当前位置: 首页 > 编程日记 > 正文

进程详细剖析(二)

摘自《C++多核高级编程》

5.6.3  进程状态

在进程执行期间,它的状态会发生改变。进程的状态时指进程的当前状况。在POSIX兼容的环境中,进程可以处于以下状态:

1)运行(running)

2)就绪(runnable, ready)

3)僵死(zombied)

4)等待(waiting, blocked)

5)停止(stopped)

进程的当前状况取决于进程或操作系统所创造的境况(circumstance)。当特定境况出现时,进程将改变它的状态。状态转换(state transition)是进程改变其状态的境况。下图时进程的状态图,状态图由节点以及节点之间的有向边组成。每个节点代表进程的状态,节点之间的有向边时状态转换。表5-4列出了状态转换以及简要描述。如下图和下表所以,状态之间只能发生特定转换。例如,在就绪和运行之间存在转换,但是在休眠和运行之间不存在转换。这意味着有一些境况能够导致一个进程从就绪状态转到运行状态,但是没有哪个境况能够使得进程从休眠状态转到运行状态。

当创建了一个进程后,它就已经准备好执行它的指令了,但是它首先必须等待,直到处理器可用。每个进程只允许使用处理器一小段时间,被称作时间片(time slice)。等待使用处理器的进程处于就绪队列中,只要就绪队列中的进程会被调度器选中来使用处理器。就绪队列中的进程时可运行的(runnable)。当处理器可用时,会由分派器(dispatcher)指派一个可运行的进程给处理器。当时间片用完之后,无论它是否运行完它的全部指令,进程都将被从处理器上移除。进程会被放回到就绪队列中,等待下一次轮到它使用处理器。从就绪队列中选出一个新的进程并给它时间片来执行。系统进程是非抢占式的,当它们占用处理器后,会一直运行到结束。如果时间片没有用完,进程如果因为等待某个事件的发生而不能够继续处理,会主动放弃处理器。进程也可能通过发起系统调用来发出访问I/O设备的请求,或者可能需要等待一个同步变量被释放。由于等待事件发生而不能够继续执行的进程会处于休眠状态,它会同其他休眠进程一同被放入一个队列中。当事件发生之后,会从该队列中将它们删除,病放回到就绪队列中。在时间片被用完之前,进程锁使用的处理器可能被抢夺走,这发生在有更高优先级的进程可运行时,如系统进程。被强占的进程仍然是可运行的,因此会被放到就绪队列中。

运行中的进程可能会收到一个停止信号。停止状态同休眠状态是不同的,进程的时间片没有用完,而进程也没有发起任何系统请求。进程可能会接收到停止信号,是因为它正在被调试,或者在系统中发生了某种情况。进程接收到信号后,会进行从运行状态到停止状态的转换,稍后进程可能会被唤醒,或者可能被销毁。

当进程执行完所有的指令后,它会退出系统。进程会从进程表中被删除,PCB将被销毁,它的所有 资源将被释放并退回到系统可用资源池中。不能够继续执行但也不能够退出系统的进程的状态被称为僵死状态。僵死进程不使用任何系统资源,但是仍然在进程表中占用一个条目。当进程表中包含过多的僵死进程时,会影响系统的性能,甚至可能导致系统重新启动。

5.6.4 进程是如何被调度的

当一个就绪队列包含多个进程时,调度器必须决定首先将哪个进程指派给处理器。调度器维护使得它可以以高效的方式调度进程的数据结构。每个进程将被赋予一个优先级别,并同其他有着相同优先级别的可运行进程放置在同一个优先级队列中。存在多个优先级队列,每个队列代表系统所使用的不同的优先级别。这些优先级别队列时分不同等级的,而且被放置在一个名为多优先级队列(multilevel priority queue)的分派数组(dispatcg arrat)中。下图描述了多个优先级队列。数组中的每个元素指向一个优先级队列。调度器将位于非空最高优先级队列头部的进程指派给处理器。

