操作系统 第三章 进程
第三章
3.1初识进程
进程(Process)
1.操作系统最核心的概念之一
2.操作系统要面对的最核心的管理对象
3.占用cpu资源和其他资源的实体
什么是进程?
1.一个正在计算机上执行中的程序
2.一个能分配给处理器执行的实体
3.一个具有一下特征的活动单元:一组指令序列的执行、一个当前状态和相关的系统资源集
所以,进程是一个程序的一次动态执行过程。
进程重要性
1.用户的所有程序均通过进程的形式进行
2.操作系统给用户提供的各种服务也是以进程的形式进行
3.进程管理模块是操作系统最核心的一个模块
讨论:如果不引入进程,使用程序作为管理对象,可以么?
答:可以,但是使用程序作为管理对象会出现很多问题无法解决。如音乐播放器无法同时播放两首歌,无法实现并发。(答案并不唯一)
通过上述的讨论,可以明白操作系统需要引进进程,那么,为什么操作系统需要引入进程呢?
1.使用进程描述每一个程序的每一次动态执行。
2.通过进程实体来管理控制每一个程序的每一次执行过程。
3.引入子进程,让一个大的程序段可以并发,加快程序推进且提高CPU利用率。
引入子进程


并发运行的基本特征
1.异步特征
2.资源共享特征
3.相互制约特征
4.不可重现性特征
进程和程序的区别
程序: 完成一件事情的代码序列
进程: 一个程序的一次动态执行过程
> 程序是静态的,进程是动态的
> 程序只包含代码,进程包括要运行的代码、代码要处理的数据、运行过程中的状态参数等
进程和程序的关联
1.进程是操作系统为了管理控制程序的运行而加设的一个概念和尸体
2.程序不运行,就没有进程,一个进程是一个程序的一次执行过程。
3.一个程序可能对应多个进程。
作业、程序、进程
作业
用户提交给系统的一个计算任务
批作业=程序+数据+作业控制说明书
交互作业=程序+数据+交互命令
作业是用于人机之间交互的一个概念
程序
程序是作业的组成部分
进程
进程对应程序的一次动态执行过程
3.2 进程与进程管理模块
进程的特征
1.动态特征:生命周期
2.并发特征:在一个时间段内都处于宏观的运行状态
3.独立特征:独立占有资源、独立参与cpu调度
4.异步特征:运行推进速度不可预知
5.结构特征:PCB+进程体
进程的组成

