综述:何谓进程,进行中的程序,顾名思义,进程就是运行中的程序。即用户使用时的东西。所以进程是一种动态的概念,是只存在一段时间的过程概念。有着开始有着灭亡。进程可以称为是动态的程序。是程序实现功能时的投影。操作系统因为有了进程的概念,可以进行并发操作,并发运行的就是这些进程们。

进程的概念

为了实现进程,特别的设置一种数据结构叫做PCB(进程控制块),这里面包含着一个进程的各种信息,可以帮助完成各种操作。而进程的产生就是pcb的产生,而进程的灭亡就是pcb的灭亡,pcb就是进程存在的唯一标志。再加上程序段和数据段,一个进程就完整了。进程是一个动态的概念,可以这样理解,程序段和数据段是基础,没有程序数据也就没了进程,而程序段和数据段都是静态的,想让程序运行起来就需要合力一起创建PCB,这样进程就诞生了,程序就可以以进程的方式运行了。当需要关掉程序时,也就删除pcb。程序段和数据段也就变回了静止的样子。进程在运行过程中,是需要计算机资源的,进程就是计算机分配资源的一个最小单位。系统资源可以理解为时间片,每个进程宠幸几个时间片,也都是以进程为分配单位的。皇帝宠爱皇妃,不能以皇妃身上的汗毛为单位吧。

进程的特征

进程的特征是相对于单个程序顺序执行而提出的

动态性:是一次动态的过程,有创建、活动、暂停、终止等过程。具有生命周期。(是最基本的特征)

并发性:指进程的目的,进程的提出本身就是为了程序并发而设计的,进程的存在当然实现了程序的并发。也自然就有并发性的特征。

独立性:指进程是一个可以独立运行的独立单位。可以独立获得资源,独立接受调度的单位。

异步性:由于是并发进行的,资源又有限,进程以不可知的速度向前推进。进程的异步性与操作系统的异步性是一样的。表达的具有不可预知性。

结构性:进程具有相对规整的结构,都是由PCB、程序段、数据段构成的。

进程的状态与其转换

进程从创建到消亡,整个生命周期,具有几个特点鲜明的状态。通常有五种状态(也称为五态图

运行状态:正在使用处理机资源(此时是并发进行的,微观上依旧存在走走停停,但即使短暂的挺也算运行状态)

就绪状态:进程已经准备好了所有运行所需要的条件,就差cpu临幸了。一旦得到资源,立刻就可以运行。

阻塞状态:又称等待状态,进程因为某一件事暂停运行(这里是宏观上的暂停,不是微观上的暂停),阻塞状态就是进程还没有达到就绪的状态。即使cpu空闲也不能临幸它。

创建状态:进程正在被创建,PCB初始化。然后由系统分配必备的资源,最后把进程转入就绪状态。

结束状态:进程正在消失,可能是正常结束也可能是中断退出。系统置进程结束状态,收回资源,删除pcb。

【ps】就绪状态要转入运行状态的时候,系统分配的是时间片,当时间片进程还没结束的时候,会被重新挂为就绪状态。

进程控制

计算机中的控制就是管理,对进程实现创建,结束,状态转换的控制。控制进程所用的是原语。

进程创建

进程的创建可以是一个新的进程,也可以是已有进程创建的子进程。子进程可以继承父进程的资源,当子进程被撤销时,资源归还给父进程,而不是归还给系统。当父进程被撤销时,子进程也不能独立存在,也要被撤销。

操作系统创建一个进程的过程如下(创建原语

1)分配进程标识号,申请空白PCB(申请失败则创建失败)

2)为进程分配资源(程序、数据、内存空间)。(分配失败则转为阻塞状态而非失败)

3)初始化PCB(标志信息、处理机状态信息、处理控制信息、设置优先级)。

4)如果就绪队列可以接纳新进程,则接收到就绪队列中。

进程的终止

进程的中止有三种情况:1)正常结束2)异常结束3)外界干预(我关的,咋地?)

操作系统终止进程的过程(撤销原语):

1)根据要禁止的标识号,检索PCB,找到它,并读取状态。

2)终止。

3)如果还有子进程,终止

4)归还资源,或父进程或操作系统。

5)从PCB中删除。

进程的阻塞与唤醒

进程的阻塞是一种进程自身的主动行为,是进程自己要求的,因为自身条件不满足。

阻塞原语:

1)根据标识号找到对应的pcb

2)若在运行,保护好现场。将状态转为阻塞

3)把该PCB插入到对应事件的等待队列中(等待资源)

当被阻塞的进程所期待的事情都发生之后,便安排让它重新就绪。执行唤醒原语。

