弄懂“进程”(下):进程的控制、同步和通信
进程控制
是进程管理的主要功能,负责创建和终止进程、进程执行过程中的状态转换。
由操作系统内核通过原语实现。
1.OS内核
常驻内存的、紧靠硬件的软件层次,运行在系统态(又称管态、内核态),以免遭到用户程序的破坏。
主要包括:一些与硬件紧密相关的模块(如中断处理程序),各种常用设备的驱动程序,运行频率较高的模块(如时钟管理、进程调度和许多模块所公用的一些基本操作)。
2.原语
由若干条指令组成,用来执行某个特定操作。
其执行具有原子性,即执行过程中不允许被中断。
常驻内存,且在系统态下执行。
3.进程的创建
创建子进程的进程被称为父进程,子进程又可以创建子进程,形成进程图。
进程创建原语完成,其主要任务是创建PCB。
具体过程:从PCB集合申请空闲的PCB,然后为新进程分配内存等资源,再根据父进程提供的参数和分配到的资源情况对PCB进行初始化,然后将新进程插入就绪队列。
4.进程的终止
发生在进程完成任务或遇到异常情况和外界干预需要结束时。
进程终止原语完成,实质是回收PCB。
具体过程:找到待终止进程的PCB,终止执行,设置重新调度标志,终止其一切子孙进程,释放全部资源,移出队列,回收PCB。
5.进程的阻塞和唤醒
当正在执行的进程需要等待某种事件的完成或本身无新工作可做:
执行状态+阻塞原语=阻塞状态
当阻塞进程等待的事情完成了:
阻塞状态+唤醒原语=就绪状态
6.进程的挂起与激活
活动阻塞状态+挂起原语=静止阻塞状态
活动就绪状态/执行状态+挂起原语=静止就绪状态
静止阻塞状态+激活原语=活动阻塞状态
静止就绪状态+激活原语=活动就绪状态
进程同步
和进程并发要区分开,进程同步是指对多个相关进程在执行次序上进行协调。
使得系统中诸进程可以按照一定的规则(或者时序),共享资源或相互合作,从而使得程序的进程具有可再现性。
用来实现同步的机制被称作同步机制。
1.进程间的两种相互制约关系
间接:两个进程之间要共享相同的资源,一个正在占用,另一个则处于阻塞状态,只有等前者释放后者才被唤醒。
直接:两个进程有合作,比如D等着C向缓冲里面放数据,缓冲里没数据,D就阻塞着,缓冲已经满了,C就阻塞。
2.临界资源和临界区
临界资源:一次只允许被一个进程使用的资源。如打印机、共享变量。
临界区:访问临界资源的那段代码。
要想互斥地使用临界资源,就要保证进程互斥地进入临界区。
措施:临界区前面加一段代码,称为进入区,可用来检查对应资源是否正在被其他进程访问,相应地,临界区后面有一段退出区,用来将临界区从正被访问的标识恢复为未被访问的标识。
3.同步机制遵循的4条规则
空闲让进。当临界资源空闲就要允许请求进入临界区使用临界资源的进程进入。
忙则等待。和上一条相对。
有限等待。避免“死等”,任何请求进入临界区的进程要在有限时间内进入。
让权等待。避免“忙等(白等)”,不能进入临界区的进程要立即释放CPU。
4.信号量机制
是一种同步机制,发展历程:整型信号量->记录型信号量->信号量集。
整型信号量
是非负的、共享的整数,用来表示一类临界资源的数目。
只在三种情况下改变:初始化,P操作,V操作。
P操作即wait
wait(S){while(S<=0);S--;
}
只要S小于0,wait操作就会不断地测试,不符合让权等待原则。
V操作即signal,表示释放资源
signal(S){S++;
}
记录型信号量
除了有整型表示资源量,还有一个进程链表指针,连接所有等待该类资源的进程。
符合让权等待原则,主要是因为有block原语,当资源量小于0的时候,调用这个原语自我阻塞,将PCB插入信号量等待队列中。
应用
1.实现前驱关系
要是有Pi->Pj,即进程Pi是Pj的直接前驱,Pj必须在Pi完成后才能进行
可以设置初值为0的公共信号量S,在Pi后面加Signal(S),在Pj前面加wait(S)。
2.实现多个进程互斥地访问某临界资源
设置初值为1的互斥信号量mutex,在每个进程的临界区前后分别加wait(mutex)和signal(mutex)。
5.经典进程同步问题
生产者-消费者
哲学家进餐
读者-写者
进程通信
根据信息量多寡和通信效率高低将进程通信分为低级和高级。
前面提到的互斥进制和共享存储器系统属于低级通信。
1.共享存储器系统
通过读写共享存储区来交换数据。
2.管道通信
管道指连接了两个进程的共享文件。管道是临界资源。必须采用互斥机制。
3.消息传递系统
数据交换以格式化的消息为单位。
分为直接和间接两类。
所谓直接,就是源进程直接把消息发送给目的进程。
所谓间接,就是在收发进程间引入了信箱,这样通信可以是非实时的。
4.C/S系统
分为套接字、远程过程调用、远程方法调用。
5.消息缓冲队列通信机制
媒介:内存中公用的消息缓冲区
对应第三小节中的直接通信
最重要的数据结构是消息缓冲区,可以描述为
struct message_buffer{int sender;//发送进程的标识符int size;//消息长度char *text;//消息正文struct message_buffer *next;//指向下一消息缓冲区的指针
}
PCB中需要加入一下数据项
mq:消息缓冲队列队首指针
mutex:消息缓冲队列的互斥信号量
sm:消息缓冲队列的资源信号量
OS会提供发送原语send和接收原语receive。
参考: 《计算机操作系统(第四版)--学习指导与题解》 梁红兵 汤小丹 汤子瀛
相关文章:

(转自Timon's wang blogs)C#实现web信息自动抓取
原文转自:http://www.csharp.net.cn/post/C实现web信息自动抓取.html主要为了学习一下相关的网络蜘蛛,为自己获取信息使用背景 随着Internet的普及,网络信息正以极高的速度增长,在这么多数据中找到自己需要的信息是一件很繁琐的事…

数据结构-栈与队列
栈的定义 栈是限定仅在表尾进行插入和删除操作的线性表 我们把允许插入和删除的一端称为栈顶 (top) ,另一端称为栈底 (bottom) ,不含任何数据元素的栈称为空栈。 栈又称为后进先出 (Last In Filrst Out) 的线性表,简称LIFO结构。 理解栈的定义…

雷观(七):靠谱的程序员,不是随便一个码农就可以做到的
在学习Web开发4年之后,我自己可以独立做一些基本的项目了。在加入前单位秒针,也做了几个Web项目。 我发现一个现象,很多公司大部分的Web项目,用到的技术很少,主要就是SSH等框架,实现一些行业的业务逻辑&…

1032 Sharing
思路很简单,不要想多了,就是找第一个出现的共同字母,即使后面不一样了也没关系。 经验收获如下: 1. 5位整数算小整数,用静态链表,本质上是哈希。 2. 读入字符型的时候千万注意空格。 AC代码 #include&…

Magento开发的特点有哪些?
Magento是一套专业开源的电子商务系统,也是目前主流的外贸网站购物系统,都是居于PHP语言开发的,数据库使用的是Mysql,且浏览界面很适合欧美用户的使用习惯。Magento开发设计得非常灵活,具有模块化架构体系和丰富的功能…

Linux多任务编程之五:exit()和_exit()函数(转)
来源:CSDN 作者:王文松 转自:Linux公社 ------------------------------------------------------------------------------------------------------------------------------------------------ wait()和waitpid() 函数说明 wait()函数用…

LogMiner日志分析工具的使用
1.安装logminer: 要安装LogMiner工具,必须首先要运行下面这样两个脚本, $ORACLE_HOME/rdbms/admin/dbmslm.sql $ORACLE_HOME/rdbms/admin/dbmslmd.sql. 这两个脚本必须均以SYS用户身份运行。 *************使用字典文件…

1052 Linked List Sorting
1. 开始测试点4不通过,得分24/25,是忽略了所有节点都不在链表上的特殊情况。 2. 其实就是用静态链表,把结点根据值的大小,升序排列,所以一开始把每个结点的key赋值为超出最大值的maxn,是为了方便输出。 3…

C#尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
用VS2012调试时发现在调用数据集时提示“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。” 用管理员身份运行CMD,输入netsh winsock reset并回车 转载于:https://www.cnblogs.com/CandiceW/p/4204552.html

TFS2008 + Windows2003 + Sql2005 安装注意事项
TFS2008并不是一个很容易安装的软件,很多时候能否顺利安装成功跟人品有关(笑),要想一次安装成功,强烈建议准备一个全新的干净系统。 1.系统 最好采用刚安装好的windows2003,注意要打上sp2,安装IIS(如果IIS默认站点的主…

发票拍照识别OCR
发票拍照识别系统还可与政府、企事业单位、工商等多个行业的业务流程系统无缝结合,辅助办公人员进行发票等单据的信息录入,提高资料电子化、数据格式化的效率。 那么发票拍照识别系统有哪些技术特点呢? 1、中安发票拍照识别系统支持安卓andro…

1097 Deduplication on a Linked List
1. 开始测试点4不通过,检查后发现是犯了低级错误,把表示绝对值有无出现的整型数组的大小设置为了4000(题目中说绝对值不会超过10的4次方),所以最小也该是10001。 2. 我认为和其他链表题相比,本题是不需要给结点加特殊属性用来排序…

搞定MyBatis
对于从事 Java EE 的开发人员来说,iBatis 是一个再熟悉不过的持久层框架了,在 Hibernate、JPA 这样的一站式对象 / 关系映射(O/R Mapping)解决方案盛行之前,iBaits 基本是持久层框架的不二选择。即使在持久层框架层出不…

6-6.用HLSL定义点光源
6-6.用HLSL定义点光源问题直到现在,你已经用定向光照亮你的场景,它对添加阳光到3D世界很有用。常常,你也将需要一个单点光照,例如手电筒或爆炸。这种光源叫点光源。方案从你的XNA项目传递点光源的3D位置到你的XNA effect。为每个顶…

2018 JVM 生态报告:79% 的 Java 开发者使用 Java 8
百度智能云 云生态狂欢季 热门云产品1折起>>> 2018 JVM 生态调查报告已于近日发布,该报告由 Snyk 和 The Java Magazine(Oracle 的双月刊)联合推出,旨在了解 JDK 的实现、工具、平台和应用方面的前景。基于超过 10200 …

广度优先搜索(BFS)模板
伪代码 void BFS(int S){queue<int> q;q.push(s);while(!q.empty()){取出队首元素top;访问队首元素top;将队首元素出队;将top的下一层结点中未曾入队的结点全部入队,并设置为已入队;} } 说明 1. 定义队列q,并将起点s入队 2. 写一个while循环&a…

static关键字和内存使用
1 static静态的,用来修饰属性,方法,代码块,内部类 2 当其中一个变量对此属性进行修改,会导致其他对象对此属性的一个调用 vs 实例变量:对象各有一套副本 3 静态变量和方法随着类的加载而加载,可…

转载:用 Tomcat 和 Eclipse 开发 Web 应用程序
原文地址:http://www.ibm.com/developerworks/cn/opensource/os-eclipse-tomcat/所需的组件 Eclipse V3.2 Callisto 集成开发环境 (IDE) 包括了用于 Web 开发及与服务器集成的工具。所以,除了软件开发工具箱 (SDK) 之外,只需安装 Eclipse 和 Apache Tomc…

【学习——字符串】字符串之一网打尽quq
学弟lyh上午讲课,喜闻乐见的制胡窜 一上午讲惹KMP, manachar, trie树, AC自动机 orz 例题都是洛咕咕上的, 贴一下(督促自己不要咕 AC自动机不会qaq(并且没有学的意向 manachar 没写过 P4555 […

分别用BFS和DFS求给定的矩阵中“块”的个数
目录 背景介绍 BFS实现 基本思想 获取相邻位置元素技巧 BFS函数 DFS实现 基本思想 DFS函数 完整代码 背景介绍 背景 给出一个mxn的矩阵,矩阵中的元素为0或1。称位置(x,y)与其上下左右四个位置(x,y1),(x,y-1),(x-1,y),(x1,y)是相邻的。如果矩阵中有若干(…

[Python_7] Python Socket 编程
0. 说明 Python Socket 编程 1. TCP 协议 [TCP Server] 通过 netstat -ano 查看端口是否开启 # -*-coding:utf-8-*-"""TCP 协议的 Socket 编程,Server 端Server 端绑定到指定地址,监听特定的端口,接受发来的连接请求 "&q…

2014.12.01 B/S之windows8.1下安装IIS
1、打开 控制面板——程序——程序和功能——启用或关闭windows功能 2、找到Internet信息服务 3、等待安装完毕即可 4、控制面板——系统和安全——管理工具——Internet Information Services (IIS)管理器 默认路径为 C:\inetpub\wwwroot 路径更改以后记得更改权限。 转载于:h…

[分享]C# 获取Outlook帐号和密码
[分享]C# 获取Outlook帐号和密码http://www.vjsdn.com/bbs/bbsTopicDetails.aspx?pid108281214 转载于:https://www.cnblogs.com/vjsdn/archive/2009/09/26/1574341.html

BFS:走出迷宫并输出最小步数
目录 背景 描述 例子 思路 完整代码 收获总结 背景 描述 给定一个n*m大小的迷宫,其中*代表不可通过的墙壁,而“.”代表墙壁,S表示起点,T代表重点。移动过程中,如果当前位置是(x,y)(下标从0开始),且…

人工智能和机器学习领域有哪些有趣的开源项目
人工智能和机器学习领域有哪些有趣的开源项目?投递人 itwriter 发布于 2014-12-02 11:21 评论(0) 有20人阅读 原文链接 [收藏] 本文简要介绍了 10 款 Quora 上网友推荐的 人工智能和机器学习领域方面的开源项目。 GraphLab GraphLab 是一种新的面向机器学习…

复杂度归纳--小结
一、复杂度分析的4个概念1.最坏情况时间复杂度:代码在最理想情况下执行的时间复杂度。2.最好情况时间复杂度:代码在最坏情况下执行的时间复杂度。3.平均时间复杂度:用代码在所有情况下执行的次数的加权平均值表示。4.均摊时间复杂度ÿ…

KDE社区:首个KDialogue正式开放
今天KDE社区与“People Behind KDE” 合作推出一个非常有意思的栏目,叫作KDialogue。 关于KDialogue,有点类似头脑风暴。简言之就是成员向社区发起关于KDE的话题(或某一问题),然后KDE的开发者会被邀请参与这个话题。KE…

1091 Acute Stroke 需再做
这是BFS的典型应用场景:求给定矩阵中块(由相邻的点组成)的大小之和。不同的是这一次是三维。 判断是否邻接的依据是是否有公共边,还是可以用上增量数组的技巧 int X[6] {0,0,1,-1,0,0};//增量数组 int Y[6] {1,-1,0,0,0,0}; int Z[6] {0,0,0,0,1,-…

Ext UI 第一步
Code//Ext.onReady(function(){ var _panelnew Ext.Panel({ renderTo:Ext.getBody(), title:"XXX" });});空面板 加按钮方法:addButton(String/Object _config,Function _handler,Object _scope):添加一个按钮对象到面板Codevar loadfunction(){ …

深入浅出 Java Concurrency (29): 线程池 part 2 Executor 以及Executors[转]
Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService。 下面这张图完整描述了线程池的类体系结构。 首先Executor的execute方法只是执行一个Runnable的任务&…