第一章

操作系统的概念、功能和目标

操作系统的概念

操作系统(OS)是指

  1. 控制和管理整个计算机系统的硬件和软件资源,
  2. 并合理地组织调度计算机的工作和资源的分配,
  3. 以提供给用户和其他软件方便的接口和环境,
  4. 它是计算机系统中最基本的系统软件

操作系统的功能和目标

  1. 作为系统资源的管理者

    1. 处理机管理:将对应的进程交给**处理机(CPU)**处理
    2. 存储器管理:将要执行的程序的相关数据放入内存
    3. 文件管理:找到文件存放位置的过程
    4. 设备管理:将外接设备分配给进程、回收的过程
    5. 目标:安全、高效

    (进程是一个程序的执行过程,执行前需要将该程序放到内存中,才能被CPU处理

  2. 用户与计算机硬件之间的接口

    1. 命令接口:允许用户直接使用

      1. 联机命令接口:交互式(e.g. cmd)
      2. 脱机命令接口:批处理(e.g. 代码文件)
    2. 程序接口(系统调用 / 广义指令)(允许用户通过程序间接使用):由一组系统调用组成
    3. GUI(图形用户界面)
    4. 目标:方便用户使用

    (命令接口和程序接口统称用户接口)

  3. 最接近硬件的层次

    1. 对硬件机器的扩展

    (把覆盖了软件的机器称为扩充机器、虚拟机)

操作系统的特征

  1. 并发
  2. 共享
  3. 虚拟
  4. 异步

并发与共享是两个最基本的特征,两者互为存在条件。(如果不存在其中一种,另一种也就失去了意义)

并发

  • 并发:指两个或多个事件在同一时间间隔内发生宏观上同时发生,微观上交替发生
  • 并行:指两个或多个事件在同一时刻同时发生

操作系统的并发性指计算机系统中同时存在多个运行中的程序。即单核处理机同一时刻只能执行一个程序,操作系统赋值协调多个(宏观)程序交替(微观)执行。

共享

资源共享,指系统中的资源可供内存中多个并发执行的进程共同使用。

两种资源共享方式:

  • 互斥共享方式

    • 一个时间段内只允许一个进程访问
    • (微信和QQ不能同时视频聊天)
  • 同时共享方式
    • 一个时间段内允许多个进程访问(宏观上同时,微观上交替)
    • (微信和QQ同时发送文件,微观上交替访问硬盘)

虚拟

指把一个物理实体(实际存在)变为若干个逻辑对应物(用户感受)。

虚拟技术:

  • 空分复用技术

    • 如虚拟存储器
  • 时分复用技术
    • 如虚拟处理器:即使只有一个单核CPU,宏观上似乎有多个CPU为自己服务,微观上处理机在各个微小的时间段内交替为各个进程服务。

如果失去并发性,则一个时间段内系统只能运行一段程序,则失去实现虚拟性的意义

异步

在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行需要不可预知地不断地中断开始。这就是进程的异步性。

如果失去并发性,则每个进程执行完才执行下一个,则失去实现异步性的意义

操作系统的发展和分类

OS的发展与分类:

  • 手工操作阶段

    • 缺点:人机速度矛盾
  • 批处理阶段
    • 单道批处理系统(引入脱机输入输出技术)

      • 优点:缓解人机速度矛盾
      • 缺点:资源利用率依然很低
    • 多道批处理系统(操作系统开始出现)
      • 优点:多道程序并发执行,资源利用率高
      • 缺点:不提供人机交互功能
  • 分时操作阶段
    • 优点:提供人机交互功能
    • 缺点:不能优先处理紧急任务
  • 实时操作阶段
    • 硬实时系统
    • 软实时系统
    • 优点:能优先处理紧急任务
  • 网络操作系统
  • 分布式操作系统
  • 个人计算机操作系统

操作系统的运行机制与体系结构

运行机制

指令是处理器能识别、执行的最基本的命令。(即代码翻译过来的机器语言指令)

两种指令:

  • 特权指令:不允许用户程序使用(如内存清零)
  • 非特权指令:允许用户程序使用(如普通的运算)

两种处理器状态(通过程序状态字寄存器(PSW)中的某标志位类标识状态(0用户态1核心态)):

  • 用户态(目态):此时只能执行非特权指令
  • 核心态(管态):此时都可以执行

两种程序:

  • 内核程序:可以执行两种指令,运行在核心态
  • 应用程序:可以执行非特权指令,运行在用户态

内核

内核:计算机上配置的底层软件,是操作系统最基本、最核心的部分

  • 对系统资源进行管理的功能(非必要内核程序):进程管理、存储器管理、设备管理等功能(大内核拥有,微内核无)
  • 时钟管理:实时计时功能
  • 中断管理
  • 原语(设备驱动、CPU切换等):一种特殊的程序,最接近硬件的部分,具有原子性(不执行或执行至结束)。

(时钟管理、中断管理、原语是必要的)

体系结构

  • 大内核:

    • 将操作系统的主要功能模块都作为系统内核,运行在核心态
    • 优点:高性能
    • 缺点:代码庞大,结构混乱,难以维护
  • 微内核
    • 只把最基本的功能保留在内核
    • 优点:代码少,结构清晰,方便维护
    • 缺点:需要频繁在核心态和用户态之间切换,性能低

中断和异常

中断机制的诞生

为了实现多道程序并发执行而引入的一种技术。

中断的概念和作用

本质:发生中断就意味着需要操作系统介入,开展管理工作

背景:由于操作系统的管理工作(比如进程切换、分配I/O设备等)需要使用特权指令,因此CPU要从用户态转为核心态。

作用:中断可以使CPU从用户态切换为核心态,使操作系统获得计算机的控制权。有了中断才能实现多道程序的并发执行。

表现:

  1. 当中断发生时,CPU立即进入核心态
  2. 当中断发生后,当前进程暂停运行,由操作系统内核对中断进行处理
  3. 对于不同的中断信号会进行不同的处理

中断是CPU从用户态进入核心态唯一途径。核心态进入用户态只需执行特权指令修改PSW的标志位。

中断的分类

第一种分类方式

  • 内中断(也称异常、例外、陷入):信号来源CPU内部,与当前执行的指令有关

    • 自愿中断——指令中断(系统调用)
    • 强迫中断
      • 硬件故障(缺页)
      • 软件中断(整数除0)
  • 外中断(也称中断):信号来源CPU外部,与当前执行的指令无关

    • 外设请求
    • 人工干预

第二种分类方式

  • 内中断

    • 陷入:有意的异常(系统调用)
    • 故障:可处理的故障(缺页)
    • 终止:不可修复的错误(整数除0)
  • 外中断
    • I/O中断请求
    • 人工干预

外中断的处理过程

  1. 每次执行完一条指令,CPU检查当前是否有外中断信号
  2. 如果有,保存当前进程的CPU环境
  3. 转入相应的中断处理程序(核心态)
  4. 恢复进程CPU环境,继续执行下一条指令

系统调用

概念:

  1. 系统调用是操作系统提供给应用程序使用的接口
  2. 通过系统调用来获得操作系统的服务
  3. 系统调用会使处理器从用户态进入核心态
  4. 系统中的各种共享资源都由操作系统统一管理,凡是与资源有关的操作(如存储分配、I/O操作、文件管理等),都必须通过系统调用向操作系统提出服务请求,由操作系统完成。

作用:保证系统的稳定性和安全性,防止用户非法操作。

分类(按功能划分):

  • 设备管理
  • 文件管理
  • 进程控制
  • 进程通信
  • 内存管理

系统调用的功能需要执行一些特权指令才能完成,故需要在核心态上进行。

系统调用的过程

传递系统调用参数 =》执行陷入指令(用户态) =》 执行系统调用相应的服务程序(核心态) =》 返回用户程序

注意:

  1. 陷入指令是在用户态执行的,执行后引发一个内中断,使CPU进入核心态
  2. 发出系统调用请求是在用户态系统调用相应的处理是在核心态
  3. 陷入指令是唯一一个只能在用户态执行,不能在核心态执行的指令

第二章

进程的定义、组成、组织方式、特征

进程的定义

程序:一个指令序列。

单道程序技术:在内存中,程序保存在程序段,程序运行过程的数据保存在数据段

多道程序技术:为方便管理,引入进程、进程实体。PCB、程序段、数据段三部分构成进程实体(进程映像)

(PCB:进程控制块,用来描述进程的各种信息,是进程存在的唯一标志

定义:

  1. 进程是程序的一次执行过程
  2. 进程是一个程序及其数据在处理机上顺序执行时所发生的活动
  3. 进程是具有独立功能的程序在数据集合上运行的过程动态性),它是系统进行资源分配和调度的一个独立单位

定义:进程是进程实体的运行过程,是系统进行资源分配调度的一个独立单位

注意:进程实体是静态的,进程是动态的。但一般情况下可以把进程实体简称为进程。

进程的组成

进程(进程实体)由程序段、数据段、PCB三部分组成。

PCB:存放进程的**管理者(操作系统)**所需的数据

  • 进程描述信息

    • 进程标识符PID:进程ID
    • 用户标识符UID:进程用户ID
  • 进程控制和管理信息
    • 进程当前状态
    • 进程优先级
  • 资源分配清单
    • 程序段指针
    • 数据段指针
    • 键盘
    • 鼠标
  • 处理机相关信息
    • 各种寄存器值:保存进程环境

进程的组织

多个进程之间的组织方式。

  • 链接方式

    • 按照进程状态将PCB分为多个队列
    • 操作系统持有指向各个队列的指针
      • 执行指针
      • 就绪队列指针
      • 阻塞队列指针
  • 索引方式
    • 根据进程状态的不同建立多张索引表
    • 操作系统持有指向各个索引表指针
      • 执行指针
      • 就绪表指针
      • 阻塞表指针

进程的特征

  • 动态性:进程是程序的一次执行过程,是动态地产生、变化和消亡的,是进程最基本的特征
  • 并发性:内存中有多个进程实体,各进程可并发执行
  • 独立性:进程是能独立运行、独立获得资源、独立接受调度基本单位
  • 异步性:各进程以不可预知的速度向前推进,可能导致运行结果的不确定性
  • 结构性:由固定结构:程序段、数据段、PCB组成

进程的状态与转换

进程的状态

三种基本状态:

  • 运行态(Running):占有CPU,并在CPU上运行(单核只能有一个进程处于运行态)
  • 就绪态(Ready):已经具备运行条件,但由于没有空闲CPU,而暂时不能运行
  • 阻塞态(Waiting/Blocked,又称等待态):因等待某一事件而暂时不能运行

另外两种状态:

  • 创建态(New,又称新建态):进程正在被创建。操作系统为进程分配资源、初始化PCB
  • 终止态(Terminated,又称结束态):进程正在从系统中撤销,操作系统会回收进程拥有的资源、撒销PCB

进程的转换

进程控制

基本概念

对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。

即实现进程状态转换

为防止运行态->就绪态而没有改变PCB,用原语实现进程控制。原语的特点是执行期间不允许中断。这种不可被中断的操作即原子操作。原语采用“关中断指令”和“开中断指令”实现原子操作。

关/开中断指令的权限非常大,是只允许在核心态下执行的特权指令。所以原语也运行在核心态

进程控制相关的原语

创建原语(在进程创建时):

  • 申请空白PCB
  • 为新进程分配所需资源
  • 初始化PCB
  • 将PCB插入就绪队列

引起进程创建的事件:

  • 用户叠录:分时系统中,用户登录成功,系统会建立为其建立一个新的进程
  • 作业调度:多道批处理系统中,有新的作业放入内存时,会为其建立一个新的进程
  • 提供服务:用户向操作系统提出某些请求时,会新建一个进程处理该请求
  • 应用请求:由用户进程主动请求创建一个子进程

撤销原语(在进程终止时):

  • 从PCB集合中找到终止进程的PCB
  • 若进程正在运行,立即剥夺CPU,将CPU分配给其他进程
  • 终止其所有子进程
  • 将该进程据有的所有资源归还给父进程或操作系统
  • 删除PCB

引起进程终止的事件:

  • 正常结束
  • 异常结束
  • 外界干预

阻塞原语(在进程阻塞时):

  • 找到要阻塞的进程对应的PCB
  • 保护进程运行现场,将PCB状态信息设置为"阻塞态"。暂时停止进程运行
  • 将PCB插入相应事件的等待队列

引起进程阻塞的事件:

  • 需要等待系统分配某种资源
  • 需要等待相互合作的其他进程完成工作

唤醒原语(在进程唤醒时):

  • 在事件等特队列中找到PCB
  • 将PCB从等待队列移除。设置进程为就堵态
  • 将PCB插入就绪队列。等特被调度

引起进程唤醒的事件:

  • 等待的事件发生

切换原语(在进程切换时):

  • 将运行环境信息存入PCB
  • PCB移入相应队列
  • 选择另一个进程执行,并更新其PCB
  • 根据PCB恢复新进程所需的运行环境

引起进程切换的事件:

  • 当前进程时间片到
  • 有更高优先级的进程到达
  • 当前进程主动阻塞
  • 当前进程终止

进程通信

为了保证安全,一个进程不能直接访问另一个进程的地址空间

进程通信的三种方式:

  • 共享存储

    (两个进程不能同时访问共享空间)

    • 基于数据结构的共享:速度慢、限制多,是一种低级通信方式
    • 基于存储区的共享:速度更快,是一种高级通信方式。
  • 消息传递

    进程间的数据交换以格式化的消息(Message)为单位。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换。

    • 直接通信方式:消息直接挂在接收进程的消息缓冲队列上

    • 间接通信方式:消息要先发送到中间实体(信箱)中,也称“信箱通信方式”

  • 管道通信

    1. 一个管道只能半双工通信。
    2. 数据以字符流的形式写入管道。
    3. 如果没写满,就不允许读(读进程的read()系统调用将被阻塞)。如果没读空,就不允许写(进程的write()系统调用将被阻塞)。
    4. 数据一旦被读出,就从管道中被抛弃,这就意味着读进程最多只能有一个,否则可能会有读错数据的情况。

线程、多线程模型

概念

为什么要线程:有些进程需要并发处理各种任务,故引入线程。

引入线程后,线程是一个基本的CPU执行单元,也是程序执行流的最小单位进程只作为除CPU之外的系统资源的分配单元,例如分配打印机给该进程。

引入线程后的变化:

  • 资源分配、调度

    • 传统:进程是资源分配、调度的基本单位
    • 现在:进程是资源分配的基本单位,线程是调度的基本单位
  • 并发性

    • 传统:只能进程间并发
    • 现在:各线程间也能并发,提升了并发度
  • 系统开销

    • 传统:需要切换进程的运行环境,系统开销很大
    • 现在:并发所带来的系统开销减小

    (线程间并发,如果是同一进程内的线程切换,则不需要切换进程环境,系统开销小)

线程的属性

  • 线程是处理机调度的单位
  • 多CPU计算机中,各个线程可占用不同的CPU
  • 每个线程都有一个线程ID、线程控制块(TCB)
  • 线程也有就绪、阻塞、运行三种基本状态
  • 线程几乎不拥有系统资源
  • 同一进程的不同线程间共享进程的资源
  • 由于共享内存地址空间。同一进程中的线程间通信甚至无需系统干预
  • 同一进程中的线程切换,不会引起进程切换
  • 不同进程中的线程切换。会引起进程切换
  • 切换同进程内的线程,系统开销很小
  • 切换进程,系统开销较大

线程的实现方式

用户级线程

  • 由应用程序通过线程库实现。所有的线程管理工作都由应用程序负责,线程切换也在用户态完成。

内核级线程

  • 线程的管理工作操作系统内核完成。线程调度、切换等工作都由内核负责,因此内核级线程的切换必然需要在核心态下才能完成。

内核级线程才是处理机分配的单位

多线程模型

在同时支持用户级线程和内核级线程的系统中,几个用户级线程映射到几个内核级线程的方式,即多线程模型。

多对一模型:多个用户级线程映射到一个内核级线程。

优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高。
缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行。

一对一模型:一个用户级线程映射到一个内核级线程。

即与上述单纯内核级线程一致。

优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。
缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。

多对多模型:n 用户及线程映射到 m 个内核级线程(n >= m)。

克服了多对一模型并发度不高的缺点,又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。

处理机调度的概念、层次

概念

调度:以某种规则来决定处理这些任务的顺序

处理机调度:从就绪队列中按照一定的算法选择一个进程将处理机分配给它运行,以实现进程的并发执行。

三个层次

高级调度

高级调度(作业调度)。按一定的原则从外存上处于后备队列的作业中挑选一个(或多个)作业,给他们分配内存等必要资源,并建立相应的进程(建立PCB),以使它(们)获得竞争处理机的权利

高级调度是辅存(外存)与内存之间的调度。每个作业只调入一次,调出一次。作业调入时会建立相应的PCB,作业调出时才撤销PCB。高级调度主要是指调入的问题,因为只有调入的时机需要操作系统来确定,但调出的时机必然是作业运行结束才调出。

中级调度

暂时调到外存等待的进程状态为挂起状态。但PCB并不会一起调到外存,而是会常驻内存。PCB中会记录进程数据在外存中的存放位置,进程状态等信息,操作系统通过内存中的PCB来保持对各个进程的监控、管理。被挂起的进程PCB会被放到的挂起队列中。

中级调度(内存调度),就是要决定将哪个处于挂起状态的进程重新调入内存。一个进程可能会被多次调出、调入内存,因此中级调度发生的频率要比高级调度更高。

挂起态可分为就绪挂起、阻塞挂起

七状态模型

低级调度

低级调度(进程调度),其主要任务是按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它。

进程调度是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度。进程调度的频率很高。

进程调度的时机、切换与过程、调度方式

时机

  • 当前运行的进程主动放弃处理机

    • 进程正常终止
    • 运行过程中发生异常而终止
    • 进程主动请求阻塞(如等待I/O)
  • 当前运行的进程被动放弃处理机
    • 分给进程的时间片用完
    • 有更紧急的事需要处理(如I/O中断)
    • 有更高优先级的进程进入就绪队列

不能进行进程调度与切换的情况:

  1. 处理中断的过程中。中断处理过程复杂,与硬件密切相关,很难做到在中断处理过程中进行进程切换。
  2. 进程在操作系统内核程序临界区中。
  3. 原子操作过程中(原语)

临界资源:一个时间段内只允许一个进程使用的资源。各进程需要互斥地访问临界资源。

临界区:访问临界资源的那段代码。

内核程序临界区一般是用来访问某种内核数据结构的,不可以进行进程调度与切换。

普通临界区访问的是不会直接影响操作系统内核的管理工作,可以进行进程调度与切换。

进程调度的方式

  • 非剥夺调度方式,又称非抢占方式。即只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程依然会继续使用处理机,直到该进程终止或主动要求进入阻塞态。
  • 剥夺调度方式,又称抢占方式。当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要紧迫的那个进程。

进程的切换与过程

进程切换的过程主要完成了:

  1. 对原来运行进程各种数据的保存
  2. 对新的进程各种数据的恢复

(如:程序计数器、程序状态字、各种数据寄存器等处理机现场信息,这些信息一般保存在进程控制块(PCD))

进程的切换是有代价的

调度算法的评价指标

  • CPU利用率:忙碌时间 / 总时间
  • 系统吞吐量:总完成作业 / 总时间
  • 周转时间
    • 周转时间:完成时间 - 提交时间
    • 平均周转时间:周转时间之和 / 作业数
    • 带权周转时间:周转时间 / 运行时间
    • 平均带权周转时间:带权周转时间之和 / 作业数
  • 等待时间
    • 进程 / 作业 等待被服务的时间之和
    • 平均等待时间即各个 进程 / 作业等待时间的平均值
  • 响应时间
    • 从用户提交请求到首次产生响应所用的时间

调度算法

饥饿:某进程/作业长期得不到服务。

先来先服务(FCFS)

  • 算法思想:“公平”

  • 算法规则:按照作业/进程到达的先后顺序进行服务

  • 用于作业/进程调度:用于作业调度时,考虑的是哪个作业先到达后备队列;用于进程调度时,考虑的是哪个进程先到达就绪队列

  • 是否可抢占:非抢占式的算法

  • 优缺点:

    • 优点:公平、算法实现简单
    • 缺点:排在长作业(进程)后面的短作业需要等待很长时间,带权周转时间很大。对长作业有利,对短作业不利
  • 是否会导致饥饿:不会

短作业优先(SJF)

  • 算法思想:追求最少的平均等待时间,最少的平均周转时间、最少的平均平均带权周转时间

  • 算法规则:最短的作业/进程优先得到服务(所谓“最短”,是指要求服务时间最短)

  • 用于作业/进程调度:也可用于进程调度。用于进程调度时称为“短进程优先(SPF)算法”

  • 是否可抢占:SJF 和 SPF非抢占式的算法。最短剩余时间优先算法(SRTN)是抢占式

  • 优缺点:

    • 优点:“最短的”(不严谨)平均等待时间、平均周转时间
    • 缺点:不公平。对短作业有利,对长作业不利。可能产生长作业饥饿现象。另外,作业/进程的运行时间是由用户提供的,并不一定真是短作业
  • 是否会导致饥饿:会。如果源源不断地有短作业/进程到来,可能使长作业/进程“饥饿”

高响应比优先(HRRN)

  • 算法思想:要综合考虑作业/进程的等待时间和要求服务的时间

  • 算法规则:在每次调度时先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务

    响应比 = (等待时间 + 要求服务时间)/ 要求服务时间

  • 用于作业/进程调度:即可用于作业调度,也可用于进程调度

  • 是否可抢占:非抢占式算法

  • 优缺点:

    • 优点:综合考虑了等待时间和运行时间(要求服务时间),对于长作业来说,随着等待时间越来越久,其响应比也会越来越大,从而避免了长作业饥饿的问题
  • 是否会导致饥饿:不会

时间片轮转调度算法(RR)

  • 算法思想:公平地、轮流地为各个进程服务,让每个进程在一定时间间隔内都可以得到响应

  • 算法规则:按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片。若进程未在一个时间片内执行完,则剥夺处理机,将进程重新放到就绪队列队尾重新排队。

  • 用于作业/进程调度:用于进程调度

  • 是否可抢占:抢占式算法。由时钟装置发出时钟中断来通知CPU时间片已到

  • 优缺点:

    • 优点: 公平;响应快,适用于分时操作系统;
    • 缺点:由于高频率的进程切换,因此有一定开销;不区分任务的紧急程度。
  • 是否会导致饥饿:不会

如果时间片太大,使得每个进程都可以在一个时间片内就完成,则退化为先来先服务调度算法,并且会增大进程响应时间。
如果时间片太小,会导致进程切换过于频繁,系统会花大量的时间来处理进程切换。

优先级调度算法

  • 算法思想:实时操作系统的出现,越来越多的应用场景需要根据任务的紧急程度来决定处理顺序

  • 算法规则:调度时选择优先级最高的作业/进程

  • 用于作业/进程调度:作业调度、进程调度、I/O调度

  • 是否可抢占:抢占式或非抢占式。

  • 优缺点:

    • 优点:用优先级区分紧急程度、重要程度,适用于实时操作系统。可灵活地调整对各种作业/进程的偏好程度。
    • 缺点:可能导致饥饿
  • 是否会导致饥饿:会。若源源不断地有高优先级进程到来

优先级分为:

  • 静态优先级:创建进程时确定,之后一直不变。
  • 动态优先级:创建进程时有一个初始值,之后会根据情况动态地调整优先级。

通常:

  • 系统进程优先级高于用户进程
  • 前台进程优先级高于后台进程
  • 操作系统更偏好 I/O 型进程(或称 I/O 繁忙型进程)
    注:与 I/O 型进程相对的是计算型进程(或称CPU繁忙型进程)
  • 如果某进程在就绪队列中等待了很长时间,则可以适当提升其优先级
  • 如果某进程占用处理机运行了很长时间,则可适当降低其优先级
  • 如果发现一个进程频繁地进行l/o操作,则可适当提升其优先级

多级反馈队列调度算法

  • 算法思想:对其他调度算法的折中权衡

  • 算法规则:详见下方例题

  • 用于作业/进程调度:进程调度

  • 是否可抢占:抢占式的算法。在k级队列的进程运行过程中,若更上级的队列(1~k-1级)中进入了一个新进程,则由于新进程处于优先级更高的队列中,因此新进程会抢占处理机,原来运行的进程放回k级队列队尾

  • 优缺点:

    • 优点:对各类型进程相对公平(FCFS的优点);每个新到达的进程都可以很快就得到响应(RR的优点);短进程只用较少的时间就可完成(SPF的优点);不必实现估计进程的运行时间(避免用户作假);可灵活地调整对各类进程的偏好程度,比如将因I/O而阻塞的进程重新放回原队列,这样I/O型进程就可以保持较高优先级
  • 是否会导致饥饿:会

进程同步、互斥

进程同步

进程具有异步性:各并发执行的进程以各自独立的、不可预知的速度向前推进。

同步亦称直接制约关系,它是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而产生的制约关系。进程间的直接制约关系就是源于它们之间的相互合作。(同步即用来解决异步次序不一定的问题)

进程互斥

一个时间段内只允许一个进程使用的资源称为临界资源。许多物理设备(比如摄像头、打印机)都属于临界资源。此外还有许多变量、数据、内存缓冲区等都属于临界资源。

对临界资源的访问,必须互斥地进行。

进程互遵循的原则:

  1. 空闲让进。临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区
  2. 忙则等待。当已有进程进入临界区时,其他试图进入临界区的进程必须等待
  3. 有限等待。对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿)
  4. 让权等待。当进程不能进入临界区时,应立即释放处理机,防止进程忙等待。

