什么是进程?
- 进程是一个实体,每一个进程都有它自己的地址空间。
- 进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体。
进程的三种状态
- 执行态run : 进程正在使用CPU
- 等待态wait : 进程正在等待I/O完成
- 就绪态ready : 进程不在使用CPU,但已经准备好使用CPU
进程状态的转换
- 就绪 -> 执行 : 当前运行进程阻塞,调度程序选一个优先权最高的进程占有CPU
- 执行 -> 就绪 : 当前进程时间片用完
- 执行 -> 等待: 当前运行进程等待键盘输入
- 等待 -> 就绪: I/O操作完成,被中断处理程序唤醒
进程的调度
进程调度器是操作系统的一部分,决定了何时运行什么进程。它通常能够暂停一个运行中的进程,将它放回到运行队列当中,并运行一个新进程,我们把这样的调度器叫做抢占调度器。否则,它就是协同调度器。
进程调度的指标:
- CPU利用率:尽可能让CPU保持忙的状态
- 吞吐量:每单位时间CPU运行时所完成的进程数目
- 周转时间:从进程创建到结束的时间
- 等待时间:进程在就绪队列中等待所花的时间综合
- 响应时间:从事件产生到进程或系统作出响应所经过的时间
进程调度的方式:
- 可抢占式:就绪队列中一旦有某进程的优先级高于当前正在执行的线程的优先级时,操作系统会立即进行线程调度,完成线程切换。
- 不可抢占式:即使在就绪队列中有某进程优先级高于当前正在执行的进程的优先级时,当前进程仍将占用CPU执行,直到该进程自己进入阻塞状态,或时间片用完,或在执行完系统调用后准备返回用户进程前的时刻,才重新发生调度让出CPU。
显然,可抢占式调度可有效减少等待时间和响应时间,但会带来较大的其他管理开销,使得吞吐量等的性能指标比不可抢占式调度要低。所以一般在桌面计算机中都支持可抢占式调度,使得用户可以得到更好的人机交互体验,而在服务器领域中不必非要可抢占式,而通常会采用不可抢占式,从而可提高系统的整体吞吐量。
进程调度的策略
先到先服务(FCFS):处于就绪状态的进程按先后顺序进入到就绪队列中,FCFS策略是按就绪进程进入就绪队列的先后次序选择当前最先进入就绪队列的进程来执行,直到此进程阻塞或结束,才进行下一次的进程选择调度。
缺点:FCFS为不可抢占式调度。一旦一个进程占有CPU,就一直运行下去,直到该线程完成其工作,或因等待某一事件而不能继续执行时,才释放CPU。如果操作系统采用这种进程调度方式,则一个运行时间长且正在运行的进程会使很多晚到的且时间短的进程的等待时间过长。
短作业调度(SJF):选择就绪队列中确切运行时间最短的进程进入执行。它既可采用可抢占式,也可采用不可抢占式。
评价:短进程优先调度算法能有效缩短进程的平均周转时间,提高系统的吞吐量,但不利于长线程的运作。而且如果进程的运行时间是”估计“出来的话,会导致由于估计的运行时间不准确,而不能实际做到短线程优先。
时间片轮转(RR)算法:定义一个时间单元,称为”时间片“。一个时间片通常在1~100ms,当正在运行的进程用完了时间片后,就会从就绪队列中依次选择下一个就绪状态的进程执行,而被剥夺CPU使用的进程返回到就绪队列的末尾,等待再次被调用。
评价:时间片的大小可调整,如果时间片大到让一个进程足以完成其全部工作,这种算法就退化为FCFS算法。若时间片设置得很小,那么CPU在进程之间的进程上下文切换工作过于频繁,使得真正用于运行用户程序的时间减少。时间片可以静态设置好,也可根据系统当前负载状况和运行情况动态调整。
高响应比优先算法:FCFS算法只考虑进程的等待时间而忽略执行时间,而SJF只考虑执行时间,而忽略了等待时间。而高响应比优先算法既考虑等待时间,又考虑执行时间,为此定义了一个指标:
Rp = (等待时间 + 预计执行时间)/ 执行时间 = 响应时间 / 执行时间
- 评价:这样既照顾了短线程又不使长线程的等待时间过长,改进了调度性能。但该算法需要每次计算各个进程的响应比,这样会带来较大的时间开销。