唤醒原语

1)找到相应进程的pcb

2)将其从等待队列中移除,并将状态转换为就绪状态

3)把该pcb插入到就绪队列中。

进程切换

进程切换是指处理机从这个进程到另一个进程的转换。切换过程如下:

1)保护现场

2)更新pcb

3)把该进程移入等待队列(如就绪队列)

4)选择另一个进程,并更新其pcb

5)更新内存管理的数据结构

6)恢复上下文

进程切换是逻辑上的切换,而处理机模式切换不一样,模式切换可能处理机还在执行这个进程,可能进程刚刚去了一趟核心态,回来的时候,逻辑没有变,依旧是这个程序。所以,无需如此复杂的切换环境。

【注解】调度是指资源的分配,切换是进程的切换,实际的行为。进程的切换效率不高,所以后文中的线程帮助提高效率,减少进程间的切换。

进程的结构

PCB

一旦进程被创建,那他的PCB就常驻在内存中,只有在进程结束的时候才会被删除。PCB是进程实体的一部分,也是进程存在的唯一标志。

主要组成部分如下:
1)进程描述信息

进程标识符:所有进程的编号

用户标识符:进程归属的用户的编号

2)进程控制和管理信息

进程当前状态:五态

进程优先级:进程抢占处理机的优先级

3)资源分配清单:所使用的资源的相关信息,比如内存地址。

4)处理机相关信息:这就是现场和环境。处理机各寄存器的值。

管理PCB:如此繁多的PCB,系统需要对他们进行管理。有两种方式,

 链接方式:通过队列的方式,把相同状态的PCB放在同一队列中。

 索引方式:将状态相同的进程放在同一张索引表中。

程序段和数据段:顾名思义。特别的是,程序段可以被多个进程同时使用。这就是一个软件可以打开好几次。

进程通信

进程空间是独立的,不能随便越界的,所以进程间的通信需要一些方法。

1)共享存储:设置一个共享空间,是可以被多个进程读写的,进程就可以通过这样一个中间空间来进行通信。

2)消息传递:进程可以把信息发送给另一个进程,就像写信一样,有直接通信方式,进程把消息发送到另一个进程的消息缓冲队列。还有间接通信方式,存在一个中间实体,就像一个信箱

3)管道通信:是消息传递的特殊方式,管道是用于连接一个进程和另一个进程的共享文件。写进程对管道写信息,然后读进程读取管道。为了协调双方的通信,管道需要有协调能力。

管道文件的大小是固定的,就像一个大小固定的缓冲区。当写进程写满时,管道将阻塞写,转而等待读,只有读之后,才能再次写。所以管道中的数据读完就消失了,是一次性的,也是连续的。所以管道注定只能是半双工通信。

线程的概念和多线程模型

线程的基本概念

操作系统的设计者发现以进程为单位的并发性还是不足够高效,为了可以有更好的性能,提出了线程的概念,以前进程是最小的独立单位,现在把进程的某些最小单位的特性分解成更小的单位,这就是线程了(并不是全部的特性,进程在某些方面依旧是最小的单位)。线程是cpu执行中的最小的单位,线程是进程的实体,是可以被系统独立调度和分配的基本单位。但是线程不拥有系统资源,线程使用进程的资源。一个线程也可以创建另一个线程,同一进程中的线程可以并发运行。线程也像进程一样,有就绪阻塞运行三个基本状态。引入线程后,进程只作为除cpu以外系统资源的分配单位。线程作为处理机的分配单元。由于线程切换就在进程空间内进行,相比进程切换只需要很少的时空开销。

线程和进程的比较

1)调度线程是独立调度的基本单位进程是拥有系统资源的基本单位。进程内线程的切换不需要进程切换。开销就会小很多。

2)拥有资源进程是拥有系统资源的单位线程享用进程的资源

3)并发性,进程和线程都可以并发,线程的并发效率更高

4)系统开销线程的存在可以有效的减少系统开销,线程在同一进程内的切换效率高很多。并且在同一进程的线程通信也非常方便。

5)地址空间和其他资源,进程间的地址空间相互独立,进程内的线程对于其他进程是透明的,进程就像一个黑箱。

6)通信,进程间通信需要进程同步和互斥手段的辅助,而线程间的通信直接读写全局变量就行。

线程的属性

1)线程是一个轻型实体,它不拥有系统资源。但是线程也拥有一个标识号和一个线程控制块,记录了寄存器信息。

2)不同的线程可以执行相同的程序

3)线程共享资源

4)线程是处理机调度的单位

