信号量-摘自《现代操作系统》

        信号量是E.W.Dijkstra在1965年提出的一种方法,它使用一个整型变量来累计唤醒次数,供以后使用。在他的建议中引入了一个新的变量类型,称作信号量(semaphore)。一个信号量的取值可以为0(表示没有保存下来的唤醒操作)或者为正值(表示有一个或多个唤醒操作)。

        Dijkstra建议设立两种操作:down和up(分别为一般化后的sleep和wakeup)。对一信号量执行down操作,则是检查其是否大于0. 若该值大于0,则将其值减一(即用掉一个保存的唤醒信号)并继续;若该值为0,则将进程睡眠,并且此时down操作并未结束。检查数值,修改变量值以及可能发生的睡眠操作均作为一个单一的,不可分割 原子操作完成。保证一旦一个信号量操作开始,则在该操作完成或阻塞之前,其他进程均不允许访问该信号量。这种原子性对于解决同步问题和避免竞争条件是绝对必要的。所谓原子操作,是指一组相关联的操作要么都不间断地执行,要么都不执行。原子操作在计算机科学的其他领域也是非常重要的。

        up操作对型号量的值增1. 如果一个或者多个进程在该信号量上睡眠,无法完成一个先前的down操作,则由系统选择其中一个(如随机挑选)并允许该进程完成它的down操作。于是,对一个有进程在其上睡眠的信号量执行一次up操作之后,该信号量的值仍旧是0,但在其上睡眠的进程却少了一个。信号量的值增1和唤醒一个进程同样也是不可分割的。不会有某个进程因执行up而阻塞,正如在前面的模型中不会有进程因执行wakeup而阻塞一样。

        顺便提一下,在Dijkstra原来的论文中,他分别使用名称P和V而不是down和up,在荷兰语中,Proberen的意思是尝试,Verhogen的含义是增加或升高。由于对于不讲荷兰语的读者来说采用什么记号并无大的干系,所以我们将使用down和up名称。它们在程序设计语言Algol68中首次引入。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值