进程互斥的软件实现方法

单标志法

算法思想:两个进程在访问完临界区后会把使用临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予

主要问题:违背“空闲让进”原则。如果P0一直不访问临界区,P1将一直不能访问。

双标志先检查

算法思想:设置一个布尔型数组flag[],数组中各个元素用来标记各进程想进入临界区的意愿

主要问题:违反“忙则等待”原则。进入区的“检查”和“上锁”两个处理没有原子性。“检查”后,“上锁”前可能发生进程切换,导致同时进入临界区。

双标志后检查

算法思想:设置一个布尔型数组flag[],数组中各个元素用来标记各进程想进入临界区的意愿。但是是先“上锁”后“检查”。

主要问题:违背了“空闲让进”和“有限等待”。进入区的“上锁”和“检查”两个处理没有原子性。“上锁”后,“检查”前可能发生进程切换,导致同时都无法进入临界区。各进程都长期无法访问临界资源而**产生“饥饿”**现象。

Peterson 算法

算法思想:如果双方都争着想进入临界区,那可以让进程尝试主动让对方先使用临界区。

主要问题:Peterson算法用软件方法解决了进程互斥问题,遵循了空闲让进、忙则等待、有限等待三个原则,但是依然未遵循让权等待的原则。

进程互斥的硬件实现方法