5)线程与进程一样有生命周期,一样会经历阻塞就绪运行。

线程的实现方式

实现有两种方式:用户级线程内核级线程

用户级线程由应用程序编程实现,对于内核是透明的,内核是不知道线程的存在的

内核级线程是应用程序没有管理线程的能力,只有一个到内核的编程接口。用户空间的线程通过接口到内核态接受管理

某些系统使用组合的方式,两种都有。

多线程模型

基于用户级线程和内核线程的不同组合,产生了一些不同的多线程模型。

1)多对一模型,将多个用户级线程连接到一个内核级线程上,线程的管理在用户空间,用户级线程对于系统是透明的。

优点:线程管理在用户空间中,效率较高。

缺点:当其中一个线程被阻塞了,整个进程就被阻塞了,因为系统是盲的。多线程不能并行。

2)一对一模型,每个用户级线程连接一个内核级线程

优点:并发能力更强

缺点:创建的比较多,系统开销比较大。

3)多对多模型。n个用户级线程映射到m个内核线程。

折中呗。

处理机调度

由于进程数量往往大于处理机数量,进程就会争用处理机资源。处理机调度就是对处理机资源的分配方式,就是从就绪队列中按照一定的算法选择一个进程并将处理机分配给他运行。以实现并发运行。

调度的层次

1)作业调度(高级调度):主要任务是从外存中上处于后备状态中的作业调度到内存中。并建立相应的进程。频率几分钟一次。

2)内存调度(中级调度):为了提高内存利用率和系统吞吐量,主要是对内存的调度,将哪些暂时不能运行的进程调度到外存中,当又有空闲,条件符合就绪的时候再调回到内存。

3)进程调度(低级调度):主要任务是按照某种策略从就绪队列中选取一个进程。频率很高几十毫秒一次。

高级(创建进程)中级(内存与外存的调入调出)低级(就绪到运行)进程调度是最基本的不可或缺的。

进程调度方式

非剥夺方式:当一个进程在处理机上运行时,即使有更重要的事件在就绪队列,仍然让执行的进程继续执行。直到该进程完成或者阻塞。(系统开销小,但是不适合实时操作系统)

剥夺方式:当一个进程正在处理机上执行时,若有某个更为重要的进程需要处理机,则立即停止当前进程,将处理机分配给这个更重要的进程。采用剥夺式的方式有利于提高系统吞吐率和响应效率都有明显的好处。但是剥夺必须遵循一些原则:优先权、短进程优先、时间片原则。

调度的基本原则

调度的目的永远是为了提高系统运行效率

1)cpu利用率

2)系统吞吐量:单位时间内cpu完成作业的数量

3)周转时间:指对于单个作业的时间,不能太久。也要照顾到个体。表示从作业提交到作业完成经历的时间。

4)等待时间:指进程处于等处理机的时间,越长越不好。本质上处理机调度算法只影响作业在就绪队列中等待的时间。

5)响应时间:用户提交到系统首次被响应的时间。

整个调度的基本原则,既要照顾到计算机整体的运行效率,又要照顾到单个进程单个用户的感受。不能等太久。

经典的调度算法

1)先来先服务

算法内容:就是一个队列,先来的就是先被服务,后来的就等着,按照顺序来。简单粗暴。

特点:算法简单,效率低,对长作业比较有利。但对短作业不利。

2)短作业优先

算法内容:短作业优先级高,优先处理短作业。

特点:平均等待时间和平均周转时间最短。但是对长作业不利,会导致长作业长期不受到服务(此种现象称为饥饿)。而且,不能保证紧急的任务得到解决。

3)优先级调度算法

算法内容:选择优先级最高的作业。根据能否抢占分为非剥夺式和剥夺式。根据能否改变进程优先级分为讲台优先级和动态优先级。

特点:书上没写。我觉得就是灵活。可以动态修改优先级的话,就可以动态的调整。

4)高响应比优先调度算法

算法内容:响应比=等待时间+要求服务时间/要求服务时间。优先调度高响应比的作业。

特点:1、等待时间相同时,要求服务时间越短越好,则利于短作业。2、当要求服务时间一样时,等待时间越长优先级越高,类似于先来先服务。3、对于长作业,只要等的足够长,就会被调度,避免了饥饿。

5)时间片轮转调度算法

算法内容:适用于分时系统,将就绪的进程按照时间先后排队。类似于先来先服务,进程调度程序总是选择队列第一个进程执行。但是只能运行一个时间片(一个固定的时间长度),在运行完一个时间片后,进程就被暂停放在队列的最后。

特点:此种算法的时间片长度非常重要。应该选择一个合适的长度。

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

