操作系统 2. 进程基本定义及通讯; OS 进程宏观; CPU调度算法

来源:互联网 发布:信息碎片化定义知乎 编辑:程序博客网 时间:2024/05/29 07:47

这个文章会详细说下 进程的基本定义。进程之间的通信。操作系统中进程的宏观理念。CPU Scheduling算法。



(1) 进程以及相关概念


进程的定义

1. 运行中的程序可被称为进程(The executing program)。

2. 计算机中系统资源分配的基本单元。


PCB
PCB (ProcessControl Block, 又名Task Control Block, 中文叫进程控制块) 是一个数据结构,通常被放在kernel里面。 他用来储存关于进程的所有信息,包括:

1.Process State(进程状态):5个,贯穿一个计算机里面每个进程的生死。分别是 new, ready, running, waiting, terminated。
2.Program Counter(程序计数器, 在X86 MicroProcessor中也被称为IP):记录着接下来要执行的instruction的位置 and so on。
3.Memory Information(内存信息): 包含着process的 basic register, limit register 和 page table的信息 and so on。
4.CPU scheduling Information(CPU调度的相关信息): 里面包含关于这个进程的优先级,还有其他的调度参数。
5.CPU Register(CPU寄存器): 寄存器有各种各样的数目和种类,主要取决于computer architecture。 主要包含:累加器, index register, stack pointer等等。
6.Accounting Information: 占用了CPU多长时间, timer设定有多长等等。
7.I/O Status Information(I/O状态信息): 包含了这个process要使用的 I/O devices and list of open files。
8.Interprocess communication information: 各种各样的 flags, signals,每个进程进行交流的信息。

(2) 进程间的通信( Interprocess Communication)


1.内存共享(Shared memory):

从物理层面解决通信问题:

1.一部分内存在物理意义上被多个想互相交流的进程共享。

2.这个交流被使用者控制而不是被OS控制(Under user control)。

3.最大的问题就是多个进程同时使用的共享内存同步问题。

4.Size is fixed.

Solved by: 

互斥锁(Mutual Exclusion, mutex);


2. 信息传递(Message passing):

2.1 定义:

1.这个mechanism用来实现进程交流和动作同步。

2.提供两个操作(Receive, Send)。

3.Size is either fixed or variable.


2.2执行(Implementation): *详情见附注1

物理层面(Physical):

Network, Hardware bus, Shared memory.

逻辑层面(Logical):

1. Direct and Indirect

2. Synchronization and Asynchronization
3. Automatic and Explict buffering


3. 管道(Pipe):


3.1 定义:

通过关闭file descriptor的形式来进行进程间的处理。


3.2 Unnamed pipe(ordinary pipe):
1. 单向性(unidirectional)。
2. happen between related processes.


3.3 Named pipe:

1. 多向性(bidirectional)。
2. Not related to process requirements.



附注1:

1. Direct and Indirect Implementation

逻辑层面的直接实现和间接实现。
Direct(直接实现):
    1.send(P,Message); receive(V, Message);
    2.每一组都会自动的建立一条链接来实现通信。
    3.这条链接通常是双向的。


Indirect(间接实现):
*在间接实现的过程中,会有一个Mailbox(信箱)作为中转。
1.send(Mailbox,message);receive(Mailbox,message);
2.Issue:在多收信人的情况下,信件不知道该给谁。

3.Solved by:
  I. Sender notifies who the receiver is.
  II. Allow link can send to multiple processes.
  III. A process can receive a message one time.


2. Synchronization and Asynchronization Implementation

逻辑层面的同步处理和异步实现。
Synchronisation:

Blocking then send; blocking then receive.

Asynchronisation:
Unblock and send; unblock and receive;


3. Automatic and Explicit buffering implementation

自动或者手动的缓冲实现。
Buffering:
Implemented in one of three ways: 
1).Zero capacity: no message, redezvous, sender wait receiver.
2).Bounded capacity: sender must wait if link full.
3).unbounded capacity: sender never wait.


(3) 操作系统中进程的Scheduler


1. Long-term Scheduling(Job Scheduler)

进程最开始是不会被放进Ready queue里面的, 新被创建的进程会被放进Job Queue里面,而后Long-term Scheduler会从Job Queue里面挑选进程放进Ready Queue(这里的Ready Queue就是RAM, 所以 Job Scheduler干的事情也可理解为将Processes从Queue里面load进内存)。 这个挑选过程是希望保证将CPU Binding的进程和I/O Binding的进程(见附注2)以相同比例放进Ready Queue里面以确保 Degree of multi-programming的正常稳定, 避免Thrashing。Job Scheduler将一个process的state从new转换成ready。

*有些操作系统对Long-term Scheduler的运用很少,甚至没有。 比如说 Time-sharing Operating System。



附注2:

