OS-信号量管理

信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。

目的:给共享资源设立一个标志,表示共享资源的占用情况。当临界资源被某进程访问时,则本进程不能访问。当临界资源未被访问时,对标志进行查询,若本进程的全部共享资源都准备好了,则进入就绪状态,等待处理机处理。

  1. 整形信号量

一个用于表示资源数目的整型量S,它与一般整型量不同,除初始化外,仅能通过两个标准的原子操作wait(S)和signal(S)来访问。很长时间以来,这两个操作一直被分别称为P、V操作。原子操作,执行时不可中断。当一个进程在修改某信号量时,没有其他进程同时对该信号量进行修改。wait : S--;   signal : S++;

  1. 记录型信号量

在整形信号量机制中的wait操作,只要信号量S<=0,就会不断的进行while(S<=0);测试。因此该机制并未遵循“让权等待”的准则,而是使进程处于“忙等”状态。记录型信号量不会出现“忙等”现象,在采取了“让权等待”策略后,又会出现多个进程等待访问同一临界资源的情况。为此,在信号量机制中,需要一个代表资源数目的整型变量value,一个进程链表指针list,用于链接上述所有等待进程,采用记录型数据结构。S->value 表示系统中某类资源的数目,当S->value <0时,表示在该信号量链表中已阻塞的进程数目。

如果S->value的初值为1,表示只允许一个进程访问临界资源,此时的信号量转化为互斥信号量。针对的是多个并发进程仅共享一个临界资源的情况。

  1. AND型信号量

一个进程需要获得两个或更多的共享资源才能执行其任务。

将进程在整个运行过程中需要的所有资源,一次性全部地分配给进程,待进程使用完后再一起释放。只要尚有一个资源未能分配给进程,其他所有可能为之分配的资源也不分配给它。对若干临界资源的分配采取原子操作方式:要么把请求的全部资源分配到进程,要么一个也不分配。这样可以避免死锁。

  1. 信号量集

记录型信号量机制中,wait(S)或signal(S)操作仅能对信号量施加以加一减一操作,意味着每次只能对某类临界资源进行一个单位的申请或释放。当一次需要n个单位时便要进行n次操作。在某些情况下,为确保系统安全,当所申请的资源数量低于某一下限值时,必须进行管制,不予分配。因此在每次分配之前,都必须测试资源的数量,判断是否大于可分配的下限值。

对AND型信号量进行扩充,下限值ti,Si>ti;需求量di,Si=Si-di;为信号量集机制。

  1. 忙等

当一个进程正处在某临界区内,任何试图进入其临界区的进程都必须进入代码连续循环,连续测试一个变量直到某个值出现为止,陷入忙等。

没有进入临界区

  1. 让权等待

当进程不能进入自己的临界区时,应立即释放处理机给别的进程,以免忙等。

(处理机:CPU+主存储器+I/O接口)。

当进程需要的资源全都到位,只需等待处理机调度,为就绪状态。

当进程等待某些事件发生才能继续执行时,不再占用处理机而转为阻塞状态。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值