计算机操作系统-2-处理器管理
时间:2022-11-15 11:00:00
Lecture2-处理器管理
- 处理器管理它是操作系统的重要组成部分
- 处理器负责管理、调度和分配计算机系统的重要资源,并控制程序执行
- 最重要的是处理器管理处理器调度,即过程调度,即控制和协调过程对处理器的竞争。
- 进程与线程
- 管态与目态
- 管理状态也被称为特权状态(核心状态、核心状态),可以执行特权指令、资源管理程序、各种为应用程序执行提供良好运行环境的原语等。
- 目态又称用户态(普通态),只能执行非特权指令
1. 处理器和寄存器
1.1. 处理器
部件简单示意图
- 上图所有组件通过内部总线连接起来,形成一个不包括通用寄存器,I/O相关寄存器、地址寄存器、数据寄存器和Cache的示意图。
- CPU各组件的描述
- 算数逻辑单元:计算结束后,将结果的标志放置在标志寄存器中Flag中。
- 控制单元:包括重要的指令译码器ID,指令放置在指令中IR中。
- 程序计数器PC:下一个指令的地址
- 内存地址寄存器和内存数据寄存器:用于访问内存数据。
- 通过系统总线访问内存中的数据,首先设置地址和数据,然后通过控制读取和写回数据。
- 时钟等外部信号对处理器线程进行反应。
1.2. 寄存器
1.2.1. 寄存器可见于用户程序
- 程序员可以减少访问主存储器的次数,提高指令执行的效率
- 所有程序可使用,包括应用程序和系统程序
- 数据(通用)寄存器:AX、BX、CX、DX等
- 地址寄存器:索引(SI、DI)、栈指针(SP、BP)、段地址(CS、DS、SS、ES)、页面寄存器等
1.2.2. 控制和状态寄存器
- 控制和状态寄存器用于控制处理器的操作,主要是被具有特权的操作系统程序使用,以控制程序的执行
- 程序计数器PC:存储接收指令的地址
- 指令寄存器IR:存储最近使用的指令
- 条件码CC:CPU标志正/负/零/溢出是指令操作结果设置的位置
- 标志位
位 | 描述 |
---|---|
中断位 | 是否有中断,什么是中断源? |
中断允许位 | 表示目前的响应是否中断 |
中断屏蔽位 | 中断发生,中断响应,我们想阻止中断吗? |
处理器模式位 | 处理器现在处于什么模式 |
内存保护位 | 是只读还是读还是不能操作这段内存 |
1.2.3. 程序状态字PSW
- PSW操作系统的概念是记录当前程序运行的概念动态信息,通常包含:
- 条件码
- 中断字、中断允许/禁止、中断屏蔽、处理器模式、内存保护、调试控制
- PSW也是计算机系统寄存器
- 通常设置一组控制和状态寄存器
- 也可以专设一个PSW寄存器
- 标志分为三组:状态标志、控制标志和系统标志(更多见P58)
- 状态标志:使指令的执行结果影响后续指令的执行,如溢出等标志
- 控制指令:控制模式转换等操作系统的行为。
- 系统标志:与进程管理有关,用于保护模式。
2. 指令和处理器模式
2.1. 机器指令
- 机器指令是计算机系统执行的基本命令,是中央处理器执行的基本单位。
- 指令由一个或多个字节组成,包括操作码字段、一个或多个操作数字地址字段、一些表示机器状态的状态字和特征码。
- 指令完成各种算术逻辑操作、数据传输和流跳转控制。
2.2. 指令执行过程
- CPU根据PC取出指令,放入IR,并对指令进行翻译,然后发出各种控制命令,执行微操作系列,以完成指令执行
- 一种指令执行步骤如下:(细分更多,这只是一个例子)
- 取指:根据PC从存储器或高速缓冲存储器中获取指令IR
- 解码:解译IR该指令决定了其执行行为
- 执行:连接到CPU部件,执行操作,产生结果并写回来CC设置运算结论标志;跳转指令操作PC,其加其他指令PC值
2.3. 指令执行周期和指令流水线
目前的操作系统不是顺序执行指令,而是选择使用指令流水线执行指令
2.4. 特权指令和非特权指令
用户程序不能使用所有的机器指令,与计算机核心资源相关的特殊指令将受到保护
- 比如:启动I/O指令(启动打印机,打印文件细分为行打印,可能导致逻辑失败)、放置PC指令(多程序调用)等
- 操作系统程序只能使用与核心资源相关的指令(作为特权指令,不允许在用户状态下使用)
2.4.1. 特权指令
- 只有操作系统本身可以使用的命令,才能在核状态下调用的命令,不仅会影响操作程序本身,还会干扰其他程序和操作系统。
- 例如,变机器状态,修改寄存器值,中断屏蔽位置,加载程序状态字等。
- 如果应用程序执行特权指令,将导致非法执行和保护中断,然后转向操作系统"用户非法执行特权指令"异常处理程序处理。
2.4.2. 非特权指令
- 所有用户程序都可以使用的命令,可以在用户态和内核态中调用的命令。
- 非特权命令可以在目态和管态下工作。
2.5. 处理器模式
- 计算机通过设置处理器模式实现特权指令管理
- 计算器一般设置0、1、2、3等四种运行模式(保护等级)
- 0:内核级,操作系统内核,可执行中断处理、处理等所有指令I/O操作等命令
- 1:系统调用级,执行系统调用,获得特定和受保护的程序服务
- 2.共享库级,可共享多个运行过程,允许调用库函数,读取但不修改相关数据。
- 3.用户程序只能执行非特权指令,至少可以得到保护
- 0模式可以执行所有指令;3模式只能执行非特权指令;指令子集可以在其他操作模式下执行
- 一般来说,现代操作系统只使用0和3两种模式,对应于核心模式和用户模式
- 处理器模式是由处理器模式位决定的。
2.6. 处理器模式切换
- 简称模式切换,包括
用户模式->内核模式
和内核模式->用户模式
的两种切换。 - 中断、异常或系统异常等事件导致用户程序向OS内核切换,触发:
用户模式->内核模式
,以下三种方式是唯一能触发的方式:- 程序请求操作系统服务,执行系统调用
- 程序运行时发生异常(如发生程序性中断,或者目态执行特权指令)
- 程序运行时发生并响应中断(一般是I/O中断)
- 我们可以认为中断和异常是用户态到内核态转换的仅有途径。
- OS内核处理完成后,调用中断返回指令(如Intel的iret)触发:
内核模式->用户模式
,操作系统将控制权转交给应用进程。
2.7. 系统调用示例
3. 栈空间
3.1. 用户栈
- 用户栈是用户进程空间中开辟的一块区域,用于保存应用程序的子程序(函数)间相互调用的参数、返回值、返回点以及子程序的局部变量。
- 如果只有用户栈,没有核心栈,那么操作系统则很难对核心栈的数据提供相应的保护措施。
3.2. 核心栈
- 核心栈也叫系统栈或内核栈,是内存中属于操作系统空间的一块区域,其用途包含以下两种:
- 保存中断现场,嵌套中断
- 保存操作系统程序(函数)间相互调用的参数、返回值、返回点以及程序局部变量。
- 每个进程有一个核心栈:可读可写不可执行,大小有限
- 硬件栈指针只有一个
4. 中断
4.1. 中断、异常和系统异常
- 广义的中断是指程序执行过程中,遇到急需处理的事件时,暂时中止CPU上现行程序的运行,转去执行相应的事件处理程序,待处理完成后再返回原程序被中断处或调度其他程序执行的过程
- 狭义的中断指来源于处理器之外的中断事件,即与当前运行指令无关的中断事件,如I/O中断(为打印机结束后进行善后)、时钟中断(计算机系统计时,多一段时间就要更新系统时间)、外部信号中断(关机)等
- 异常指当前运行指令引起的中断事件,如地址异常(访问其他程序的内存、读写没有权利读写的内存、虚拟地址的异常)、算术异常(数字溢出、对0除法)、处理器硬件故障(奇偶校验位错误)等
- 来自于CPU内部的广义中断事件我们称之为异常,和狭义的中断构成了广义的中断。
- 系统异常指执行陷入指令而触发系统调用引起的中断事件,如请求设备、请求I/O、创建进程等,与硬件无关(通过系统异常请求服务),系统异常可以被认为是异常中的一类
4.2. 操作系统与中断
- 操作系统是中断驱动的;换言之,中断是激活操作系统的唯一方式。
- 操作系统要求计算机硬件系统为其设置相应的中断激活的硬件机制,再配合操作系统的内核程序共同完成中断驱动方式,这个是操作系统实现的最根本的基础,中断处理需要借助硬件电路
4.3. 中断源分类
由硬件发出或产生的中断称为硬中断,按硬中断事件的来源和实现手段可将终端划分为外中断和内中断。
4.3.1. 外中断
- 外中断又称中断或异步中断,是指来自处理器之外的中断信号,包括时钟中断、键盘中断、它机中断和外部设备等、
- 外中断又可以分为可屏蔽中断和不可屏蔽中断,各个中断具有不同中断优先级。
4.3.2. 内中断
- 内中断又称异常或同步中断,是指来自处理器内部的中断信号,通常是由于程序执行过程中,发现与当前指令相关的、不正常或错误的时间,内中断可分为:
- 访管中断,由执行系统调用而引起
- 硬件故障中断,如电源失效、奇偶校验错误、总线超时等
- 程序性异常,如非法操作、地址越界、页面故障、调试指令、除数为0和浮点溢出等。
4.4. 中断和异常区别(P60)
中断 | 异常 |
---|---|
CPU异步 | CPU同步 |
内核态、用户态 | 大部分在用户态,内核态唯一的异常是"缺页异常" |
一般中断处理程序提供的服务不是当前进程需要的 | 是当前的进程需要的 |
快速处理,不可以被打断 | 可以被阻塞 |
允许嵌套 | 大多为一重等 |
不可以被异常打断 | 可以被中断中断 |
5. 中断事件处理原则
5.1. 中断源:处理器硬件故障中断事件(硬中断)
- 由处理器、内存储器、总线等硬件故障引起,除了极少类的校验错误可以恢复以外,是非常严重的中断。
- 处理原则为:保护现场,停止设备,停止CPU,向操作员报告,等待人工干预
- 电脑会配置一个小电容保证尽可能较少硬件损伤
5.2. 中断源:程序性中断事件
处理器执行机器指令引起
- 语法错误:由编译程序发现
- 逻辑错误:由测试程序发现
- 程序运行过程中产生异常
- 除数为零、操作数溢出等算术异常:简单处理,报告用户;也可以由用户编写中断续元程序处理
- 非法指令、用户态使用特权指令、地址越界、非法存取等指令异常:终止进程
- 终止进程指令:终止进程
- 虚拟地址异常:指令和数据不在内存当中,调整内存后重新执行指令
5.3. 中断源:I/O中断事件
- 来源于外围设备报告I/O状态的中断事件
- I/O完成:调整进程状态,释放等待进程
- I/O出错:先向设备发命令索取状态字,分析产生故障的确切原因,再执行复执或请求人工干预,
- I/O异常:等待人工干预,缺纸,人工加纸
- 设备报道或设备结束:表示有设备接入可供使用或设备断开暂停使用
- 狭义中断事件
5.4. 中断源:自愿性中断事件(访管中断)
- 处理器执行陷入指令请求OS服务引起;在操作系统中,它一般又被称作系统调用,比如请求分配外设、请求I/O等等
- 处理流程是:
- 程序执行访管指令,并通过适当方式指明系统调用号。
- 通过中断机制进入访管中断处理程序,现场信息被保护到核心栈,按功能号实现跳转。
- 通过系统调用入口地址表找到对应中断服务历程的入口地址
- 执行终端服务例程
5.5. 中断源:外部中断事件
- 由外围设备发出的信号引起的中断事件
- 时钟中断、间隔时钟中断:记时与时间片处理,最常见
- 设备报到与结束中断:调整设备表
- 键盘/鼠标信号中断:根据信号作出相应反应
- 关机/重启动中断:写回文件,停止设备与CPU
- 时钟可以分为绝对时钟和间隔时钟
- 绝对时钟:固定周期发出中断请求
- 间隔时钟:每个时间切换点,将间隔时钟的内容减1,其值为0的时候,产生间隔时钟中断。
- 时钟间隔定时器
- real:按照实际经过的时间计时
- virtual:仅在用户态下执行才计时
- profile:进程执行用户态或用户态时都计时,当计时到达发送信号
6. 中断系统
- 中断系统是计算机系统中响应和处理中断的系统,包括硬件子系统和软件子系统两部分
- 中断响应由硬件子系统完成
- 中断处理由软件子系统完成
- 中断系统是操作系统的基础,中断系统也是软硬件协同系统的典型例子
6.1. 中断响应处理与指令执行周期
在指令执行周期最后增加一个微操作,以响应中断,CPU在完成执行阶段后,如果允许中断,则进入中断阶段
6.2. 中断装置
- 计算机系统中发现并响应中断/异常的硬件装置称为中断装置
- 由于中断源的多样性,硬件实现的中断装置有多种,分别处理不同类型的中断
- 这些中断装置因计算机而异,通常有:
- 处理器外的中断:由中断控制器发现和响应
- 处理器内的异常:由指令的控制逻辑和实现线路发现和响应,相应机制称为陷阱
- 请求OS服务的系统异常:处理器执行陷入指令时直接触发,相应机制称为系统陷阱
6.3. 中断控制器
- 中断控制器:CPU中的一个控制部件,包括中断控制逻辑线路和中断寄存器,中断控制器会记录中断是来自哪里
- 狭义中断:(异步过程)外部设备向其发出中断请求IRQ,在中断寄存器中设置已发生的中断
- (同步过程)指令处理结束前,会检查中断寄存器,若有不被屏蔽的中断产生,则改变处理器内操作的顺序,引出操作系统中的中断处理程序
- 狭义中断是异步进程,CPU正在做的事情和中断可能是两个不同部分
6.4. 陷阱与系统陷阱
陷阱与系统陷阱:指令的逻辑和实现线路的一部分
- 执行指令出现异常后,会根据异常情况转向操作系统的异常处理程序
- 出现虚拟地址异常后,需要重新执行指令,往往越过陷阱独立设置页面异常处理程序
- 执行陷入指令后,越过陷阱处理,触发系统陷阱,激活系统调用处理程序
6.5. 中断程序的处理&中断/异常响应过程
- 中断处理程序:操作系统处理中断事件的控制程序, 主要任务是处理中断事件和恢复正常操作。
- 是一个软件过程
- 中断/异常响应过程
- 发现中断源,提出中断请求(选择响应哪一个程序)
- 发现中断寄存器中记录的中断
- 决定这些中断是否被屏蔽
- 当有多个要响应的中断源时,根据规定的优先级选择一个
- 中断当前程序的执行(保护现场):保存当前程序的PSW(程序状态字)/PC到核心栈
- 转向操作系统的中断处理程序:处理器状态已从用户态转换至内核态。
- 恢复现场:恢复原运行程序的PSW,重新返回中断点,以便执行后续指令。
- 发现中断源,提出中断请求(选择响应哪一个程序)
6.6. 恢复正常操作
- 情况一:对于某些中断,在处理完毕后,直接返回刚刚被中断的进程,比如计时中断。
- 情况二:对于其他一些中断,需要中断当前进程的运行,调整进程队列,启动进程调度,选择下一个执行的进程并恢复其执行,比如请求输入输出。
- 无论是哪个都是从内核态到用户态。
6.7. 中断系统处理流程
- 硬件设计受到操作系统的要求。
- 操作系统:大型软件系统,大型紧密结合软硬件设备的系统。
7. 多中断的响应与处理
7.1. 中断优先级
- 当计算机同时检测到多个中断时, 中断装置响应中断的顺序。
- 有优先度的响应中断:将紧迫程度相当的中断源归为同一级别,将紧迫程度差距较大的中断源归为不同级别。
- 一种可能的处理次序:(对几十个人使用的大型计算机系统很合理),可以借助软硬件分别来完成实现。
- 处理机硬件故障中断事件。
- 自愿性中断事件。
- 程序性中断事件。
- 时钟中断等外部中断事件。
- 输入输出中断事件。
- 重启动和关机中断事件。
- 不同类型的操作系统有不同的中断优先级:PC做出关机操作表示放弃当前的所有的操作,所以重启动和关机中断是优先级最高的中断。
7.2. 中断屏蔽
- 当计算机检测到中断时, 中断装置通过中断屏蔽位决定是否响应已发生的中断。
- 有选择的响应中断:由计算机决定。
- 延迟或禁止某些中断的响应以避免共享数据结构受到破坏。
- 协调中断响应与终端处理的关系,保证优先级顺序。
- 防止同级中断互相干扰。
- 计算机均配置可编程中断控制器。
7.3. 中断的嵌套处理
- 当计算机响应中断后,在中断处理过程中,可以再响应其他中断
- 操作系统是性能攸关的程序系统,且中断响应处理有硬件要求,考虑系统效率和实现代价问题,中断的嵌套处理应限制在一定层数内,如3层
- 中断的嵌套处理改变中断处理次序,先响应的有可能后处理
7.4. 多中断的响应与处理
决定了中断处理次序的因素
- 中断屏蔽可以使中断装置不响应某些中断
- 中断优先级决定了中断装置响应中断的次序
- 中断可以嵌套处理, 但嵌套的层数应有限制
- 中断的嵌套处理改变了中断处理的次序
7.5. 多重中断处理
7.5.1. 顺序中断处理(串行处理)
X、Y两个中断同时发生,如下图所以,系统先响应X,屏蔽Y,待X响应完成后,系统再响应并处理Y
7.5.2. 嵌套中断处理(嵌套处理)
X、Y两个中断同时发生,根据中断有限级,先响应中断X,因为没有屏蔽Y,则响应并处理Y,处理Y完成后,再处理X。
7.5.3. 即时处理
- 在运行中断处理程序时,如果出现程序性中断事件,在一般情况下,表明此时中断程序有异常,应对其立即响应并处理。
7.6. 中断处理的例子:Linux内核处理流程
- 中断信号源:中断向量
- 中断,分为所有外部设备产生的屏蔽中断请求,和硬件故障等紧迫时间引发的非屏蔽中断。
- 异常:CPU发出的中断信号,主要有故障、陷阱、终止和编程异常等
- 更多见P66-71页
8. 进程及其状态
8.1. 进程的提出
- 操作系统必须全方位地管理计算机系统中运行的程序。因此,操作系统为正在运行程序建立一个管理实体:进程
8.2. 进程的概念
- 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。
- 具有一定独立功能的程序:进程是相对独立的
- 关于某个数据集合:对于不同数据集合的操作不是同一个进程。
- 一次运行活动:有生命周期
- 进程是操作系统进行资源分配和调度的一个独立单位:这只限于单线程单进程的情况下
- 资源分配:除了CPU之外的资源的分配,比如内存和外设等
- 单线程情况下,进程的资源分配和调度就是处理器的。
- 调度特指处理器的调度
- 有的将进程叫做process,Linux以及一些企业中,把进程称为Task。
- 进程可以看为可运行程序加载到内存,配合相应的数据集,在操作系统中的一个实例,程序可以多次被加载进入成为进程。
8.3. 进程的属性
- 动态性:进程是程序在数据结合上的一次执行过程,是动态概念,同时它有声明周期,而程序是一组有序指令序列,是静态概念,所以程序作为系统中的一种资源是永久存在的。
- 共享性:同一程序同时运行于不同数据集合上时都是不同的进程,即不同的进程可以运行相同的程序。
- 独立性:每个进程是操作系统中的一个独立实体。有自己的虚存空间、程序计数器和内部状态.
- 制约性:进程因共享资源或协同工作产生相互制约关系,造成进程执行速度的不可预测性,必须对进程的执行次序或相对执行速度予以协调。
- 并发性:多个进程的执行在时间上可以重叠。
8.4. 进程的组成
一个进程包括五个实体部分,分别是:
- (OS管理运行程序的)数据结构P
- (运行程序的)内存代码C
- (运行程序的)内存数据D
- (运行程序的)通用寄存器信息R
- (OS控制程序执行的)程序状态字信息PSW
8.5. 单线程结构进程和多线程结构进程
- 单线程结构进程:进程级别,负责完成资源分配和CPU调度。
- 多线程结构进程:线程级别,负责完成资源分配(进程完成)和CPU调度(代表一个执行流),并且一个进程中可以包含很多线程。
- 操作系统最开始设计的时候并没有设计多线程。
8.6. 进程举例
- 以下的程序与数据集都是内存级的。
- 不同时段针对同一个外存数据文件运行同一个外存程序文件意味着完全不同的(P, C, D, R, Psw)
8.6.1. 无关进程
不同程序在不同数据集上运行:构成两个无关进程
8.6.2. 共享数据的交往进程
不同程序在相同数据集上运行:构成两个共享数据的交往进程
8.6.3. 共享代码的无关进程
- 相同代码在不同数据集上运行:构成两个共享代码的无关进程
- 共享的代码称为可再入程序,如编辑器可再入程序是纯代码的,可再入程序必须是纯代码的
8.6.4. 共享代码和数据的进程
可以共享代码或者共享数据
9. 进程状态和转换
9.1. 进程三态模型
- 只要操作系统支持多道程序设计,就必须要设计进程转换模型来管理,必须实现三个进程状态和四个跳转关系,进程状态转换一定有内核的参与。
- 运行被中断进程时需要找到被中断时的信息并恢复。
9.1.1. 三种状态
- 运行态:进程占有处理器正在运行的状态。
- 就绪态:进程具备运行条件,等待系统分配处理器以便运行的状态,面向调度的,处理器只会挑选就绪态进程(就绪队列进程)
- 等待态:又称阻塞态或睡眠态,指进程不具备运行条件,正在等待某个事件完成的状态,暂时被剥夺处理机会。
- 处于运行态个数不能大于处理器个数。
- 进程创建后一般是处于就绪态
9.1.2. 四种状态转换
- 运行态 → \rightarrow →等待态:等待资源、I/O、信号量
- 等待态 → \rightarrow →就绪态:资源满足、I/O结束、信号量完成
- 运行态 → \rightarrow →就绪态:运行时间片到(倒计时到,不缺少其他东西,只缺少CPU,退回就绪态)、有更高优先权进程,低级调度问题
- 以上四个状态转换,一个不能少,一个也不能多,其他的转换不存在的原因如下:
- 没有就绪态到等待态:到等待态需要内核参与。
- 没有等待态到运行态:等待的资源还没有就绪,无法进入运行态。
9.1.3. 时间片与进程转换
- 时间片用完,计算没有做完,被抢占的进程
运行态->就绪态
:启动内核的处理器调度算法. - 时间片内,用户进程发生中断或系统调用,
运行态->等待态
- 时间片内,用户进程完成全部计算完成退出系统,
运行态->终止态
,激活内核,时间片被撤销。
9.1.4. 进程三态模型总结与扩展
- 进程映像定义其数据结构和存储结构
- 状态转化模型(队列模型)定义其生命周期和状态转换
- 然后围绕以上两部分开发出相应的操作和算法
- 进程状态和模型与信号量同样相关,后续深入讨论。
9.2. 进程七态模型(P74)
9.2.1. 新添加的状态
- 新建态:对应于进程被创建的状态,尚未进入就绪队列,创建进程的两个步骤
- 为新进程分配所需资源和建立必要的管理信息
- 设置进程为就绪态,等待被调度执行
- 终止态:
- 进程完成认为到达正常结束点
- 出现无法克服的错误而异常终止
- 操作系统及有终止权的进程所终止时所处的状态,处于终止态的进程不再被调度执行
- 下一步就将被系统撤销,最终从系统中消失。
- 挂起就绪态:表明进程具备运行条件,但目前在外存中,只有它被对换到内存才能调度执行。
- 挂起等待态:表明进程正在等待某一个事件发生且在外存中。
9.2.2. 进程挂起的源头
- 到目前为止:随着不断创建进程,当系统资源尤其是内存资源已经不能满足进程运行的要求时,必须把某些进程挂起,对换到磁盘对换区中,释放它占有的某些资源,暂时不参与低级调度,起到平滑系统负荷的目的;也可能系统出现故障,需要暂时挂起一些进程,以便故障消除后再接触挂起并恢复进程运行。
- 进程挂起的原因是多种多样的。
9.3. 进程挂起
9.3.1. 进程挂起的概念
- OS无法预期进程的数目与资源需求,计算机系统在运行过程中可能出现资源不足的情况
- 运行资源不足表现为性能低和死锁两种情况。
- 解决办法:剥夺某些进程的内存及其他资源,调入OS管理的对换区,不参加进程调度,待适当时候再调入内存、恢复资源、参与运行,这就是进程挂起
- 挂起态与等待态有着本质区别
- 进程挂起:没有任何资源
- 进程等待:占有已申请到的资源处于等待
- 结束挂起状态的命令只能由操作系统和父进程发出。
9.3.2. 进程挂起的选择与恢复
- 挂起的选择:
- 一般选择等待态进程进入挂起等待态
- 也可选择就绪态进程进入挂起就绪态
- 运行态进程还可以挂起自己
- 挂起的恢复
- 等待事件结束后,挂起等待态进入挂起就绪态
- 一般选择挂起就绪态进程予以恢复
- 操作系统极其空闲才会选择调入挂起等待态的进程
9.3.3. 挂起进程的特点
- 进程不能被立即执行
- 进程可能会有等待事件,但是等待事件是独立于挂起条件的,事件结束并不能导致进程具备执行条件
- 由于操作系统、父进程或进程自身阻止其运行
9.4. 补充:SVR4 进程状态模型
preempted:抢占,虚线表示合为一体。
10. 进程的描述与组成
进程的设计时要考虑进程的声明周期,从而引入三态模型
10.1. 进程映像,Process Image
- 某一时刻进程的内容及其执行状态集合:
- 进程控制块: 每个进程捆绑一个,保存进程的标识信息、现场信息和控制信息。进程创建时创建进程控制块,进程撤销时回收进程控制块,与进程一一对应。
- 进程程序块: 进程执行的程序空间,规定进程一次运行所应完成的功能。
- 进程数据块: 进程处理的数据空间,是进程的私有地址空间,包括各类私有数据、处理函数的用户栈和可修改的程序
- 进程核心栈: 每个进程捆绑一个,进程在内核模式下运行时使用的堆栈,中断或系统过程使用,保存函数调用的参数、局部变量和返回地址等。
- 进程运行时如果遇到要执行操作系统内核函数,此时则保存应用程序的全部现场信息及其用户栈,使其不被内核程序破坏。而内核函数运行时使用进程的核心栈来放置工作信息。
- 进程映像是内存级的物理实体,又称为进程的内存映像
- 进程的内存映像示意图
10.2. 进程控制块,Process Control Block,PCB,又称进程描述符
- 进程控制块PCB是OS用于记录和刻画进程状态及环境信息的数据结构,是进程存在的唯一标识,是操作系统刻画进程的执行状态及环境信息的数据结构,是进程动态特征的汇集,是操作系统掌握进程的唯一资料结构和进程调度的主要依据
- 包括标识信息、现场信息和控制信息。
10.2.1. 标识信息
用于存放唯一标识该进程的信息
- 系统分配的标识号
- 系统分配的进程组标识号
- 用户定义的进程名
- 用户定义的进程组名
10.2.2. 现场信息
用于存放该进程运行时的处理器现场信息
- 用户可见寄存器内容:数据寄存器、地址寄存器
- 控制与状态寄存器内容:PC、IR、PSW
- 栈指针内容:核心栈与用户栈指针
10.2.3. 控制信息
用于存放与管理、调度进程相关的信息
- 调度相关信息:状态、等待事件/原因、优先级
- 进程组成信息:代码/数据地址、外存映像地址
- 队列指引元:进程队列指针、父子兄弟进程指针
- 通信相关信息:消息队列、信号量、锁
- 进程特权信息:如内存访问权限、处理器特权
- 处理器使用信息:占用的处理器、时间片、处理器使用时间/已执行总时间、记账信息
- 资源清单信息:如正占有的资源、已使用的资源
10.3. 进程上下文,Process context
- 进程的执行需要环境支持,包括CPU现场和Cache中的执行信息。
- 在操作系统中,进程物理实体和支持进程运行的环境合称进程上下文。
- OS中的进程物理实体和支持进程运行的环境合成进程上下文,包括以下:
- 用户级上下文:
- 用户程序块(可执行的机器指令序列)
- 用户数据区(进程可访问的信息)
- 用户栈(存放函数调用过程中的信息)
- 用户共享内存(进程通信使用的内存区)
- 对换至磁盘的分段或页面仍然是用户级上下文的组成部分。
- 寄存器上下文(存储在进程控制块中):
- 处理器状态寄存器(进程当前状态)
- 指令计数器(下一条该执行的指令地址)
- PSW/栈指针(指向用户栈或核心栈当前地址)
- 通用寄存器等
- 系统级上下文
- PCB(Process Control Block,进程的状态)
- 内存区管理信息(进程页表或段表)
- 核心栈(进程内核态运行时的工作区)
- 用户级上下文:
- 进程上下文刻画了进程的执行情况
10.4. 进程队列及其管理
- 进程队列分类
- 运行队列:通常只有一个进程
- 等待(阻塞)队列:也是有机会被调入,他等待的资源或事件完成后,调入就绪队列。
- 就绪队列:从就绪队列中挑选进程调入运行,按照优先级或FCFS的原则排队
最后通过系统调用结束处理,进程实现的队列模型不适合使用堆栈(堆栈是先进后出的)
- 进程队列组织方式
- 链接方式:采用单向链接或双向链接。
- 索引方式:利用索引表记录不同状态进程的PCB地址或在PCB表中的编号
- 核心是完成入队和出队操作
- 进程与资源调度围绕进程队列展开
11. 进程的管理
11.1. 概念级的OS进程管理软件
关键的进程管理软件包括:
- 系统调用/中断/异常处理程序:
- 队列管理模块:操作系统用来管理进程控制块的信息,核心程序包,是操作系统实现进程管理的核心模块
- 进程控制程序:操作系统用于控制进程状态转换用到的程序包
- 进程调度程序(独立进程居多)
- 进程通信程序(多个程序包)
- 终端登录与作业控制程序、性能监控程序、审计程序等外围程序
11.2. 部分进程管理原语(P81)
- 进程创建:
- 操作系统初始启动时会创建承担系统资源分配和控制管理的一些系统进程,同时会创建一个所有用户集成的祖先,其他用户进程实在用户程序被提价与选中运行时被创建的。
- 操作系统通常将创建关系通过父子进程的关系来表示。
- 创建原语:进程表加一项、申请PCB(进程控制块)并初始化、生成唯一进程标识、建立进程映像、分配各种资源、移入就绪队列、通知操作系统某些模块
- 进程撤销:
- 完成特定工作或出现严重错误后需要撤销,分为正常撤销和非正常撤销。
- 产生原因:运行结束、执行非法指令、用户态执行特权指令、时间配额到、等待时间超时、越界错误、共享内存区非法使用、程序性故障等。
- 撤销原语:从队列中移除、归还资源、撤销标识、回收PCB、移除进程表项
- 进程阻塞:
- 使得进程让出处理器转而等待一个事件,比如等待资源等,阻塞是同步时间。
- 阻塞原语:保存现场信息、修改PCB、移入等待队列、调度其他进程执行
- 进程唤醒:
- 等待时间完成时产生一个中断,激活操作系统,在系统的控制下将被阻塞进程唤醒
- 唤醒原语:等待队列中移出、修改PCB、移入就绪队列(该进程优先级高于运行进程触发抢占)
- 进程挂起:
- 出现引起挂起的事件时,系统或进程会利用挂起原语把指定进程或处于等待态的进程挂起。
- 挂起原语:修改状态并出入相关队列、收回内存等资源送至对换区。
- 挂起原语可以由进程自己或其他进程调起。
- 进程激活:
- 当系统资源尤其是内存资源充裕或请求激活进程时,系统或相关进程会调用激活原语将指定进车行激活。
- 激活原语:分配内存,修改状态并出入相关队列。
- 激活原语只能由其他进程调用。
- 其他:如修改进程特权,以上是一个进程控制的流程
11.3. 原语与进程控制原语(Primitive)
- 进程控制过程中涉及对OS核心数据结构(进程表/PCB池/队列/资源表)的修改,不是进程处理的所有指令都是。
- 为防止与时间有关的错误,应使用原语
- 原语是由若干条指令构成的完成某种特定功能的程序,执行上具有不可分割性(保证对核心资源的访问是正确的,原语涉及到的资源都是共享核心资源,只能是唯一的),进入原语区间,立刻关闭中断完成,然后再开中断响应。
- 原语的执行可以通过关中断实现,进程控制使用的原语被称为进程控制原语,另一类常用原语是进程通信原语
11.4. 进程切换与模式切换(状态转换)
11.4.1. 进程切换
- 进程切换指从正在运行的进程中收回处理器,让待运行进程来占有处理器运行
- 进程切换实质上就是被中断运行进程与待运行进程的上下文切换。
- 进程切换必然发生在内核态而非用户态。
11.4.2. 进程切换的工作过程
- (中断/异常等触发)正向模式切换并压入PSW/PC
- 保存被中断进程的现场信息
- 处理具体中断/异常
- 把被中断进程的系统堆栈指针SP值保存到PCB
- 调整被中断进程的PCB信息,如进程状态
- 把被中断进程的PCB加入相关队列
- 选择下一个占用CPU运行的进程
- 修改被选中进程的PCB信息,如进程状态
- 设置被选中进程的地址空间,恢复存储管理信息
- 恢复被选中进程的SP值到处理器寄存器SP
- 恢复被选中进程的现场信息进入处理器
- (中断返回指令触发)逆向模式转换并弹出PSW/PC
11.4.3. 进程切换的发生时机
进程切换一定发生在中断/异常/系统调用处理过程中,常见的情况是:
- 阻塞式系统调用、虚拟地址异常导致被中断进程进入等待态
- 时间片中断、I/O中断后发现更高优先级进程,导致被中断进程转入就绪态
- 终止用系统调用、不能继续执行的异常导致被中断进程进入终止态
11.4.4. 内核不能执行调度和切换的情况
- 内核正在处理中断的过程中
- 进程运行在内核临界区
- 内核处在需要屏蔽中断的原子操作过程中。
11.4.5. 模式切换(状态转换)
- 进程切换必须在操作系统内核模式下完成,这就需要用到模式切换。
- 模式切换又称处理器状态切换,包括:
- 用户模式到内核模式由中断/异常/系统调用中断用户进程执行而触发
- 内核模式到用户模式OS执行中断返回指令将控制权交还用户进程而触发
11.4.6. 模式切换(状态转换)的基本工作任务
- 中断装置完成正向模式切换,包括:
- 处理器模式转为内核模式
- 保存当前进程的PC/PSW值到核心栈
- 转向中断/异常/系统调用处理程序
- 中断返回指令完成逆向模式转换,包括:
- 从待运行进程核心栈中弹出PSW/PC值
- 处理器模式转为用户模式
11.4.7. 模式切换(状态转换)的处理器情况
- 用户空间中,处于进程上下文,应用进程在用户态下运行,使用用户栈。
- 内核空间中,处于进程上下文,内核代表进程在内核态下运行,使用核心栈。
- 内核空间中,处于中断上下文,与任何进程无关,中断服务例程在内核态下处理特定中断。
- 内核空间中,内核线程(无用户地址空间的进程)运行于内核态。
11.4.8. 进程切换与模式切换(状态转换)
- 一些中断/异常不会引起进程状态转换,不会引起进程切换,只是在处理完成后把控制权交回给被中断进程,处理流程是:
- (中断/异常触发)正向模式切换压入PSW/PC
- 保存被中断进程的现场信息
- 处理中断/异常
- 恢复被中断进程的现场信息
- (中断返回指令触发)逆向模式转换弹出PSW/PC
- 比如计时中断,中断处理完成后直接恢复
- 模式切换是进程仍在自己的上下文进行处理,仅仅是处理器状态发生了变化,内核仍然被中断进程的上下文中进行处理。
12. 多线程技术概述
- 最开始设计进程的时候并没有体现线程的概念
12.1. 单线程结构
传统进程是单线程结构进程
12.1.1. 单线程结构进程的问题
单线程结构进程在并发程序设计上存在的问题
- 进程切换开销大:10个人干100天的活动->开会等活动产生的开销,进程切换要进行模式切换,然后再启动进程调度,选择一个就绪进程占用处理器,恢复现场,然后再反向进行。
- 进程通信开销大:指令流如果分布在不同进程中,那么每次交互都需要由内核完成。
- 限制了进程并发的粒度:如果没有线程概念,那么进程中本身不可以并发,粒度比较高
- 降低了并行计算的效率
12.1.2. 解决问题的思路
- 把进程的两项功能分离开来
- 独立分配资源(进程概念上),进程作为系统资源分配和保护的独立单位,不需要频繁地切换
- 被调度分派执行(线程概念上),线程作为系统调度和分派的基本单位,能轻装运行,会被频繁地调度和切换
- 线程的出现会减少进程并发执行所付出的时空开销,使得并发粒度更细、并发性更好
- 两项功能绑定就是单线程进程,两项功能分离就是多线程进程。
12.2. 多线程结构进程
12.2.1. 多线程环境下进程的概念
- 在多线程环境中,进程是操作系统中除处理器以外的资源分配和保护的独立单位。具有:
- 用来容纳进程映像的虚拟地址空间
- 对进程、文件和设备的存取保护机制
12.2.2. 多线程环境下线程的概念
- 线程是进程能够并发执行的实体,是进程的组成单位,也是处理器调度和分派的基本单位。
- 进程是一条执行路径,有独立的程序计数器,未运行时保护线程上下文。
- 同一个进程中的所有线程共享进程获得的主存空间和资源。它具有:
- 线程执行状态
- 受保护的线程上下文,当线程不运行时,用于存储现场信息
- 独立的程序指令计数器
- 执行堆栈
- 容纳局部变量的静态存储器
- 线程控制块
12.2.3. 多线程结构进程中的进程与线程
- 于是,进程可以分为两部分:
- 资源集合
- 线程集合。
- 进程要支撑线程运行,为线程提供虚拟地址空间和各种资源。
- 进程封装管理信息,包括对指令代码、全局数据、打开的文件和信号量等共享部分的管理。
- 线程封装执行信息,包括状态信息、寄存器、执行栈(用户栈指针与核心栈指针)和局部变量、过程调用参数、返回值等私有部分的管理。
- 由于线程具有传统进程的许多特征,所以也把线程称为轻量级进程(Light Weight Process,LWP)
12.2.4. 多线程环境下线程的状态与调度
- 线程状态有运行、就绪和等待和终止,(没有挂起状态时因为挂起和资源有关,而进程是资源管理的单位,与线程无关)
- 与线程状态变化有关的线程操作有:孵化、封锁、活化、剥夺、指派、结束
- OS感知线程环境下:
- 处理器调度的对象是线程
- 线程的存在、状态等都需要被操作系统内核感知到,进程没有三状态,或者说只有挂起状态。
- OS不感知线程环境下:
- 处理器调度的单位仍然