通过命名管道队共享内存的数据发送进行保护的bug:
命名管道挂掉后,进程也挂掉了。
6.systemV消息队列
原理:进程间IPC:原理->看到同一份资源->维护成为一个队列。
过程:
进程A,进程B进行通信。
让操作系统提供一个队列结构,A数据放在队列结点,把结点放在OS内部,B也这么干
消息队列可以实现双向通信进程A放数据,还要放type,
进程A那数据,只拿type和自己不一样的数据。来区分自己和别的数据结论:
结论1:消息队列,提供了一种进程给另一种进程发送有类型数据块的方式。区分那个数据是我要的,那个数据是我发的。
方法:入队列,出队列,
结论2:消息队列存在多个,OS要对消息队列进行管理->先描述,再组织。
::
消息队列的结构体:
struct msgid_ds
{
}消息队列
struct node{
}结点。
结论3:两个进程怎么保证自己看到是同一个消息队列,两个进程约定一个key,再把key放在消息队列里面。跟共享内存一样。
消息队列的调用接口:
msgget:创建消息队列
key_t key :
int msgflag:
跟共享内存是一样的。
msgctl:删除消息队列
消息队列:结构体
消息队列结构体:
struct msgid_ds{
stryct ipc_prem sg perm}
perm信息
struct perm
{
key_t key
}
跟共享内存的创建基本是保持一致的,除了需要type进行区别
msgsnd:发数据msgrcv:收数据,msgtype!!!
三种ipc通信
ipcs -q:就看消息队列
下面那个是删除
msgsize():msgdata的大小,type必须大于0
---------------------------------------------------------------------------------------------------------------------------------
这种相似性,叫做system V标准。
---------------------------------------------------------------------------------------------------------------------------------
7.system V信号量
为什么要信号量
解决保护机制引入->信号量
基本概念
• 多个执⾏流(进程),能看到的同⼀份公共资源:共享资源
• 被保护起来的资源叫做临界资源
• 保护的⽅式常⻅:互斥与同步
• 任何时刻,只允许⼀个执⾏流访问资源,叫做互斥
• 多个执⾏流,访问临界资源的时候,具有⼀定的顺序性,叫做同步
• 系统中某些资源⼀次只允许⼀个进程使⽤,称这样的资源为临界资源或互斥资源。
• 在进程中涉及到互斥资源的程序段叫临界区。你写的代码=访问临界资源的代码(临界区)+不访问 临界资源的代码(⾮临界区)
• 所谓的对共享资源进⾏保护,本质是对访问共享资源的代码进⾏保护
互斥:
怎么保护:只允许一个执行流访问资源->互斥
保护临界区的一种手段
!!!!!!!!!!!!!!
多个执行流,访问临界资源的时候,具有一定的顺序性,叫做同步。->一个人访问完后,通知下一个人继续访问,保证临界区的安全。
原子性:要么做,要么就不做
申请资源,申请锁。
访问资源,锁是要共享的谁来保证锁的安全->申请锁的时候,就需要原子性的概念了。
7-2信号量
1.信号量是什么?
本质是一个计数器,用来表示,临街资源中,资源的数量是多少。
2.理解信号量
电影院就是共享内存,把共享内存按照不同的区域,部分使用,
1.不要访问同一个位置
2.不要放过多的进程进来信号量本质是个计数器,表述的是临界资源中,资源数量的多少
所有进程,访问临界资源中的一小块,就修现申请信号量
进程访问资源前,现申请信号量,本质是:对资源的预定机制
过程:进程访问资源,先对信号量进行申请,申请后,信号量--,如果信号量为0,那么就不会给你
细节1:信号领本身就是共享资源
申请 -- ,原子性--> p操作sem ++,原子性-->v操作,归还资源
细节2:
信号量只有1或者0的两态的信号量叫做二元信号量。--->这就是互斥
二元信号量的本质就是互斥
3.共享资源使用的问题
信号量和通信有什么关系???
1.先访问信号量P,每个进程都得先看到同一个信号量!!
system V可以解决这个问题
2.不是传递数据,是通信IPC,通知,同步互斥,也算
传递控制信息
4.信号量接口
1.创建信号量:
semeget:
key:
nsems:信号量的个数
semflag:权限返回值:信号量级别的返回值semid
2.查看信号量资源:
ipc -s:
semid:返回值
ower:谁创建的
perms:权限
nsem:数量
3.删除信号量:
![]()
4.对信号量进行操作
semopsembuf:结构体
sem_op:操作P/V
flg:暂时不管
5.初始化信号量:
cmd->SETVAL
细节信号量的初始值是多少???
semctl:还
对信号量新进参数初始化。setval:设计在信号量集中第几个信号量的值
senum:信号量集里面信号量的下标
...:可变参数,可传入结构体semun
senum = 0,cmd = SETCAL,对信号量集中下标为0的用“...”指向的结构体进行初始化
查看信号量ipc -s
OS内部存在大量的信号量集
操作系统也要对信号量进行挂历->先描述在,在组织。
信号量结构体:
struct ipc_perm_sem_permipc_perm:第一个资源都是key
struct XXXid_ds的结构!!! - >key!