第三章——进程描述和控制

一、什么是进程

(一)进程的背景——需要解决的问题

①失败的互斥
②不正确的同步
③不可确定的程序操作
④死锁
(详见第二章笔记)

(二)操作系统管理应用程序执行的目标

①资源对于多个应用是可用的。
②处理器在多个应用程序间切换,以确保所有程序都在执行中。
③处理器和I/O设备得到充分利用


为了达到这些目标、解决上面的问题,要依赖一个模型——应用程序的执行依赖一个或者多个进程。

(三)进程和进程控制块

1、进程

定义:
①一个正在执行的程序
②有一个单一顺序线程、一个当前状态和一组相关的系统资源所表征的活动单元
这是等价的表述,其中①用于答题,②用于理解本质。

第二章:进程 = 程序 + 数据 + 进程上下文
第三章:进程的两个基本元素是程序代码和数据集,当处理器开始执行这段程序时,我们把这个执行实体称为进程。

数据集包含程序所需的数据以及进程上下文(也被称为数据)

进程和程序的区别:
程序是静态存储的,而进程是动态运行的。

进程执行的任何时刻都可以由如下元素表征:
①标识符(Pid):用于区分进程的唯一标识符(整形)
②状态:进程所处的状态
③优先级:相对于其他进程的优先顺序
④程序计数器:程序中即将执行的下一条指令
⑤内存指针:包含程序代码和进程相关的指针,以及与其他进程共享内存块的指针
⑥上下文数据:进程执行时处理器的寄存器中的数据
⑦I/O状态信息:包含显式I/O请求、分配给进程的I/O设备、被进程使用的文件列表
⑧记账信息:处理器时间总和、使用的时钟数总和、时间限制、记帐号

这里有一点乱,我结合原著中的英语说明一下
第二章中的概念:进程上下文(execution context),又称为进程状态(process state)。
第三章中的概念:上下文数据(context data);状态(state)。
进程状态(process state)和状态(state)并不是一个概念,进程上下文(execution context)和上下文数据(context data)也不是一个概念。
中文“进程状态”就很奇妙了,既可以是专有名词指进程上下文;也可能是“进程”做定语修饰“状态”,有歧义。

(存疑:进程上下文近似可以看作这里所有元素的总和)

2、进程控制块

①上面提到的用于表征进程的的所有元素存放在一个称为进程控制块的数据结构中
②进程控制块由操作系统创建和管理
③进程控制块包含了进程的所有信息,因此可以通过进程控制块中断及恢复进程的执行(这与第二章中进程上下文的保存和恢复相一致)
进程控制块

二、进程状态

(一)若干重要概念

轨迹:进程执行的指令序列
进程的组合轨迹:多个进程执行的指令序列
例子:
内存中的3个进程的指令存储如下
在这里插入图片描述

3个进程的轨迹如下
在这里插入图片描述

组合轨迹如下
在这里插入图片描述

进程状态:进程所处的状态

轨迹和进程状态都可以用来描述进程,那么为什么要在拥有了轨迹的前提下,引入进程状态这个概念呢?
因为实际中,计算机中有多个进程,每一个进程有多条指令,由此形成的轨迹非常复杂,不利于进行进程描述,所以我们要引入进程状态的概念。

1、进程的创建

大致流程(详细的步骤为5步,之后详解):
①操作系统建立用于管理进程的数据结构
②操作系统在内存为进程分配空间

什么情况下会创建进程:
①出现新的批处理作业:操作系统响应批处理作业时会创建进程
②交互登录:终端用户登陆到系统时会创建进程
③操作系统提供服务:在其他进程需要操作系统提供服务时,操作系统会创建进程,使用户无需等待(如控制I/O设备的进程)
④由现有进程派生:已有的进程可能需要创建子进程(进程永远是操作系统建立的,已有进程通过向操作系统发出请求,再由操作系统创建进程)

允许一个进程引发另一个进程的创建是很有用的,相关进程需要相互之间的通信和合作。
进程派生:操作系统为一个进程显式地创建另一个进程的动作称为进程派生。
当A进程派生B进程时,A称为父进程,B称为子进程

2、进程的终止

终止:即进程不再被执行。
终止进程的情况分类:
①进程正常完成
②用户请求终端进程
③父进程终止子进程
④进程出现错误或故障

部分导致进程终止的原因如下
进程的终止条件

3、进程的退出

第一步:进程的终止
第二步:操作系统或者父进程提取该进程的信息,然后从系统中删除该进程

(二)两状态进程模型

两状态进程模型

1、进程的状态