优先级可以时动态的或静态的。一旦进程的静态优先级被设置,则不能够改变它,而动态优先级是可以改变的。有着最高优先级的进程可以垄断对处理器的使用。如果一个进程的优先级时动态的,最初的优先级可以被调整为更合适的值。进程会被放置到有着更改优先级的优先级队列。还可以给垄断处理器的进程设置较低的优先级,或者把其他进程的优先级设置得更高一些。当您为用户进程设置优先级时,需要考虑进程多数时间是做什么类型的工作。有些进程是CPU密集型的,这些进程在整个时间片内部都使用处理器,有些进程将多数时间用于等待I/O或一些其他事件的发生。当这样的一个进程准备好使用处理器时,应当立即将处理器交给它使用,这样它能够处理下一个I/O请求。交互进程可能会要求高优先级来保证良好的响应时间。系统进程的优先级高于用户进程。

进程是根据调度策略放置在优先级队列中的,在POSIX API中使用的两个主要调度策略是FIFO(First-in, First-out, 先进先出)和RR(round robin, 轮询)策略。

1)下图显示了FIFO调度策略。使用FIFO调度策略时,进程时根据到达队列的时间被指派给处理器的。当正在运行的进程的时间片耗尽时,它会被放置到优先级的头部。当一个休眠进程变为可运行时,它将被放置在优先级队列的尾部。进程可以发起系统调用并放弃处理器,将处理器交给有着相同优先级等级的另一个进程,然后这个进程会被放置到优先级队列的尾部。

2)在轮询调度策略下,所有进程都被同等对待。下图描述了RR调度策略。RR调度和FIFO的区别在于:当时间片耗尽时,进程被放置到队列的后端,同时队列中的下一个进程被指派给处理器。除了这一点之外,RR和FIFO相同。

上图显示了FIFO和RR调度策略的行为。FIFO调度策略根据进程到达队列的时间将它们指派到处理器,进程将一直运行,直到结束。RR调度策略使用FIFO调度指派线程,但是当时间片耗尽时,进程将被放置到就绪队列的尾部。

转载于:https://www.cnblogs.com/rohens-hbg/p/10153829.html

相关文章:

AI算力需求6年增长30万倍,「超异构计算」才能满足下一个10年

今年 3 月,「强化学习教父」Richard Sutton 在《苦涩的教训》一文中指出,「70 年的人工智能研究史告诉我们,利用计算能力的一般方法最终是最有效的方法。要在短期内有所提升,研究人员要利用专门领域的人类知识。但如果想要长期的获…

一览六月最热的5篇AI技术论文

作者 | 神经小姐姐转载自HyperAI超神经(ID: HyperAI)导语:始建于 1991 年的 arXiv.org 至今已收录超过 100 万篇论文预印本,近年来,其每月提交量已经超过 1 万篇。这里成为一个巨大的学习宝库。本文罗列了 arXiv.org 上…

OnCheckedChanged的触发需要AutoPostBack=true

OnCheckedChanged的触发需要AutoPostBack"true"

OpenCV中resize函数五种插值算法的实现过程

最新版OpenCV2.4.7中,cv::resize函数有五种插值算法:最近邻、双线性、双三次、基于像素区域关系、兰索斯插值。下面用for循环代替cv::resize函数来说明其详细的插值实现过程,其中部分代码摘自于cv::resize函数中的源代码。 每种插值算法的前…

企业金融云存储建设之路

当前世界形势千变万化,各种技术创新层出不穷,新兴业务模式也是波谲云诡,企业的信息化建设如何紧跟业务,适应业务乃至驱动业务转型是各级管理者的头等题目。对于底层执行者,如何能够快速满足企业的要求,如何…

【原创】VB利用堆栈实现算术表达式计算

这个抽象算法早已为人所知,只不过在VB的公开文档中鲜见示例代码。于是,为了提高自己的程序设计水平,锻炼自己的能力,我写了如下代码。 【VB代码版权所有,允许转载修改用作学习目的,转载必须注明来源】 【求…

树莓派4与英伟达Jetson Nano性能大比拼,谁是最佳的嵌入式“电脑”?

作者 | Chris Pietschmann译者 | 弯月,责编 | 屠敏转载自CSDN(ID:CSDNnews)导读:日前,Raspberry 基金会发布了开发者为之兴奋的 Raspberry Pi 4,其不仅在性能上进行了全面的升级,而且…

作为互联网流量入口,CDN日志大数据你该怎么玩?

