共享内存-------进程间最快的通信方式

1.共享内存通信方式的实现原理是什么?

首先申请一块物理内存,然后将这块物理内存通过页表映射到需要进行通信的进程的虚拟地址空间中,然后进程可以通过访问虚拟地址从而间接的访问共享物理内存,每一个与共享物理内存建立映射关系的进程都可以实现进程间通信
在这里插入图片描述
2.共享内存通信方式的具体实现过程

1.通过shmget函数来开辟共享物理内存

int shmget(key_t key,size_t size,int shmflg);
 // key:共享内存在操作系统中的标识符
// size: 共享内存的大小
// shamflg:  ipc_creat|0664
         ipc_creat  :共享内存若存在则打开,不存在 则创建
         IPC_excl  :与ipc_creat同时使用,若共享内存存在则报错返回
         mode  : 共享内存的操作权限
返回: 若成功返回:  正整数---共享内存的操作句柄    若失败: 返回-1

2.通过shmat函数将共享物理内存映射到虚拟地址空间中

void*shmat(int shmid,const void *shamaddr,int shmflg);
  // shmid: 创建共享内存返回的操作句柄
  // shmaddr :共享内存在虚拟地址空间中的首地址---通常置null
  // shmflg: SHM_RDONLY----映射之后,共享内存只读;通常置0--可读可写
返回: 若开辟成功返回映射首地址    若开辟失败则:  (void*)   -1

3.建立映射关系的进程可以通过虚拟地址来实现对内存的访问,进行操作(若多个进程映射同一块物理内存,
就可以实现进程间相互通信—直接通过虚拟地址来改变内存中的数据, 其他进程也会随之改变)

memcpy/strcpy

4.通过shmdt函数解除原来的映射关系

int shmdt(const void*shmaddr);
//  shmaddr:  shmat 建立映射时返回的首地址

5.通过shmctl 函数来删除共享内存

  intshmctl(int shmid ,int cmd, struct shmid_ds*buf);
    //  shmid  :共享内存操作句柄
    // cmd:即将进行的操作
       IPC_RMID  删除共享内存
    // buf:  用于获取/设置共享内存信息

共享内存的删除流程: 共享内存在删除的时候,首先看与共享内存具有映射关系的映射连接数是否为0;若为0则直接删除;若不为0,表示现在还有进程正在使用这块共享内存,此时不能立即删除,但是会拒绝后续进程的映射链接,等到使用共享内存的进程用完以后,这块共享内存的映射连接数为0时,再进行删除.

3.共享内存通信方式的特性

它时进程间最快的通信方式

4.为什么说共享内存是进程间最快的通信方式

相比较其他的进程通信方式,共享内存确实是最快的,比如说,管道通信,管道通信需要两次数据拷贝的过程.
以进程1 和进程2实现进程间通信为例
进程1 和进程2 要想进行进程间通信,首先进程1 需要将数据从用户态空间拷贝到,内核态空间,接着进程2 从内核态空间中将数据拷贝到进程2
中,于是进程间通信完成了.,然而共享内存就没有数据的拷贝过程,因此效率最高.

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页