进程间通信IV System V 系列(linux)
目录
消息队列
原理
操作
补充概念
信号量 (原子性计数器)
原理
操作 (和共享内存相似)
总结
小知识
消息队列
原理
在内核中建立一个队列,进程可以相互进行通信,通过队列进行IPC,就是进程之间发送带类型的数据块。
操作
接口和共享内存基本相似
msgget 获取消息队列
msgctl 控制消息队列
msgsnd 写入数据
补充概念
共享资源:多个执行流(进程),能看到的同一份公共资源。
临界资源:被保护起来的资源
保护的方式:互斥和同步
互斥:任何时候,只允许一个执行流访问资源
同步:多个执行流,访问资源时,具有一定的顺序性。
临界资源或互斥资源:系统中某些资源一次只允许一个进程使用
临界区:在进程中涉及到互斥资源的程序段。(我们写的代码 = 访问临界资源的代码(临界区)+不访问临界资源的代码(非临界区))
信号量 (原子性计数器)
原理
本质是一种描述临界资源数量的原子性计数器,是对资源的预定机制
保证:1.资源不会被多申请
2.所有进程未来向通过临界区访问临界资源,先申请信号量(让信号量计数器 -- ),申请成功才能访问临界区资源
信号量要被多个进程看到,本身也就是一个共享资源。 自己也要保护自己,通过要求对信号量的++和--必须为原子操作来保护。(原子操作:进行操作时不会被其他操作影响)
操作 (和共享内存相似)
semget 申请信号量
参数:
nsems: 信号量的数量
semctl 控制信号量
参数:
semnum:要进行操作的信号量个数
semop 对信号量进行操作
总结
1.所有的system V资源生命周期都随内核,都需要自己手动释放
2.所有的system V资源,都要被OS管理起来,都有描述它的结构体
3.内核中管理IPC资源,使用柔性数组,之前的shmid等id都是上面柔性数组的下标。
小知识
1.ipcs -p 查看消息队列
ipcrm -q msgid 删除消息队列
2.ipcs -s查看信号量
ipcrm -s semid 删除信号量
3.C语言多态:一个数组,元素为指向不同结构体中的相同的元素的指针,这样一个数组可以管理不同的结构体对象,多态。