用于实现进程间的同步与互斥(進程/线程安全概念)保证进程间对临界资源的安全有序访问。
多个进程同时操作一个临界资源的时候就需要通过同步与互斥机制来实现臨界资源的安全访问
同步:保证对临界资源访问的时序的可控性
互斥:对临界资源同一时间的唯一访问性
本质:具有一个等待队列的计数器(代表现在还有没有资源使用)当信号量没有资源可用时,这时候需要阻塞等待
同步:只有信号量资源计数从0转变为1的时候,才会通知别人打断阻塞等待,去操作临界资源
互斥:同一时间,A获取了信号量的资源其它进程就没有办法获取资源了。
二元信号量:信號量如果想要实现互斥那么它的计数器只能是0或1
*P操作: 获取信号量资源说的是对计数器进行-1操作
*V操作:释放信号量资源说的是对计数器進行+1操作
进程在操作临界资源之前先获取信号量资源,判断是否可以对临界资源进行操作如果信号量没有资源了(计数器为0),则需要等待当别人释放信号量计数器变为1,才会唤醒等待的进程去重新获取信号量资源
信号量数据大于0,代表信号量有资源可以操作,
信號量资源等于0代表信号量没有资源,需要等待
信号量作为进程间通讯方式,意味着大家都能访问到信号量实际上也是一个临界资源,但是信号量的这个临界资源的操作是不会出问题的因为信号量的操作是一个原子操作。
semnum:指定操作的是第几个信号量
cmd:SETVAL设置单个信号量嘚初值SETALL设置所有信号量的初值,semnum将被忽略IPC_RMID删除信号量,…将被NULL
...
是一个不定参数:
函数会对对应的操作的联合结构中的对象操作 |
---|
nsops操作的信號量个数
这个sembuf在库里是这样的
这是一个基于信号量的互斥操作, 让子进程打印A睡1000us嘫后再打印一个A 让父进程打印B睡1000us然后再打印一个B
检查结果是否是连续的?
如何让打印结果是我们预期的AA BB这种形式
关键点就在于两个进程的咑印操作都不能被打断,这时候就需要使用一个一元信号量来完成互斥操作
用于实现进程间的同步与互斥(進程/线程安全概念)保证进程间对临界资源的安全有序访问。
多个进程同时操作一个临界资源的时候就需要通过同步与互斥机制来实现臨界资源的安全访问
同步:保证对临界资源访问的时序的可控性
互斥:对临界资源同一时间的唯一访问性
本质:具有一个等待队列的计数器(代表现在还有没有资源使用)当信号量没有资源可用时,这时候需要阻塞等待
同步:只有信号量资源计数从0转变为1的时候,才会通知别人打断阻塞等待,去操作临界资源
互斥:同一时间,A获取了信号量的资源其它进程就没有办法获取资源了。
二元信号量:信號量如果想要实现互斥那么它的计数器只能是0或1
*P操作: 获取信号量资源说的是对计数器进行-1操作
*V操作:释放信号量资源说的是对计数器進行+1操作
进程在操作临界资源之前先获取信号量资源,判断是否可以对临界资源进行操作如果信号量没有资源了(计数器为0),则需要等待当别人释放信号量计数器变为1,才会唤醒等待的进程去重新获取信号量资源
信号量数据大于0,代表信号量有资源可以操作,
信號量资源等于0代表信号量没有资源,需要等待
信号量作为进程间通讯方式,意味着大家都能访问到信号量实际上也是一个临界资源,但是信号量的这个临界资源的操作是不会出问题的因为信号量的操作是一个原子操作。
semnum:指定操作的是第几个信号量
cmd:SETVAL设置单个信号量嘚初值SETALL设置所有信号量的初值,semnum将被忽略IPC_RMID删除信号量,…将被NULL
...
是一个不定参数:
函数会对对应的操作的联合结构中的对象操作 |
---|
nsops操作的信號量个数
这个sembuf在库里是这样的
这是一个基于信号量的互斥操作, 让子进程打印A睡1000us嘫后再打印一个A 让父进程打印B睡1000us然后再打印一个B
检查结果是否是连续的?
如何让打印结果是我们预期的AA BB这种形式
关键点就在于两个进程的咑印操作都不能被打断,这时候就需要使用一个一元信号量来完成互斥操作