本文介绍操作系统进程管理的两个核心概念:

  • 信号量
  • PV操作

一、信号量介绍

1.1 信号量引入

信号量(Semaphore)1965年由Dijkstra引入的。信号量一般由一个值是一个变量,其值有可能是0,或者一个正数,或者是负数:

  • 0表示没有资源可以使用
  • 大于0,标识可用资源的数量
  • 小于0,其绝对值表示等待这个资源的进程的个数

针对信号量,Dijkstra提出了两个操作:

  • P操作
  • V操作

信号量的值只有通过PV操作来完成。

1.2 PV原语操作(atomic action)

PV操作里面会有一些列步骤,这些步骤是一个原语操作(atomic action),类似于数据库的事务,要么同时成功,要么同时失败。

二、P操作

P操作流程

P操作核心:如果有资源(信号量大于0),则继续执行,否则阻塞自己(处于睡眠等待信号量的状态)

三、V操作

V操作流程

四、关键点

  • P/V操作必须成对出现,这样就不会出现死循环
  • 信号量大于0的确表示有临界资源可供使用,而且这个时候没有进程被阻塞在这个资源上,也就是说没有进程因为得不到这类资源而阻塞,所以没有被阻塞的进程,自然不需要唤醒。

  • 原语操作的本质在于:一个进程使用完临界资源后,释放临界资源,使信号量加1,以通知其它的进程,这个时候如果信号量<=0,表明有进程阻塞在该类资源上,因此要从阻塞队列里唤醒一个进程来“转手”该类资源。比如,有2个某类资源,三个进程A、B、C、D要用该类资源,最开始信号量=2,当A进入,信号量=1,当B进入信号量=0,表明该类资源刚好用完,当C进入时信号量=-1,表明有一个进程被阻塞了(C会被阻塞),D进入,信号量=-2(D继续阻塞)。当A用完该类资源时,进行V操作,信号量=-1,释放该类资源,而这时信号量<0,表明有进程阻塞在该类资源上,于是唤醒一个。

  • 当一个进程阻塞了的时候,它已经执行过了P操作,并卡在临界区那个地方。当唤醒它时就立即进入它自己的临界区,并不需要执行P操作了,当执行完了临界区的程序后,就执行V操作。

  • 当信号量信号量小于0时,其绝对值表示系统中因请求该类资源而被阻塞的进程数目。S大于0时表示可用的临界资源数。注意在不同情况下所表达的含义不一样。当等于0时,表示刚好用完。

最新文章

  1. 窗体Showmedol 遇到的奇怪异常--&gt;进阶问题
  2. Sqoop使用手册
  3. 查看regulator的信息
  4. Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80070005.
  5. spark操作elasticsearch数据的限制
  6. vtigerCRM5.4的安装和汉化 ubuntu
  7. java之接口(笔记)
  8. TCP/IP学习-链路层
  9. 浅谈JavaScript计时器
  10. SAN简介
  11. hdu2159 Fate 二维背包
  12. 【外文翻译】 为什么我要写 getters 和setters
  13. 深入理解Activity的启动模式
  14. location对象浅探
  15. fs输出文件目录
  16. C语言Linix服务器网络爬虫项目(一)项目初衷和网络爬虫概述
  17. mysql user表root 用户误删除解决方法
  18. Netty源码分析(二):服务端启动
  19. 【Jetty】Jetty 的工作原理以及与 Tomcat 的比较
  20. java⑦

热门文章

  1. 离乡与理想 Demo
  2. php数组函数-array_diff()
  3. linux 无密码登录
  4. C++中容器的使用(一)
  5. relativePath
  6. 【atcoder】Two Sequences [arc092 D](思维题)
  7. nginx流量全copy记录
  8. jq中同个页面点击事件和回车事件
  9. python定制
  10. js执行环境、作用域