1.CPU Binding Process 和 I/O Binding Process
CPU Binding Process:就是CPU绑定进程, 通常指大运算量(高CPU需求)并且少量I/O需求的进程。
I/O Binding Process:就是I/O绑定进程, 通常是那些需要I/O处理比较多而不怎么需要使用CPU的进程。通常I/O绑定的进程会在处理完相应的CPU操作之后被踢出CPU,然后进入I/O waiting Queue或者直接被I/O handler接受并处理。


2. Degree of Multi-programming
一个操作系统能够容纳并且有效率的运行的最多的process个数。在Degree of Multi-programming 稳定的情况下, process的创建和离开应该是基本相等的。当然这是理想情况。



2. Medium-term Scheduling(Process Swapping Scheduler)

 主要提一提Ready Suspend Queue, 在Ready Queue里面的东西放满了之后。Medium-term Scheduler会挑一个不重要的(这个不重要是多角度考虑的)进程又或者是I/O request的进程,从主内存里面丢到Backing Store( Secondary Storage,即disk)里面,把更多的主物理内存空间(即Ready Queue,RAM)留给那些最近运行或者更重要的进程。这个过程就叫做Swapping。在这个过程中,进程的状态从Ready变成Waiting。这部分的具体操作会在后面的文章里面详细说说。


3. Short-term Scheduling(CPU Scheduler)

 CPUScheduler,顾名思义就是把什么进程扔进CPU,让其占有CPU。在这个过程中,CPU Scheduler会选择那些状态为Ready的进程(这些进程可以理解为万事具备,只欠东风。啥都 OK了,就差被CPU跑一跑了)。进程状态的转变是从Ready变成Run。那么CPU具体要跑哪个呢? 要是有重要的进程,那样怎么样才能他优先完成呢?这就涉及到CPU Scheduling算法了。


Preemptive, Non-preemptive(抢占性与非抢占性)

Preemptive(抢占性): 一个进程在运行过程中可以被打断并被扔回Ready Queue。

Non-Preemptive(非抢占性): 一个进程在运行过程中不可被打断。必须等他运行完了之后其他的进程才有机会进入CPU。


Scheduling Criteria(调度准则):用来比较调度算法的好坏,判断他是否适用。

1. CPU Ultilization(CPU 利用率): 我们当然希望CPU能够被完美的使用(as busy as possible),在Real System中,他的范围通常是40% ~ 90%。

2. Throughput(吞吐量): 用来测量在一个time unit里面有多少个进程被完成。

3. Turnaround time(运转时间): 一个进程到达到完成所经历的所有时间。 又可以理解为一个进程的 等待进入RAM的时间 + 在RAM(Ready Queue)里的等待时间 +CPU burst time + I/O Using time。当然在大学里面我们只focus Ready Queue等待时间(即下文的waiting time)还有 CPU burst time。  

4. Waiting time(等待时间): 在Ready Queue里面的等待时间。 CPU调度算法不会影响以上3个item的时间,只会影响这个Waiting time。

5. Response time(响应时间): 一个process到达到第一次扔进CPU运行所花的时间。注意在interactive operating system中,Response time不能用来判断一个算法的好坏。

在大多数情况下,我们通过算平均的turn-around time和平均的waiting time来测量一个算法的好坏。


*CPU 的进程安排算法:

FCFS(First-Come, First Served): 先到先得, 按照先后顺序来处理Ready Queue里面的进程。单纯的FCFS特性是Non-Preemptive, 为什么是Non-Preemptive呢? 因为如果中断后任何对该进程的再次操作都会涉及到其他算法。 举个例子,好比说,我跑着跑着被high priority的进程中断了那就成了high priority first,如果被运行时间较短的进程中断了,就成了shortest-job-first。 所以,在逻辑意义上来讲,FCFS就是先后顺序处理,不能打断。


SJF(Shortest-Job-First): 顾名思义,就是时间最短的process优先处理。特性是Non-Preemptive 不可打断。 所以说,还是先处理arrive 较早的进程,当有同时等待的情况的时候,CPU占用时间短的process优先处理。


SRTF(Short-remaining-time-first): 跟SJF有点像,也是CPU占用最短的进程优先。唯一的区别是,SRTF的特性是Preemptive,也就是可以被打断的。具体的运算步骤会在下面的实例部分说。需要注意的一点是, 当CPU正在处理一个process,并且这个process的timer还剩下3s的时候,新来了一个CPU burst 为3s的进程。这种情况下,我们不会将这个新来的process取代CPU正在处理的进程。这么做是有原因的,从资源处理方面想的话, 如果我需要取代的话,一个必要的步骤就是context switch。 而在进行这个步骤的时候CPU会处于idle状态。因此在某种角度来看,context switch这个必要步骤是对CPU资源的一种浪费。所以,新到达的进程不会抢走有同样时间的,正在running的进程的CPU。


