其实,我只是把 PPT Ctrl+C、Ctrl+V 了一下(捂脸)

3.1 中央处理器

3.1.1 CPU 的构成与基本工作方式

中央处理器(Central Processing Unit,CPU)是一台计算机的运算核心和控制核心。

处理器由运算器、控制器、一系列的寄存器以及高速缓存构成。

1)运算器

实现指令中的算术运算和逻辑运算,是计算机计算的核心。

2)控制器

负责控制程序运行的流程,包括取指令、维护 CPU 状态、CPU 与内存的交互等等。

3)寄存器

寄存器是指令在 CPU 内部作处理的过程中暂存数据、地址以及指令信息的存储设备。在计算机的存储系统中它具有最快的访问速度。(寄存器 > 缓存 > 内存 > 外存)

  • 用户可见寄存器——高级语言编译器通过算法分配并使用之,以减少程序访问主存次数。
  • 控制寄存器——用于控制处理器的操作,由OS的特权代码使用,以控制其它程序的执行。
3.1.2 特权指令与非特权指令

● 特权指令:只能由操作系统使用的指令

● 非特权指令:操作系统和用户都能使用的指令

具体特权指令如:启动I/O设备、设置时钟、控制中断屏蔽位、清内存、建立存储键,加载程序状态字等。

3.1.3 处理器的状态

管态:操作系统管理程序运行的状态,具有较高的特权级别,又称为特权态(特态)、系统态

目态:用户程序运行时的状态,较低的特权级别,又称为普通态(普态)、用户态

(注意:有些系统将处理器状态划分核心状态,管理状态和用户程序状态(目标状态)三种)

处理器处于管态时:

√ 全部指令(包括特权指令)可以执行

√ 可使用所有资源

√ 并具有改变处理器状态的能力

处理器处于目态时:

√ 只有非特权指令能执行

● 特权级别越高,可以运行指令集合越大

● 高特权级别对应的可运行指令集合包含低特权级的

目态→管态 :其转换的唯一途径是通过中断。

管态→目态 :可用设置PSW(修改程序状态字)可实现。

3.1.4 程序状态字

程序状态寄存器PSW是计算机系统的核心部件——控制器的一部分。

PSW用来存放两类信息:一类是体现当前指令执行结果的各种状态信息,称为状态标志,如有无进位(CF位),有无溢出(OF位),结果正负(SF位)等;

另一类是存放控制信息,称为控制状态,如允许中断(IF位),方向标志(DF)等。

PSW用来控制指令执行顺序并保留和指示与程序有关的系统状态,主要作用是实现程序状态的保护和恢复

每个进程都有一个与其执行相关的PSW,每个处理器都设置一个PSW寄存器。进程占有处理器执行,它的PSW将占有PSW寄存器。

3.2 中断

3.2.1 中断的概念

中断是指CPU对系统中或系统外发生异步事件的响应(异步事件是指无一定时序关系的随机发生事件)

3.2.2 中断的分类
  • 强迫性中断

    正在运行的程序所不期望的,由于某种硬件故障或外部请求引起的。

  • 自愿性中断
    用户在程序中有意识安排的中断,是由于用户在编制程序时因为要求操作系统提供服务,有意使用“访管”指令或系统调用,使中断发生。

按事件来源和实现手段分类:

  • 硬中断:
    • 外中断:中断(时钟中断、键盘中断、设备中断…)
      • 可屏蔽中断
      • 不可屏蔽中断
    • 内中断:异常(错误事件、地址越界…)
  • 软中断:
    • 信号:用于内核对进程的中断
    • 软件中断:用于硬中断服务程序的处理
关于中断(外中断),请大家记住4句话:

1)中断是由与现行指令无关的中断信号触发的(异步的)

2)中断的发生与CPU处在用户模式或内核模式无关

3)在两条机器指令之间才可响应中断

4)一般来说,中断处理程序提供的服务不是为当前进程所需的

关于异常(内中断),请大家记住3句话:

1)异常是由处理器正在执行现行指令而引起的

2)一条指令执行期间允许响应异常

3)异常处理程序提供的服务是为当前进程所用的

3.3 进程及其实现

3.3.1 进程的定义
  • 进程是为了描述程序在并发执行时对系统资源的共享,所需的一个描述程序执行时动态特征的概念。
  • 定义:进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配、调度和保护的独立单位。
  • 概念:
    • 进程是程序在一个数据集合上的运行过程。
    • 是系统进行资源分配和调度的一个独立单位。
    • 进程具有以下基本特征:6个
3.3.2 进程的类型和特性
1)进程分类
  • 系统进程(在核心态下执行操作系统代码,如作业调度、各种资源管理和控制等)
  • 用户进程(在用户态下执行用户程序)

(系统进程一般优先于用户进程)

2)进程的特征
  • 动态性:进程是程序在处理机上的一次执行过程,有一定生命周期
  • 并发性:多个进程可同时存在于内存中,能在一段时间内同时运行
  • 独立性:进程是一个能独立运行的基本单位,也是资源分配的基本单位
  • 制约性:进程间因为对资源的争用而相互制约
  • 异步性:进程按照各自独立的、不可预知的速度推进
  • 结构性:进程包含了相关的数据和程序,同时还有一个称为“进程控制块”的数据结构来记录进程的动态变化过程。因此,进程的组成三要素为“程序”、“数据”和“进程控制块(PCB)”
3.3.3 进程与程序的区别(重中之重)
  • 进程更能真实地描述并发,而程序不能
  • 进程是由程序和数据和进程控制块三部分组成的
  • 程序是静态的,进程是动态的
  • 进程有生命周期,有诞生有消亡,短暂的;而程序是相对长久的
  • 一个程序可对应多个进程,反之亦然
  • 进程具有创建其他进程的功能,而程序没有
3.3.4 进程的状态和转换
1)三态模型

(1)运行态(Running):

​ 进程占有CPU,并在CPU上运行

(2)就绪态(Ready):

​ 一个进程已经具备运行条件,但由于无CPU暂时不能运行的状态(当调度给其CPU时,立即可以运行)

(3)等待态(Blocked):

​ 又叫阻塞态、封锁态、睡眠态指进程因等待某种事件的发生而暂时不能运行的状态(即使CPU空闲,该进程也不可运行)

三态模型(图+文字说明)

  • 就绪→运行:调度程序选择一个新的进程运行
  • 运行→就绪:
    • 运行进程用完了时间片
    • 运行进程被中断,因为一高优先级进程处于就绪状态
  • 运行→等待:
    • 当一进程必须等待时
    • 对一资源的访问尚不能进行
    • 初始化I/O且必须等待结果
    • 等待某一进程提供输入
  • 等待→就绪:当所等待的事件发生时
五态模型

和三态模型相比,增加了两个状态,分别是:

(1)新建状态

① 操作系统已完成为创建一进程所必要的工作

  • 已构造了进程标识符
  • 已创建了管理进程所需的表格

② 但还没有允许执行该进程

​ (尚未同意运行,即尚未进入内存)

  • 因为资源有限

(2)终止状态

  • 进程运行终止后进程移入该状态

  • 进程在此状态不再有执行资格

  • 表格和其它信息暂时由辅助程序保留

  • 一旦其他进程完成了对终止态进程的信息抽取之后,系统将删除该进程

  • 从三态模型到五态模型

    • NULL→新建态:创建一个子进程。
    • 新建态→就绪态:系统完成了进程创建操作,且当前系统的性能和内存的容量均允许。
    • 运行态→终止态:一个进程到达自然结束点,或出现了无法克服的错误,或***作系统所终结,或被其他有终止权的进程所终结。
    • 终止态→NULL:完成善后操作。
    • 就绪态→终止态:某些操作系统允许父进程终结子进程。
    • 等待态→终止态:某些操作系统允许父进程终结子进程。
七态模型

比五态模型增加了“挂起”状态