中断屏蔽方法

利用“开/关中断指令”实现,即在某进程开始访问临界区到结束访问为止都不允许被中断,也就不能发生进程切换,因此也不可能发生两个同时访问临界区的情况。

优点:简单、高效

缺点:

  • 不适用于多处理机
  • 只适用于操作系统内核进程,不适用于用户进程(因为开/关中断指令只能运行在内核态)

TestAndSet(TS指令 / TSL指令)

TSL指令是硬件实现的,执行过程具有原子性。相当于把“上锁”和“检查”当做一个操作。

优点:实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞;适用于多处理机环境

缺点:不满足“让权等待”原则,暂时无法进入临界区的进程会占用CPU并循环执行TSL指令,从而导致“忙等”

Swap指令(XCHG指令)

逻辑实现原理与优缺点与TSL指令差不多。

信号量机制

用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现了进程互斥、进程同步。

信号量其实就是一个变量(可以是一个整数,也可以是更复杂的记录型变量),可以用一个信号量来表示系统中某种资源的数量

一对原语:wait(S)原语和signal(S)原语。可以理解为函数,括号里的信号量S是参数。wait、signal原语常简称为P、V操作,通常写为P(S)、 V(S)

整型信号量

记录型信号量

用记录型数据结构表示的信号量。

wait(S)、signal(S)也可以记为P(S)、V(S),用于实现系统资源的**“申请”和“释放”**。