算法内容:设置多个就绪队列。并为各个队列分配优先级。第一级最高,依次递减,第n级最低。优先级越高的队列所分配的时间片越短(第2级要比第1级长1倍,依次指数级增加)。当一个新进程(高级调度进来)进入内存后,先进入第1级队列,先来先服务的原则排队等待,排到它的时候运行一个时间片,如果没有运行完,就排到第2级队列的末尾,继续排队。如果直到第n-1级队列的时候都没有运行完。被排到最后一个队列的时候,就使用时间片轮转的方法循环排队。

特点:

终端型作业用户:短作业优先

短批处理作业用户:周转时间短

长批处理作业用户:不会长期不处理。

进程同步

综述:进程本身是并发执行的,互相之间存在着不同的制约关系,这就需要同步的协调管理才能让进程有效进行。本质上是为了让多个进程能配合完成任务的一种机制。

进程同步的基本概念

1)临界资源:指那些资源同一时间只能让一个进程使用的资源。不可以并发的共享。比如打印机和有些数据变量。把访问临界资源的代码称为临界区。可以把访问临界资源的代码分为进入区、临界区(使用)、退出区、剩余区(代码中的其他资源)

2)同步:同步就是直接制约关系,进程间的制约关系来源于那些它们的相互合作。

3)互斥:间接制约关系,当一个进程访问临界资源时,其他的进程就必须等待。

为了禁止两个进程同时访问临界资源需要服从以下原则:

1)空闲让进

2)忙则等待

3)有限等待(应保证能在有限的时间等待到)

4)让权等待(不傻等,得不到就释放处理器资源)

实现临界区互斥的基本方法

一、软件实现方法

1)单标志法:设置一个变量,变量存放的是允许进入的进程的编号。

特点:因为是进程要访问的时候按照顺序置的编号,若进程突然不访问了,但是编号并没有改变,则临界资源将无法被其他进程访问。(违背空闲让进)

2)双标志法先检查:设置一个flag[i]数组,i表示进程号,置0就是没有访问临界区,置1就是在访问临界区。

特点:可能两个进程同时给自己置1,同时访问的情况。(违背忙则等待)

3)双标志法后检查:与上面不一样的是,先设置自己为1,然后再检查有没有其他进程在用。

特点:若两个进程在空闲的时候同时给自己置1,则会盲目认为临界区有进程被访问。从而导致饥饿现象。

4)Peterson ’s Alogarithm(爸爸):首先既要设置一个flag[i]数组,又要设置一个变量。每个进程先设置自己的标志,再设置变量标志。这时再同时检测另一个进程的状态标志和不允许进入表示。我们主要解决的问题就是同时访问的问题,此种方法,在两个进程同时访问时,有两个参考的标志,一个是数组值,一个是变量的值。可以避免上面算法的问题。

二、硬件实现方法

1)中断屏蔽法:当一个进程正在使用处理机执行临界区代码时,屏蔽所有中断。关中断——临界区——开中断。

特点:效率低,不安全(把关中断权力交给用户)

2)硬件指令法

TestAndSet:原子操作,功能是读出指定标志,并置1

Swap:交换两个字节的内容

实现方法:为每个临界资源设置一个共享的布尔变量lock,初值为1,然后每个进程设置一个局部布尔变量key,用于与lock交换信息。在进入临界资源之前,交换自己的key和lock,然后检查key值。若有进程在临界区,则重复交换和检查。

优点:简单,适用于任意多个进程

缺点:得一直等,不能让权等待。有可能饥饿。

信号量(重点)

信号量机构是一种很好的方式用来解决互斥和同步的问题,它只能被两个标准的原语wait(S)和signal(S)来访问。就是传说中的PV操作。

1)整型信号量

仅仅定一个资源数量的变量S,操作代码如下:

Wait(s){

While(s<=0);//用来等待的

S=s-1

}

signal(s)

{

S=s+1;

}

此种方法显然是非常的简陋的一种方法,在S<=0的时候,就一直等待,没有遵循让权等待的原则。(了解即可,此种方法垃圾)

2)记录型信号量

不仅设置一个代表资源数量的变量S,还增加一个进程链表L。用于链接所有等待该资源的进程。当一个进程申请资源时(使用wait操作),如果资源量是小于0的,那么就进行自我阻塞,并链接到进程链表中去。不会无限等待。当有进程执行完成后,释放资源,会唤醒链表的第一个进程。

3)利用信号量实现同步

信号量机构可以用来解决各种同步问题,是操作系统这门课程的重点,也是考研中的重点。设S是实现P1和P2进程的公共信号量,初值为0 。假如P2要使用P1的结果,那么就需要进程同步问题,我们现在用信号量机构解决这个问题:

P1中结果运算好的时候,运行V(S)操作,大致意思是告诉P2,我运算完了。P2中的需要P1结果的代码前面要运行P(S),来检查是否P1已经运行完了,如果没有将把P2阻塞。

4)利用信号量实现进程互斥

信号量机构亦能解决进程互斥问题,S为进程P1和P2互斥的信号量。为了表示临界资源,S初值为1(即代表可用资源为1).具体操作如下:

互斥操作就不像同步问题那样有个谁先谁后了,大家都是互相竞争平等的关系。每个进程在执行临界区代码之前,要执行P(S)操作,来检查S资源是否可用,如果可用就继续执行访问临界资源,如果不可用将阻塞。当临界资源正在这个进程访问时,S值为0,其他进程的P(S)操作总是失败的,这就实现了互斥的功能。进程访问完临界资源后,使用V(S)操作释放资源。

5)利用信号量实现前驱关系

想要实现前驱关系,就要给每个驱图中的进程设置一个信号量初值为0.当前驱运行完了,将自己的信号量置1,然后后驱一检查是1,就可以通过P操作了,就可以执行了。这样就实现了前驱关系。

管程(了解)

管程是一组数据以及定义在这组数据之上的对这组数据的操作组成的软件模块。

管称本质上就是一个对系统资源的抽象,是把具体的资源抽象成一些数据,并且可以对这些数据进行操作,以达到使用这些资源的目的。管程依旧是程序是软件。

经典的同步问题(重点)

1)生产者—消费者问题

问题来源:一组生产者和消费者进程共享一个缓存区。只有缓存区没有满时,生产者才能把生产的东西放进去,只有缓存区没有空时,消费者才能从这里买走东西。并且缓存区是临界资源,只能同时被两者中的一个访问。

关系分析:消费者和生产者在访问上是互斥的。消费者只有在生产者生产了才能消费,这也是同步关系。

解决问题方法:两个进程存在着互斥和同步关系,通过PV操作和信号量解决。

设置一个互斥信号量mutex,初值为1

设置一个缓存区满数量full,初值为0

设置一个缓存区空数量empty,初值为n

生产者:生产者首先自发的生产数据,然后想要放进缓冲区前,首先要判是否满,所以

P(empty)一下,若empty不为0,说明没有满,那么就可以访问缓冲区,接着就要判是否有其他进程在访问临界资源,P(mutex)一下。如果没有进程访问,则可以把数据写入缓存区。在送入之后,要释放资源,所以V(mutex)一下,解除临界资源。因为放进了数据,所以要V(full)使满缓存区加1.(即提供了什么V一下)。

消费者:消费者在准备消费的时候,先要P(full),判断是不是还有货。然后接着同样的
P(mutex)一下,来解决互斥问题。消费完之后,再V(mutex),然后V(empty)。基本同上。

总结:消费者生产者问题就是简单的互斥与同步并存的两个进程的问题,利用信号量可以简单清楚的解决问题。凡是要减少什么,就P一下,凡是要增加什么,就V一下。凡是互斥的代码,前后要加PV护航。

2)读者写者问题

问题来源:读者和写者两组并发进程,共享一个文件,允许多个读者同时读文件,只允许一个写者往里写信息,任意写者在写完之前,其他读者或写者都不能对文件操作。写者执行写操作前,应退出工作。

关系分析:读者和写者是互斥关系,写者和写者也是互斥的。

解决问题方法:依旧是使用PV操作来解决问题,首先写者是比较容易的,任何一个写者进程与其他任何一个进程都是互斥的。但是读者稍微复杂一些,读者可以多个读者读。因为数量多,所以设置一个计数器来表示有多少读者在读。当计数器为0时写者才能工作。

设置一个信号量计数器count,初值为0

设置mutex用来互斥保存更新count变量,初值为1

设置rw用于保证读者和写者的互斥问题,初值为1

设置w用来实现读写公平的,初值为1

写者:

写者要写入的时候,要先P(w)来判断有没有写者在写,没有就可以继续P(rw)来访问临界资源,就可以写入了,写完的时候用v操作来释放刚才P的资源。

读者:
读者要读的时候,因为与写者是互斥的,所以要先P(w)来判断有没有写者在写。没有写者在写的话,就P(mutex)来解决互斥访问计数器的问题。如果是第一个读者,那么要P(rw)来禁止写者再进来了。计数器加一后,就可以释放mutex和w了,恢复对共享文件的访问(即允许其他读者进来)。接着就可以读了。读完之后,要在P(mutex)后使计数器减1,再顺便判断一下是不是最后一个读进程了,如果是就释放rw,以便允许写者进入。接着再释放mutex。