为什么要有“挂起”状态?

由于进程的不断创建,系统资源已不能满足进程运行的要求,就必须把某些进程挂起(suspend),对换到磁盘镜像区中,暂时不参与进程调度,起到平滑系统操作负荷的目的。

挂起(Suspend):把一个进程从内存转到外存可能有以下几种情况:

  • 阻塞→阻塞挂起:没有进程处于就绪状态或就绪进程要求更多内存资源时,发生这种转换,以提交新进程或运行就绪进程。
  • 就绪→就绪挂起:当有高优先级阻塞(系统认为会很快就绪的)进程和低优先级就绪进程时,系统会挂起低优先级就绪进程。
  • 运行→就绪挂起:对抢占式系统,当有高优先级阻塞挂起进程因事件出现而进入就绪挂起时,系统可能会把运行进程转到就绪挂起状态。

激活(Activate):把一个进程从外存转到内存;可能有以下几种情况:

  • 就绪挂起→就绪:没有就绪进程或挂起就绪进程优先级高于就绪进程时,发生转换。
  • 阻塞挂起→阻塞:当一个进程释放足够内存时,系统会把一个高优先级阻塞挂起(系统认为会很快出现所等待的事件)进程转换为阻塞状态。
3.3.5 进程控制块
1)定义

进程控制块(Process Control Block)是系统为了管理进程设置的一个专门的数据结构,用它来记 录进程的外部特征,描述进程的运动变化过程。

系统利用PCB来控制和管理进程,所以PCB是系统感知进程存在的唯一标志

进程与PCB是一一对应的。

2)进程控制块的构成

(1)进程描述信息

  • 进程标识符(process ID),唯一,通常是一个整数
  • 进程名,通常基于可执行文件名(不唯一)
  • 用户标识符(user ID)
  • 进程组关系

(2)进程控制信息

  • 当前状态
  • 优先级(priority)
  • 代码执行入口地址
  • 程序的外存地址
  • 进程间同步和通信
  • 阻塞原因
  • 进程的队列指针
  • 进程的消息队列指针
  • 运行统计信息(执行时间、页面调度)

(3)所拥有的资源和使用情况

  • 虚拟地址空间的现状
  • 占用内存的大小

(4)CPU现场保护信息

  • 寄存器值(通用、程序计数器PC、状态PSW,地址包括栈指针)
  • 指向赋予该进程的段/页表的指针
3)进程控制块的组织
  • 系统把所有PCB组织在一起,并把它们放在内存的固定区域,就构成了PCB表。
  • PCB表的大小决定了系统中最多可同时存在的进程个数,称为系统的并发度。
3.3.6 进程的要素
1)进程的静态组成
  • 进程程序
  • 进程数据
  • 栈:用于系统调用、过程调用时的参数存储和传递
  • 进程控制块PCB (进程属性):
    • 处于核心段
    • 用户进程不能直接访问、修改自己的PCB
2)存储器中的进程映像
3)进程上下文

(1)进程上下文的概念:进程本身+运行环境对进程执行活动全过程的静态描述

(2)进程上下文的分类

用户级上下文:进程的用户地址空间(包括用户栈各层次),包括用户正文段、用户数据段和用户栈

寄存器级上下文:PSW寄存器、处理器状态寄存器、栈指针、通用寄存器的值

系统级上下文

● 静态部分(PCB和资源表格)

● 动态部分:核心栈(核心过程的栈结构,不同进程在调用相同核心过程时有不同核心栈)

(3)进程上下文的切换

进程切换是让处于运行态的进程中断运行,让出处理器,这时要做一次进程上下文切换、即保存老进程状态而装入被保护了的新进程的状态,以便新进程运行。

3.4 进程的控制

3.4.1 进程控制的概念

进程控制是系统使用一些具有特定功能的程序段来创建、撤消进程以及完成进程各状态间的转换,从而达到多进程高效率并发执行和协调、实现资源共享的目的

