以下用伪代码的方式归纳了信号量的理解,呵呵,如果不对请指正!
-----------------------------------
信号量结构体定义:
结构体 semaphore
{
信号量value;
等待队列List
};
-----------------------------------
信号量S 操作:
Init
初始化赋值value
初始化等待队列
P(S)
信号量value--
若该值<0 则进程被阻塞后进入该信号量的等待队列,转入进程调度
若 >=0 则进程继续执行Signal
V(S)
信号量value++
若该值>0 则进程继续执行
若 <=0 则从该信号队列中唤醒一个等待进程,然后在返回原进程继续执行或转入进程调度
在进行 信号量S++/S--的更新的时候要确保原子性,因此要将中断关闭,待更新完毕之后再立即将中断打开
----------------------------------------------------------------------
实例:
// 信号量初始化
信号量=2// P操作1
信号量=1 进程继续执行
// P操作2
信号量=0 进程继续执行
// P操作3
信号量=0进程被阻塞进入该信号量的等待队列,转入进程调度
信号量=0 进程被阻塞进入该信号量的等待队列,转入进程调度
// V操作1
信号量=0 从该信号队列中唤醒一个等待进程,然后在返回原进程继续执行或转入进程调度
// V操作2
信号量=0 从该信号队列中唤醒一个等待进程,然后在返回原进程继续执行或转入进程调度
// V操作3
信号量=1 进程继续执行
// V操作4
信号量=2 进程继续执行
2035

被折叠的 条评论
为什么被折叠?



