《软件技术基础》之《进程》
并发是现代操作系统最重要的特征之一。
进程是操作系统最重要的抽象概念之一。
并发基于进程。
程序的顺序执行与并发执行
顺序执行
若干程序或程序段之间必须严格按照某种先后顺序来执行。
示例:
程序顺序执行时的特征
- 顺序性:处理机的操作严格按照程序所规定的顺序执行
- 封闭性:程序运行时独占全机资源,程序一旦开始运行,其执行结果不受外界因素影响
- 可再现性:只要程序执行时的环境和初始条件相同,都将获得相同的结果
并发执行
两个或两个以上的程序或程序段在同一时间间隔内同时执行。
示例:
有两个并发执行的进程P1和P2 ,共享初值为1的变量 x。P1对x加1,P2对x减1。加1和减1操作的指令序列分别如下所示, 试问两个操作完成后,x的值是多少?
答案:可能为0、1、2。
并发类型
应用级并发、系统级并发。
程序并发执行时的特征
- 间断性:由于资源共享和相互合作,程序呈现“执行——暂停——执行”现象
- 失去封闭性:程序本身的执行环境受外界程序的影响
- 不可再现性:程序在并发执行时,由于失去了封闭性,导致不可再现性
并发执行的条件
假设程序Pi所访问的共享变量的读集合、写集合分别为R(Pi)、W(Pi),则任意两个程序P1和P2可以并发执行的条件有以下3条:
进程及其运行环境
引入进程的目的是使多道程序能够正确地并发执行,以保证程序运行结果的可再现性。
典型的进程定义
- 一个正在执行的程序
- 一个正在计算机上执行的程序实例
- 能分配给处理器并由处理器执行的实体
- 一个具有以下特征的活动单元:一组指令序列的执行、一个当前状态和相关的系统资源集
- 可并发执行的程序在一个数据集合上的运行过程
进程的基本特征
- 动态性(本质特征):一个正在计算机上执行的程序实例,存在生命周期
- 并发性(重要特征):任何进程都可以同其他进程一起向前推进
- 独立性:各进程的地址空间相互独立,除非采用进程间通信手段
- 异步性:按各自独立的、不可预知的速度向前推进
- 结构性:进程 = 进程控制块( PCB )+ 程序段 + 数据
进程的执行轨迹
进程在内存中的布局:
进程的轨迹:执行指令序列,用于描述单个进程的行为。
规定:每个进程仅允许最多连续执行6个指令周期,之后被中断 (避免独占)
以下使3进程并发执行的轨迹,理解处器的行为,如何在三个进程间交替执行:
进程状态模型
进程的动态性和进程执行的间断性使得进程具有多种状态。
进程的3种基本状态
- 就绪状态:当进程已分配到除CPU以外的所有必要资源后,只要再获得CPU,便可立即执行过程。
- 执行状态:进程已获得CPU,其程序正在执行。
- 阻塞状态:正在执行的进程由于发生某事件而暂时无法继续执行时,便放弃处理机而处于暂停状态,把这种暂停状态称为阻塞状态或等待状态。
3种状态之间的转换:
进程的5种状态
- 就绪状态、执行状态、阻塞状态
- 新建状态:OS 已完成为创建一进程所必要的工作(已构造了进程标识符;已创建了管理进程所需的表格),但还没有允许执行该进程。
因为资源有限,OS 所需的关于该进程的信息保存在主存中的进程表中,但进程自身还未进入主存,也没有为与这个程序相关的数据分配空间,程序保留在辅存中。
- 终止状态:进程不再有执行资格,但表格和其他信息暂时保留。
5种状态之间的转换:
进程的挂起状态
多个进程竞争内存资源可能导致:
- 内存资源紧张
如何在有限的内存中装入尽量多的进程? - 无就绪进程,处理机空闲
I/O操作速度远低于CPU计算速度,导致所有进程阻塞,该如何处理?
对换技术
内存中没有就绪进程或内存空间非常紧张时,系统将一个或多个进程的全部或部分程序和数据从内存中换出到磁盘,以腾出部分内存空间。
进程被交换到外存,状态可能变为挂起状态。
挂起状态
使执行的进程暂停执行,静止下来,不再参与 CPU 的竞争,我们把这种静止状态称为挂起状态。
进程挂起的原因
- 进程全部阻塞,处理机空闲;
- 系统负荷过重,内存空间紧张;
- 操作系统的需要,操作系统可能需要挂起后台进程或一些服务进程,或某些可能导致系统故障的进程;
- 终端用户的请求;
- 父进程请求。
阻塞状态和挂起状态的区分
- 阻塞与否:进程是否等待事件
- 挂起与否:进程是否被换出内存
进程的4种状态组合
- 就绪:进程在内存,准备执行
- 阻塞:进程在内存,等待事件
- 就绪 /挂起: 进程在外存,只要调入内存并获得 CPU 即可执行
- 阻塞 /挂起: 进程在外存,等待事件
有挂起状态的转换模型:
操作系统对进程的控制
操作系统控制结构
操作系统是资源的管理者,采用表格(或数据结构)来记载各资源的信息,从而实现对资源的管理、维护、更新等。
操作系统控制表的通用结构:
进程的构成与进程的组织
进程的构成(进程映像):程序段+数据段+进程控制块(PCB)
进程控制块(PCB)
进程控制块中的信息的作用:
- 进程存在的唯一标志;
- PCB常驻内存。
进程控制块中的信息:标示、处理机状态、进程调度信息、进程控制信息…
进程标示符:唯一地标识一个进程,分为内部标示符和外部标示符。
- 内部标示符:操作系统为每个进程赋予的一个唯一整数,便于系统控制
- 外部标示符:由创建者提供,通常是由字母、数字组成,往往是由用户(进程)在访问该进程时使用
处理机状态信息:主要是由处理器的各种寄存器中的内容组成的。
- 通用寄存器(用户可视寄存器):暂存信息
- 指令计数器:要访问的下一条指令的地址
- 程序状态字(PSW):状态信息,如条件码、执行方式、中断屏蔽标志等
- 用户栈指针:存放过程和系统调用系数及调用地址
进程调度信息:与进程调度和进程对换有关的信息。
- 进程状态:指明进程的当前状态
- 进程优先级:进程使用处理器的优先级别
- 进程调度所需的其他信息:如进程已等待CPU的时间总和、进程已执行的时间总和等
- 事件:指进程由执行状态转变为阻塞状态所等待发生的事件,即阻塞原因
其他信息:
- 程序与数据的地址:指进程的程序和数据所在的内存或外存地址
- 进程同步和通信机制:指实现进程同步和进程通信时必需的机制,如消息队列指针、信号量等
- 资源清单:进程所需的全部资源及已经分配到该进程的资源的清单
- 链接指针
创建进程的步骤
- 给新进程分配一个唯一的进程标识符;
- 为进程分配空间;
- 初始化进程控制块:初始化标识信息、初始化处理机状态信息(如使程序计数器指向程序的入口地址,使栈指针指向栈顶等)、初始化进程调度信息(如设置进程的状态、优先级);
- 建立链接,将之插入就绪或就绪/挂起链表;
- 建立或扩充其他数据结构。
进程终止过程
进程阻塞过程
进程唤醒过程
进程的挂起
当出现引起进程挂起的事件后,系统将利用挂起原语suspend()将指定进程挂起。
挂起原语的执行过程:首先检查被挂起进程的状态,若处于就绪状态,便将其改为就绪/挂起;若处于阻塞状态,便将其改为阻塞/挂起。
进程的激活
当发生激活进程的事件时,则可将在外存上处于就绪/挂起状态的进程换入内存。
激活原语的执行过程:系统利用激活原语active()将指定进程激活;激活原语先将进程从外存调入内存,检查该进程的现行状态,若是就绪/挂起,便将之改为就绪;若为阻塞/挂起,便将之改为阻塞。
UNIX进程控制
fork()
作用:创建一个新进程。
调用格式:pid=fork()
在调用fork()之后,父进程和子进程在下一条语句上继续运行。
父、子进程的fork返回值不同:
在子进程中返回时,pid=0;在父进程中返回时,pid为所创建的子进程的标识。
示例:
exec()
子进程通过exec()调用族,加载新的程序文本。子进程可以拥有自己的可执行代码,即用一个新进程覆盖调用进程。
参数包括新进程对应的文件和命令行参数。成功调用时,不再返回;否则,返回出错原因。
在大多数程序中,系统调用fork和exec是结合在一起使用的。父进程生成一个子进程,然后通过调用exec覆盖该子进程
示例:
线程
有没有可改进的地方?
线程的属性
进程与线程的关系
进程和线程的比较
线程的类型
依据线程是否对内核透明,可分为:用户级线程、内核级线程、混合线程。
用户级线程
内核级线程
混合线程