第二轮复习 408 操作系统(概述)
进程与线程
进程的组成
进程是一个独立的运行单位,也是操作系统资源分配和调度的基本单位,有三部分组成,最核心的是PCB
PCB
- PCB 进程标识符:标志各个进程,每个进程都有唯一的标识号
- 进程控制和管理:进程当前状态,进程优先级
- 资源分配清单:用于说明有关内存地址或虚拟空间地址的状况,打开文件列表和所使用的输入输出设备
- 处理机相关信息:CPU的上下文,主要指寄存器的值。当前进程处于执行态时,CPU许多信息都在寄存器中。当进程被切换时,CPU很多信息都在寄存器中,当进程被切换时,CPU状态信息必须保存在相应的PCB中
程序段
程序段就是能被进程调度程序调度道CPU执行的程序代码段
数据段
进程控制
进程控制的主要功能是对系统的所有进程实施有效管理。它具有创建进程、撤销进程、进程状态的转换等功能
系统初始化、作业调度、系统提供服务、用户的应用请求
-
进程的创建:
- 为新进程分配一个唯一的进程标识号,并申请空白PCB
- 为进程分配其运行所需的资源,如内存、文件、I/O设备和CPU时间等这些资源可以从操作系统获得或从父进程获得
- 初始化PCB,主要包括初始化标志信息、初始化CPU状态信息、初始化CPU的控制信息,以及设置进程的优先级
- 若进程就绪能接纳新进程,则将新进程加入就绪队列
-
进程的终止
- 根据被终止进程的标识符,检索该进程的PCB,读出进程的状态
- 若被终止进程处于运行状态,立即终止该进程的运行
- 将该进程所拥有的全部资源,或归还父亲进程或归还操作系统
- 将PCB从所在队列中删除
-
进程的阻塞
- 找到将要被阻塞的PID对应的PCB
- 若该进程为运行态,则保护现场、其状态转为阻塞态
- 将该PCB插入相应事件的等待队列
-
进程的唤醒
- 找到PCB
- 从等待队列中移出,并置状态为就绪态
- 将PCB插入就绪队列
进程的通信
- 共享存储 :低级方式是基于数据结构的共享,高级共享方式是基于存储区的共享
- 消息传递 :进程的数据交换以格式化消息为单位
- 管道:互斥、同步、确定对方存在
- 限制管道大小。管道文件是一个固定大小的缓冲区
- 读进程可能比写进程快
线程和多线程模型
线程ID、程序计数器、寄存器集合和堆栈组成。线程是系统独立调度和分配的基本单位。
线程的组织和控制
- 线程控制块:1.线程标识符 2.一组寄存器 3.线程运行状态 4.优先级 5.线程专有存储区 6堆栈指针
- 线程的创建:在创建新进程时,需要利用一个线程创建函数,并提供相应的参数,如指向线程主程序的入口指针、堆栈大小、线程优先级等
- 线程的终止:当一个线程完成自己任务后,或线程在运行中出现异常而被强行终止时,由终止线程调用相应的函数执行终止操作
线程的实现方式
线程的实现可以分为两类:用户级线程和内核级线程
- 用户级线程就是用户视角能看到的线程,线程管理的所有工作都在用户空间中完成
- 内核级线程:操作系统也为每个内核级线程设置一个线程控制块TCB,内核根据该控制块感知线程和存在,并加以控制
错题回顾
- 55题当一个线程等待同步条件时,应用程序切换到另一个就绪的用户级线程,以提高CPU的利用率
- 60题 进程中某线程的栈指针是属于线程的
调度
- 高级调度(作业调度):从外存的处于后备队列的作业挑选一个
- 中级调度(内存调度):将那些暂时不能运行的进程调入外存等待,等到他们具有运行条件且内存空闲时,调入内存
- 低级调度(进程调度):按照某种算法选取一个进程
调度的实现
- 排队器:将就绪态的进程插入就绪队列
- 分排器:依据调度程序所选的进程,从就绪队列中取出
- 上下文切换:在对CPU进行切换时,会发生两对上下文的切换操作:第一对:将当前进程的上下文保存至PCB中,再装入分派程序的上下文,第二对,移出分派程序,将新进程的CPU现场信息装入CPU的各个相应寄存器
不能进程调度或切换过程如下
- 在处理中断过程中
- 需要完全屏蔽中断的原子操作过程中
闲逛进程
在进程切换时,如果系统中没有进程,就会调度闲逛进程运行,他的PID为0。如果没有其他进程就绪,该进程就一直运行,并在指令周期后测试中断。只要有进程就绪,就会立即让出CPU
进程切换
上下文切换的消耗通常是计算密集型,即它需要相当可观的CPU时间,在每秒几十次上百次的切换中,每次切换都要纳米量级的时间
调度算法
先来先到算法(作业,进程,不可剥夺算法)
短作业优先调度算法(作业,进程,不可剥夺,可剥夺)
高响应优先调度
响应比 = (等待时间+要求服务时间)/ 要求服务时间
优先级调度(作业,进程,不可剥夺,可剥夺)
进程优先级分为以下两种
- 静态优先级:整个运行期间保持不变
- 动态优先级:优先级在运行过程中发生变化
系统进程> 用户进程,交互进程 > 非交互进程,I/O进程 > I/O交互式
时间片轮转调度(进程,可剥夺)
多级队列调度算法
多个队列,每个队列可实施不同的调度算法,同一队列可以有不同优先级
不同队列间也可以有不同优先级
多级反馈队列调度算法(进程,可剥夺)
多级反馈队列调度算法是时间片轮转调度算法和优先级调度算法的发展
- 设置多个就绪队列,每个队列赋予不同的优先级。第1队列优先级最高,第2队列次之
- 赋予各个队列的进程运行时间片的大小各不相同,优先级越高,进程的时间片越小,第i+1队列要比第i级队列长1倍
- 每个队列都采用FCFS
- 按队列优先级调度。仅当前队列为空时,才会调度下一队列。
同步与互斥
我们将一次仅允许一个进程使用的资源叫做临界资源,对每个进程中,访问临界资源的那段代码叫做临界区
实现临界区互斥必须遵循的原则
- 空闲让进
- 忙则等待
- 有限等待
- 让权等待(理论遵循但非必要)
管程
管程由4部分组成
-
管程的名称
-
局部于管程内部的共享数据结构说明
-
对该数据结构进行操作的一组过程
-
对局部于管程内部共享数据设置的语句
-
管程将共享资源的操作封装起来
-
每次仅允许一个进程进入管程,从而实现进程互斥
条件变量condition
x.wait:当x条件不满足时,正在调用管程的进程调用x.wait将自己插入x条件队列,并释放管程
x.signal:x对应条件发生变化,则调用x.signal唤醒一个因x条件而阻塞的进程
条件变量是没有值的,仅仅实现了排队等待的功能
错题回顾
- 28 这里的临界区是指临界资源A的那段代码。那么五个进程共有5个操作共享变量A的代码段
- 30 管程的signal操作与信号量机制的V操作不相同,信号量机制中的V一定会改变信号量的值。而管程操作是针对某个条件变量的
- 32 系统中如果n个进程,只要这个进程不都处于阻塞态一定有个进程在处理机上运行
死锁
死锁的概念
死锁是指多个进程因竞争资源而造成的一种僵局,使得各个进程都被阻塞,若无外力干涉,这些进程无法推进
死锁产生的原因
- 系统资源的竞争
通常系统中拥有不可剥夺资源,其数量不足以满足多个进程运行的需要,使得进程在运行过程中会因争夺资源而陷入僵局。只有对不可剥夺的竞争才可能产生死锁,对可剥夺资源的竞争不会产生死锁
死锁产生的必要条件
- 互斥条件
- 不可剥夺资源
- 请求并保持条件:进程已经保持一个资源,但又提出新的资源请求,而该资源被其他进程占有,此时请求进程被阻塞,但对自己获得资源保持不放
- 循环等待条件
循环等待的条件和死锁的区别,死锁要求Pi等待的资源必须有Pi+1来满足
死锁的处理策略 - 死锁预防 破坏死锁产生的4个必要条件之一
- 避免死锁 在资源分配中,用某种方法防止系统进入不安全状态
- 死锁的检测及接除。无须采取任何限制性措施,允许进程在运行过程中产生死锁,通过系统的检测机构及时检测出死锁的发生
死锁的预防
- 破坏互斥条件条件:如果只能互斥使用的资源改为运行共享使用,系统不回进入死锁
- 破坏不可剥夺条件:当一个已经保持了某些不可剥夺资源的进程,请求新的资源而得不到满足的时候必须释放所有资源
- 破坏请求并保持条件:在请求资源时不可剥夺资源有两种方式实现:1.采用预先分配方法2.允许进程只获得允许初期所需的资源后便可运行
- 坡缓循环等待条件,给系统的各类资源编号,规定每个进程必须按照编号地政的顺序请求资源
死锁避免
银行家算法
- 可利用资源向量: 含有m个数组,每个元素代表一类可用的资源数
- 最大需求矩阵:n * m矩阵,定义n个进程对m类资源的最大需求
- 分配矩阵:定义系统中每个进程对m类资源的最大需求
- 分配矩阵:定义每类资源当前已分配每个进程的资源数
- 需求矩阵:每个进程接下来还需要多少资源
安全性算法
死锁检测与解除
死锁检测
死锁检测可用资源分配图来检测系统是否为死锁状态。用圆圈表示一个进程,用框表示一类资源。由于一种资源可能有多个,因此用框的一个圆代表一类资源的,从进程到资源请求边,从资源到进程时分配边、
死锁解除
- 资源剥夺法
- 撤销进程法
- 进程回退法