linux (七)进程间通信(信号量)

在上篇博客说的共享内存是没有同步与互斥的!但是今天说的信号量主要用于同步和互斥

我们先来看看什么是进程互斥

由于各进程要求共享资源,而有些资源需要互斥使用,因此个进程间的竞争使用这些资源,进程的这中关系叫做进程的互斥
系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源
在进程中涉及到互斥资源的程序段叫做临界区

举例说明进程的同步与互斥实例
互斥:在电影院买票当一个进程进入买票期间,当付款后,票的总数就会减一,而在这个过程,别人是不能进去并且修改票总数的。

同步:进程同步指的是多个进程需要相互配合共同完成一项任务。
就像司机停车售票员开门,司机开车,售票员关门售票。这就是个进程同步问题

信号量和P,V原语
信号量
互斥:P,V在同一个进程中
同步:P,V在不同的进程中
信号量的含义
S>0:S表示可用的资源的个数
S=0 :表示无可用资源,无等待进程
S<0; |S|表示等待队列中的进程个数

P原语
P(s)
{
s.value = s.value–;
if(s.value <0)
{
该进程状态为等待状态
将该进程的PCB插入相应的等待队列s.queue末尾

}

}

V原语
V(s)
{
s.value = s.value++;
if(s.value <=0)
{
唤醒相应的等待队列s.queue中等待的一个进程
改变其状态为就绪状态
并将其插入就绪队列
}
}

信号量集函数
semget函数
功能:用来创建和访问一个信号量集
原型:
int semget(ket_t key,int nsems,int semflg);
参数
key:信号集的名字
nsems:信号集中信号的个数
semflg:由九个权限标志构成,他们的用法和创建文件时使用的mode模式标志是一样的
返回值:成功返回一个非负整数,即该信号集的表示码;失败返回-1

shmctl函数
功能:用于控制信号量集
原型:
int semctl(int semid.int semnum,int cmd,…);
参数
semid:由semget返回的信号集标识码
semnum:信号集中信号量的序号
cmd:将要采取的动作(有三个可取值)
最后一个参数根据命令的不同而不同
返回值:成功返回0; 失败返回-1
命令:
SETVAL:设置信号量集中的信号量的计数值
GETVAL:获取信号量集中的信号量的计数值
IPC_STAT:把semid_ds结构中的数据结构设为信号集的当前关联值
IPC_SET:在进程有足够权限的前提下,把信号集的当前关联值设置为semid_ds数据结构中给出的值
IPC_RMID:删除信号集

下面就是实例代码实现

这里写图片描述
这里写图片描述这里写图片描述这里写图片描述

这里写图片描述
这里写图片描述

这是我们不加信号量的情况 看看他会出现什么

这里写图片描述
我们可以看到在不加信号量的时候,A和B不是成对出现

但是加了信号量之后我们来看
这里写图片描述
我们可以看到的是AB成对出现 ,
这里写图片描述

这就说明了,信号量完成了两进程的同步与互斥动作


如有错误请指出,谢谢

猜你喜欢

转载自blog.csdn.net/mignatian/article/details/80019399
今日推荐