明确几点:
- 用户编程面对的始终是虚拟内存
- 通过各种函数调用操作内存时,系统返回的地址也都是虚拟地址;
- 虚拟地址到物理地址的映射和管理由系统管理,用户不需操心,这也体现了操作系统屏蔽底层细节,方便用户使用的特性。
例题:映射匿名虚存区实现共享内存
※ 源代码:
※ 运行及结果
[flora@localhost ~]$ gedit mmap.c
[flora@localhost ~]$ gcc mmap.c
[flora@localhost ~]$ ./a.out
child 18397 write: result =45,sum=45
we’re going to sleep 20 seconds,see us in /proc
farther 18396 : result =45,sum=0
we’re going to sleep 20 seconds,see us in /proc
分析:该例子相当于子进程写内容,父进程读内容。result变量为共享的虚存区,父子进程都指向该区。而sum变量是双方都有的副本。所以可以看到父子进程中的result结果相同,而sum变量的值不同,父进程中sum变量的值未进行任何操作,为初始值。
※ 在程序执行后父子进程都会睡眠20秒,到proc的相应pid目录下可以观察maps文件,查看新建的匿名虚存区:
两进程共享内存区域
(1)特点:共享内存和访问它的所有进程都处于用户空间,进程通过地址映射的方式直接读写内存,从而获得非常高的通信效率。
(2)注意点:共享内存需要搭配同步机制才能保证对共享存储区的读、写操作的逻辑秩序。