2.29、共享内存(2)
- 1、问题1:操作系统如何知道一块共享内存被多少个进程关联?
- 2、问题2:可不可以对共享内存进行多次删除 shmctl
- 3、共享内存和内存映射的区别
1、问题1:操作系统如何知道一块共享内存被多少个进程关联?
- 共享内存维护了一个结构体
struct shmid_ds
这个结构体中有一个成员shm_nattch
shm_nattach
记录了关联的进程个数
2、问题2:可不可以对共享内存进行多次删除 shmctl
- 可以的
- 因为
shmctl
标记删除共享内存,不是直接删除 - 什么时候真正删除呢?
- 当共享内存的
key
为0
的时候,表示共享内存被标记删除了
- 如果一个进程和共享内存取消关联,那么这个进程就不能继续操作这个共享内存。也不能进行关联。
3、共享内存和内存映射的区别
- 共享内存可以直接创建,内存映射需要磁盘文件(匿名映射除外)
- 共享内存效果更高
- 内存
- 所有的进程操作的是同一块共享内存。
- 内存映射,每个进程在自己的虚拟地址空间中有一个独立的内存。
- 数据安全
- 进程突然退出
- 运行进程的电脑死机,宕机了
- 数据存在在共享内存中,没有了
- 内存映射区的数据 ,由于磁盘文件中的数据还在,所以内存映射区的数据还存在。
- 生命周期
- 内存映射区:进程退出,内存映 射区销毁
- 共享内存:进程退出,共享内存还在,标记删除(所有的关联的进程数为
0
),或者关机