读者代码:

Readrer()

{

P(w);

P(mutex);

If(count==0)p(rw);

Count++;

v(mutex);

V(w);

Reading;

P(count);

Count—;

If(count==0)v(rw);

V(mutex);

}

总结:读者写者经典在于通过计数器来解决互斥问题。

3)哲学家进餐问题

问题描述:一个圆桌上,5个哲学家,每两个哲学家之间的桌上有一根筷子,桌子的中间是一碗米饭,哲学家只要不饿就会思考,哲学家在饿的时候才会拿起筷子,左一根右一根,如果筷子在别人手里,就要等待。饥饿的哲学家只有在两根筷子时才吃米饭。吃饱后放下筷子,继续思考。

关系分析:5名哲学家对其中间的筷子的访问是互斥的。

问题解决办法:

这里每个哲学家相当于一个进程,既不能饥饿,把哲学家饿死,也不能造成死锁(5个人每个人拿一个筷子,那五个人都死求了)。

设置互斥信号量数组5个,初值均为1,哲学家从0到4编号,称编号为i那么约定哲学家左边的筷子为i ,可以计算得右边筷子的编号为(i+1)%5

设置一个互斥访问量,在一个哲学家取筷子的时候,别人不能动。

开始:

哲学家想取筷子之前,先P互斥量,知道别人没有在拿的时候再分别P一下左边筷子和右边筷子,两个筷子都拿到后,可以释放互斥量了,别人可以拿了。吃饭,吃完后,释放筷子。思考。

总结:哲学家问题,是多个进程对有限资源的访问,并且这个资源不是单一的,是得得到多个才能完成进程,此种问题,就要考虑避免饥饿和死锁

4)吸烟者问题

问题描述:假设一个系统有三个抽烟者一个供应者。抽烟者不停的抽烟,但是抽烟需要三种材料,第一个抽烟者有烟草,第二个拥有纸,第三个拥有胶水,供应者无限的给这些东西。供应者一次放两种材料,让没给的那个人抽烟。如此循环。

关系分析:供应者与抽烟者是同步关系,由于一次只有两种材料,所以抽烟者无法同时抽烟是一种互斥关系。

解决问题办法:

设置三个信号量对应抽烟者,初值为1

设置一个互斥信号量用来互斥抽烟。

开始:

用随机函数随机1、2、3三个数,随机到哪个,供应者就V(这个吸烟者),也即提供他没有的那两种材料。提供完之后,有人要抽烟了,所以P这个互斥量。接下来,谁刚才被V了,就P这个资源之后,抽烟,然后V互斥量。一共一个主进程是供应者,然后是3个抽烟者进程。

死锁问题

死锁问题最明显的例子就是哲学家问题中,五个人每个人都拿了一个筷子的尴尬情况,每个进程都无法运行完成也无法退出。就是白白进入死循环。

所谓死锁就是指多个进程因竞争资源而造成的一种僵局。

死锁产生的原因

1)系统资源竞争

2)进程推进顺序非法

死锁产生的必要条件(死锁缺一不可)

1)互斥条件:资源是临界资源,具有排他性

2)不剥夺原则:进程所占有的资源,没有执行完成,不能剥夺。

3)请求和保持条件:进程在有资源的情况下申请别人在用的资源。自己的资源不放手

4)循环等待:存在一种进程资源的循环等待链。

你能在哲学家问题的死锁情况中找到上面的条件么?

1)筷子是临界资源

2)一根筷子不会被剥夺

3)想用别人手中的筷子

4)5个人都拿了一根筷子,循环等待。

死锁的处理策略

1)预防死锁:破坏某些必要条件(过于保守,效率底)

2)避免死锁(折中算法):在资源动态分配中,防止形成死锁。(必须知道进程资源的需求,进程不能长时间阻塞)

3)死锁检测和解除:主动检测是否死锁,然后系统干预解决死锁。(通过剥夺解除死锁,造成损失)

死锁预防

1)破坏互斥条件:emmmm,不现实,因为互斥资源现实存在。

2)破坏不剥夺条件:在一个进程请求新资源不得时,必须释放所有保持的资源。(适用于现场容易恢复的进程,不适合打印机。)

3)破坏请求与保持条件:进程创建之初,就把他所有需要的资源一次给他。(实现简单,效率底下,还会产生饥饿现象)

4)破坏循环等待条件:采用顺序资源分配法。先给资源编号,进程必须按照资源顺序的资源(编程麻烦,资源浪费)

