一、进程与线程
1.1、进程
进程是资源分配的基本单位。
进程控制块PCB(Process Control Block)描述的是进程的基本信息以及进程的运行状态,我们说的创建及撤销进程都是对进程控制块PCB的操作。
进程之间可以并发执行。
一个程序中可以有多个进程。
1.2、线程
线程是独立调度的基本单位。
一个进程中可以有多个线程,他们之间共享进程资源。
1.3. 进程的切换
二、多级反馈队列
2.1、批处理系统
在批处理系统中用户所提交的作业先放到外存上。并且排成一个队列,称之为“后备队列”。然后作业调度的程序按照一定的算法,从后背队列中选择若干个作业调入内存,使他们共享CPU和系统中的各种资源。
一、先来先服务first-come first-serverd(FCFS)
调度的作业是最先进入就绪队列的作业。
这种调度算法有利于长作业,但是不利于短作业,因为短作业必须一直等待前面的长作业执行完毕后才能执行,但是长作业又需要执行很长的时间,造成了短作业等待的时间过长。
二、短作业优先shortest job first(SJF)
优先调度运行时间最短的作业
这种调度算法导致长作业有可能会出现饿死的现象,因为可能存在长作业一直等待短作业执行完毕的状态。如果一直有短作业到来,那么长作业永远也得不到调度。
2.2、交互式系统(分时系统)中的调度
它是指一台主机上连接了多个配有显示器和键盘的终端由此所组成的系统,该系统运行多个用户同时通过自己的终端,以交互方式使用计算机,共享主机中的资源。
一、优先级调度
除了可以手动赋予优先权之外,还可以把响应比作为优先权,也叫做高响应比优先调度算法。
响应比 = (等待时间 + 要求服务时间)/要求服务时间 = 响应时间/要求服务时间
这种调度算法主要是为了解决短作业优先调度算法长作业可能会饿死的问题,随着等待时间的增长,响应比也会越来越高。
二、时间片轮转
将所有的就绪进程按照FCFS的原则排成一个队列,每次调度时,把CPU的时间分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序程序便停止该进程的执行,并把它送到就绪队列的末尾,同时把CPU的时间分配给队首进程。
时间片轮转算法的效率和时间片的大小有很大的关系,因为进程的切换都要保存进程的信息和载入新进程的信息,如果时间片太小,会导致进程切换的太频繁,在进程切换上会花费过多的时间。
三、多级反馈队列
如果一个进程需要执行 100 个时间片,如果采用轮转调度算法,那么需要交换 100 次。多级队列是为这种需要连续执行多个时间片的进程考虑,它设置了多个队列,每个队列时间片大小都不同,例如 1,2,4,8,…。进程在第一个队列没执行完,就会被移到下一个队列。这种方式下,之前的进程只需要交换 7 次。
2.3、实时系统的调度
实时系统要求一个服务请求在一个确定的时间内得到响应
分为硬实时和软实时,前者必须满足绝对的截止时间,后者可以容忍一定的超时。
三、进程同步
3.1、临界区
对临界资源进行访问的那段代码称之为临界区。
为了互斥的访问临界资源,每个进程在进入临界区的之前,需要先进行检查。
3.2、互斥和同步
同步:多个进程按照一定的顺序执行。
互斥:多个进程同一时刻只能一个进程进入到临界区。
四、进程通信
进程同步与进程通信的区别在与:
进程同步:控制多个进程按照一定的顺序执行。
进程通信:进程间的传输信息。
五、死锁
5.1、产生死锁的必要条件:
互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。
请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。
不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。
环路等待条件:在发生死锁时,必然存在一个进程–资源的环形链。
5.2、解决死锁的基本方法 预防、检测、解决死锁:
预防死锁
资源一次性分配:一次性分配所有资源,这样就不会再有请求了:(破坏互斥条件)
只要有一个资源得不到分配,也不给这个进程分配其他的资源:(破坏请求保持条件)
可剥夺资源:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源(破坏不可剥夺条件)
资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)
检测死锁
首先为每个进程和每个资源指定一个唯一的号码;
然后建立资源分配表和 进程等待表。
解除死锁:
当发现有进程死锁后,便应立即把它从死锁状态中解脱出来,常采用的方法有:
剥夺资源:从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态;
撤消进程:可以直接撤消死锁进程或撤消代价最小的进程,直至有足够的资源可用,死锁状态.消除为止