操作系统(3)——进程管理

码文不易,希望支持,谢谢->支持原创


 一.多道程序设计


 1.前趋图定义

  前趋图是一个有向无循环图,图中的每个节点可以表示一条语句、一个程序段或一个进程,节点间的有向边表示两个节点之间存在的偏序或前趋关系“→”;
  p1 → p2,则称p1是p2的直接前驱, p2是p1的直接后继。在前趋图中,没有前驱的节点称为初始节点,没有后继的节点称为终止节点。

前驱图


 2. 程序顺序执行

  程序顺序执行时基本特征是顺序处理:程序的操作按某种顺序依次执行,只有当前一个操作完成后,才能执行下一个操作。

程序顺序执行时的特征:
(1)顺序性。处理机的操作严格按照程序所规定的顺序执行,只有当上一个操作完成后,下一个操作才能执行。除非有人为的干预造成机器暂时停顿外,前一个动作的结束就意味着下一个操作的开始。因此,程序和处理机执行程序的活动一一对应。
(2)封闭性。程序运行在一个封闭的环境中,即程序运行时独占系统的全部资源,这些资源的状态只能因程序的执行而改变,不受任何外界因素的影响。
(3)可再现性。由于程序顺序执行的封闭性,只要程序顺序执行时的初始条件和执行环境相同,当程序重复执行时,都将获得相同的结果(即程序的执行结果与时间有关) 。正由于程序顺序执行的特点,程序员可以检测和重现程序的错误,可以调试和校正程序。

进程管理——程序顺序执行


 3.程序并发执行

  程序的并发执行是指若干个程序(或程序段)同时在系统中运行,这些程序(或程序段)的执行在时间上是重叠的,即一个程序(或一个程序段)的执行尚未结束,另一个程序(或一个程序段)的执行已经开始。

在同一作业中,作业的输入操作、计算操作和打印操作必须顺序执行,但对一批作业而言,情况就不一样了。例如,在作业1的输入操作完成后可以进行该作业的计算操作;与此同时,也可以进行作业2的输入操作,这使得作业1的计算操作和作业2的输入操作同时进行。

进程管理——程序并发执行

程序并发执行特征:
(1)间断性
(2)失去封闭性:主要由共享资源引起
(3)不可再现性:因为程序的执行顺序难以预知。



 二.进程的描述

码文不易,希望支持,谢谢->支持原创


 1.进程的概念

  进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配调度的基本单位,是操作系统结构的基础。又称任务(Task)为了描述程序在并发执行时对系统资源的共享,所需的一个描述程序执行时动态特征的概念。

① 进程(或任务)是可以和别的计算共同执行的计算(J.T.Donoven);
② 进程是程序在一个数据集合上运行的过程,它是系统进行资
源分配和调度的一个独立单位。
③ 进程是一抽象实体,当它执行某个任务时,将要分配和释放
各种资源(P.Denning);
④ 行为的规则叫程序,程序在处理机上执行时所发生的活动称
为进程(E.W.Dijkstra);
⑤ 一个进程是一系列逐一执行的操作,而操作的确切含义则有
赖于以何种详尽程度来描述进程(Brinch Hansen);
⑥ 进程是进程映象的执行(UNIX).


 2.进程的特征

(1)动态性。进程是一个动态的概念,实质上是程序的一次执行过程。进程具有生命期:它因“创建”而产生,因“调度”而执行,执行时还走走停停,因“撤消”而灭亡。
(2)并发性。在一个系统中,可以同时存在多个进程,它们并发地执行,共享系统资源。正由于多个进程的并发执行,才使系统资源得到充分的利用,系统的处理能力大大增强。
(3)独立性。进程是一个能独立运行的基本单位,也是系统进行资源分配和调度的基本单位。未建立进程的程序不能作为一个独立单位参与运行,并发进程获得所需的资源才能向前推进。
(4)异步性。每个进程按各自独立的不可预知的速度向前推进。正由于进程的异步性,并发进程相互穿插地执行,才失去了程序的可再现性。但由于进程之间相互制约,进程执行时也常间断,出现走走停停的现象。
(5)结构特征。从结构上看,一个进程实体由三个部分组成,即程序数据进程控制块。进程要完成一个任务,就必须执行描述其任务的程序,并对要求加工的数据进行处理。为对进程实施有效的管理,系统就必须为进程设立一个专门的数据结构——进程控制块。

  程序与进程的联系和区别