死锁避免

1)系统安全状态:首先我们要清楚什么是系统安全状态,然后通过方法使计算机保持在系统安全状体。就可以避免死锁。所谓的安全状态,就是系统按照某种顺序给进程分配资源,直至满足每个进程的最大需求,最终使每个进程都可以完成任务。当系统无论如何也找不到一个方法可以使进程顺利都完成的时候,系统就是不安全状态。

2)银行家算法(重点)

把操作系统看成银行家,操作系统管理的资源当作银行家管理的资金,进程申请资源就相当于向银行家贷款。银行家对分配贷款有以下几个准则:

1)当进程首次申请资源时,测试该进程对该资源的最大需求量,如果系统现有资源能够满足该进程,就按照他现在的申请量给他。否则就推迟分配。(即检测该进程最大需求是100万,银行有200万,那么银行家就给他现在申请的10万)

2)当进程在运行过程中再次申请资源时,测试该进程已经占用的资源与申请的资源是否超过当初创建时候测试的最大资源数,如果超过则拒绝放贷。如果没有超过,则检测现存的系统资源是否满足该进程实现最大资源数。

例子:假设银行家现在还有100万,此贷款者已经申请了20万,当初它的最大资源数是100万。那如果贷款者再次申请的时候,申请90万,那么90+20已经超过了当初最大资源数,银行有钱也会拒绝。如果申请80万,检测最大资源数100万-20万是80万,银行家的100万是超过这个数字的,所以允许给他80万。

【分析】通过约定一个最大资源数,那么以后再也不会分配超过这个数字。那么就永远不会让系统资源陷入不够用的情况。因为每个进程都符合这个要求的话,即使某些进程现在要等待,但是其他的进程会随着运行完成释放资源,而不是各个进程都占有着,却都无法正常运行。

实现方法:
资源数组:数组标号代表资源种类,所包含的值就是现有资源数目。

最大需求矩阵:定义了n个进程对m种资源的最大需求量。

分配矩阵:定义了n个进程对m种资源的占有数量

需求矩阵:定义了n个进程对m中资源的尚需资源数

ps:需求矩阵就是最大需求矩阵-分配矩阵

算法过程:

假设Requesti是进程Pi的请求矢量,如果Requesti[j]=K,表示Pi需要j类资源K个。当资源请求发出时,进行逐项检查。

如果需求资源大于需求矩阵的值,则拒绝,表明已经大于最大需求。如果没有继续。

如果需求资源大于资源数组中的值,则拒绝,表明系统中已经没有足够的资源给它。如果没有继续。

系统试探着给它资源,修改数据,但是现在还没有正式开始,要进行安全性算法检测,看系统是否在修改后依旧安全,如果安全才正式分配资源。

【总结】银行家算法,就是三个上限,你申请的资源既不能超过需求矩阵(即你已占有的和现在申请的)也不能超过系统现有可用资源(如果系统资源不够,你肯定申请不到),也不能因为你的申请使系统不安全(这跟其他进程有关)。

总结说,银行家算法就是三点禁止:禁止超过最大需求量、禁止超过系统现有资源量、禁止使系统不安全

3)安全性算法

从需求矩阵中,依次寻找,还不在安全序列的进程,而且这个进程的需求量小于系统目前的资源数目(即现在系统可以满足它)。找出这些进程,加入安全序列,并且让系统资源数组加上它所释放的资源数目,然后依次按照这个方法执行,直到不存在符合条件的进程。这个时候判断,如果此时的安全序列中含有所有的进程,则系统安全,否则系统不安全。(不安全的情况就是,存在系统将所有能运行的进程都运行完成,并且把他们的资源都收回时,仍有进程系统满足不了,无法完成)

死锁检测和解除

1)死锁检测:书中使用的资源分配图,本质上和银行家算法中的矩阵是表示的同样的东西。而死锁检测本质上也可以看作就是安全性算法,当一个系统不安全的时候,即已经表明,系统要死锁了。

2)死锁解除:一旦检测出死锁,就立即采取相应的措施,以解除死锁。主要方法三种:

1、资源剥夺法:挂起某些死锁进程(即安全性算法中那些没有进入安全序列的算法),抢占其资源。将这些资源分配给其他的死锁进程。但是要避免长时间挂起。

2、撤销进程法:强制撤销部分甚至全部的死锁进程,并剥夺这些资源。撤销可以按照进程优先级和代价排序来撤销。

3、进程回退法:让一个或多个进程回退到足以避免死锁的地步。要求系统有设置还原点。

