2.29、共享内存(2)

2.29、共享内存(2)

  • 1、问题1:操作系统如何知道一块共享内存被多少个进程关联?
  • 2、问题2:可不可以对共享内存进行多次删除 shmctl
  • 3、共享内存和内存映射的区别

1、问题1:操作系统如何知道一块共享内存被多少个进程关联?

  • 共享内存维护了一个结构体struct shmid_ds 这个结构体中有一个成员shm_nattch
  • shm_nattach 记录了关联的进程个数

2、问题2:可不可以对共享内存进行多次删除 shmctl

  • 可以的
  • 因为shmctl 标记删除共享内存,不是直接删除
  • 什么时候真正删除呢?
    • 当和共享内存关联的进程数为0的时候,就真正被删除
  • 当共享内存的key0的时候,表示共享内存被标记删除了
    • 如果一个进程和共享内存取消关联,那么这个进程就不能继续操作这个共享内存。也不能进行关联。

3、共享内存和内存映射的区别

  1. 共享内存可以直接创建,内存映射需要磁盘文件(匿名映射除外)
  2. 共享内存效果更高
  3. 内存
  • 所有的进程操作的是同一块共享内存。
  • 内存映射,每个进程在自己的虚拟地址空间中有一个独立的内存。
  1. 数据安全
  • 进程突然退出
    • 共享内存还存在
    • 内存映射区消失
  • 运行进程的电脑死机,宕机了
    • 数据存在在共享内存中,没有了
    • 内存映射区的数据 ,由于磁盘文件中的数据还在,所以内存映射区的数据还存在。
  1. 生命周期
  • 内存映射区:进程退出,内存映 射区销毁
  • 共享内存:进程退出,共享内存还在,标记删除(所有的关联的进程数为0),或者关机
    • 如果一个进程退出,会自动和共享内存进行取消关联。

你可能感兴趣的:(linux,c++,服务器)