对于信号量理解
#semaphore(信号)
1. 信号量就是一个计数器
描述临界资源的数目(将共享内存分为了几个区域)
提供多个进程对共享数据对象的访问
也就是一个仅能由同步原语对其进行操作的整形变量
信号量来控制临界资源
如果对信号量减1,也就是使用该信号量为进程分配了一个临界资源
如果对信号量加1,也就是使用该信号量释放了一个临界资源,如果此时等待队列中有进程在等待的话,就让该进程来使用这一临界资源
2. 同步原语
对于同步原语共有两个
这两个同步原语分别是P操作和V操作
P操作:发信号(申请临界资源)--
V操作:等待(释放临界资源)++
扫描二维码关注公众号,回复: 5283676 查看本文章对于这两个操作都是原子性的
3. 信号量的分类
二元信号量
允许取值为“0”和“1”,主要用于做互斥变量
一般信号量
允许取值为非负整数,主要用于进程间的一般同步问题
4. 信号量与信号量值
信号量
互斥:P、V在同一个进程下面
同步:P、V不在同一个进程下面
信号量值
S > 0:S表示可用资源的个数
S = 0:表示没有可用资源,无等待进程
S < 0:表示等待队列中进程的个数
5. 对于信号量结构体伪代码
**信号量的本质一个计数器** struct semaphore { int value; pointer_PCB queue; }
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中等待的一个进程,也就是等待队列中的队首 改变其状态为就绪态 并将其插入到就绪队列 } }
5. 对于同步与互斥的理解
互斥:
进程在通过临界区访问临界资源时,有且只有一个进程是独占式的,排他式的
同步:
在互斥的基础上,让多个进程访问临界资源的时候具有顺序
6. 信号量集
信号量本质就是信号量的一个集合
struct semid_ds { struct ipc_perm sem_perm; time_t sem_otime;//最后一次进行semop()函数的时间 time_t sem_ctime;//最后一次改变的时间 unsigned short sem_nsems;//有多少个信号在该信号集中 }
#信号量的操作
对于信号量的所有操作都是使用信号集来进行操作的。