匿名管道和命名管道都是基于文件的进程间通信,SystemV方案是在OS内核层面专门为进程间通信设计的一个方案,然后通过系统调用(system call)给用户提供通信接口
SystemV方案包含三种:共享内存、消息队列、信号量
下面要说的就是共享内存的创建和释放
目录
一、什么是共享内存??
1、共享内存的定义
由于进程通信的本质是要让两个不同的进程看到同一份资源,我们可以在物理内存上开辟一块空间,这块空间被称为共享内存,然后让这两个进程通过某种方式都能访问到这块内存,这样的话,两个进程之间就可以通信了

2、共享内存的特点
第一,和创建进程类似,进程被创建的时候,会被分配一个pid来标识这个进程的唯一性,同时也方便OS管理这些进程,因此共享内存在被创建的时候,会被分配一个“ID”来标识唯一性

第二,共享内存可以允许存在多个,为了区分这些共享内存,我们上面引入了“ID”的概念,但是要如何让两个进程连上同一个共享内存呢??
就好比,我要和人solo(通信),我创建了一个房间(共享内存),这个房间就有了房间号(共享内存的ID),是个人都能进这个房间,根本没法通信,所以我们要设置房间密码。因此为了通信,我们需要两样东西,一个是房间号,一个是房间密码
二、使用共享内存的准备和收尾工作
当我们需要使用共享内存时,我们要做的准备工作是:
— 通过某种调用,在内存中开辟一块空间(shmget)
— 通过某种调用,让两个进程挂接到这个新开辟的空间上(shmat)
当我们不需要使用共享内存时,我们需要做的收尾工作是:
— 断开进程和共享内存之间的关联(shmdt)
— 释放共享内存(shmctl)
每一步都对应着一个系统调用接口,下面要说的就是这四个系统调用接口
三、shmget函数(shared memory get)
这是共享内存的创建函数,调用以后会向内核申请内存,但是需要注意的是,共享内存是以“页”为单位的,一页是4KB = 4096bytes,所以一般建议申请共享内存的大小是4KB的整数倍!
如果申请了4097个字节,那么OS会给你4096*2个字节的空间
1、 参数解析
下面是shmget函数的声明以及要用到的头文件

本文详细介绍了SystemV IPC中的共享内存,包括其定义、特点、生命周期,以及如何通过shmget和shmctl函数进行创建、连接、控制和释放。共享内存是一种高效进程间通信方式,其ID用于标识和访问。文章通过实例展示了共享内存的使用,并讨论了其不同于匿名管道的持久性。
最低0.47元/天 解锁文章
6929

被折叠的 条评论
为什么被折叠?