包括:创建进程、阻塞进程、唤醒进程、挂起进程、激活进程、终止进程和撤销进程等

3.4.2 原语

原语(Primitive)是在管态下执行、完成系统特定功能的过程。

原语在执行过程中不允许被中断,是一个不可分割的基本单位,原语的执行是顺序的而不可能是并发的。

3.4.3 进程的创建
1)进程创建的方式

(1)由系统程序模块统一创建,例如在批处理系统中,由操作系统的作业调度程序为用户作业创建相应的进程以完成用户作业所要求的功能。

(2)由父进程创建,例如在层次结构的系统中,父进程创建子进程以完成并行工作。

2)进程创建来源于以下事件:
  • 提交一个批处理作业
  • 在终端上交互式的登录
  • 操作系统创建一个服务进程
  • 存在的进程孵化(spawn)新的进程
3)进程的创建过程

(1)父进程(Parent Process)创建子进程(Child Process)时 ,系统在进程表中增加一项,并从PCB池中取一个空白PCB

(2)为新创建的进程映像分配地址空间。传递环境变量,构造共享地址空间。

(3)为新进程分配资源,除内存空间外,还有其他资源。

(4)查找辅存,找到进程正文段并装到正文区

(5)初始化进程控制块,为新进程分配进程标识符,初始化PSW。

(6)加入就绪进程队列,将进程投入运行。

(7)通知操作系统的某些模块,如记账程序、性能监控程序。

4)Linux 进程创建实例

Linux利用 fork ( ) 为每个终端创建一个子进程为用户服务。(考过)

3.4.4 进程的阻塞和唤醒
1)进程阻塞
  • 阻塞原语在一个进程期待某一事件(如键盘输入数据、其他进程发来的数据等)发生,但发生条件尚不具备,被该进程调用来阻塞自己;
  • 阻塞原语在阻塞一个进程时,由于该进程正处于执行状态,故应先中断处理机和保存该进程的CPU现场,保存现场信息到PSW
  • 然后,将被阻塞进程置“阻塞”状态后插入等待队列中,再转进程调度程序选择新的就绪进程投入运行。

进程阻塞的具体步骤是——

(1)停止进程执行,保存现场信息到PSW

(2)修改PCB的有关内容,如进程状态由运行改为等待

(3)把修改状态后的PCB加入相应的等待队列

2)进程唤醒

进程唤醒的具体步骤是——

(1)从相应的等待进程队列中取出PCB

(2)修改PCB的有关信息,如进程状态等

(3)将被唤醒的进程置为就绪状态之后,把修改后的PCB加入有关就绪进程队列

3.4.5 进程的撤销
1)以下情况导致进程被撤消:

① 该进程已完成所要求的功能而正常终止;

② 由于某种错误导致非正常终止;

③ 祖先进程要求撤消某个子进程。

2)撤销原语终止进程的具体步骤:

① 根据撤销进程标识号,从相应队列中找到它的PCB;

② 将该进程拥有的资源归还给父进程或操作系统;

③ 若该进程拥有子进程,应先撤销它所有子孙进程,以防它们脱离控制

④ 撤销进程出队,将它的PCB归还到PCB池。

3.4.6 进程的挂起和激活
1)挂起原语执行过程:

① 检查要被挂起进程的状态,若处于活动就绪态就修改为挂起就绪,若处于阻塞态,则修改为挂起阻塞。

② 被挂起进程PCB的非常驻部分要交换到磁盘对换区。

2)激活原语执行过程:

① 把进程PCB非常驻部分调进内存,修改它的状态,挂起等待态改为等待态,挂起就绪态改为就绪态,排入相应队列中。

② 挂起原语既可由进程自己也可由其他进程调用,但激活原语却只能由其他进程调用。

3.5 进程切换与模式切换(没考过)

3.5.1 执行模式
1)处理机一般有两种执行模式
  • 特权模式(又称核心模式、系统模式等)
  • 非特权模式(即用户模式)