进程控制块PCB
主要内容
- 进程标识
- 外部标识(也叫做进程的外部名)
- 是进程的创建者提供的进程名字,通常为字符串组成
- 内部标识(也称作进程的内部名,简记Pid
- 是系统为进程命名的一个代码,通常是一个整型数据
- 外部标识(也叫做进程的外部名)
- 调度信息
- 进程优先数,描述进程紧迫性的信息
- 进程状态信息,描述进程当前处于何种状态
- 其他调度信息(如进程在系统中等待的时间、已经在cpu上运行的时间、剩余的运行时间等)
- 处理机信息(进程上下文)进程被中断时,该进程的CPU现场信息可以保存在他自己的PCB内,以便该进程重新获得CPU时可以从此处恢复现场信息,继续运行。
- 通用寄存器的内容:包括数据寄存器、段寄存器等
- 程序状态字PSW(Program Status Word)
- 程序计数器PC(Program Count)
- 进程的堆栈指针
- 进程控制信息
- 程序代码和数据集所在的内存地址
- 资源清单,记载进程请求资源和已经占有资源的情况
- 同步和通信信息
- 外存地址
- 家族信息
- 链接指针
进程管理模块
- 进程控制
- 创建新进程,撤销结束进程
- 阻塞或者唤醒进程
- 挂起或激活进程
- 进程同步和进程互斥
- 进程通信
- 进程调度
- 根据进程当前状态决定哪个进程获得CPU,以及占用多长时间
- 将cpu分给进程
3.3 进程状态转换
两状态进程模型


进程的三种基本状态
1.运行状态(Running) -> 进程获得CPU并投入运行的一种状态
单CPU系统中,每个瞬间最多只有一个进程
2.就绪状态(Ready) -> 进程尚未获得CPU使用权的一种状态
进程已经拥有除CPU外其他全部所需资源,"万事俱备、只欠东风"
3.阻塞状态 -> 进程因某种要求得不到满足,只好等待,我们称之为运行"受阻"
处于阻塞状态的进程是无权获得CPU的

两种挂起状态
将内存中的当前某个尚不能运行的进程调到外存上去,腾出来的空间接纳更多的进程。这一处理称作进程"挂起"(Suspend)
目的:
挂起某某些暂时不能运行的进程,目的是腾出内存装入更多的进程,让CPU忙碌起来。
两种挂起状态:
挂起就绪(S-Blocked)、挂起阻塞(S-Ready)


3.5 父进程和子进程
问题:进程什么时候被创建?
1.批作业调度
2.交互作业提交
3.系统提供服务
4.用户程序创建子进程

fork函数详解
- 函数原型 pid_t fork(void)
- 该函数包含于头文件unistd.h中
- 函数功能:
- 创建一个新的子进程,子进程会复制父进程的数据和堆栈空间,并继承父进程的用户代码、组代码、环境变量、已打开的文件代码、工作目录和资源限制等
- 函数返回值:
- 如果fork()调用成功,则在父进程会返回新建立的子进程代码(PID),而在新建立的子进程中则返回0
- 如果fork()调用失败则直接返回-1,失败原因有三种:
- 系统内存不足
- 进程表满(容量一般为200~400)
- 用户的子进程太多(一般不超过25个)
5.UNIX中,父进程通过系统调用fork()创建子进程,子进程继承父进程资源,父子进程各自独立。
父子进程各自拥有自己的PCB、内存用户区、临时资源等,各自独立参与CPU调度

3.6 进程状态转换控制原语
原语类型

何时调用阻塞原语?
- 当正在运行的进程需要等待某一时间而发生运行受阻时,它通过中断请求系统服务
- 系统按照进程的需求进行适当处理后,启动进程阻塞原语将该进程阻塞起来
- 引起进程阻塞的原因:
- 等待I/O
- 请求资源得不到满足
- 进程同步约束
- 服务进程无事可做

何时调用唤醒原语?
- 当系统发生某一个事件时,正在等待该事件的进程需要立即被唤醒,由阻塞状态转为就绪状态
- 进程被唤醒的原因:
- 所等的I/O操作已完成
- 请求的资源得到了满足
- 进程同步约束已经撤销
- 服务进程收到新的任务

何时调用挂起原语?
- 当前内存空间紧缺,部分进程优先运行
- 应用户要求,将用户进程挂起
- 应父进程要求,将其子进程挂起

何时调用激活原语?
- 有进程运行完毕,当前内存空间不紧张
- 应用户要求,将其进程激活
- 应父进程要求,将其子进程激活
- 或者进程自身设定的挂起周期已完成

3.7 抢占式调度和非抢占式调度
按照调度方式划分抢占式调度和非抢占式调度
非抢占式调度
当前进程主动放弃处理机控制权,可能情况:
1. 进程运行完毕退出
2. 运行受阻
3. 运行出错,非正常中止
4. 遇到不可挽回的故障
抢占式调度
也称作剥夺式调度,一般用于有实时需求的系统
- 主要指在系统正常运转期间,如果由某种时间出现,系统将迫使正在运行的进程停下来,将CPU控制权交给其他进程
- 其思想源自对高紧迫性作业的响应

抢占式调度结果

3.8 进程调度算法
进程调度
进程调度功能:
从处于就绪状态的进程中,按照某种调度策略,选择一个进程切换个CPU,使其状态从就绪转为运行
调度方式:
调度策略
进程调度算法
- FCFS
- SPF
- HPF
- HRF
- 最短剩余时间优先算法 SRT
- RR算法,轮转调度
- 应用于分时系统,目标是提高响应及时性
- 按照时间片轮转调度
- 进程轮流使用CPU,各用一个时间片,时间片用完管理程序停止它的运行,并将它转入就绪队列尾部,调度下一个进程
- 进程失去CPU不是资源的,而是被系统剥夺的
4.轮转算法的启动时机:- 一个时间片运行结束
- 当前进程运行结束
- 正在运行的进程因运行受阻主动放弃了CPU控制权

- 时间片的选取(时间片的确定通常是以下几个原则):
- 进程道术较多时,q就选的小一点。反之,可以选的大一点
- 系统要求的响应时间比较苛刻的时候,q就选的小一些。反之,可以选的大一点
- 多队列调度算法
- 设置多个就绪队
- 就绪队优先级不同,优先级别高的队列优先调度
- 优先级高的队列为空时,再调度低优先级别队列

- 多级队列反馈调度算法(终端型用户满意、短的批处理作业用户满意、长的批处理作业用户满意)
- 设置n个队列Q1,Q2,Q3,...,Qn
- 记Qi的优先级别为Pi,有P1>P2>P3>...>Pn
- 记Qi的时间片为qi,有q1<q2<q3<...<qn
- 新建进程进入Q1队
- 只有Q1为空时,才调度Qi+1中的进程
- 进程p在Qi中被调度执行,若时间片qi已到但尚未结束,则进程p转为就绪状态进入Qi+1队,进程p在Qn中被调度执行,若时间片已到但尚未结束,则进程转为就绪状态仍进入Qn队
3.10 线程的引入
问题:线程是什么?
- 线程是现代操作系统引入的一种执行实体
- 线程称"轻型进程",进程的组成部分
- 进程是资源占有单位,线程只是CPU调度单位(也就是线程只是调度,没有单独占有的资源,共享进程的资源)

问题:操作系统为什么要引入线程?
举个例子,刷锅、洗菜、切菜的过程,如果建立子进程,那么当进程切换的时候,是背着包袱切换的,每个进程的资源不一样,需要切换资源,读入读出。



浙公网安备 33010602011771号