CDN是非常重要的互联网基础设施,用户可以通过CDN,快速的访问网络中各种图片,视频等资源。在访问过程中,CDN会产生大量的日志数据,而随着如今越来越复杂的网络环境变化,和业务的迅速增长,日志数据…

OpenCV中图像旋转(warpAffine)算法的实现过程

在OpenCV中,目前并没有现成的函数直接用来实现图像旋转,它是用仿射变换函数cv::warpAffine来实现的,此函数目前支持4种插值算法,最近邻、双线性、双三次、兰索斯插值,如果传进去的参数为基于像素区域关系插值算法(INTE…

10亿美元续命!OpenAI获微软投资,意在通用人工智能?

来源 | OpenAI官博译者 | 孙薇编辑 | 一一出品 | AI科技大本营(ID:rgznai100) 7 月 22 日,微软宣布将对非营利人工智能研究组织 OpenAI 投资 10 亿美元,用于通用人工智能(AGI)的开发。双方将以微软原有的公…

TrayIcon 类 添加系统托盘不显示托盘图标

为什么80%的码农都做不了架构师?>>> 好久不碰 java swing最近写了一个swing 程序 添加托盘时,怎么也不显示图标,就一空白 ,在网上搜了老半天,大部无效。 边看帖子边看 java api ,结合理解,有一属性设置了一…

Crystal Report 加载模板报错 无法在c++ 堆栈中打开由jrc 引擎处理的文档

2019独角兽企业重金招聘Python工程师标准>>> 纠结了很久, 尝试过录入一个错误的路径,文件读取也是包相同的错误,也就是表示找不到路径文件而已,并不是开发环境的问题 于是设置一个最简单的路径,放置下去rpt模板,代码后续没有报错; 再次之前也修复了一个关于引用的dl…

Ubuntu下makefile及gcc生成静态库动态库的简单使用举例

环境:Ubuntu-13.10 32位(虚拟机)、gcc4.8.1 首先创建一个test_makefile_gcc文件夹,此test_makefile_gcc文件夹下包括:src文件夹用于存放源文件; include文件夹用于存放头文件;bin文件夹用于存放生成的动态库.so文件&…

Exchange Server 2013 安装完成后配置外部URL

Exchange Server 2013 安装完成后配置外部URL 比如 mail.contoso.com 1、转到 EAC → “服务器”,然后单击“配置外部访问域”。2、在“选择要与外部 URL 一起使用的客户端访问服务器”下面,单击“添加”3、选择您要配置的客户端访问服务器,…

Ubuntu下CodeBlocks的安装、配置及静态库动态库的简单使用举例

1、 从Ubuntu Software Center中搜索Code::Blocks并安装; 2、 在第一次启动时选择GNU GCC Compiler作为默认的编译器; 3、 生成静态库并调用操作步骤,代码同 http://blog.csdn.net/fengbingchun/article/details/17994489 3.1、New fil…

React 打怪笔记

介绍 本文为学习react中的记录。 Tips: 当组件的props或state有变化,执行render函数。无论是使用函数或是类来声明一个组件,它决不能修改它自己的propsReact 可以将多个setState() 调用合并成一个调用来提高性能。无状态函数式组件 (stateless functiona…

新闻智能分类练习赛开始报名啦!最先达到80分就可以领GPU,技术书籍!

现代信息爆炸般地产生,信息如海如潮。信息分类,不仅有利于加快信息检索速度,且有利于提高查准率。Internet是信息的重要载体,深入地研究与探讨网上信息自动分类的方法、技术和理论,已成为时代的迫切需求和新的研究热点…

项目经理应该具备的技能

作为一个优秀的项目经理应该具备五个方面的技能: 项目管理知识体系 应用领域的相关知识、标准和规则项目环境知识一般管理知识软技能/人际关系技能项目管理知识体系 就是要掌握常说的9大知识领域:范围、时间、成本、质量、人力资源、风险、沟通、采购再加上集成…

SSE2 Intrinsics各函数介绍

SIMD相关头文件包括&#xff1a; //#include <ivec.h>//MMX//#include <fvec.h>//SSE(also include ivec.h)//#include <dvec.h>//SSE2(also include fvec.h)#include <mmintrin.h> //MMX#include <xmmintrin.h> //SSE(include mmintrin.h)#incl…

中国城市道路名图鉴

作者| AlfredWu来源 | Alfred数据室&#xff08;ID&#xff1a;Alfred_Lab&#xff09;不知道大家出差或旅游的时候有没有发现&#xff0c;有些城市特别喜欢使用其它城市或者省份的名字作为道路名&#xff0c;特别是青岛市&#xff0c;这会儿还在徐州路&#xff0c;走过一个街区…

中国电子信息产业发展研究院主办的2018中国软件大会上大快搜索“又双叒叕”获奖了...

大快搜索自荣获“2018中国大数据企业50强”殊荣&#xff0c;12月20日在由工信部指导&#xff0c;中国电子信息产业化发展研究院主办的2018中国软件大会上&#xff0c;大快搜索获评“2018中国大数据基础软件领域领军企业”称号&#xff0c;入选中国数字化转型TOP100服务商&#…

SystemCenter2012SP1实践(15)共享库服务器和ISO

用过HyperV的同学都知道&#xff0c;HyperV调用ISO作为启动光盘的时候&#xff0c;必须保存在本地才行。网络共享下的一概不认。在SCVMM下&#xff0c;我们可以通过一些设置&#xff0c;让SCVMM下创建的虚拟机&#xff0c;支持调用不在同一台主机上的ISO文件。我是分隔线首先要…

XLNet:公平PK,BERT你已经被超过!

作者 | XLNet Team译者 | 孙薇责编 | Jane出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导语】几周前&#xff0c;XLNet 团队发布了新型预训练语言模型 XLNet&#xff0c;这个新模型在各项基准测试中都优于谷歌之前发布的BERT模型&#xff0c;其中模型 XLNet-La…

C/C++中switch用法的一种替换方式

在C/C中&#xff0c;switch语句是经常被用到的&#xff0c;当switch内的case语句较多时程序有时显得比较繁乱&#xff0c;此种情况下可以用另外一种实现方式替代switch。详细用法见例子&#xff1a; #include "stdafx.h"float AddFunc(float a, float b) {return (a …

My excellent 2018

又到一年年底时&#xff0c;除了感叹一句时间过得真快之外&#xff0c;也非常庆幸自己能够渡过了这精彩的一年。 工作 首先是工作上面的变化。自16年毕业以后就在招联消费金融有限公司上班&#xff0c;一直到今年的五月份。在招联的期间&#xff0c;有幸得到老大的赏识&#xf…

POJ 2955 Brackets (区间DP)

题目链接&#xff1a;http://poj.org/problem?id2955 BracketsTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 1977 Accepted: 1012Description We give the following inductive definition of a “regular brackets” sequence: the empty sequence is a regul…

从芯片到AI智能芯片,一文了解它的前世今生

作者 | 元宵大师&#xff0c;Python高级工程师&#xff0c;致力于推动人工智能、大数据分析在金融量化交易领域中的应用。欢迎大家关注我的个人公众号《元宵大师带你用Python量化交易》。责编 | 胡巍巍来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;经过长期的发展…

Windows7下OpenGL简单使用举例

1、 从http://www.opengl.org/resources/libraries/glut/glut_downloads.php下载glut相关头文件和库glutdlls37beta.zip &#xff0c;(默认的windows机子上并没有glut头文件及相应的库&#xff0c;它主要用来打开窗口、开发和管理菜单&#xff0c;以及管理事件等)&#xff0c;…

Snagit9-12注册码

SnagIt 9 注册码&#xff1a; AM5SC-8LWML-MVMWU-DTLGE-ERMBE SnagIt 10 注册码&#xff1a; 5HCAK-DEGMZ-EYABA-M4LCC-ACBE2 DFKDA-JZ5FC-TGLAA-CM5DM-MFEBD CMCFH-93DCD-SFZYC-K5KCM-C7CA7 SnagIt 11 注册码&#xff1a; 7CTCC-5WQCS-98AY8-V8F2M-76258 NCTCC-5WFCK-98A28-V8…

Strut2访问

访问HelloWorld应用的路径的设置 在struts2中&#xff0c;访问struts2中action的URL路径由两部份组成&#xff1a; 包的命名空间action的名称 例如: 访问本例子HelloWorldAction的URL路径为&#xff1a; /l6n/helloWorldAction (注意&#xff1a;完整路径为&#xff1a;http:/…