3.5.2 模式切换
进程模式与模式切换的比较
  • 进程切换是指处理机从一个进程的运行转到另一个进程上运行。
  • 模式切换时,处理机还在同一个进程上运行,而进程切换指处理机转入另一个进程运行。

3.6 处理机调度

3.6.1 调度策略
1)要解决的问题

WHAT:按什么原则分配CPU?

——进程调度算法

WHEN:何时分配CPU?

——进程调度的时机

HOW : 如何分配CPU?

——CPU调度过程(进程的上下文切换)

2)调度的目标

① 合理性

② 有效性

3)考虑的因素

① 系统设计目标

批处理系统以充分发挥计算机效率为目的;实时系统要保证不要丢失实时信息并使之得到及时处理;而分时系统则应该优先保证用户的请求能够及时给予响应。

② 资源利用率

考虑在实现设计目标的前提下,尽可能地发挥各种资源的效能。

③ 均衡系统与用户的要求

一方面,不能因为用户的要求而完全不顾及系统的性能,另一方面,也不应该使一个作业的运行被无限制地推迟。

3.6.2 调度模式(背清楚)
1)高级调度

也称为作业调度宏观调度

例如,在分时操作系统中 ,高级调度任务:

(1)是否接受一个终端用户的连接;

(2)一个程序能否被计算机系统接纳并构成进程;

(3)一个新建态进程是否能够加入就绪进程队列。

2)中级调度

也称为平衡负载调度中程调度

(1)决定主存储器中所能容纳的进程数,这些进程将允许参与竞争处理器资源。

(2)中级调度根据存储资源量和进程的当前状态来决定辅存和主存中进程的对换。

(3)使用方法是通过把一些进程换出主存,使之进入挂起状态,起到平滑和调整系统负荷作用。

3)低级调度

也称为进程调度短程调度

(1)按照某种原则决定就绪队列中的哪个进程或线程能获得处理器,并将处理器出让给它工作。

(2)短程调度是操作系统最为核心的部分,短程调度策略的优劣直接影响到整个系统的性能。

(3)低级调度的时间尺度通常是毫秒级的。由于其算法的频繁使用,要求在实现时做到高效。

3.7 作业的管理与调度

3.7.1 作业及其调度
1)作业

(1)作业

用户在一次计算过程中,或者一次事务处理过程中,要求计算机系统所做工作的总称。

(2)作业流

若干个作业进入系统并存放于主存储中形成作业流。

(3)作业步

一个作业可划分成若干部分,每部分称一个作业步。

2)作业的状态及其转换

进入状态→后备状态→运行状态→退出状态

3)作业的调度

主要功能:

  • 审查系统能否满足用户作业的资源要求

只要通过调用相应的资源管理程序的有关部分,审核其表中是否能满足作业说明书中的要求即可

  • 按照一定的算法从输入井中的后备作业中选取作业

调度的关键在选择恰当的算法

3.7.2 作业与进程
作业与进程主要的区别与关系

① 作业是用户向计算机提交任务的任务实体,而进程则是完成用户任务的执行实体是向系统申请分配资源的基本单位

一个作业可由多个进程组成。且必须至少由一个进程组成,但反过来不成立

作业的概念主要用在批处理系统中,像Linux这样的分时系统中,则没有作业概念,而进程的概念则用在几乎所有的多道程序系统中

3.7.3 调度原则
1)理想目标

(1)单位时间内运行尽可能多的作业

(2)使处理器尽可能保持“忙碌”

(3)响应时间和周转时间能够尽可能短

(4)使各种I/O设备得以充分利用

(5)对所有的作业都是公平合理的

2)设计原则

要设计一个理想的调度算法是一件十分困难的事。在实际系统中,调度算法往往折衷考虑。

  • 调度算法应与系统设计目标保持一致
  • 注意系统资源均衡使用
  • 保证提交的作业在截止时间内完成
  • 设法缩短作业平均周转时间

大多数操作系统都采用比较简单的调度算法。

3)调度算法性能的衡量

