1,我的疑惑:
进程都是运行在自己的虚拟内存中的,虚拟内存空间是分段的,大小相当于整个物理内存大小。那么我们共享内存是如何在进程的虚拟内存分布的?网上简单介绍了下说进程间共享内存就是多个进程共享一块物理内存?那么这里有第一个问题了,进程是如何找到一个固定地址的物理内存的(也就是地址翻译过程)。
2,页表工作机制:
首先进程的虚拟内存中分为很多段,其中的一段区域就是内核区域,里面有对应的页表,当操作系统切换上下文时候会在物理内存区域装置进程自己的内核段区域(就是自己的页表),当cpu读到虚拟内存地址发送到mmu(内存控制单元),未在mmu的缓存中找到,那么会去进程的页表中去找对应的物理地址,如果该物理地址还没加载到内存中那么就会出发中断进行加载并且更新页表。
3,页表中物理地址和虚拟地址的映射如何形成的。
对于这里就要提到内核页和进程页了,虚拟地址应该是源代码编译形成程序的时候形成的,而页表中的物理地址关系是运行的程序都会有内核段区域,他里面的页表是从操作系统的内核页表中拷贝过来的,然后当触发中断操作系统的内核页表物理地址关系发生改变的时候也会通知当前进程进行改变。
4,共享内存个本质
就是操作系统提供了一个接口,可以开辟一块物理内存,然后为这块物理内存创建一个新的页表,更新自己的页表,然后需要使用的进程需要绑定共享内存,其实就是更新自己的页表,形成自己的虚拟内存和物理内存之间映射关系。不同的进程使用的虚拟地址不同,但是最后映射的物理内存页是相同的,从而达到共享内存的作用。
5,shmget方式和mmap方式有什么不同?
shmget是共享内存。
mmap其实是文件映射需要配合shm_open()来使用才是共享内存。shm_open()是创建共享内存的文件。