操作系统学习笔记(day3)进程状态及转换

1. 为什么要引入进程状态?

1.1 简单例子说明进程在内存会发生什么

先介绍以下概念:
轨迹(trace): 列出为进程执行的指令序列,可描述单个进程的行为,这样的序列称为进程轨迹
如何描述处理器的行为:只要给出各个进程之间的交替行为,就可以描述处理器的行为。
分派器: 就是调度器,用于进程间切换。

简单的例子:
图中给出了三个进程在内存中的布局,为简化讨论,假设未使用虚存,因此所有三个进程都由完全载入内存中的程序表示。此外,给出了一个分派器用于进程的切换。
读图:
从下图中,我们知道进程A的起始地址是500,进程B的起始地址是8000,进程C的起始地址是12000,从程序计数器的值8000,我们知道这张图表示此时刚开始执行进程B。
图1
假设操作系统为避免任何一个进程独占处理器时间,仅允许一个进程最多连续执行6个指令周期,此后将被中断。假设每切换一次进程需要分派器执行6个指令周期才完成切换。假设进程B执行第4条语句时进行I/O请求。
现分析程序最初52个指令周期中交替出现的轨迹:
图2
上图中,进程A的前6条指令执行后,出现一个超时,然后进行分派器的某些代码,在将控制权交给进程B前,分派器执行了6条指令。在进程B的第4条指令执行后,进程B请求一个它必须等待的I/O操作,因此处理器停止执行进程B,并通过分派器转移到进程C,在超时后,处理器返回进程A,这次超时后,进程B仍然等待那个I/O操作的完成,因此分派器再次转移到进程C。

三个进程在执行过程早期(最初52个指令周期)的轨迹:
图3

1.2 两状态模型

上面的简单例子说明了我们操作系统需要控制进程的执行(执行进程和超时时剥夺进程的处理机),包括确定进程交替执行的方式和进程分配资源。因此我们需要描述进程的状态,以便操作系统根据进程状态控制进程。
通过上述例子,可知在任一时刻,一个进程要么正在执行,要么未执行。因此可以构建一个简单的模型:
图4 进程转换图
从这个模型中,我们可以看出:当一个进程被创建的时候就以未运行态加入系统,操作系统能知道这个进程的存在,以及这个进程在等待运行机会。当前进程由于运行的时间片到了或者发生了I/O请求,分派器就按某个算法(比如前面的顺序执行)从非运行态中选择一个进程运行,前一个进程从运行态转变为未运行态,后一个进程由未运行态转变为运行态。
操作系统如何知道哪个进程该不该运行,哪个进程是否正在运行,要从哪里调用进程进入处理机?
为了解决这个问题,必须用某种方式来表示每一个进程,以便使得操作系统能够跟踪到它,即必须有一些与进程相关的信息,包括进程在内存中的当前状态和位置。对于单处理机,处于运行态的进程只用一个,而处于未运行态的进程有很多个,所以必须将未运行进程位于某种类型的队列里,并等待执行机会。如下图:
队列
队列中的每项有指向某个特定进程的指针,或者可以由数据块构成的链表组成,每一个数据块表示一个进程。

2. 引入创建和终止

无论哪种进程行为模型,进程的周期都围绕着进程的创建和终止。

2.1 导致进程创建的原因

概念 将一个新进程添加到正被管理的进程集时,操作系统需要建立用于管理该进程的数据结构PCB,并在内存中给它分配地址空间,这些行为构成了一个新进程的创建过程。

事件说明
新的批处理作业磁盘或磁盘中的批处理作业控制指令通常会提供给操作系统。
当操作系统准备接受新工作时,将读取下一个作业控制命令
交互登录终端用户登入到系统
为提供服务而由操作系统创建操作系统可以创建一个进程,代表用户程序执行一个功能,使用户无需等待
由现有进程派生基于模块化的考虑或开发并行性,用户程序可以指示创建多个进程

进程的创建可以由操作系统自己创建,也可以由一个进程引发另一个进程。

  1. 操作系统以对用户或应用程序透明的方式来创建所有进程。
  2. 由一个进程引发另一个进程,例如:一个应用程序进程可以产生另一个进程,以接受应用程序产生的数据,并将数据组织成适合于后续分析的格式。

当操作系统为另一个进程的显示请求创建一个进程时,这个动作就称为进程派生
当一个进程派生另一个进程时,前一个进程称为父进程,被派生的进程称为子进程

2.2 导致进程终止的原因