(1)作业平均周转时间

(2)平均带权周转时间

3.7.4 作业调度算法(重点掌握)
1)常见的作业调度算法

(1)先来先服务算法(FCFS:First Come First Serve)

最简单的调度算法。按照作业提交的先后顺序分派CPU。当前作业或进程占用CPU后,除非其任务完成或阻塞,才让出CPU(非抢占式)。

特点:

  • 算法开销小
  • 有利于长作业,不利于短作业
  • 有利于CPU繁忙的作业,不利于I/O繁忙的作业

(2)最短作业优先算法(SJF:Shortest Job First)

对执行时间短的作业优先分派处理机。

特点:

  • 可以得到最大的系统吞吐率
  • 比FCFS算法改善了平均周转时间和带权周转时间
  • 有可能使长作业永远没有机会执行

(3)最短剩余时间优先算法(SRTF)

SRTF把SJF(短作业优先)算法改为抢占式。

一个新作业进入就绪状态,如果新作业需要的CPU时间比当前正在执行的作业剩余下来还需的CPU时间短,SRTF强行赶走当前正在执行作业。称最短剩余时间优先算法。

(4)最高响应比优先算法(HRN)

(HRN:Highest Response Ratio Next)

响应比R = 作业周转时间 / 作业处理时间

​ =(作业处理时间+作业等待时间)/作业处理时间

​ = 1 +(作业等待时间 / 作业处理时间)

(5)基于优先数的调度算法(HPF)

由用户规定优先数(外部优先数)

用户提交作业时,根据急迫程度规定适当的优先数

作业调度程序根据JCB优先数决定进入内存的次序

由系统计算优先数(内部优先数)

例:可按如下公式计算作业的优先数:

​ 优先数 = 用户规定优先数 – 作业处理时间 + 作业等待时间 – 输出量

(6)均衡调度算法(分类排队法)

基本思想:

  • 根据系统运行情况和作业属性将作业分类
  • 轮流从不同的作业类中挑选作业

目标:

  • 力求均衡地利用各种系统资源,发挥资源使用效率
  • 力求使用户满意
3.7.5 单道程序环境下的作业调度算法


3.7.6 多道程序环境下的作业调度算法

3.8 低级调度

3.8.1 低级调度的概念
  • 低级调度负责动态地把处理器分配给进程或内核级线程。
  • 操作系统中实现低级调度的程序称为进程(线程)调度程序,或分派程序(Dispatcher)。
  • 进程调度算法多数适用于线程调度。
3.8.2 低级调度的时机
  • 当一个进程从运行态切换成等待态时;
  • 当一个进程从运行态切换成就绪态时;
  • 当一个进程从等待态切换成就绪态时;
  • 当一个进程中止时。
3.8.3 低级调度的功能

(1)记录系统中所有进程的执行情况

(2)选择占有处理机的进程

(3)进行进程上下文切换

(4)低级调度的功能小结

  • 记住进程的状态。
  • 决定某个进程什么时候获得处理器。
  • 决定某个进程占用处理器多长时间。
  • 把处理器分配给进程。
  • 收回处理器。
3.8.4 低级调度的方式
可剥夺式(可抢占式Preemptive)

当有比正在运行的进程优先级更高的进程就绪时,系统可强行剥夺正在运行进程的CPU,提供给具有更高优先级的进程使用,或是当运行进程/线程时间片用完后被剥夺。win98/2000/xp

不可剥夺式(不可抢占式 Non-preemptive )

某一进程被调度运行后,除非由于它自身的原因不能运行,否则一直运行下去。win3.1

3.8.5 低级调度算法
1)先来先服务算法
  • 按照进程进入就绪队列的先后次序分配处理器。先进入就绪队列的进程优先被挑选,运行进程一旦占有处理器将一直运行直到结束或阻塞。
  • 算法容易实现,效率不高,不利于I/O频繁的进程
