操作系统--02进程管理

2.1 进程

1.进程和线程的比较:

调度:进程是拥有资源的基本单位
资源:线程是独立调度的基本单位

并发性:引入线程后,各线程间也能并发,提高了并发性。

系统开销:传统的进程间切换,需要切换进程的运行环境,开销很大。如果是同一进程内的线程切换,不需要切换运行环境,系统开销小。并发所带来的开销小。

地址空间:

系统为每个运行的程序配置一个数据结构,称为进程控制块(PCB),用来描述各种信息,如程序代码存放的位置。

PCB是进程存在的唯一标志,进程的管理者(操作系统)所需的数据都在PCB中。

进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
进程是动态的,进程实体是静态的。

2 进程的组织

链接方式:按照进程状态将PCB分为多个队列。操作系统持有指向不同队列的指针。执行指针:指向当前处于运行状态的进程,就绪队列指针,阻塞队列指针。

索引方式:根据进程状态建立几张索引表,操作系统持有指向不同索引表的指针。

3进程的特征

动态性:一次执行过程,动态的产生、变化、消亡。进程最基本的特征
并发性:
独立性:进程是资源分配,接受调度的基本单位
异步型:各进程以不可预知的速度向前推进,可能导致运行结果的不确定性。
结构性:PCB,数据段,程序段

4 进程的状态和转化

三种基本状态:

运行态:占有CPU,并在cpu上运行。
就绪态:已经具备运行条件,cpu没有空闲,暂时不能运行(只欠处理机)
阻塞态:因为等待某一事件而暂时不能运行(分配打印机,磁盘读入等)

三种状态的转换:
运行态–>就绪态:时间片到,或者处理机被更高优先级的进程抢占
运行态–>阻塞态:主动行为,若进程用系统调用某个资源,或者请求某个事件
阻塞态–>就绪态:被动行为,等待资源分配(进程唤醒)

在这里插入图片描述
另外的两种状态:

创建态:分配资源,初始化PCB
创建新进程的操作:登录系统、作业调度、(系统)提供服务、(用户)应用请求
进程的创建过程:
1.分配一个唯一的标识号(pcb)
2.为进程分配资源
3.初始化PCB
4.若就绪队列空–>插入就绪队列–>等待系统调用

终止态:撤销进程,回收资源,撤销PCB等

5进程控制

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

就是要实现进程状态转化

修改PCB的标志位,放到相应不同的队列中。

用原语实现进程控制,原语的特点是执行期间不允许中断,只能一气呵成。原语采用关中断指令和开中断指令。是特权指令,只能在CPU核心态下运行。

原语做的三类事情:

更新PCB中的信息
将PCB插入合适的队列
分配/回收资源
引起创建进程用(创建原语)的事件:用户登录,作业调度,提供服务,应用请求。

6进程通信

共享存储
分为基于数据结构的共享(低级通信)和基于存储区的共享(高级通信)

管道通信:
管道是指用于连接读写进程的一个共享文件,实际上就是在内存中开辟一个大小固定的缓冲区。只能进行半双工通信,如果要双向通信,则需要设置两个管道。各进程互斥地访问管道。读进程最多只有一个。没写满,不能读,没读空,不能写。

消息传递:
进程通过操作系统提供的“发送消息、接受消息”两个原语进行数据交换。进程间的数据交换以格式化的消息为单位(消息头+消息体)。分为直接通信方式间接通信方式(消息要先发送到中间实体(信箱)中,也称为信箱通信方式)。

2.2 线程

1.引入进程的目的:

更好的使多道程序并发执行,提高资源利用率和系统吞吐率

2.引入线程的目的:

减小程序在并发执行时所付出的时空开销,提高操作系统的并发性能

3.线程控制块(TCB)

多CPU计算机,各个线程占有不同的cpu
同一进程的线程共享进程的系统资源
由于共享内存地址空间,同进程中的线程间通信甚至无需系统干预

4. 实现方式

用户级线程–切换线程可以在用户态下即可完成,无需操作系统干预。
对用户不透明,对操作系统透明。

内核级线程–必须在核心态下完成

操作系统只看得见内核级线程,因此内核级线程才是处理分配的单位。

5.多线程模型:

多对一模型:
多个用户级线程映射到一个内核级线程。无需切换到核心态,处理效率高,系统开销小。缺点:若某一个用户级线程阻塞,整个进程都会被阻塞。并发度不高。

