虚拟地址和物理地址,共享内存
32位操作系统,寻址空间为2^32次方个byte,注意存储单位是字节byte
即物理内存为4GB
内存分布图:
虚拟地址转变成物理地址:
逻辑地址(段表,段偏移量)-> 线性地址(页表)->物理地址
1. 每个进程的4G内存空间只是虚拟内存空间,每次访问内存空间的某个地址,都需要把地址翻译为实际物理内存地址
2. 所有进程共享同一物理内存,每个进程只把自己目前需要的虚拟内存空间映射并存储到物理内存上。
3. 进程要知道哪些内存地址上的数据在物理内存上,哪些不在,还有在物理内存上的哪里,需要用页表来记录
4. 页表的每一个表项分两部分,第一部分记录此页是否在物理内存上,第二部分记录物理内存页的地址(如果在的话)
5. 当进程访问某个虚拟地址,去看页表,如果发现对应的数据不在物理内存中,则缺页异常
6. 缺页异常的处理过程,就是把进程需要的数据从磁盘上拷贝到物理内存中,如果内存已经满了,没有空地方了,那就找一个页覆盖,当然如果被覆盖的页曾经被修改过,需要将此页写回磁盘
(LRU置换页面算法,将最近最少使用的页面从内存回写到磁盘)
共享内存
1)获取共享内存地址:在内核态空间开辟内存空间,返回该内存区域的唯一标识
2)映射到进程地址空间:映射开辟的kernel空间到用户态内存空间(虚拟内存)
3)操作空间: 操作用户态的内存空间
4)关闭映射
5)删除内核态内存空间