2)时间片轮转调度算法
  • 调度程序每次把CPU分配给就绪队列首进程使用一个时间片,例如100ms,就绪队列中的每个进程轮流地运行一个时间片。
  • 当这个时间片结束时,强迫一个进程让出处理器,让它排列到就绪队列的尾部,等候下一轮调度。
  • 轮转策略可防止那些很少使用外围设备的进程过长的占用处理器而使得要使用外围设备的那些进程没有机会去启动外围设备。

关于时间片的取选

  • 轮转法调度是一种剥夺式调度,系统耗费在进程切换上的开销比较大,这个开销与时间片的大小很有关系。
  • 时间片大小的确定要从进程个数、切换开销、系统效率和响应时间等方面考虑。
  • 时间片取值太小,多数进程不能在一个时间片内运行完毕,切换就会频繁,开销显著增大,从系统效率来看,时间片取大一点好。
  • 时间片取值较大,随就绪队列里进程数目增加,轮转一次的总时间增大,对进程的响应速度放慢了。为满足响应时间要求,要么限制就绪队列中进程数量,要么采用动态时间片法,根据负载状况,及时调整时间片的大小。
3)优先权调度算法

(1)静态优先数法

  • 使用外围设备频繁者优先数大,这样有利于提高效率;
  • 重要算题程序的进程优先数大,这样有利于用户;
  • 进入计算机时间长的进程优先数大,这样有利于缩短作业完成的时间;
  • 交互式用户的进程优先数大,这样有利于终端用户的响应时间等等。

(2)动态优先数法

  • 根据进程占有CPU时间多少来决定,当进程占有CPU时间愈长,那么,在它被阻塞之后再次获得调度的优先级就越低,反之,进程获得调度的可能性越大;
  • 根据进程等待CPU时间多少来决定,当进程在就绪队列中等待时间愈长,那么,在它被阻塞之后再次获得调度的优先级就越高,反之,进程获得调度的可能性越小。
4)多级反馈队列调度
  • 又称反馈循环队列或多队列策略。主要思想是将就绪进程分为两级或多级,系统相应建立两个或多个就绪进程队列,较高优先级的队列一般分配给较短的时间片。
  • 处理器调度先从高级就绪进程队列中选取可占有处理器的进程,只有在选不到时,才从较低级的就绪进程队列中选取。
5)保证调度算法
  • 向用户做出明确的性能保证,然后去实现它。
  • 容易实现的一种保证是:当工作时己有n个用户登录在系统,则将获得CPU处理能力的1/n。
  • 必须跟踪各个进程自创建以来已经使用了多少CPU时间。计算各个进程应获得的CPU时间,即自创建以来的时间除以n。由于各个进程实际获得的CPU时间已知,所以很容易计算出实际获得的CPU时间和应获得的CPU时间之比,于是调度将转向比率最低的进程。
6)***调度算法
  • 基本思想:为进程发放针对各种资源(如CPU时间)的***。调度程序随机选择一张***,持有该***的进程获得系统资源。
  • 进程都是平等的,有相同的运行机会。如果某些进程需要更多的机会,可被给予更多***,增加其中奖机会。

3.9 线程及其概念

3.9.1 线程的定义
  • 引入线程(Thread)的基本目的是将进程以更细的粒度加以切分,以低开销进一步提高系统的并发度
  • 所谓线程,有的系统中也称之为轻量级进程,是进程中的一个运行实体,作为CPU的调度单位。
  • 在多线程系统中,资源分配的单位,或是资源的拥有者还是进程。
  • 多线程程序设计是指使单个程序中包含并发执行的多个线程。
3.9.2 线程的内容
  • 线程是进程的一条执行路径,它包含独立的堆栈和CPU寄存器状态
  • 每个线程共享其所附属的进程的所有的资源
  • 线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一物理内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。
  • 线程有生命周期,即它由创建而产生,由撤消而消亡。在线程的生命期中,它总是从一种状态变迁到另一种状态。