一对一模型:
一个用户级线程映射到一个内核级线程。并发能力强,线程管理成本高,系统开销大。

多对多模型:
多个用户级线程映射到多个内核级线程。集中了以上两种的优点。

2.3 处理机调度

调度的概念:当有一堆任务要处理,但由于资源有限,需要确定某种规则来决定处理这些任务的顺序,这就是调度研究的问题。

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

调度的三个层次:

高级调度:按一定的原则从外存上处于后备队列的作业中挑选一个或者多个给他们分配必要的资源,并建立相应的进程,以使它们或者竞争处理机资源的权利。
中级调度:引入虚拟存储技术后,可将暂时不能运行的进程调至外存等待。这么做的目的是为了提高内存利用率和系统吞吐量。暂时调到外存等待的状态,称为挂起状态。而PCB并不会一起调到外存,而是会常驻内存。挂起态分为就绪挂起和阻塞挂起。
低级调度(进程调度):按照某种方法和策略从就绪队列中选取一个进程,并将处理机分配给他。进程调度是操作系统中最基本的一种调度。
2.3.2 进程调度的时机
当前运行的进程主动放弃处理机(正常终止、发生异常而终止,进程主动请求阻塞)
当前进程被动放弃处理机(有更紧急的,有更高优先级的,分给进程的时间片用完)
不能进行进程调度的时机:

在处理中断的过程中
进程在操作系统内核程序临界区中
在原子操作过程中(原语)
临界资源:一个时间段内只允许一个进程使用的资源,各进程需要互斥地访问临街资源。
临界区:访问临界资源的那段代码。

3.进程调度的方式

非剥夺调度方式(非抢占式):
只允许进程主动放弃处理机。实现简单,系统开销小但是无法及时处理紧急任务,适用于早期的批处理系统。

剥夺调度方式(抢占式):
优先处理更紧急的进程,实现让各进程按照时间片轮转的功能

广义的进程调度包括类选择一个进程运行和进程切换两个步骤。

进程切换过程:

对原来的运行进程各种数据的保存
对新的进程的数据的恢复
进程调度,切换需要代价,并不是调度越频繁,并发度就越高

4. 调度算法的评价指标

CPU利用率: cpu忙碌的时间占总时间的比例
系统吞吐量:单位时间内完成作业的数量。总共完成作业数量/总时间

周转时间:作业完成的时间减去提交作业的时间

平均周转时间:各作业周转时间之和/作业数

带权周转时间:作业周转时间/作业实际运行的时间 (>=1)

平均带权周转时间:各作业带权周转时间之和/作业数

等待时间 = 周转时间 - CPU运行时间 - I/O操作时间

等待时间:进程/作业处于等待处理机状态时间之和,等待时间越长,用户满意度越低
进程等待时间和作业等待时间之和不同,进程等待时间是在进程建立之后的等待时间之和,在等待I/O完成的期间其实进程也是在被服务的,不计入等待时间,对于作业,不仅要考虑建立进程后的等待时间,还要加上作业在外存后备队列中等待的时间。

一个作业需要被CPU,I/O设备处理多久是确定不变的,调度算法是在减少等待时间。

响应时间:用户提出请求到被响应的时间

5.调度算法

非抢占式:
先来先服务、高响应比优先

抢占式:
时间片轮转调度算法、多级反馈队列调度算法

非抢占式、抢占式均有:短作业优先、优先级调度算法

不会导致饥饿:
先来先服务、高响应比优先、时间片轮转调度算法

会导致饥饿:
短作业优先、优先级调度算法、多级反馈队列调度算法


(1)先来先服务(FCFS)

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

优点:公平,算法实现简单
缺点:对于排在长作业后的短作业,用户体验不好。平均带权周转时间大,对于长作业有利,对于短作业不利

(2)短作业优先

是否可抢占?
非抢占式(SJF):每次选择当前已到达的并且运行时间最短的作业/进程

抢占式(SRNT最短剩余时间优先算法):

每当有进程加入就绪队列改变时就需要调度,如果新到达的进程剩余时间比当前运行的进程剩余时间更短,则由新进程抢占处理机,当前运行进程重新回到就绪队列。平均等待时间和平均周转时间优于非抢占式。

