2.1 进程的定义、组成、组织方式、特征
程序:就是一个指令序列。
程序段、数据段、PCB三部分组成了进程实体(进程映像)。一般情况下,我们把进程实体就简称为进程。例如,所谓创建进程,实质上是创建进程实体中的PCB;而撤销进程,实质上是撤销进程实体中的PCB。
PCB是进程存在的唯一标志。
定义:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
2.2进程的状态与转换
进程的三种基本状态
运行态:占有CPU,并在CPU上运行。
就绪态:已经具备运行条件,但由于没有空闲CPU,而暂时不能运行。
阻塞态:因等待某一事件而暂时不能运行。
另外两种状态
创建态:进程正在被创建,操作系统为进程分配资源、初始化PCB。
终止态:进程正在从系统中撤销,操作系统会回收进程拥有的资源、撤销PCB。
进程状态的转换
重要考点
2.3 进程控制
进程控制的主要功能是对系统中所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现状态转换等功能。
简化理解:进程控制就是要实现进程状态转换。
用原语实现进程控制。
原语的特点是执行期间不允许中断,只能一气呵成。这种不可被中断的操作即原子操作。
原语采用“关中断指令”和“开中断指令”实现,运行在核心态。
2.4 进程通信
进程通信就是进程之间的信息交换。
进程是分配系统资源的单位,因此各进程拥有的内存地址空间相互独立。
进程通信方式分为:共享存储、消息传递、管道通信。
共享存储
两个进程对共享空间的访问必须是互斥的。
共享存储分为基于数据结构的共享(低级通信方式)和基于存储区的共享(高级通信方式)。
管道通信
“管道”是指用于连续读写进程的一个共享文件,又名pipe文件,其实就是在内存中开辟一个大小固定的缓冲区。
- 管道只能采用半双工通信,某一时间段内只能实现单向传输。如果要实现双向同时通信,则需要设置两个管道。
- 各进程要互斥的访问管道。
- 数据以字符流的形式写入管道,当管道写满时时,写进程的write()系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取走后,管道变空,此时读进程的read()系统调用将被阻塞。
- 如果没写满,就不允许读。如果没读空,就不允许写。
- 数据一旦被读出,就从管道中抛弃,这意味着读进程最多只能有一个,否则可能会有读错数据的情况。
消息传递
进程间的数据交换以格式化的消息(Message)为单位。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换。
一个格式化的消息会分为消息头和消息体两部分。消息头中包括:发送进程ID、接收进程ID、消息类型、消息长度等格式化的消息。
消息传递分为直接通信方式(消息直接挂到接收进程的消息缓冲队列上)和间接通信方式(消息要先发送到中间实体,即信箱中,因此也称为“信箱通信方式”)。
它们都是用发送/接收原语来实现的。
2.5 线程概念与多线程模型
线程是一个基本的CPU执行单元,也是程序执行流的最小单位。引入线程后不仅是进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务。
引入线程后,进程只作为除CPU之外的系统资源的分配单元。
线程的实现方式
用户级线程 线程切换在用户态即可完成,无需操作系统干预。用户级线程就是从用户视角能看到的线程。
内核级线程 必须在核心态才能完成。内核级线程就是从操作系统内核视角能看到的线程。
内核级线程才是处理机分配的单位。
多线程模型
2.6 处理机调度的概念、层次
处理机调度,就是从就绪队列中按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程的并发执行。
调度的三个层次
高级调度(作业调度)
高级调度:按照一定的原则从外存上处于后备队列的作业中挑选一个(或多个)作业,给他们分配内存等必要资源,并建立相应的进程(建立PCB),以使它(们)获得竞争处理机的权利。
高级调度是外存与内存之间的调度,每个作业只调入一次、调出一次。作业调入时会建立相应的PCB,作业调出时撤销PCB。高级调度主要指调入的问题。
中级调度(内存调度)
中级调度(内存调度),就是要决定将哪个处于挂起状态的进程重新调入内存。
一个进程可能会被多次调入、调出内存,因此中级调度发生的频率要比高级调度更高。
暂时调到外存等待的进程状态称为挂起状态。
值得注意的是,PCB并不会一起调到外存,而是常驻内存。PCB中会记录进程数据在外存中的存放位置、进程状态等信息,操作系统通过内存中的PCB来保持对各个进程的监控、管理。被挂起的进程PCB会被放到挂起队列中。
低级调度(进程调度)
低级调度(进程调度),其主要任务是按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它。
进程调度是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度。
进程调度的频率很高,一般几十毫秒一次。
知识回顾
2.7 进程调度的时机、切换的过程与方式
进程调度(低级调度),就是按照某种算法从就绪队列中选择一个进程为其分配处理机。
进程调度的时机
进程在操作系统内核程序临界区中不能进行调度与切换。【√】
进程处于临界区时不能进行处理机调度。【×】
进程调度的方式
非剥夺调度方式
又称非抢占方式,即只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程依然会继续使用处理机,直到该进程终止或主动要求进入阻塞态。
实现简单、系统开销小,但无法及时处理紧急任务,适合早期的批处理系统。
剥夺调度方式
又称抢占方式,当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要紧迫的那个进程。
可以优先处理更紧急的进程,也可实现让各进程按时间片轮流执行的功能(通过时钟中断)。适合于分时操作系统、实时操作系统。
进程的切换与过程
2.8 调度算法的评价指标
CPU利用率:指CPU“忙碌”的时间占总时间的比例。
CPU利用率=忙碌的时间 / 总时间
系统吞吐量:单位时间内完成作业的数量。
系统吞吐量=总共完成了多少道作业 / 总共花了多少时间
周转时间:是指从作业被提交给系统开始,到作业完成为止的这段时间间隔。
作业周转时间=作业完成时间 - 作业提交时间
平均周转时间=各作业周转时间之和 / 作业数
带权周转时间=作业周转时间 / 作业实际运行的时间
平均带权周转时间=各作业带权周转时间之和 / 作业数
响应时间:指从用户提交请求到首次产生响应所用的时间。
2.9 调度算法
先来先服务(FCFS)
短作业优先(SJF)
非抢占式的短作业优先:
抢占式的短作业优先,也称为最短剩余时间优先算法(SRTN):
高响应比优先(HRRN)
2.20 调度算法
时间片轮转
时间片轮转调度算法:轮流让就绪队列中的进程依次执行一个时间片(每次选择都是排在就绪队列对头的进程)
如果时间片太大,使得每个进程都可以在一个时间片内完成,则时间片轮转调度算法退化为先来先服务调度算法,并且会增大进程响应时间,因此时间片不能太大。另一方面,因为进程调度、切换是有时间代价的,时间片也不能太小。
优先级调度算法
多级反馈队列调度算法
2.3_4 信号量机制
信号量其实就是一个变量(可以是一个整数,也可以是更复杂的记录型变量),可以用一个信号量来表示系统中某种资源的数量。
整型信号量
记录型信号量
2.4_1
死锁:各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象。
死锁产生的必要条件
产生死锁必须同时满足以下四个条件,只要其中任一条件不成立,死锁就不会发生。
互斥条件
只有对必须互斥使用的资源的争夺才会导致死锁。
不剥夺条件
进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。
请求和保持条件
进程已经保持了至少一个资源,但是又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放。
循环等待条件
存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求。
发生死锁时一定有循环等待,但是发生循环等待时未必死锁。(循环等待是死锁的必要不充分条件)
什么时候会发生死锁
- 对系统资源的竞争。
- 进程推进顺序非法。
- 当信号量的使用不当也会造成死锁。
死锁的处理策略
- 预防死锁。破坏死锁产生的四个必要条件中的一个或几个。
- 避免死锁。用某种方法防止系统进入不安全状态,从而避免死锁(银行家算法)。
- 死锁的检测和解除。允许死锁的发生,不过操作系统会负责检测出死锁的发生,然后采取某种措施解除死锁。
2.4_2 预防死锁
破坏互斥条件
如果把只能互斥使用的资源改造为允许共享使用,则系统不会进入死锁状态,如SPOOLing技术。
缺点:并不是所有的资源都可以改造成可共享使用的资源,为了系统安全,很多地方还必须保护这种互斥性。因此很多时候都无法破坏互斥条件。
破坏不剥夺条件![在这里插入图片描述](https://img-blog.csdnimg.cn/05ce3dfd986a4fb7a3618c316d16e201.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5p2-6byg54ix5ZCD57OW,size_20,color_FFFFFF,t_70,g_se,x_16)
破坏请求和保持条件
破坏循环等待条件
总结
2.4_3 避免死锁
银行家算法
系统处于不安全状态未必死锁,但死锁一定处于不安全状态。
系统处于安全状态一定不会死锁。