操作系统——进程管理(进程的概念与进程控制)

进程基本概念

程序的顺序执行及其特征

程序的顺序执行
仅当前一操作(程序段)执行完后,才能执行后继操作。
特征

  • 顺序性
  • 封闭性
  • 可再现性

程序的并发执行及其特征

多个程序的并发执行
在一定时间内物理机器上有两个或两个以上的程序同处于开始运行但尚未结束的状态,并且次序不是事先确定的。宏观上同时处于运行状态微观上各程序交替地间断运行。
特征

  • 在并发环境下程序的执行是间断性的
    执行——停——执行
  • 失去封闭性
    并发程序共享系统中的资源,资源状态将由多个程序改变,某程序执行过程和结果会受其它程序的影响。
  • 程序结果的不可再现性
    由于失去封闭性,并发程序执行的结果不可再现,与其执行的相对速度有关,是不确定的。
  • 程序与CPU执行的活动之间不再一一对应
    程序与CPU执行的活动,这是两个不同的概念;程序是完成某一特定功能的指令序列,是静态的概念;而CPU执行的活动是一个动态概念,它是程序的执行过程。程序在顺序执行(即单道运行)时,程序与CPU执行的活动是一一对应的,而在程序并发执行(即多道程序)时,这种关系不再存在。

进程的特征与状态

较为典型的进程定义有

  • 进程是程序的一次执行。
  • 进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
  • 进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。

进程的基本特征

  • 结构性
    由程序+数据+进程控制块组成了进程实体,称之为进程映像。进程控制块是进程存在的标志。
  • 动态性
    进程是进程实体的执行过程,它由创建而产生,由调度而执行,因某事件而暂停,由撤销而消亡。在生命周期内,进程在三种基本状态之间动态转换
  • 并发性
    多个进程同时存于内存中,一起向前推进,并发执行
  • 独立性
    进程是独立获得资源和独立调度的基本单位
  • 异步性
    各进程都各自独立的不可预知的速度向前推进

进程的基本状态及其转换

进程的三种基本状态

  • 运行态:执行态
    进程占有CPU,并在CPU上运行
  • 就绪态
    进程已经具备运行条件,但由于CPU忙而暂时不能运行的状态(当调度给其CPU时,立即可以运行)。
  • 阻塞态:等待态、封锁态。冻结态、睡眠态
    进程因等待某种事件的发生而暂时不能运行的状态。(即使CPU空闲,该进程也不可运行)。

进程生命周期内处于且仅处于三种基本状态之一,不同的系统设置的进程态度数目不同。
进程状态转换

  • 就绪→运行
    调度:调度程序选择一个新的进程运行
  • 运行→就绪
    超时:运行进程用完时间片被中断,在抢占调度方式中,因为一高优先级进程进入就绪状态
  • 运行→阻塞
    I\O请求:当进程发生I\O请求或等待某事件时
  • 阻塞→就绪
    I\O完成:当I\O完成或所等待的事件发生时

在这里插入图片描述
进程的挂起状态
引入原因:由于终端用户、父进程及操作系统的需要,要将某进程静止下来不接受调度,增加了静止阻塞(阻塞挂起)和静止就绪(就绪挂起)态,原阻塞和就绪改称为活动阻(Blockeda)和活动就绪(Readya)态。

  • 运行或活动就绪→静止就绪,活动阻塞→静止阻塞
    通过挂起原话
  • 静止就绪→活动就绪,静止阻塞→活动阻塞
    通过激活原语
  • 静止阻塞→静止就绪:当等待的事件发生时

在这里插入图片描述

进程控制块

进程控制块的作用
系统为管理进程设置一个专门的数据结构一进程控制块(Process Control Block),用它来记录进程的外部特征,描述进程的运动变化过程(从结构的观点上看,程序与进程的区别就在于有没有PCB)、进程与PCB一一对应,在进程的整个生命期内,PCB随进程的创建而产生随进程的终止而消失,系统利用PCB来控制和管理进程,系统根据PCB感知进程的存在,所以PCB是进程存在的唯一标志。存放控制进程所需的数据(进程属性)。
PCB中的信息

  • 进程的标识信息
  • 处理器状态信息(现场信息)
  • 进程调度信息
  • 进程控制信息

1.进程标识符(在PCB中)
进程标识符用于唯一地标识一个进程

  • 外部标识符
    由创建者提供,由字符、数字组成
  • 内部标识符
    为了方便系统而设置,OS中,每个进程有唯一的标识符(PID)

2.处理器状态信息(现场信息)
进程走走停停必须保存处理器的状态信息即处理器现状,它由处理器寄存器内容组成。

  • 通用寄存器(8—32 个,RISC结构中超过100个)
  • 指令计数器(下一条指令的地址)
  • 状态寄存器(程序状态字PSW,如:EFLAGS寄存器)
  • 用户栈指针(过程和系统调用参数及地址)

3.进程调度信息

  • 进程状态(如:运行、就绪、阻塞…)
  • 进程优先级
  • 该进程在等待的事件(阻塞原因)
  • 调度所需其他信息(如:等待总时间,执行总时间)

4.进程控制信息

  • 程序和数据的地址
    程序和数据所在的内存(段/页表指针)或外存地址
  • 进程间同步和通信机制
    需要的消息队列指针和信号量等
  • 所需的和已分配到的资源清单及使用情况
    出CPU外的资源:文件,I/O设备…它们的使用史
  • 数据结构信息
    进程可能需要有指向其他PCB的指针,父-子进程关系及其它结构

进程块的组织方式
PCB表:系统把所有PCB组织在一起,并把它们放在内存的固定区域,就构成了PCB表,PCB表的大小决定了系统中最多可同时存在的进程个数,称为系统的并发度
:多道程序中的道数与系统并发度不同
PCB表组织方式

  • 链接方式
    在这里插入图片描述
  • 索引方式
    在这里插入图片描述
    进程队列
    在这里插入图片描述