①运行态:正在运行
②未运行态:未在运行

2、进程的4种变化

①null->非运行态:操作系统创建新的进程,进程以未运行态进入系统
②非运行态->运行态:操作系统调度未运行态的进程进入运行态
③运行态->非运行态:运行态的进程被中断,进入未执行态
④运行态->离开系统:运行态的进程退出系统

3、进程的调度

未运行态的进程位于一个队列中;
当运行态的进程进入未运行态或者离开系统时,操作系统从队列中以先入先出的原则选择一个进程执行;
队列是“先入先出表”,处理器以轮转的方式操作;
轮转:依次给队列中每个进程一定的执行时间,然后进程返回队列;
队列有以下两种形式:
①队列元素是指向进程控制块的指针
②队列元素是进程数据块(队列以链表的形式构建);
排队图

(三)五状态进程模型

1、引入的原因

进程队列中的非运行态进程可以细分为两类:
①已就绪等待执行的进程,被操作系统调度后可以被执行
②(因I/O操作等)被阻塞的进程,这些进程即使被操作系统调度,也不能执行。
如果仍以先入先出的原则调度,那么可能换入被阻塞的进程,因而需要扫描整个队列,找到未被阻塞且等待时间最长的进程,而这是很耗费资源和时间的。
所以我们需要将未运行态分为阻塞态和就绪态。
至于为什么要增加新建态和退出态,课本只说了“可以证明很有用”、“对进程管理很有用”。

2、进程的状态

①运行态:正在运行
②就绪态:只要被调度就可以立即执行
③阻塞/等待态:在某些事件(如I/O操作完成)前不能执行
④新建态:进程已经创建进程控制块,但是未被载入内存
⑤退出态:进程已经被终止运行,但是未被提取信息(或者笼统的称为“正在被释放的进程”)

位于退出态的进程相当于完成了进程退出中的第一步而没有完成第二步;
可能导致这种情况的原因是操作系统或者父进程还没来得及收集信息。

位于新建态的进程相当于完成了进程创建中的第一步而没有完成第二步;
可能导致这种情况的原因是操作系统限制进程并发度或者内存不足。

就绪态与新建态的区别是进程是否被载入内存;
在单处理器下,只能有一个进程位于运行态;
就绪态是有意义的:操作系统出于内存以及并发度的考虑会限制内存中的进程数量,从而保证内存空间以及系统不会因为并发度太高导致性能下降;

3、进程的7种变化

在这里插入图片描述

①null—>新建态:操作系统已创建进程控制信息,但是并未载入内存
(新建进程的4种原因见上)

②新建态—>就绪态:操作系统将新建的进程载入内存

③就绪态—>运行态:操作系统调度内存中就绪态的队列执行

④运行态—>阻塞态:进程遇到其必须等待事件
等待的事件大致分为3类:
a、请求操作系统提供服务,但操作系统不能立即提供服务
b、请求了一个无法立即得到的资源
c、一个进程和另一个进程通信时,可能需要等待另一个进程的信息
d、遇到了需要进行某些初始化的操作,如I/O操作

⑤阻塞态—>就绪态:进程等待事件发生

⑥运行态—>就绪态:最常见的原因是进程运行超时
a、进程运行超时
b、进程被操作系统抢占(A进程比B进程优先级低,A在执行时,B由阻塞变为就绪态,操作系统可能会因为优先级原因强制终止A的执行,而去执行B)
c、进程自愿放弃控制权(如进行周期性进行资源管理的进程)

⑦运行态—>退出态:操作系统释放进程资源

抢占的定义:操作系统收回进程正在使用的处理器资源;
关于退出态书上有些不严谨,但是不要在意这些细节;
不存在阻塞态—>运行态,因为操作系统只能从就绪队列中调度进程执行。

4、进程的调度

模式一:单阻塞队列 + 单就绪队列

进程被移除处理器后,要么进入就绪队列,要么进入阻塞队列;
当某个等待事件发生后,从阻塞队列中扫描进程,将等待该事件的进程放入就绪队列;
就绪队列没有优先级,先入先出;
相比于二状态模型的调度模型,模式一的改进在于区分了就绪进程和阻塞进程,事件发生时无需扫描就绪进程。
单阻塞队列
模式二:多阻塞队列 + 单就绪队列
根据需要等待的事件将阻塞进程分配到多个队列,当一个等待事件发生时,将相应队列的进程移入就绪队列;
就绪队列没有优先级,先入先出;
相比于模式一,模式二的改进在于细化了阻塞进程,事件发生时无需扫描与该事件无关的阻塞进程。
多阻塞队列
模式二:多阻塞队列 + 多就绪队列
单个就绪队列内部没有优先级,先入先出;
但是不同的就绪队列之间有优先级;
转换为就绪态的进程根据优先级进入不同的队列;