S.value 的初值表示系统中某种资源的数目

对信号量S的一次Р操作意味着进程请求一个单位的该类资源,因此需要执行 S.value–,表示资源数减1,当 S.value < 0 时表示该类资源已分配完毕,因此进程应调用 block 原语进行自我阻塞(当前运行的进程从运行态 -> 阻塞态),主动放弃处理机,并插入该类资源的等待队列 S.L 中。可见,该机制遵循了“让权等待”原则,不会出现“忙等”现象。

对信号量S的一次V操作意味着进程释放一个单位的该类资源,因此需要执行 S.valuet++,表示资源数加1,若加1后仍是 S.value <= 0,表示依然有进程在等待该类资源,因此应调用 wakeup 原语唤醒等待队列中的第一个进程(被唤醒进程从阻塞态 -> 就绪态

用信号量机制实现

实现进程互斥

实现进程同步

实现进程的前驱关系

生产者消费者问题

实现互斥的P操作一定要在实现同步的P操作之后。

V操作不会导致进程阻塞,因此两个V操作顺序可以交换。

注意有两个同步信号量。

前V后P:前的进程先V,后的进程再P。

多生产者多消费者问题

准确的说应该是多类生产者多类消费者。

  1. 对应生产者需要对应消费者才能消费
  2. 缓冲区为1
  3. 消费者消费完生产者才能生产

如果缓冲区大小为1,那么有可能不需要设置互斥信号量就可以实现互斥访问缓冲区的功能。

如果缓冲区大小不为1,那么必须设置互斥信号量实现互斥访问缓冲区的功能。

PV操作题目的解题思路:

  1. 关系分析。找出题目中描述的各个进程,分析它们之间的同步、互斥关系。同步分析应该是对事件的先后进行分析,比如以上“放入水果->取走水果”、“放入苹果->取走苹果”、“放入橙子->取走橙子”;异步分析应该是对缓冲区的大小。
  2. 整理思路。根据各进程的操作流程确定P、V操作的大致顺序。
  3. 设置信号量。设置需要的信号量,并根据题目条件确定信号量初值。(互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值是多少)

吸烟者问题

一个供应者进程,三个吸烟者进程:

  1. 三个吸烟者轮流吸烟(同步)
  2. 供应者提供对应的组合,对应的吸烟者才能吸烟(同步)
  3. 吸烟者吸完供应者才能提供(同步)
  4. 缓冲区为1(互斥)

读者写着问题

  1. 写进程与写进程(互斥)
  2. 写进程与读进程(互斥)
  3. 多个读进程可同时访问

哲学家进餐问题

五个哲学家进餐,每个哲学家两边各有一支筷子,使用一双筷子才可以进餐。如果只是单纯的让每支筷子互斥,当所有哲学家拿起一边的筷子时,就会产生死锁。

解决方法:

  1. 设置所有哲学家只能先竞争奇数的筷子
  2. 最多允许4个哲学家同时竞争筷子
  3. 将两次拿筷子设为原子操作,使各个哲学家拿筷子事件互斥

第三种方法:

当每个进程需要同时持有两个临界资源时,可能会产生死锁的问题,此时可以考虑使用哲学家问题解决。

管程

管程的定义和基本特征

管程是为了解决信号量机制编程麻烦、易出错的问题

管程是一种特殊的软件模块,有这些部分组成:

  1. 局部于管程的共享数据结构说明
  2. 对该数据结构进行操作的一组过程
  3. 对局部于管程的共享数据设置初始值的语句
  4. 管程有一个名字

管程的基本特征:

  1. 局部于管程的数据只能被局部于管程的过程所访问
  2. 一个进程只有通过调用管程内的过程才能进入管程访问共享数据
  3. 每次仅允许一个进程在管程内执行某个内部过程

用管程解决生产者消费者问题

死锁的概念

什么是死锁

在并发环境下,各进程因竞争资源而造成的一种互相等待对方手里的资源,导致各进程都阻塞,都无法向前推进的现象,就是“死锁”。发生死锁后若无外力干涉,这些进程都将无法向前推进

进程死锁、饥饿、死循环的区别

死锁:各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象。

饥饿:由于长期得不到想要的资源,某进程无法向前推进的现象。

死循环:某进程执行过程中一直跳不出某个循环的现象。

死锁产生的必要条件

互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁(如哲学家的筷子、打印机设备)。像内存、扬声器这样可以同时让多个进程使用的资源是不会导致死锁的(因为进程不用阻塞等待这种资源)

不剥夺条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动放。

请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己己有的资源保持不放。

循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程己获得的资源同时被下一个进程所请求。

注意:发生死锁时一定有循环等待,但是发生循环等待时未必死锁(循环等待是死锁的必要不充分条件)

什么时候会发生死锁

  1. 对对不可剥夺的资源(如打印机)的竞争可能引起死锁
  2. 进程推进顺序非法。请求和释放资源的顺序不当,也同样会导致死锁。
  3. 信号量的使用不当也会造成死锁。如生产者-消费者问题中,如果实现互斥的P操作在实现同步的P操作之前,就有可能导致死锁。

总之,对不可剥夺资源的不合理分配,可能导致死锁。

死锁的处理策略

  1. 预防死锁。破坏死锁产生的四个必要条件中的一个或几个。
  2. 避免死锁。用某种方法防止系统进入不安全状态,从而避兔死锁(银行家算法)。
  3. 死锁的检测和解除。允许死锁的发生,不过操作系统会负责检测出死锁的发生,然后采取某种措施解除死锁。

预防死锁

破坏互斥条件

如果把只能互斥使用的资源改造为允许共享使用,则系统不会进入死锁状态。比如:SPOOLing技术。操作系统可以采用SPOOLing 技术把独占设备在逻辑上改造成共享设备。比如,用SPooLing技术将打印机改造为共享设备。

缺点:

  1. 并不是所有的资源都可以改造成可共享使用的资源。
  2. 为了系统安全,很多地方还必须保护这种互斥性。

破坏不剥夺条件

方案一:当某个进程请求新的资源得不到满足时,它必须立即释放保持的所有资源(破坏了不可剥夺条件),待以后需要时再重新申请。

方案二:当某个进程需要的资源被其他进程所占有的时候,可以由操作系统协助,将想要的资源强行剥夺。这种方式一般需要考虑各进程的优先级(比如:剥夺调度方式,就是将处理机资源强行剥夺给优先级更高的进程使用)

缺点:

  1. 实现起来比较复杂。
  2. 释放已获得的资源可能造成前一阶段工作的失效。因此这种方法一般只适用于易保存和恢复状态的资源,如ICPU。
  3. 反复地申请和释放资源会增加系统开销,降低系统吞吐量。
  4. 方案一如果一直得不到某个资源,就会导致进程饥饿。

破坏请求和保持条件

静态分配方法:即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不让它投入运行。一旦投入运行后,这些资源就一直归它所有,该进程就不会再请求别的任何资源了。

缺点:

  1. 有些资源可能只需要用很短的时间,因此如果进程的整个运行期间都一直保持着所有资源,就会造成严重的资源浪费,资源利用率极低。
  2. 该策略也有可能导致某些进程饥饿。

破坏循环等待条件

顺序资源分配法:首先给系统中的资源编号,规定每个进程必须按编号递增的顺序请求资源,同类资源(即编号相同的资源)一次申请完。

缺点:

  1. 不方便增加新的设备,因为可能需要重新分配所有的编号
  2. 进程实际使用资源的顺序可能和编号递增顺序不一致,会导致资源浪费
  3. 必须按规定次序申请资源,用户编程麻烦

避免死锁

什么是安全序列

指如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全状态安全序列可能有多个

什么是系统的不安全状态,与死锁有何联系

如果分配了资源之后,系统中找不出任何一个安全序列,系统就进入了不安全状态。这就意味着之后可能所有进程都无法顺利的执行下去。当然,如果有进程提前归还了一些资源,那系统也有可能重新回到安全状态

如果系统处于安全状态,就一定不会发生死锁。如果系统进入不安全状态,就可能发生死锁

因此可以在资源分配之前预先判断这次分配是否会导致系统进入不安全状态,以此决定是否答应资源分配请求。即“银行家算法”的核心思想。

如何避免系统进入不安全状态——银行家算法

银行家算法步骤:

  1. 检查此次申请是否超过了之前声明的最大需求数
  2. 检查此时系统剩余的可用资源是否还能满足这次请求
  3. 试探着分配,更改各数据结构
  4. 安全性算法检查此次分配是否会导致系统进入不安全状态

安全性算法步骤:

  1. 检查当前的剩余可用资源是否能满足某个进程的最大需求,如果可以,就把该进程加入安全序列,并把该进程持有的资源全部回收。
  2. 不断重复上述过程,看最终是否能让所有进程都加入安全序列

死锁的检测和解除

死锁的检测

  1. 用某种数据结构来保存资源的请求和分配信息:

  2. 使用一种算法,利用上述信息来检测系统是否已进入死锁状态。

    • 如果所有进程顺利执行(相当于能找到一个安全序列),最终能消除所有边,就称这个图是可完全简化的。此时一定没有发生死锁
    • 如果最终不能消除所有边,那么此时就是发生了死锁

死锁的解除

用死锁检测算法化简资源分配图后,还连着边的那些进程就是死锁进程

解除死锁的主要方法有:

  1. 资源剥夺法。挂起(暂时放到外存上)某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但是应防止被挂起的进程长时间得不到资源而饥饿。
  2. 撤销进程法(或称终止进程法)。强制撤销部分、甚至全部死锁进程,并剥夺这些进程的资源。这种方式的优点是实现简单,但所付出的代价可能会很大。
  3. 进程回退法。让一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程的历史信息,设置还原点。

选择哪些进程解除死锁:

  1. 进程优先级低的
  2. 已执行较短时间
  3. 还要很久才能完成
  4. 进程使用资源多的
  5. 进程是批处理式的(非交互式的)

完结
——"Learning is the accumulation of experience, and ability is hard-working patience."

【基础】《操作系统》学习笔记(B站王道考研)(1)相关推荐

  1. 操作系统学习笔记目录(暂时不全223)

    操作系统学习笔记目录章节汇总 (暂时不全,目前只有第一章+第二章-浅谈线程,进程-2020.3.6) 文章目录 操作系统学习笔记目录章节汇总 1.打开钢琴的盖子(序章) 1.1-操作系统的概念(定义) ...

  2. 操作系统学习笔记-01-操作系统的概念(定义),功能和目标

    操作系统学习笔记-2019 王道考研 操作系统-01-操作系统的概念(定义),功能和目标 文章目录 1-操作系统的概念(定义),功能和目标 1.1常见的操作系统 1.2概念(定义) 1.3-操作系统的 ...

  3. 操作系统学习笔记-2.1.5线程概念和多线程模型

    操作系统学习笔记-2019 王道考研 操作系统-2.1.5线程概念和多线程模型 文章目录 5线程概念和多线程模型 5.1知识概览 5.2 什么是线程?为什么要引入线程? 5.3引入线程及之后,有什么变 ...

  4. 操作系统学习笔记-2.1.4进程通信

    操作系统学习笔记-2019 王道考研 操作系统-2.1.4进程通信 文章目录 4进程通信 4.1知识总览 4.2前置知识:什么是进程通信? 4.3共享存储 4.4 管道通信 4.5消息传递 4.6小结 ...

  5. 操作系统学习笔记-2.1.3进程控制

    操作系统学习笔记-2019 王道考研 操作系统-2.1.3进程控制 文章目录 3.进程控制 3.1知识概览 3.2 基本概念 3.2.1什么是进程控制? 3.2.2如何实现进程控制? 3.3进程控制相 ...

  6. 操作系统学习笔记-2.1. 2进程的状态与转换

    操作系统学习笔记-2019 王道考研 操作系统-2.1. 2进程的状态与转换 文章目录 2进程的状态与转换 2.1知识概览 2.2进程的状态-三种基本状态 2.3进程的状态-另外两种状态 2.4进程状 ...

  7. 操作系统学习笔记-2.1.1.进程的定义、组成、组织方式、特征

    操作系统学习笔记-2019 王道考研 操作系统-2.1.1.进程的定义.组成.组织方式.特征 文章目录 2.1.1.进程的定义.组成.组织方式.特征 1.1知识概览 1.2进程的定义 1.3进程的组成 ...

  8. 操作系统学习笔记-06-系统调用

    操作系统学习笔记-2019 王道考研 操作系统-06-系统调用 文章目录 6-系统调用 6.1 知识概览 6.2什么是系统调用?有什么作用? 6.3系统调用与库函数的区别 6.4系统调用背后的过程 6 ...

  9. 操作系统学习笔记-05-中断和异常

    操作系统学习笔记-2019 王道考研 操作系统-05-中断和异常 文章目录 5-中断和异常 5.1知识概览 5.2 中断机制的诞生 5.3中断概念和作用 5.4中断的分类 5.5 外中断的处理过程 5 ...

  10. 操作系统学习笔记-04-操作系统的运行机制和体系结构

    操作系统学习笔记-2019 王道考研 操作系统-04-操作系统的运行机制和体系结构 文章目录 4-操作系统的运行机制和体系结构 4.1知识总览 4.2运行机制 4.2.1预备知识:什么是指令? 4.2 ...

最新文章

  1. TAB(Nav)导航菜单
  2. php面试常问的问题
  3. C#实现http断点下载
  4. jvm性能调优 - 12Stop The Word 问题分析
  5. 专访网易云:数字企业九层之台,起于“全栈云”
  6. Vue项目实战06:nprogress页面加载进度条
  7. POJ 2152 Fire
  8. 小白学JAVA,与你们感同身受,JAVA---day5:关于多态的理解和分析。鲁迅的一句话:总之岁月漫长,然而值得等待。
  9. java静态类_Java静态类
  10. tcl 查询与设置编码格式
  11. java万年历代码_JAVA实现的简单万年历代码
  12. linux设置ipsan_Linux下搭建iSCSI共享存储详细步骤(服务器模拟IPSAN存储)
  13. 布尔逻辑析取范式思考
  14. android WIFI相关问题集合
  15. [渝粤教育] 中国地质大学 生产与作业管理 复习题 (2)
  16. 2021-2025年中国灌溉计时器行业市场供需与战略研究报告
  17. Solaris 11 创建IPMP
  18. 本地连接ipv4无网络访问权限解决办法
  19. 〖全域运营实战白宝书 - 高转化文案速成篇⑤〗- 如何撰写内容型文案?
  20. 【TUXEDO】Linux下Tuxedo安装教程

热门文章

  1. 读《The C Programming Language》
  2. 我的世界Java超级指令_我的世界空气方块指令(附:删除大量方块攻略)
  3. 苹果手机 jquery点击事件无效
  4. 计算机无误的英语,“开电脑”的英语正确表示是哪个?说错了就尴尬
  5. 创建一个rails入门项目并运行
  6. 【数据结构】图-图的遍历_深度优先遍历(动态图解、c++、java)
  7. linux中无线管理员密码,无线网管理员密码
  8. 华为手机大变?余承东被传离职转岗,进军美国受阻惹的祸?
  9. 如何高效利用GitHub
  10. 全球与中国标准轻触开关市场现状及未来发展趋势