进程控制

进程的创建

进程何时创建
引起创建进程的事件:
用户登录作业调度提供服务应用请求
进程创建过程
一旦发现了要求创建新进程的事件,OS便调用创建原语,按以下过程创建新进程。

  • 分配一个唯一的进程标识符,索取一个空白的PCB
  • 为新进程的程序和数据分配内存空间
  • 初始化进程控制块初始化标识符信息(填入)、处理机的状态信息(指令指针,栈指针)和控制信息(状态,优先级…)
  • 设置相应的链接,如:把新进程加到就绪队列的链表中

进程的终止(撤销)

进程何时终止

  • 正常结束
    批处理系统中,进程已运行完成遇到Halt指令分时系统中,用户退出登录
  • 异常结束
    本进程发生出错和故障事件
    存储区越界、保护性错(如:写只读文件)、特权指令错、非法指令(如:程序错转到数据区)、算术运算错、运行超时、等待超过时、I/O失败、
  • 外界干预
    操作系统干预、父进程请求、父进程终止.

进程的终止过程
一旦发生终止进程的事件,OS便调用撤消原语,按以下过程终止该进程。

  • 从PCB中读取进程的状态
  • 若进程处于执行态,应立即终止该进程的执行,并置调度标志为真(以便该进程终止后系统重新进行调度,将处理机分配给新选择的进程)
  • 若有子孙进程则将它们全部终止,以防它们失控
  • 将该进程所占有的全部资源还给父进程或系统
  • 将该进程的PCB从所在队列中移出

进程的阻塞与唤醒

引起进程阻塞和唤醒的事件

  • 请求系统服务:服务未满足.
  • 启动某种操作:典型I/O操作
  • 新数据尚未到达:
  • 无新工作可做:等待

进程阻塞过程
正在执行的进程,当发现上述某事件时,由于无法继续执行,于是进程便通过调用阻塞原语block把自己阻塞。可见,进程的阻塞是进程自身的一种主动行为。进入block过程后,由于此时该进程还处于执行状态,所以应先立即停止执行,把进程控制块中的现行状态由“执行”改为阻塞,并将PCB插入阻塞队列。如果系统中设置了因不同事件而阻塞的多个阻塞队列,则应将本进程插入到具有相同事件的阻塞(等待队列。最后,转调度程序进行重新调度,将处理机分配给另一就绪进程,并进行切换,亦即,保留被阻塞进程的处理机状态(在PCB中),再按新进程的PCB中的处理机状态设置CPU的环境。.
进程的唤醒过程
当被阻塞进程所期待的事件出现时,如I/O完成或其所期待的数据已经到达,则由有关进程(比如,用脘并释放了该I/O设备的进程)调用唤醒原语wakeup(),将等待该事件的进程唤醒。唤醒原语执行的过程是:首先把被阻塞的进程从等待该事件的阻塞队列中移出,将其PCB中的现行状态由阻塞改为就绪,然后再将该PCB插入到就绪队列中。

进程的挂起与激活

进程的挂起
当出现了引起进程挂起的事件时,比如,用户进程请求将自己挂起,或父进程请求将自己的某个子进程挂起,系统将利用挂起原语suspend()将指定进程或处于阻塞状态的进程挂起。挂起原语的执行过程是:首先检查被挂起进程的状态,若处于活动就绪状态,便将其改为静止就绪;对于活动阻塞状态的进程,则将之改为静止阻塞。为了方便用户或父进程考查该进程的运行情况而把该进程的PCB复制到某指定的内存区域。最后,若被挂起的进程正在执行,则转向调度程序重新调度。
进程的激活过程
当发生激活进程的事件时,例如,父进程或用户进程请求激活指定进程,若该进程驻留在外存而内存中已有足够的空间时,则可将在外存上处于静止就绪状态的进程换入内存这时,系统将利用激活原语active()将指定进程激活。激活原语先将进程从外存调入内存,检查该进程的现行状态,若是静止就绪,便将之改为活动就绪;若为静止阻塞便将之改为活动阻塞。假如采用的是抢占调度策略,则每当有新进程进入就绪队列时,应检查是否要进行重新调度,即由调度程序将被激活进程与当前进程进行优先级的比较,如果被激.活进程的优先级更低,就不必重新调度;否则,立即剥夺当前进程的运行,把处理机分配给刚被激活的进程。

总结

  • 并发执行新特征:
    间断性失去封闭性和可再现性相互制约性.
  • 进程的基本特征:
    动态性并发性独立性异步性和结构性
  • 进程定义:
    进程是可以并发执行的程序在某个数据集合上的运行过程,是系统进行资源分配和调度的独立位。
  • 进程控制块PCB :
    系统为管理进程设置的专用数据结构,存放进程的特征和变化过程及控制进程所需的所有数据,是进
    程控制和调度的依据和操作对象。PCB与进程生命期相同一一对应,是进程存在的唯一标志。
  • PCB中的内容:
    进程标识符处理器状态调度信息控制信息
  • 进程的三种基本状态:
    运行态就绪态阻塞态.
  • 进程的状态转换:
    调度:就绪→运行
    超时:运行→就绪
    I/O请求/等待事件:运行→阻塞
    I/O完成/等待事件发生:阻塞→就绪
    挂起原语:活动→静止
    激活原语:静止→活动
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,进程调度算法是操作系统中非常重要的一部分。常见的进程调度算法有先来先服务(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}, ... ] ``` 在这个列表中,每个进程有一个名称、到达时间和执行时间。你可以根据自己的需要修改这些信息,来测试这些进程调度算法的实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值