相比于模式二,模式三的改进在于细化了就绪队列,很容易确定具有高优先级且等待时间长的进程。

(四)七状态进程模型

1、引入的背景

原因——处理器速度远远快于I/O速度,可能内存中的大部分进程都处于阻塞状态,导致处理器利用率低。

解决方法有两种:
第一:扩大内存,增加线程数量,但是并不可行。
因为增大内存的价格很贵;更大的内存往往导致更大的进程而非更多的进程(因为内存大了,单个用户程序对内存的需求会变高)
第二:使用交换技术,腾出内存空间

交换:把内存中的某个进程的一部分或者全部移到硬盘中的挂起队列。
交换之后,操作系统选择一个新进程将其放入内存中运行。
新进程的两个来源:
①挂起队列中的进程
②新建的进程
我们更倾向于①,因为不想增加系统的负担,但是②的存在也是有必要性的,因为挂起队列中可能都是被阻塞的进程,将其放入内存没有意义。

交换也是I/O操作,为什么有效呢?
因为磁盘I/O是最快的I/O,比磁带、打印机等快得多,因而能提高性能。

2、进程的状态

①新建态
②退出态
③运行态
④阻塞态:位于内存且等待事件
⑤就绪态:位于内存且可以执行
⑥就绪/挂起态:位于外存且可以执行
⑦阻塞/挂起态:位于外存且等待事件

3、进程的变化


七状态模型

①阻塞态—>阻塞/挂起态:操作系统将阻塞态进程换出内存
a、内存中无就绪进程,需要换出阻塞进程从而为就绪进程提供内存空间
b、内存中有就绪进程但是当前运行的进程或者就绪的进程需要更多内存空间
(第八版的中文翻译有问题,我吐了)
②阻塞/挂起态—>就绪/挂起态:挂起队列中的进程等待的事件发生
③就绪/挂起态—>就绪态:挂起队列中的就绪进程换入内存的就绪队列
a、内存中无就绪进程,需要换入进程执行
b、内存中有就绪进程,但是就绪/挂起态的进程相对来说优先级更高
(优先级最重要,换入高优先级进程比减少交换I/O操作更重要)
④就绪—>就绪/挂起态:将内存中就绪队列中的进程换出到挂起队列
a、释放内存的唯一方法是换出就绪队列时,会采取这样的操作
b、操作系统确信一个优先级更高的阻塞进程即将就绪,那么它宁愿换出优先级低的就绪进程也不愿换出优先级高的阻塞进程
⑤新建态—>就绪态:和之前没有区别
⑥新建态—>就绪/挂起态:如果新建的进程都进入内存太占用空间,所以增加这个变化。
⑦阻塞/挂起态—>阻塞态:虽然把阻塞态的进程换入内存后不能立即执行,但是当该进程优先级更高并且操作系统认为这个进程等待的事件很快就会发生时,很出现这种变化
⑧运行态—>就绪/挂起态:该进程时间片用完且就绪/挂起队列中有优先级更高的队列需要进入内存。
⑨各种状态—>退出态
a、进程已完成运行
b、进程出现错误
c、父进程终止子进程
d、父进程终止时子进程被强制终止(基于这种情况,各种状态都可以变为退出态)

4、挂起

到目前为止(不考虑虚存),挂起进程等价于不在内存中的进程,等价于不能立即执行的进程。
挂起进程的特点:
①不能立即执行
②是否挂起与是否阻塞没有直接联系
③进程本身、父进程、操作系统都可以挂起进程
④想要让进程退出挂起状态,必须显式地进行状态转换

挂起进程的原因:
①交换:释放内存空间
②父进程挂起子进程:父进程从而检查、修改子进程、或者协调子进程。
③定时:有的进程需要相隔固定时间执行(如监控进程),在这次执行完毕,下次执行之前,它会被挂起
④操作系统检查到进程错误,会挂起进程
⑤用户挂起进程以调试进程

三、进程描述

在这里插入图片描述
实线代表正在使用,虚线代表请求使用。
P1:正在执行的进程
P2:内存中未在执行的阻塞进程(因为最左边的IO设备而阻塞)
Pn:被换出的进程

进程的执行需要访问3种资源(内存、处理器、I/O设备)
操作系统控制进程并管理内存、处理器、I/O设备
那么操作系统是如何管理进程和资源的呢?
下面详解。

