进程、线程、调度
程序执行顺序
程序顺序执行的特点

一次只运行一道程序,特点为:
-
连续性:每道程序连续执行
-
封闭性:程序运行时独占全机资源
-
可再现性:只要初始条件相同,程序执行结果不变
封闭性与可再现性给程序调试带来方便,但系统资源利用效率低
程序并发执行

程序并发执行的特点:
-
增强了计算机系统的处理能力,提高了资源利用率
-
程序执行的间断性:并发执行的程序间产生了相互制约关系
- 执行---暂停---执行
- 因共享资源或协调完成同一任务引起
- 间接制约:共享资源
- 直接制约:协同完成任务
-
失去了程序的封闭性
- 资源共享
-
程序结果不可再现
进程的组成的概念
进程(process)是程序的一次执行过程
进程是程序在一个数据集合上顺序执行时发生的活动,是系统进行资源分配和调度的一个独立单位
总之,进程是可以和其他程序并行执行的程序关于某个数据集合的一次执行过程
进程的特性:
- 动态性:进程是程序的一次执行,是临时的,具有生命期
- 独立性:是系统进行资源分配和调度的一个独立单位
- 并发性:多个进程可在处理机上交替执行
- 异步性:进程间相互制约,使进程执行具有间隙
- 结构性:系统为每个进程建立一个进程控制块PCB
进程与程序的区别:
- 进程是动态的,程序是静态的,因此通常进程不可在计算机间迁移,但程序可以
- 进程是暂时的,程序是永久的
- 进程包括程序、数据和进程控制块(进程的组成部分)
- 通过多次执行,一个程序可对应多个进程;通过调用,一个进程可包括多个程序。进程可创建其他进程,程序不能形成新的程序
线程
线程是进程中的一个可执行实体,一个进程可以有多个线程,线程共享该进程的所有资源
以进程为单位分配资源 ,以线程为单位调度执行
包含线程的进程组成结构如下

线程控制块的组成:
- 唯一标识符
- 表示处理机状态和运行现场的一组寄存器
- 两个堆栈,分别用于用户态和核心态调用时进行参数传递
- 独立的程序计数器
- 关联的进程和线程指针
进程和线程的比较:
- 拥有的资源:进程拥有一个独立的地址空间,用于存放代码和数据段,进程内的多线程共享该进程的所有资源,线程自己拥有很少资源,进程至少包含一个线程
- 调度:进程调度的上下文切换开销较大,同一进程内的线程切换仅变换较小的资源,效率高速度快。
- 并发性:进程之间、进程内的多线程之间均可并发执行
- 安全性:进程安全性更高
系统对线程的支持:
- 用户级线程:有关线程的所有管理工作都由用户程序通过调用在用户态运行的线程库 完成,系统内核不知道线程的存在,内核以进程为单位进行调度,一个线程阻塞,其所在的进程也阻塞。用户态多线程对应核心态一个进程,为多对一模型
- 核心级线程:有关线程的所有管理工作通过内核完成,应用程序通过系统调用 来创建或撤销线程,线程阻塞不影响同一进程内其他线程的执行,用户态单线程对应核心态一个进程,为一对一模型
- 两级组合:既支持用户级线程,也支持核心级线程,多个用户线程可以对应等量或少量的核心级线程,称为多对多模型
进程控制块
进程控制块(PCB),也称为进程描述符,是进程的唯一标识
PCB的基本信息包括:
- 进程标识符,唯一标志进程的整数(内部、外部)
- 进程的状态、调度、存储器管理信息
- 进程使用的资源信息
- CPU现场保护区,通常为各类指针信息,包括程序计数器,程序状态字,堆栈指针等
- 记账信息:CPU使用量,账号等
- 进程之间的家族关系:类UNIX系统,进程之间存在着家族关系,父/子进程。Windows 进程之间不具有父子关系。
- 进程的链接指针:链接相同状态的进程
进程的基本状态的转换
基本状态:
- 运行态:在CPU上运行,单CPU系统同时只有一个运行进程
- 阻塞态/等候态:一个进程因等待某事件发生而不能运行时所处状态
- 就绪态:已经获得了除CPU core之外的全部资源并等待系统分配CPU core,一旦获得CPU core即可以变为运行态的进程状态
状态转换:
- 创建态:进程被创建时的状态
- 终止态:进程运行完成时的状态