考研—操作系统—进程管理相关推荐

  1. linux 进程管理 ppt,linux操作系统-进程管理和打印管理.ppt

    <linux操作系统-进程管理和打印管理.ppt>由会员分享,可在线阅读,更多相关<linux操作系统-进程管理和打印管理.ppt(25页珍藏版)>请在装配图网上搜索. 1.进 ...

  2. 操作系统——进程管理(一文弄懂进程间的那些事)

    进程管理 进程 进程的概念 PCB 进程的组成 进程的特征 进程的状态与转换 进程的状态 进程间的转换 进程的组织方式 链接方式 索引方式 进程控制 怎么实现进程控制--原语 进程的创建 进程的终止 ...

  3. 面试-操作系统-进程管理-进程-进程调度-死锁

    文章目录 ==概念== 备注 简单说下你对并发和并行的理解? 同步.异步.阻塞.非阻塞的概念? 操作系统概念? 一个程序从开始运行到结束的完整过程,你能说出来多少? 用户态和内核态是如何切换的? 什么 ...

  4. 操作系统----进程管理(C语言)

    一.进程管理 #include "conio.h" #include "stdio.h" #include "stdlib.h"struct ...

  5. 操作系统-进程管理实验(2)

    实验二  进程管理 一.目的 本课题实验的目的是,加深对进程概念及进程管理各个部分内容的理解:熟悉进程管理中主要数据结构的设计及进程调度算法,进程控制机构,同步机构,通信机构的实施. 二.题目 进程管 ...

  6. 计算机操作系统进程同步实验报告,操作系统-进程管理与进程同步-实验报告

    进程管理与进程同步实验报告 实验一.进程管理与进程同步 一.实验目的 了解进程管理的实现方法,理解和掌握处理进程同步问题的方法. 二.实验内容 实现银行家算法.进程调度过程的模拟.读者-写者问题的写者 ...

  7. 操作系统--进程管理1--单个CPU情况

    1.进程概念 进程:一个正在执行的程序:操作系统提出进程概念目的:是为了跟踪程序在执行期间的状态.而程序只是一段代码,是一个静态的概念 无法准确描述程序执行时候发生的一切.程序代码被加载进内存后就以进 ...

  8. 操作系统 进程管理(一)——进程的含义与状态

    目录 程序的执行特征 程序的顺序执行及其特征 程序并发执行的特征 进程的基本概念 进程的含义与特征 (一) 进程的定义 (二)进程的结构 (三) 进程与程序的区别与联系 (四) 进程的特征 (五) 进 ...

  9. 操作系统 进程管理之处理机调度

    一.调度的概念 1.1 调度的基本概念 处理机调度是对处理机进行分配,就是从就绪队列中,按照一定的算法(公平.高效)选择一个进程并将处理机分配给它运行,以实现进程并发地执行. 1.2 调度的层次 1. ...

最新文章

  1. EIgen:Matricx和vector类的定义和使用
  2. Hdu 2522 hash
  3. DC workshop指导篇1- Setup and Synthesis Flow
  4. 四则运算之Right-BICEP测试
  5. 微信屏蔽百度红包活动页面,谁在焦虑?
  6. C++ 之 转义字符
  7. nginx文件系统大小_详解Nginx系列
  8. Visual C# 2008+SQL Server 2005 数据库与网络开发-- 5.1 计算
  9. 爬虫:Python爬虫学习笔记之爬虫基础
  10. spring-第十二篇之两种后处理器
  11. 如何选择白盒测试工具
  12. c语言的运算符有那哪些,c语言逻辑运算符有哪些
  13. “以图搜图”引擎及网站合集
  14. 毕业论文标题和目录生成
  15. 5款靠谱的安卓备份应用
  16. modprobe XXX not found 解决与Depmod命令; insmod/modprobe的区别
  17. 用RSA算法加密文本文件
  18. 关闭虚拟机linux防火墙命令
  19. 创业板公司相符如何经济转型
  20. 脑波震动(二):全身脑波震动

热门文章

  1. Rob Papen Go2 for Mac - 虚拟音频合成器
  2. 生活中的收支明细该如何记录
  3. 用Python批量修改图片名称及后缀名
  4. 预防猝死,8个心率监测方案随时监测的身体状况
  5. CentOS 7.5 安装Tomcat教程
  6. 华为OD机试题:黑板上的数涂颜色
  7. 知识总结--性能优化总结(摘录+转载)
  8. 数据传输加密——非对称加密算法RSA+对称算法AES(适用于java,android和Web)
  9. wordpress博客添加微博、微信分享等等
  10. C# chart控件实时动态显示数据