(1)进程是动态的,程序是静态的。进程是程序的一次执行过程,而程序是指令的有序集合,是一个静态的概念。
(2)进程具有生命期,从创建时存在,到撤消时消失,其存在是暂时的,而程序是静态的,可以长久保存。
(3)进程具有结构特征,由程序、数据和进程控制块三者组成,而程序仅是指令的有序集合,是进程的组成部分之一。
(4)进程和程序的组成不同:进程的组成包括程序、数据和进程控制块。
(5)通过多次执行,一个程序可以产生多个不同的进程;通过调用关系,一个进程可以执行多个程序。进程可创建其他进程,而程序不能形成新的程序。
(6)进程具有并行特性(独立性、异步性),程序则没有。


 3.进程的基本状态及其转换

进程的三种基本状态:
1. 运行态(Running):
2. 就绪态(Ready):
3. 等待态(Blocked):阻塞态、封锁态、睡眠态

进程管理——状态转换

  进程状态转换的原因
  1. 就绪 –> 运行
    调度程序选择一个新的进程运行
  2. 运行 –> 就绪
    运行进程用完了时间片
    一个高优先级进程处于就绪状态,中断正在运行的进程
  3. 运行 –> 等待
    当一个进程必须等待时
    OS尚未完成服务
    对一资源的访问尚不能进行
    初始化I/O 且必须等待结果
    等待某一进程提供输入 (IPC)
  4. 等待 –> 就绪
    当所等待的事件发生时

执行状态只能由就绪状态转换,而无法由阻塞状态直接转换。
一个具体进程在任何一个指定的时刻必须而且只能处于一种状态。

  五状态转换图

进程管理——五状态转换

  进程的其他状态

   具有挂起状态的进程状态
  • 就绪状态(活动就绪)(Ready):进程在内存且可立即进入运行状态
  • 阻塞状态(活动阻塞)(Blocked):进程在内存并等待某事件的出现
  • 阻塞挂起状态(静止阻塞)(Blockeda, suspend):进程在外存并等待某事件的出现
  • 就绪挂起状态(静止就绪)(Readya, suspend):进程在外存,但只要进入内存,即可运行
挂起(Suspend):把一个进程从内存转到外存;可能有以下几种情况:
  1. 活动阻塞→静止阻塞:没有进程处于就绪状态或就绪进程要求更多内存资源时,发生这种转换,以提交新进程或运行就绪进程
  2. 活动就绪→静止就绪:当有高优先级阻塞(系统认为会很快就绪的)进程和低优先级就绪进程时,系统会选择挂起低优先级就绪进程
  3. 运行→静止就绪:对抢占式系统,当有高优先级静止阻塞进程因事件出现而进入就绪挂起时,系统可能会把运行进程转到静止就绪状态
激活(Activate):把一个进程从外存转到内存;可能有以下几种情况:
  1. 静止就绪→活动就绪:没有就绪进程或静止就绪进程优先级高于就绪进程时,发生转换
  2. 静止阻塞→活动阻塞:当一个进程释放足够内存时,系统会把一个高优先级静止阻塞(系统认为会很快出现所等待的事件)进程