3.9.3 线程的结构
1)传统进程与多线程进程模型
  • 在传统进程模型中,进程控制块(PCB)记录进程的所有信息,进程拥有一个虚地址空间,一个用户栈用于执行用户程序,一个核心栈用于执行核心程序。
  • 在多线程进程模型中,除了进程控制块和进程虚空间外,每个线程拥有一个线程控制块TCB,每个线程都有一个用户栈和核心栈。
2)线程控制块

① 线程标识信息。

② 线程运行状态(如运行、就绪等)和调度优先级等调度 信息。

③ 分别在用户态和核心态下使用的两个栈。用于保存现场 信息、子程序局部变量等。

④ 一个线程关联的私有存储区。

⑤ 与进程描述信息的连接信息。进程内的每个线程都共享进程描述信息,如地址空间、使用资源等。

3.9.4 进程与线程(重中之重)
1)联系与区别

① 进程是资源分配的基本单位。进程也是抢占处理机的调度单位,它拥有一个完整的虚拟地址空间。而线程与资源分配无关,它属于某一个进程,并与进程内的其他线程一起共享进程的资源。

② 当进程发生调度时,不同的进程拥有不同的虚拟地址空间,而同一进程内的不同线程共享同一地址空间。

③ 线程只由相关堆栈寄存器和线程控制块组成。寄存器可被用来存储线程内的局部变量,但不能存储其他线程的相关变量。

④ 进程切换时涉及到有关资源指针的保存以及地址空间的变化等问题;线程切换时,由于同一进程内的线程共享资源和地址空间,将不涉及资源信息的保存和地址变化问题。而且,进程的调度与切换都是由操作系统内核完成,而线程则既可由操作系统内核完成,也可由用户程序进行。

⑤ 进程间的关系比较疏远。各个进程是在自己独有的地址空间内执行,不但寄存器和堆栈是独有的,动态数据堆、静态数据区和程序代码也相互独立。而线程间的关系则要紧密得多,虽然各线程为保持自己的控制流而独有寄存器和堆栈,但由于两线程从属于同一进程,它们共享同一地址空间,所以动态堆、静态数据区及程序代码为各线程共享。

3.9.5 线程的优势

① 快速的关联切换

进程调度时,系统必须交换地址空间,因而进程切换时间长。在同一程序内的多个线程共享同一地址空间,因而能使线程快速切换。

② 系统额外开销小

对多个进程的管理(创建、调度等)有比较大的系统开销。在需要动态创建新进程的应用中,这种开销比较显著。而线程的系统开销比进程的小得多。

③ 通信很容易实现

进程或线程之间需要进行数据交换。对于自动共享同一地址空间的各线程来说,所有的全局数据都可以访问,因而不需要什么特殊手段就能自动实现数据共享。而进程之间的通信则要复杂得多。

④ 线程个数比进程个数多得多

许多多任务操作系统限制用户进程总数,这对许多并发应用来说远远不够。在多线程系统中,虽存在线程总数限额,但个数多得多。

3.9.6 线程的实现
1)用户级线程

用户级线程的优点在于:

① 线程不依赖于操作系统,可以采用与问题相关的调度策略,灵活性好;

② 同一进程中的线程切换不需进入操作系统,因而实现效率较高。

用户级线程的缺点在于:

① 同一进程中的多个线程不能真正并行;

② 由于线程对操作系统不可见,调度在进程级别,若某进程中的一个线程通过系统调用进入操作系统受阻,该进程的其他线程也不能运行。

2)核心级线程

①核心级线程是由操作系统支持实现的线程,操作系统维护核心级线程的各种管理表格,负责线程在处理机上的调度和切换,线程是CPU调度的基本单位。

②操作系统提供了一系列系统调用界面,让用户程序请求操作系统进行线程创建、结束、同步等操作。

核心级线程的优点是并发性好,在多CPU环境中同一进程中的多个线程可以真正并行执行。

缺点是线程控制和状态转换需要进入操作系统完成,系统开销比较大。

3)混合级线程

3.10 Linux 进程管理(不考)

Linux的调度函数是schedule。