信号量

信号量有两个主要作用:

1。提供互斥(初始为1)

2 。 调度对共享资源的访问

信号量是一个整型变量(实际是非负整型),一个信号量对应某类型资源在系统中的可用总数(也就是一个资源计数器),可以执行down(或者叫p)和up(或者叫v)操作。

  1. down:当进程获取某资源时,对应信号量计数首先减1,然后如果计数小于0,那么该进程被阻塞(插入到阻塞队列中);
  2. up:当进程释放某资源时,对应信号量计数首先加1,然后如果计数小于或等与0,那么唤醒一个被阻塞的进程(从阻塞队列中拿出一个,放进就绪队列)。

down 和 up 操作需要被设计成原子原语,就是对信号量的操纵这部分代码必须放在临界区才行。

(实际down,是如果信号量大于0,就直接减1,如果信号量等于0,那就阻塞,然后等到执行一个up的时候,先加1,然后唤醒一个阻塞进程,那个被唤醒的进程a会先把p继续执行完,也就是再减1,然后执行a后续的部分)

计数信号量具备两种操作动作,称为 V(又称signal())与 P(wait())。 V 操作会增加信号量 S 的数值,P 操作会减少。运作方式:

  1. 初始化,给与它一个非负数的整数值。
  2. 运行 P,信号量 S 的值将被减少。企图进入临界区块的进程,需要先运行 P。当信号量 S 减为负值时,进程会被挡住,不能继续;当信号量S不为负值时,进程可以获准进入临界区块。
  3. 运行 V,信号量 S 的值会被增加。结束离开临界区块的进程,将会运行 V。当信号量 S 不为负值时,先前被挡住的其他进程,将可获准进入临界区块。

如果信号量的取值只能为 0 或者 1,那就是二元信号量,还有一个概念叫互斥量(Mutex) ,两者还是有点区别的,互斥量是,一个进程为一个互斥量加了锁(值设为0),那为这个互斥量解锁的必须还得是这个进程(设为1),而二元信号量,可以是一个进程加锁,另一个解锁(比如缓存区就为1的 读写?)

(我觉得能用二元信号量的地方,都能那个一般信号量来代替,只要初始为1就好。对的,只要信号量初始为1,就是2元信号量,实际信号量是一个非负整数,只要初始为1,那它的值就只能是0or1,如果忘了可以看csapp p703)

wait对应down(消耗资源) signal对应up(释放资源)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值