(一)操作系统的控制结构

进程创建了4种不同类型的表以管理各种资源,这4种表以某种方式链接或者交叉引用
OS管理表

1、内存表

内存表用于跟踪内(实)存和外(虚)存。
内存表内容包含:
①分配给进程的内存
②分配给进程的外存
③内存和外存的保护属性(类似于访问权限)
④管理虚存所需的所有信息

2、I/O表

I/O表用于管理I/O设备和通道。
I/O表内容包括:
①I/O设备状态——可用or被分配
②I/O操作状态——是否正常执行
③I/O操作(写或者读)的内存单元

3、文件表

文件表内容包括:
①文件是否存在
②文件位置
③文件属性
④文件当前状态

4、进程表

下面详解

(二)进程的控制结构

进程表中的表项是指向进程映像的指针
进程映像 = 程序 + 数据 + 栈 + 属性集(又称为进程控制块)
进程控制块 = 进程标识信息 + 处理器状态信息 + 进程控制信息
进程控制块包含了操作系统管理进程所需的全部信息,对进程的操作都需要读取和修改进程控制块
进程表

1、进程标识信息

进程标识信息只有一类——标识符
标识符的特点:唯一数字
标识符包括3项内容:
①进程的标识符
②父进程的标识符
③用户标识符

标识符与进程表中的索引有联系:
①标识符直接作为进程表的索引
②标识符与进程表索引建立某种映射关联

2、处理器状态信息

①用户可见寄存器
②控制和状态寄存器:
③栈指针

3、进程控制信息

操作系统控制和协调进程所需的额外信息

通过进程表以及进程控制块,可以方便地访问进程,但是困难在于保护进程,具体问题有两个:
①进程控制块可能被破坏,从而失去对进程的控制
②进程控制块的设计变化会影响到操作系统的很多模块
解决方法:
使用处理程序例程(handler routine),处理程序例程的任务是保护进程控制块,它是仲裁对进程控制块读写操作的唯一程序。
(即其他程序要读写进程控制块时,处理程序例程会对这个操作进行仲裁)

四、进程控制

(一)进程的执行模式

进程的执行有两种模式,用户模式和特权模式(又称为系统模式、内核模式、控制模式)。
用户模式权限更少,用户程序使用这个模式;
特权模式权限更多,操作系统内核使用这个模式。
使用两种模式的原因是保护操作系统和重要的操作系统表不受用户程序干扰。
程序状态字中的某一位可以指示处理器当前处于什么模式。

(二)进程的创建

之前我们讲:进程的创建分为两步,创建管理进程的数据结构和分配内存空间
现在对其进行细分,分为5个步骤:
①分配进程标识符:进程表中会增加一个表项,指向新的进程映像
②为进程分配空间:为进程映像的4部分分配空间(最后分配进程控制块)
③初始化进程控制块:即对其信息进行初始化
④设置正确的链接:将该进程加入对应的队列(就绪队列、就绪/挂起队列)
队列一般以链表实现,本质上就是为链表增加表项。
⑤创建或扩充其他数据结构:操作系统会为每个进程维护一个记账文件

(二)进程的切换

进程的切换发生在:
①时钟中断:进程执行时间达到最大时间片
②I/O中断:等待I/O事件,或者I/O事件发生会发送进程切换
③内存失效:进程需要访问虚拟内存(未在内存)的数据时,该进程会阻塞,操作系统需要从外存中调入数据到内存中,然后该进程会就绪,这个过程中会发生进程切换
④陷阱:当前进程运行出现错误
⑤系统调用:发生系统调用时,用户进程会被切换到系统进程。

进程的切换过程A—>B:
①保存进程A控制块的状态信息
②更新进程A控制块的控制信息
③将进程控制块移到相应队列
④选择一个新的进程B执行
⑤更新进程B的控制信息
⑥更新内存管理数据结构
⑦(在寄存器中)恢复进程B的状态信息

模式切换不一定有进程切换;进程切换一定有模式切换。
模式切换后进程不一定切换;
进程切换必须在内核模式下执行。

五、操作系统的执行

在这里插入图片描述

(一)无进程内核

即在所有进程外部运行操作系统内核;
进程仅适用于用户程序,操作系统不可以称为进程;
操作系统代码是特权模式下单独运行的实体

(二)在用户进程内运行

在用户进程的上下文中执行操作系统;
执行操作系统代码时,用户进程处于特权模式;

(三)基于进程的操作系统

把操作系统做为一组系统进程来实现;
在多处理或多机环境中很有用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值