共享内存和信号量

共享内存和信号量实现进程间通信的另外两种机制。

一.  共享内存

1. 共享内存的结构

共享内存和信号量_第1张图片

2. 实现共享内存的函数

(1)shmget 函数

共享内存和信号量_第2张图片

功能:创建共享内存

参数:key 共享内存的名字 ,size 共享内存的大小(以页为单位分配资源)

返回值:成功返回一个非负整数,即共享内存的标识符;失败返回-1。

(2)shmat 函数

共享内存和信号量_第3张图片

功能:将共享内存块连接到进程地址空间

参数:shmid 共享内存标识符,shmaddr 一般取值NULL ,shmflg 一般取值为0;

返回值:成功返回一个指针;失败返回一个-1;

(3)shmdt 函数

共享内存和信号量_第4张图片

功能:将共享内存段和进程地址空间去关联

参数:shmaddr 是由shmat 返回的指针

返回值:成功返回0;失败返回-1;

(4)shmctl 函数

共享内存和信号量_第5张图片

功能:用于控制共享内存

参数:shmid 由shmget 返回的共享内存的标识符;cmd 是要执行的动作,有三个值可以取; 

共享内存和信号量_第6张图片

返回值:成功返回0;失败返回-1;

3. 共享内存的特点

(1)共享内存是最快的IPC形式,因为一旦共享内存创建成功,就会由页表映射到进程地址空间,进程间的数据不需要传递到内核。

(2)共享内存没有同步与互斥机制,在使用时需要自己维护代码。

(3)共享内存的生命周期随内核

4. 关于共享内存的命令

(1)ipcs  -m : 显示IPC内容

(2)ipcrm  -m :手动命令删除共享内存

二 . 信号量

在看信号量之前,我们先来看几个概念:

(1)临界资源:多个进程看到的同一个资源(公共资源);

(2)临界区:访问临界资源的代码;

(3)同步性:在一段时间内,按照一定的顺序访问 ;

(4)互斥性:在一段时间内,一份资源只能被一个进程访问 和占用 ;

(5)原子性:  一个事物要么全做,要么不做,不能只做一半 ;

1. 信号量的概念

(1)信号量本质上是计数器,是衡量临界资源的数量的 ;

(2)信号量也是一种临界资源,它的作用是保护临界资源 ;

(3)信号量只有两种操作,PV原语,P表示申请资源,V表示释放资源;

P原语

共享内存和信号量_第7张图片

V原语

共享内存和信号量_第8张图片

  (4)   PV 操作保持原子性 ;

2. 信号量集函数

(1) semget  函数

共享内存和信号量_第9张图片

功能:创建和访问一个信号量集

参数:key 信号量的名字 ,nsems 信号量集中信号量的个数 

返回值:成功返回一个非负整数,即信号量的标识符;失败返回-1。

(2)semctl 函数

共享内存和信号量_第10张图片

功能:信号量控制函数

参数:semid 信号量的标识符 ,semnum 信号量的序号,cmd和共享内存相同 ;

返回值:成功返回0; 失败返回-1;

(3)semop 函数

共享内存和信号量_第11张图片

功能:创建和访问一个信号量集

参数:semid 信号量的标识符 

返回值:成功返回0; 失败返回-1;

信号量的内容比较难理解,我们要仔细琢磨!

 

 

你可能感兴趣的:(Linux)