进程管理——具有挂起状态转换

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
操作系统概念背诵 一、进程管理 1. 进程管理的功能 ① 进程控制 ② 进程同步 ③ 进程通信 ④ 进程(线程)调度 2. 程序顺序执行时的特征:顺序性、封闭性、可再现性。 3. 程序并发执行时的特征:间断性、失去封闭性、不可再现性。 4. 进程程序段、数据段和进程控制块(PCB)组成。 5. 进程的定义 ① 进程程序的一次执行。 ② 进程是一个程序及其数据在处理机上顺序执行时所发生的活动。 ③ 进程进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。 ④ 进程程序在一个数据集合上的运行过程,是系统进行资源分配和调度的一个独立单位。 6. 进程的基本特征:动态性、并发性、独立性、异步性、结构特征(程序+数据+PCB) 7. 进程的状态 三态:就绪状态、运行状态、阻塞状态。 五态:活动就绪、静止就绪、活动阻塞、静止阻塞、运行。 8. 进程控制块(PCB)的组成:进程标识符、处理机状态、进程调度信息、进程控制信息。 9. 临界区:进程中访问临界资源的那段代码叫做临界区。 10. 同步机制必须遵循的原则:空闲让进、忙则等待、有限等待、让权等待。 11. P, V 操作的定义 P(S):S = S − 1; 若S≥0,则当前进程继续运行; 若S<0,则将当前进程插入到S 的等待队列中去。 V(S):S = S + 1; 若S>0,则当前进程继续运行; 若S≤0,则从S 的等待队列中移出一个进程放到就绪队列中去。 12. 信号量的物理意义 S = −n 时,表示有n 个等待进入临界区的进程,当前已有进程在临界区中访问临界资源; S = 0 时,表示不允许任何进程进入临界区,当前已有进程在临界区中访问临界资源; S = n 时,表示临界区是空闲的,该类资源的可用数目为n,可以有n 个进程访问该类资源。 13. 高级通信机制有:共享存储器系统、消息传递系统、管道通信系统。 14. 线程的定义:线程是进程内的一个实体,是处理机调度的基本单位,是程序内部一个单一的顺序控 制流。 15. 引入进程的目的:是为了使多个程序并发执行,提高资源利用率和系统吞吐量。 16. 引入线程的目的:是为了减少程序并发执行时的时空开销,使操作系统具有更好的并发性。
好的,进程调度算法是操作系统中非常重要的一部分。常见的进程调度算法有先来先服务(FCFS)、短作业优先(SJF)、高响应比优先(HRRN)、时间片轮转(RR)等。下面是这些算法的 Python 实现: 1. 先来先服务(FCFS): ```python def FCFS(processes): waiting_time = 0 turn_around_time = 0 completion_time = 0 for process in processes: completion_time += process['burst_time'] turn_around_time += completion_time - process['arrival_time'] waiting_time += turn_around_time - process['burst_time'] return waiting_time / len(processes), turn_around_time / len(processes) ``` 2. 短作业优先(SJF): ```python def SJF(processes): processes = sorted(processes, key=lambda x: x['burst_time']) waiting_time = 0 turn_around_time = 0 completion_time = 0 for process in processes: completion_time += process['burst_time'] turn_around_time += completion_time - process['arrival_time'] waiting_time += turn_around_time - process['burst_time'] return waiting_time / len(processes), turn_around_time / len(processes) ``` 3. 高响应比优先(HRRN): ```python def HRRN(processes): waiting_time = 0 turn_around_time = 0 completion_time = 0 for i, process in enumerate(processes): if i == 0: completion_time = process['burst_time'] else: response_ratio_list = [] for j in range(i): response_ratio = (completion_time - processes[j]['arrival_time'] + processes[j]['burst_time']) / processes[j]['burst_time'] response_ratio_list.append(response_ratio) max_response_ratio_index = response_ratio_list.index(max(response_ratio_list)) selected_process = processes.pop(max_response_ratio_index) completion_time += selected_process['burst_time'] turn_around_time += completion_time - selected_process['arrival_time'] waiting_time += turn_around_time - selected_process['burst_time'] return waiting_time / len(processes), turn_around_time / len(processes) ``` 4. 时间片轮转(RR): ```python def RR(processes, time_slice): waiting_time = 0 turn_around_time = 0 completion_time = 0 while processes: for i in range(len(processes)): if processes[i]['burst_time'] > time_slice: completion_time += time_slice processes[i]['burst_time'] -= time_slice else: completion_time += processes[i]['burst_time'] turn_around_time += completion_time - processes[i]['arrival_time'] waiting_time += turn_around_time - processes[i]['burst_time'] processes.pop(i) break return waiting_time / len(processes), turn_around_time / len(processes) ``` 这里的 `processes` 是一个列表,其中每个元素是一个字典,表示一个进程的信息,如下所示: ```python processes = [ {'name': 'P1', 'arrival_time': 0, 'burst_time': 8}, {'name': 'P2', 'arrival_time': 1, 'burst_time': 4}, {'name': 'P3', 'arrival_time': 2, 'burst_time': 9}, ... ] ``` 在这个列表中,每个进程有一个名称、到达时间和执行时间。你可以根据自己的需要修改这些信息,来测试这些进程调度算法的实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值