概念 任何一个计算机系统都必须为进程提供表示其完成的方法。

事件说明
正常完成进程自行执行一个操作系统服务调用,表示它已经运行结束
超过时限进程运行时间超过规定的时限
无可用内存系统无法满足进程需要的内存空间
超出范围进程试图访问不允许访问的内存单元
保护错误进程试图使用不允许使用的资源或文件,或试图以一种不正确的方式使用,如往只读文件中写
算术错误进程试图进行被禁止的计算,如除以零或存储大于硬件可以接纳的数字
时间超出进程等待某一事件发生的时间超过了规定的最大值
I/O失败在输入或输出期间发生错误,如找不到文件、在超过规定的最多努力次数后仍读/写失败或操作无效
无效指令进程试图执行一个不存在的指令(通常时由于传送到了数据区并企图执行数据)
特权指令进程试图使用为操作系统保留的指令
数据误用错误类型或未初始化的一块数据
操作员或操作系统干涉由于某些原因操作员或操作系统终止进程(如出现死锁)
父进程终止当一个父进程终止时,操作系统可能会自动终止该进程的所有子进程
父进程请求父进程通常具有终止其任何子进程的能力

3. 五状态模型

3.1 引入阻塞状态的必要性

在先前的两状态模型中,处理器以轮转的方式操作(依次给队列中每一个进程一定的执行时间,然后进程返回队列)。在前面的简单例子中,存在这一个由于处于I/O请求所以没有得到处理机运行的进程B,虽然轮转到了进程B,但是进程B在等待I/O操作的完成,所以处理机不执行进程B而执行B后面的进程C。从这个例子可以看出,处理器从队列中在按照排在队列前边的先执行的同时要判断这个进程是不是可以被执行的(即是否处于I/O状态)。处理器要对一个一个进程判断,这无疑增加了处理机的开销。
解决该问题的一种较好方法是:将非运行态分成l两个状态:就绪态和阻塞态。
此外还应增加前面讲到的创建态和终止态。

3.2 五状态模型及各状态间的转换

  1. 运行态:进程正在执行。
  2. 就绪态:进程做好了准备,只要有机会就开始运行。(分配到除CPU以外的所有必要资源)
  3. 阻塞态:进程在某些事件发生前不能执行。(如I/O请求)
  4. 创建态:进程控制块已经创建但未加载到内存中的新进程。
  5. 终止态:要么自己停止,要么因某种原因被取消。

在这里插入图片描述

3.3 单阻塞队列与多阻塞队列

阻塞队列
按照等待事件的类型可以将单阻塞队列分为多阻塞队列。在多阻塞队列中,当某一等待事件发生时,相应队列的所有进程都将转换到就绪态。

4. 挂起操作

4.1 引入挂起的原因

  1. 终端用户的需要。当终端用户在自己的程序运行期间发现有可疑问题,希望暂停自己的程序的运行,使之停下,以便用户研究其执行情况或对程序进行修改。
  2. 父进程请求。有时父进程希望挂起自己的某个子进程,以便考查和修改该子进程,或者协调子进程间的活动。
  3. 负荷调节的需要。当实时系统中的工作负荷较重,已可能影响到实时任务的控制时,可由系统把一些不重要的进程挂起,以保证系统能正常运行。
  4. 操作系统的需要。操作系统有时希望挂起某些进程,以便检查运行中的资源使用情况或进行记账。

4.2 引入挂起后各状态的转换

在这里插入图片描述

4.3 挂起进程的特点

  1. 该进程不能立即执行
  2. 该进程可能在也可能不在等待一个事件。若在等待一个事件,那么阻塞条件不依赖于挂起操作,阻塞事件的发生不会使进程立即执行。
  3. 为阻止该进程执行,可通过代理使其置于挂起态,代理可以是进程本身,也可以是父进程或操作系统。
  4. 除非代理显示地命令系统进行状态切换,否则该进程无法从这一状态转移。

4.4 导致挂起的原因

事件说明
交换操作系统需要释放足够的内存空间,以调入并执行处于就绪态的进程
其他OS原因操作系统可能挂起后台进程或工具程序进程,或挂起可能会导致问题的进程
交互式用户请求用户希望挂起一个程序的执行,以便进行调试或关联资源的使用
定时进程可被周期性地执行(如记账或系统监视进程),并在等待下一个时间间隔时挂起
父进程请求父进程可能会希望挂起后代进程的执行,以检查或修改挂起的进程,或协调不同后代进程之间的行为
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值