优点:最短的平均等待时间,平均周转时间
缺点:对于短作业有利,对于长作业不利

是否会导致饥饿?
会,如果源源不断地有短作业进来,可能导致长作业长时间得不到服务,产生饥饿现象,如果一直得不到服务,会导致作业饿死。

(3)高响应比优先(HRRN)

算法规则:在每次调度时,先计算各个作业/进程的响应比,选择响应比最高的优先服务。
响应比 = (等待时间 + 要求服务时间)/ 要求服务时间

优点:综合考虑等待时间和要求服务的时间,避免了长作业饥饿问题。
缺点:


以上三种算法,不区分任务的紧急程度,用户交互性差,不区分进程和作业,适用于早期的批处理系统。

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

算法思想:公平,轮流地为各个进程服务,让每个进程在一定时间间隔内都可以得到服务。
算法规则:常用于分时操作系统,更注重“响应时间”。每个时间片结束后进行一次进程调度。如果时间片太大,使得每个进程在一个时间片内完成,则时间片轮转算法就会退化为先来先服务算法,会增大响应时间,因此时间片不能太大。如果时间片太小,会导致进程切换过于频繁,系统会花大量时间来处理进程切换,从而导致实际用于进程执行的时间比例减少。
作业/进程调度:用于进程调度,不用于作业

优点:公平,响应快,适用于分时操作系统。
缺点:高频率切换,有开销;不区分任务的紧急程度。

(5)优先级调度算法

算法思想:根据任务的紧急程度来决定处理顺序
算法规则:根据优先级是否可以发生改变分为静态优先级和动态优先级。
动态优先级:如果某个进程在就绪队列中等待了很长时间,可以适当提高优先级。
通常情况下,系统进程优先级高于用户进程,前台进程优先级高于后台进程。操作系统更偏好I/O型进程(或者称为I/O繁忙型进程)

作业/进程调度:均适用。甚至还会用于I/O调度

优点:灵活调整偏好程度。适用于实时操作系统
缺点:若源源不断的高优先级进程到来,低优先级进程会导致饥饿。

(6)多级反馈队列调度算法

算法思想:对其他算法的权衡
算法规则:
设置多级就绪队列,各个队列的优先级从高到低,时间片从小到大。

新进程到达时先进入第1级队列,按照FCFS原则排队等待被分配时间片。若时间片用完进程还未结束则进程进入下一级队列队尾,如果此时已经在最下级的队列,则重新返回到最下一级队列的队尾。

只有K级队列为空时,才会给K+1级分配时间片。

被抢占处理机的进程重新返回原队列队尾。

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

优点:对各类进程相对公平(FCFS);每个新到来的进程都可以很快得到相应(RR);短进程只用较少的时间就可以完成(SPF);不必实现估计进程的时间;灵活地调整对各种进程的偏好程度


2.4 进程同步

进程访问临界区时,分为4个部分:
临界区是进程中访问临界资源的代码段;
进入区和退出区是实现进程互斥的部分。

同步机制应遵守的规则:
空闲让进,忙则等待,有限等待,让权等待

1 进程互斥的软件实现方法

单标志法 空闲让进
双标志先检查法 忙则等待
双标志后检查法 有限等待
peterson算法 让权等待

他们是一 一对应的关系,例如:单标志法违背空闲让进、双标志先检查法违背忙则等待…


软件和硬件都没有实现让权等待,才有了后面的信号量机制(PV操作)


1.单标志法:

算法思想:每个进程进入临界区的权限只能被另一个进程赋予。两个进程在访问临界区后会把临界区的权限转交给另一个进程。
问题:只有允许的进程才能进入临界区,如果该允许的进程一直不访问临界区,那么就算临界区空闲,其他进程也不能访问。违背”空闲让进“原则。

2.双标志先检查法:

算法思想:设置一个布尔型数组flag[],数组中各个元素用来标志各进程想进去临界区的意愿。每个进程在进入临界区之前,先遍历整个数组,如果没有别的进程想要进入临界区,则把自身的标志flag[i]设为true。
问题:存在两个进程同时访问临界区的风险。违背”忙着等待“原则。原因在于,检查之后,上锁之前,可能会发生进程切换。

3.双标志后检查法:

算法思想:先上锁,后检查。即先设置flag[i]为true,在开始遍历其他的进程的标志。
问题:虽然解决了忙则等待的问题,但违背空闲让进,有限等待的原则。会因各进程都长期无法访问临界资源而产生饥饿现象。

4.peterson算法:

算法思想:如果两个或者多个进程都争着进入临界区,主动让对方先使用临界区。
优于前三种算法,但是还未解决让权等待原则。

2 进程互斥的硬件实现方法

硬件互斥方法属于原子操作,不可被中断

1.中断屏蔽方法:

算法思想: 利用“开/关中断指令”实现。关中断–>访问临界区–>开中断
优点:简单,高效
缺点:适用于单处理机,多处理机可能存在多进程访问;只适用于操作系统内核进程,不适用于用户进程。因为开/关中断指令只能运行在内核态。

2.硬件指令方法

TestAndSet指令:
算法思想:用硬件实现,执行的过程中不允许被中断,只能一气呵成。相比软件实现方法,TSL指令把上锁和检查操作用硬件的方式变成了一气呵成的原子操作。
优点:实现简单,适用于多处理环境。无法像软件实现方法严格检查是否会有逻辑漏洞。
缺点:不满足“让权等待”

swap指令:
算法思想:用硬件实现。逻辑上看与TSL指令并无太大差别。优缺点基本一致

3.信号量机制

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

信号量:其实就是一个变量,可以用一个信号量来表示系统中某种资源的数量。

一对原语:wait(S)原语和signal(S)原语。可以简单的把原语理解为函数调用。这一对原语常简称为P/V操作,常写成P(S)/V(S)。

整型信号量:

用一个整数型的变量作为信号量,用来表示系统中某资源的数量。
只能对信号量进行初始化,P操作,V操作.
检查和上锁用原语实现, 避免了并发,异步导致的问题.检查和上锁一气呵成.
存在问题:不满足让权等待,会发生忙等.
记录型信号量:(超重点)

用一个记录型数据结构变量作为信号量,int value表示剩余资源数,struct process *L指向等待队列。
wait原语:S.value–;当value的值小于0等,表示资源已经分配完毕,进程调用block原语进行自我阻塞,即该进程从运行态转换为阻塞态,主动放弃处理机,不占有CPU资源,加入到S.L等待队列中,符合让权等待原则,不会出现忙等现象。
signal原语:S.value++;当前进程释放临界区资源时,如果还有其他进程等待,wakeup原语唤醒等待队列中的队头进程。

4. 信号量机制实现进程互斥、进程同步

实现进程互斥:

分析并发进程的关键活动,划定临界区。
设置互斥信号量mutex,初值为1(将临界区当做一种特殊系统资源)

在临界区代码段之前执行P(mutex)
在临界区代码段之后执行V(mutex)
P/V操作必须成对出现。缺少P操作,就不能保证互斥访问

实现进程同步:(要让各并发进程按要求有序推进)

分析什么地方需要实现同步关系,即必须保证一前一后执行两个操作。
设置同步信号另S,初始为0
先V后P
扩展:信号量机制实现前驱关系。为每一对前驱关系设置一个信号量。即一条边设置一个信号量,入度表示操作之前执行多少次P操作,出度表示操作之后执行多少次V操作.

5.生产者消费者问题

问题描述:

系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区取出一个产品并使用。(这里的产品理解为某种数据)
生产者和消费者共享一个初始为空,大小为n的缓冲区。
只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待。
只有缓冲区不空时,消费者进程才能从中取出产品,否则必须等待。
缓冲区是临界资源,各进程互斥访问。

PV操作问题分析:

关系分析,找出题目中的互斥、同步关系
整理思路,PV操作的大致流程
设置信号量:缓冲区临界资源设置互斥关系信号量初值为1;缓冲区同步关系设置信号量初值为n;产品数量(或者说非缓冲区数量)设置同步关系信号量初值为0。
注意:实现互斥的P操作一定要在实现同步的P操作之后,否则会发生死锁现象。

2.4.7 多生产者多消费者问题

2.5 死锁

至少有俩个或者俩个以上进程同时发生死锁。一定处于阻塞态。

饥饿----由于长期得不到想要的资源,某进程无法向前推进的现象。有可能是阻塞态(等待I/O设备),有可能是就绪态(等待处理机)

死循环----某个进程执行过程中一直跳不出某个循环。有时是因为程序BUG导致的,有时是程序员故意设置的(PV操作)。

