进程
为什么要引入进程
在多道程序同时运行的背景下,进程之间需要共享系统资源,这样就会导致各程序在执行过程中出现相互制约的关系,程序的执行就会表现出间断性的特征。这些特征都是在程序的执行过程中发生的,是动态的过程,而传统的程序本身是一组指令的集合,是一个静态的概念,无法描述程序在内存中的执行情况,为了深刻描述程序动态执行过程的性质乃至更好地支持和管理多道程序的并发执行,便引入了进程概念
进程的概念
一言以蔽之:进程是程序的一次执行。
一个程序实体由程序段、相关数据段和 PCB 三部分构成,其中 PCB 是标志一个进程存在的唯一标识,程序段是进程运行的程序的代码,数据段则存储程序运行过程中相关的一些数据。
PCB
在进程的整个生命周期中,系统总是通过 PCB 对进程进行控制的,亦即系统是根据进程的PCB 感知该进程的存在的,所以,PCB 是进程存在的唯一标志
PCB主要存储内容:a、进程标识符信息;b、处理器状态信息;c、进程调度信息;d、进程控制信息
进程的状态
- 创建态:进程正在创建,尚未转到就绪态。
- 就绪态:进程获得了除处理机以外所有的资源。
- 运行态:进程在处理机上运行。
- 阻塞态:进程因为等待某件事情而停止运行。
- 结束态:进程正在从系统中消失。
进程的通信
每个进程有自己独立的地址空间。在操作系统和硬件地址的保护机制下,进程无法访问其他进程的地址空间,所以必须借助于操作系统的系统调用函数实现进程之间的通信。
- 共享存储:在通信的进程之间存在一块可以直接访问的共享空间,通过对这片共享空间进行读写操作实现进程之间的信息交换。(间接通信)
- 消息传递:利用操作系统提供的消息传递方式进行进程通信。(直接通信)
- 管道通信:所谓管道,是指用于连接一个读进程和写进程以实现它们之间的通信的一个共享文件。管道是半双工的。
进程控制
原语
是由若干条指令组成的,用于完成一定功能的一个过程,并在执行中不可分割的,称为原语。
进程的创建与终止
创建:
fork:复制父进程全部资源。
clone:有选择的复制父进程的资源。(带参数)
Vfork:创建一个线程。复制除tast_struct和系统空间堆栈外的所有资源。
①申请空白 PCB ②分配运行所需资源 ③初始化 PCB(标识信息、处理机状态信息、处理机控制信息)④进入就绪队列
终止:
①取出 PCB 读出进程状态 ②若进程处于执行状态,终止执行,置调度标志为真。③将子孙进程全部终止。④归还全部资源 ⑤将 PCB 从所在队列移除。
进程的阻塞与唤醒
阻塞过程:①停止执行 ②更改 PCB 状态为阻塞 ③将 PCB 插入阻塞队列 ④重新调度
唤醒过程:①将 PCB 移出阻塞队列 ②更改 PCB 状态为就绪 ③将 PCB 插入就绪队列
进程的挂起与激活
使执行的进程暂停执行,静止下来,使就绪状态的进程暂不接受调度,我们把这种静止状态称为挂起状态。
挂起过程:①检查进程状态,若处于活动就绪状态,则改为静止就绪;若处于活动阻塞状态,则改为静止阻塞;若处于执行状态,则重新调度 ②为了方便考查进程运行情况,将 PCB 复制到某指定内存区域
激活过程:①检查进程状态,若处于静止就绪,则改为活动就绪;若处于静止阻塞,则改为活动阻塞 ②若为抢占调度策略,检查是否要进行重新调度
进程切换的基本步骤
- 保存进程上下文环境
- 更新当前运行进程的控制块内容,将其状态改为就绪或阻塞状态
- 将进程控制块移到相应队列
- 改变需投入运行进程的控制块内容,将其状态变为运行状态。
- 恢复需投入运行进程的上下文环境
进程与作业的区别
作业是用户向计算机提交任务的任务实体。在用户向计算机提交作业后,系统将它放入外存中的作业等待队列中等待执行;而进程则是完成用户任务的执行实体,是向操作系统申请分配资源的基本单位。任一进程,只要它被创建,总有相应的部分存在于内存中。一个作业可由多个进程组成,且必须至少由一个进程组成,但一个进程不能构成多个作业。作业的概念主要用在批处理系统中,而进程的概念则用在几乎所有的多道程序系统中。
进程同步
同步
同步又称直接制约关系,是指为完成某种任务而建立的两个或者多个进程,这些进程因为需要在某些位置上协调他们的工作次序而等待、传递信息所产生的制约关系。
互斥
互斥也称间接制约关系。当一个进程进入临界区使用临界资源时,另一个进程必须等待,当占用临界资源的进程退出临界区后,另一进程才允许访问此临界资源。
临界区
访问临界资源的那段代码称为临界区。
任何时刻,只允许一个进程进入临界区,以此实现进程对临界资源的互斥访问。
临界区使用原则
(1) 空闲让进。如果临界区空闲,则只要有进程申请就立即让其进入,以有效利用资源。
(2) 忙则等待。每次仅允许一个进程处于临界区,保证对临界资源的“互斥”访问。
(3) 有限等待。进程只能在临界区内逗留有限时间,不得使其他进程在临界区外陷入“死等”。
(4) 让权等待。进程不能进入临界区时,应立即释放处理机,以免陷入“忙等”状态。
同步与互斥问题的解决办法
软件办法
硬件办法
信号量
经典同步问题
线程
线程的基本概念
引入线程的目的是为了减少程序在并发执行时所付出的时空开销,提高操作系统的并发性能。
线程由线程ID、程序计数器、寄存器、堆、栈组成。
线程与进程的区别
- 调度:线程时独立调度的基本单位。
- 拥有资源:进程是拥有系统资源的基本单位,而线程不拥有系统资源。
- 系统开销:创建进程所消耗的开销比创建线程要大
- 地址空间和其他资源:进程的地址空间相互独立,同一进程内的各个线程共用该进程的资源,进程内部的线程对其他进程是不可用的。
- 通信方面:进程与进程之间,需要借助额外的手段进行通信,而线程之间可以通过之间读写数据段来进行通信。
管程
信号量机制的引入解决了进程同步的描述问题,但信号量的大量同步操作分散在各个进程中不便于管理,还有可能导致系统死锁。如:生产者消费者问题中将P、V颠倒可能死锁。
为此Dijkstra于1971年提出:把所有进程对某一种临界资源的同步操作都集中起来,构成一个所谓的秘书进程。凡要访问该临界资源的进程,都需先报告秘书,由秘书来实现诸进程对同一临界资源的互斥使用。
管程定义了一个数据结构和能为并发进程所执行的一组操作,这组操作能同步进程和改变管程中的数据。
代表共享资源的数据结构,以及由对该共享数据结构实施操作的一组过程所组成的资源管理程序,称为管程。
管程由4部分构成:
管程的名称
局部与管程内部的共享数据结构说明
对该数据结构进行操作的一组过程
对局部于管程内部的共享数据设置初始值的语句
处理机调度
就是对处理机进行分配
调度的层次
- 高级调度(作业调度):按照一定的原则从外存上处于后备状态的作业中挑选一个作业,给他们分配内存、输入/输出设备等必要的资源,并建立相应的进程。
- 中级调度(内存调度):把外存上那些已具备运行条件的就绪进程,再重新调入内存,并修改其状态为就绪态,挂入就绪队列。
3.低级调度(进程调度):从就绪队列中选择一个程序,将处理机分配给他。
进程调度的方式
- 抢夺式:立刻暂停正在执行的程序。
- 非抢夺式:等待当前程序执行完成,不能用于实时系统。
调度算法
- FCFS
- SJF短作业优先调度
- 优先级调度
- 时间片轮转调度:适用于分时系统,在FCFS的基础上加上时间片限制。
- 多级反馈队列调度:时间片轮转+优先级
进程同步
在多道程序环境下,进程是并发执行的,不同进程之间存在着不同的相互制约的关系。为了协调进程之间的相互制约关系,引入了进程同步的概念。
阐述对于互斥临界区的管理要求。请解释进程同步机制中的让权等待的概念?并说明为什么要采用让权等待?
为实现进程互斥,可利用软件方法,也可在系统中设置专门的同步机制来协调各个进程,但所有的同步机制都应该遵循以下 4 条准则:
a.空闲让进。无进程处于临界区时,相应的临界资源处于空闲状态,因而可允许下个请求进入临界区的进程立即进入自己的临界区,以有效利用临界资源。
b.忙则等待。已经有进程进入自己临界区时,相应的临界资源正被访问,所有其他试图进入临界区的进程必须等待,以保证各个进程互斥访问临界资源。
c.有限等待。对要求访问临界资源的进程,应保证该进程能在有效时间内进入自己的临界区,以免陷入“死等”状态。
d.让权等待。当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入“忙等”。主要是为了更有效地发挥 CPU 的效能,提高系统的吞吐量。
P(S)操作、V(S)操作的主要操作步骤。
P操作:设 S 是一个信号量,先执行 S=S-1;若 S≥0,则该进程继续运行;若 S<0,则阻塞该进程,将它插入该信号量的等待队列中行。
V操作:设 S 是一个信号量,先执行 S=S+1;若 S>0,则该进程继续运行;若 S≤0,则从该信号量等待队列中移出第一个进程,使其变为就绪状态并插入就绪队列,然后再返回原进程继续运行。
操作系统核心使用的同步技术有哪些?
a.原子操作(单指令) b.自旋锁c.信号量 d.关中断
什么叫原语,什么叫原子操作,怎么样保证原子操作?
原语是由若干机器指令构成用以完成特定功能,并在执行过程中不可分割的一段程序。在一个操作中的所有动作,要么全做,要么全不做。
在单机中采用屏蔽中断可保证原子性。在多机系统中可采用信号量机制保证原子性。
死锁
死锁产生的4个必要条件
- 互斥:进程要求对所分配的资源进行排他性控制,即在某个时间段内,该资源只能被一个人占有。
- 不剥夺:只能主动释放不能去抢别人的
- 请求并保持:吃着碗里的看着锅里的
- 循环等待:存在一种进程资源的循环等待链,链中每个进程已获得的资源同时被链中下一个进程所请求。
死锁的处理策略
死锁预防
只需要破坏死锁的4个必要条件中任意一种,死锁就不会发生。
死锁避免
银行家算法:把操作系统视为银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于客户向银行家请求贷款。程序运行之前,先声明对各种资源的最大需求量,当进程在执行中继续申请资源时,先测试该进程已占有的资源与本次申请资源之和是否超过了之前声明的最大需求量,如果超过,就拒绝分配,如果未超过,就检测当前剩余的资源量是否满足该进程尚需的最大资源量,如果满足,就分配。反之,则推迟分配。
死锁的检测和解除
检测
资源分配图
死锁定理:
在资源分配图中,找出一个既不阻塞又非孤立的进程节点 Pi(即从进程集合中找到一个存在连接的边,且资源申请数量小于系统中已有空闲资源数量的进程)。因进程 Pi获得了所需要的全部资源,它能继续运行直到完成,然后释放其占有的所有资源(相当于消去 Pi的所有申请边与分配边,使之成为孤立的节点)。
进程 Pi 释放资源后,可用唤醒因等待这些资源而阻塞的进程,原来阻塞的进程可能变成非阻塞进程,根据第一步消去分配边与申请边。重复以上过程,若能消去图中所有边,使所有进程成为孤立节点,则称该图是可完全简化的;若通过任何过程均不能使该图完全简化,则称该图是不可完全简化的。不同简化顺序将得到相同的简化图。系统状态 S 为死锁状态的充分条件是:当且仅当 S 状态的资源分配图是不可完全简化的,即死锁定理
解除
资源剥夺法:挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但应防止被挂起进程长时间得不到资源,而处于资源匮乏的状态。
撤销进程法:强制撤销部分、甚至全部死锁进程并剥夺这些进程的资源。撤销的原则可以按进程优先级和撤销进程代价的高低进行。
进程回退法:让一个或多个进程回退到足以回避死锁的地步,进程回退时自愿释放资源而不是剥夺。要求系统保持进程的历史信息,设置还原点。