Priority Scheduling(优先级调度): 其实SJF(或者SRTF)都可以看作 Priority Scheduling的一种,因为在以上两种调度中我们都歪歪CPU占用时间最少的进程拥有最高的优先级。而在Priority Scheduling的问题中,通常会有一个Priority的item告诉你每个进程的priority是几。 然后可以根据题中所描述的(可能数越小优先级越高,也有可能反过来),来优先处理高优先级的进程。


RR(Round Robin,轮回调度算法): 给每个进程设置一个time quantum(硬件角度来看,其实就是timer)。 当timer结束了,把当前运行的进程放回Ready Queue。然后进行下一个进程的CPU处理。在本学期的学习中,通常把RR和FCFS或者Priority Scheduling融合起来使用。需要注意的一点是,当一个进程Pa运行完的时候,如果突然arrive一个进程Pb(如果是与Priority Scheduling Combine的话,这句话需要加上相同优先级的进程), 那么在Ready Queue中 Pb必须在Pa的前面。还有就是, 当一个进程的CPU burst time已经结束,但是其本轮的time quantum还没跑完的情况下,这个process会直接terminate。记住 我们永远希望CPU不idle(闲置),这是浪费资源啊!


实例 :


( Adelaide Uni, Sem 2, 2014 )Consider the following sets of processes, with the length of CPU-Burst time of milliseconds:


Process

Arrival time

Burst time

Priority

P1

0

6

1

P2

1

4

2

P3

4

6

4

P4

2

3

3


For each of the following scheduling algorithms, determine the average turnaround time and waiting time respectively. Show the Gantt Chart.




1. First-come, First-served

     

 Gantt Chart:  

Average turnaround time:     *每个进程的完成时间 - 到达时间之和的平均值

[(19 - 4 ) + ( 13 - 2 ) + ( 10 - 1 ) + ( 6 - 0 )] / 4 = 10.25(ms);
Average waiting time:   *每个进程的turnaround time - Burst time和的平均值
[(19 - 4 - 6 ) + ( 13 - 2 - 3 ) + ( 10 - 1 - 4 ) + ( 6 - 0 - 6 )] / 4 = 5.5(ms);

2. Shortest Job First(Preemptive) *其实就是SRTF

Gantt Chart:

*注意在2ms的时候,P2的剩余时间为3ms与P4相同,但因为上文所述的原因,不会被抢占。

   

Average turnaround time:
[( 19 - 4 ) + ( 13 - 0 ) + ( 8 - 2 ) + ( 5 - 1 )] / 4 = 9.5(ms);
Average waiting time:
[( 19 - 4 - 6 ) + ( 13 - 0 - 6 ) + ( 8 - 2-3 ) + ( 5 - 1 - 4 )] / 4 = 4.75(ms);



3. Priority Scheduling, where alarger priority number indicateshigher priority (Preemptive)


Gantt Chart:

Average turnaround time:
[( 19 - 0 ) + ( 14 - 1 ) + ( 11 - 2 ) + ( 10 - 4 )] / 4 = 11.75(ms);
Average waiting time:
[( 19 - 0 - 6) + (14 - 1 - 4) + (11 - 4 - 3) + (10 - 0 - 6)] / 4 = 7.5(ms);


4. Round-Robin Scheduling (time quantum= 2) *默认与FCFS一起

Gantt Chart:


Average turnaround time:
[( 19 - 4 ) + ( 15 - 0 ) + ( 13 - 2 ) + ( 12 - 1 )] / 4 = 13(ms);
Average waiting time:
[( 19 - 4 - 6 ) + ( 15 - 0 - 6 ) + ( 13 - 2 - 4 ) + ( 12 - 1-3 )] / 4 = 8.25(ms);


附注3:

1. Shortest Job First(Non-Preemptive)

Gantt Chart:


Average turnaround time:

[( 19 - 4 ) + ( 13 - 1 ) + ( 9 - 2 ) + ( 6 - 0 )] / 4 = 10(ms);

Average waiting time:

[( 19 - 4 - 6 ) + ( 13 - 1 - 4 ) + ( 9 - 2 - 3 ) + ( 6 - 0 - 6 )] / 4 = 5.25(ms);


2. Priority Scheduling, where a lower priority number indicateshigher priority (Non-Preemptive)

 Gantt Chart:

Average turnaround time:

[( 19 - 4 ) + ( 13 - 2 ) + ( 10 - 1 ) + ( 6 - 0 )] / 4 = 10.25(ms);

Average waiting time:   

[( 19 - 4 - 6 ) + ( 13 - 2 - 3 ) + ( 10 - 1 - 4 ) + ( 6 - 0 - 6 )] / 4 = 5.5(ms);



3. CPU Scheduling with I/O Burst (稍微难那么一丢丢,例子取自导师 Ian Knight)