死锁和饥饿时管理者(操作系统)的问题,死循环时被管理者的问题。

(1)死锁产生的必要条件:

互斥条件:
争抢的资源必须是互斥使用的资源。例如像扬声器、内存这类可以让多个进程同时使用的不可能发生死锁。

不剥夺条件:
进程所获取的资源不可由其他进程抢走。

请求和保持条件:
保持了一个以上资源,又在请求新的资源

循环等待条件:
存在一种进程资源的循环等待链。
如果系统中等待的每类资源只有一个,循环等待条件是充分必要条件。

(2)产生死锁的原因

对系统资源的竞争
进程推进顺序非法。
请求和释放资源的顺序不当
信号量的使用不当。

(3)预防死锁:

破坏必要条件中的一个或者几个

1.破坏互斥条件:
SPOOLing技术将独占设备在逻辑上改造成共享设备,缺点是为了系统安全很多地方必须保证这种互斥性。应用并不广泛。

2.破坏不剥夺条件:
优先级更高的进程将想要的进程强行剥夺。缺点是实现复杂,一般只适用于易保存恢复的资源。可能会导致进程饥饿。

3.破坏请求和保持条件:
采用静态分配资源,即在进程运行前一次申请完它所需要的全部资源。缺点是资源利用率极低,造成严重的资源浪费。可能会导致进程饥饿。

4.破坏循环等待条件:
采用顺序资源分配法。首先给系统中的资源编号,规定每个进程必须按照编号递增的顺序请求资源,同类资源一次申请完。缺点是不方便增加新的资源,因为可能需要重新分配编号,进程的实际使用资源的顺序可能和编号递增顺序不一致,会导致资源浪费,必须按规定次序申请资源,用户编程极大不便。

(4)避免死锁:

通过银行家算法防止进入不安全状态
安全序列:是指如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全状态。安全序列可能有多个。

(5)死锁的检测和解除:

允许死锁的发生,不过操作提供会检测出死锁,然后采用某种措施解除死锁

死锁检测算法:

资源分配图:
最终能消除所有边,就称这个图是可完全简化的,不会发生死锁。

死锁定理:如果最终不能消除所有边即不是可完全简化的,那么此时就是发生了死锁。

解除死锁的方法:

1.资源剥夺法:
挂起某些死锁进程,并抢占它的资源

2.进程回退法:
让一个或者多个进程回退到足以避免死锁的地步。

3.撤销进程法:
强制撤销部分甚至全部死锁进程,实现简单但是代价大。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
操作系统实验报告 1、进程调度 2、作业调度 3、作业调度4、文件系统 一、 实验目的 用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。 二、实验内容和要求 编写并调试一个模拟的进程调度程序,采用“简单时间片轮转法”调度算法对五个进程进行调度。 每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、到达时间、需要运行时间、已运行时间、进程等等。 进程的到达时间及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。 进程的运行时间以时间片为单位进行计算。 每个进程的状可以是就绪 W(Wait)、运行R(Run)两种状之一。 就绪进程获得 CPU后都只能运行一个时间片。用运行时间加1来表示。 如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应分配时间片给就绪队列中排在该进程之后的进程,并将它插入就绪队列队尾。 每进行一次调度程序都打印一次运行进程就绪队列、以及各个进程的 PCB,以便进行检查。 重复以上过程,直到所要进程都完成为止。 三、实验主要仪器设备和材料 硬件环境:IBM-PC或兼容机 软件环境:C语言编程环境 四、实验原理及设计方案 1、进程调度算法:采用多级反馈队列调度算法。其基本思想是:当一个新进程进入内在后,首先将它放入第一个队列的末尾,按FCFS原则排队等待高度。当轮到该进程执行时,如能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚为完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS原则等待调度执行,以此类推。 2、实验步骤: (1)按先来先服务算法将进程排成就绪队列。 (2)检查所有队列是否为空,若空则退出,否则将队首进程调入执行。 (3)检查该运行进程是否运行完毕,若运行完毕,则撤消进程,否则,将该进程插入到下一个逻辑队列的队尾。 (4)是否再插入新的进程,若是则把它放到第一逻辑队列的列尾。 (5)重复步骤(2)、(3)、(4),直到就绪队列为空。 .................

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值