- 创建态→就绪态
- 操作系统准备好再接纳一个进程时,把一个进程从创建态变为就绪态。
- 运行态→终止态
- 进程已结束,但尚未撤消,以便其它进程去收集该进程的有关信息。
Linux进程状态
-
可运行状态:进程正在或准备在CPU上运行。
-
可中断等待状态:进程睡眠等待系统资源可用或收到一个信号后,进程被唤醒
-
不可中断等待状态:进程睡眠等待一个不可被中断的事件发生(很少使用)
-
暂停状态:进程被暂停执行。
-
跟踪状态:进程被调试器跟踪。
-
僵死状态:进程已终止,但父进程尚未回收。
-
死亡状态:进程被系统彻底删除。

Windows线程状态
- 就绪状态(ready)
- 备用状态(standby)
- 已选好处理机,正等待描述表切换,以便进入运行状态
- 运行状态(Running)
- 等待状态(waiting)
- 传输状态(transition)
- 核心栈被调到外存的就绪态
- 终止状态(terminated)
- 初始化状态(Initialized)

进程的组织:
- 线性表:把所有进程数组存放在一个数组中

- 链接表:把具有相同状态的PCB组成一个队列,比如就绪态进程排成就绪队列,阻塞态进程根据阻塞原因排成多个阻塞队列

原语与进程控制
原语 :由若干指令组成的完成某种特定功能的一段程序,具有不可分割性
进程控制:是指系统使用一些具有特定功能的程序段来创建、撤销进程,以及完成进程各状态间的转换,是通过操作系统内核来实现的,属于原语一级的操作,不可被中断
创建原语
创建进程的时机:
- 批处理系统中会为每个提交的作业创建一个进程
- 分时系统中,系统会为每个登陆的用户创建一个终端进程
- 交互式系统中,键入一个命令或点击一个图标都会开始一个新进程。
- 在UNIX和Windows系统中,用户可以同时打开多个窗口,每个窗口都对应一个进程
- 已存在的进程可以通过系统调用的形式创建进程
创建原语的功能:
- 扫描进程表,找到空闲的PCB
- 为新进程的程序、数据、用户栈分配内存
- 初始化PCB,把调用者提供的参数填入PCB
- 将PCB插入就绪队列
撤消原语
进程已完成任务,正常结束
由于故障不能继续执行,异常结束
越界错误、保护错、非法指令、运行超时、算术运算错、I/O故障
外界干预
操作员或操作系统干预:死锁
父进程请求
父进程终止
功能:
- 在PCB集合中寻找所需要撤销的进程
- 若有子进程,撤销子进程
- 将占用的系统资源归还系统
- 撤销PCB
阻塞原语
进程内部自己执行阻塞原语
功能:
- 中断CPU,将运行现场保存在PCB中
- 将PCB状态置为阻塞态,插入相应事件的阻塞队列中
- 转进程调度
唤醒原语
分两种,唤醒后会从阻塞态进入就绪态
- 若进程等待的事件是I/O完成,I/O完成后设备会产生中断,CPU响应中断,在中断处理中将等待进程唤醒
- 若等待发送进程发送消息,由发送进程调动唤醒原语将等待进程唤醒
挂起原语
根据需要将进程挂起一段时间,将进程由活动状态变为静止状态(静止就绪、静止阻塞),对于分时系统,会将其从内存转换到外存
解挂原语
当挂起进程的原因被解除时,系统调用解挂原语将指定的进程解挂,使其由静止状态变为活动状态。
当被解挂的进程变为活动就绪时,通常立即转进程调度。
处理机调度
进程数往往大于处理机数,需要多进程竞争处理机
处理机调度的级别(从高到低):
- 作业调度:高级调度,在多道批处理系统中,用户作业被提交到外存 ,形成后备作业队列,被作业调度选中进入内存后处于运行态
- 交换调度:中级调度,引入的目的是使系统资源利用更合理,将主存中暂时不具备运行条件的进程换出到外存交换区,或将外存交换区中已具备运行条件的进程换入主存(挂起、解挂)
- 进程调度:低级调度,为进程分配处理机
进程调度
进程调度的功能:
- 管理系统中各进程的执行状况,管理PCB
- 选择就绪进程占有CPU
- 进行进程的上下文切换,进程的上下文保存在PCB中,包括进程的运行环境和物理实体,分三级
- 用户级上下文:进程的程序和数据、用户栈
- 寄存器级上下文:CPU现场信息,主要为各类寄存器
- 系统级上下文:包括进程的PCB、系统环境、核心栈等
进程调度的方式:
- 非抢先方式:某进程一直占用CPU直到运行完成或不能运行,用在批处理系统
- 抢先方式:调度程序基于某种策略剥夺运行进程的CPU给其他进程,用在分时系统、实时系统
进程调度的时机:
- 进程完成或错误中止
- 提出I/O请求,等待I/O完成时
- 在分时系统,按照时间片轮转,分给进程的时间片用完
- 优先级调度中,高优先级进程就绪
- 进程自身执行了原语操作
进程调度的算法:
- 先来先服务FCFS:系统维护FIFO队列,进程先进先出,简单,但大作业占用时间长,使平均周转时间延长
- 最短作业优先SJF(可剥夺/不可剥夺):选取运行时间最短的作业运行,平均周转时间最佳; 但长作业没有机会运行,会出现饥饿现象
- 响应比高者优先HRN:

选择相应比较高的作业运行,算法较复杂
-
优先级调度法:将CPU分配给就绪队列中优先级最高的进程,分为静态优先级和动态优先级,静态优先级在进程创建时确定,系统进程有较高优先级,资源量少的进程也有较高优先级,动态优先级随进程推进而改变
-
轮转法RR:用于分时系统,利用定时闹钟定时发出中断,时钟中断处理程序在设置新的时钟常量后,立即转入进程调度程序
-
多级反馈队列轮转法:优先级不同的进程排在不同的就绪队列,刚创建的进程和因IO请求未用完时间片的进程排在较高的优先级队列,高优先级队列时间片较短,低优先级较长,运行时间较长的进程降级

总是先调度优先级较高的队列,只有当该队列为空时,才调度次高优先级队列,队列内采取轮转法RR
线程
线程是进程中的一个可执行实体,一个进程可以有多个线程,线程共享该进程的所有资源
以进程为单位分配资源 ,以线程为单位调度执行
包含线程的进程组成结构如下

线程控制块的组成:
- 唯一标识符
- 表示处理机状态和运行现场的一组寄存器
- 两个堆栈,分别用于用户态和核心态调用时进行参数传递
- 独立的程序计数器
- 关联的进程和线程指针
进程和线程的比较:
- 拥有的资源:进程拥有一个独立的地址空间,用于存放代码和数据段,进程内的多线程共享该进程的所有资源,线程自己拥有很少资源,进程至少包含一个线程
- 调度:进程调度的上下文切换开销较大,同一进程内的线程切换仅变换较小的资源,效率高速度快。
- 并发性:进程之间、进程内的多线程之间均可并发执行
- 安全性:进程安全性更高
系统对线程的支持:
- 用户级线程:有关线程的所有管理工作都由用户程序通过调用在用户态运行的线程库 完成,系统内核不知道线程的存在,内核以进程为单位进行调度,一个线程阻塞,其所在的进程也阻塞。用户态多线程对应核心态一个进程,为多对一模型
- 核心级线程:有关线程的所有管理工作通过内核完成,应用程序通过系统调用 来创建或撤销线程,线程阻塞不影响同一进程内其他线程的执行,用户态单线程对应核心态一个进程,为一对一模型
- 两级组合:既支持用户级线程,也支持核心级线程,多个用户线程可以对应等量或少量的核心级线程,称为多对多模型