操作系统 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 ProcessCPU 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)
- 操作系统 2. 进程基本定义及通讯; OS 进程宏观; CPU调度算法
- 操作系统-进程调度(CPU调度算法)
- 操作系统---OS的进程调度算法
- OS进程调度及典型调度算法
- 操作系统进程调度算法
- 【操作系统】进程调度算法
- 操作系统--进程调度算法
- 操作系统进程调度算法
- 操作系统进程调度算法
- 操作系统---进程调度算法
- 操作系统进程调度算法
- 操作系统进程调度算法
- 操作系统进程调度算法
- 操作系统进程调度算法
- 【操作系统】进程调度算法
- OS的进程调度算法
- 【操作系统】进程调度及其算法
- 操作系统 进程调度算法 浅析
- L-System分形
- Linux系统编程——Linux系统调用
- 从iOS开发走向Java开发
- 王一三学习笔记 | 什么是J2EE
- JavaEE菜鸟程序猿的开发之路(1)
- 操作系统 2. 进程基本定义及通讯; OS 进程宏观; CPU调度算法
- maven安装和搭建java helloworld项目
- 虚函数和纯虚函数的作用与区别
- HDU 1160 FatMouse's Speed(LIS+记录路径)
- 抽象类与纯虚函数
- [eclipse]项目上有叉号❌解决方案
- 【数据结构与算法】二叉树的遍历(递归遍历、非递归遍历、层序遍历)
- 学习笔记:cache 和spring cache 技术---本地缓存-分布式缓存,缓存穿透,雪崩,和热点key的问题
- Linux系统调用