350 likes | 501 Views
第 2 章 进程的描述与控制. 2.1 进程及其描述 2.1.1 进程的引入 2.1.2 进程的定义与特征 2.1.3 进程描述控制表 2.2 进程基本状态及其相互转换 2.3 进程控制 2.4 线程. 补充部分必要的微机原理知识. 2.1.1 进程概念的引入. 单任务环境下的 “ 可执行 ” 程序 未执行前的程序 可执行格式的二进制程序文件; 通常被持久存储在外存(磁盘)中。 程序被加载到主存并获得 CPU 控制权后 将按其中指令所规定的逻辑顺序被依次执行 逻辑顺序结构:顺序、选择、重复(循环)
E N D
第2章 进程的描述与控制 2.1 进程及其描述 • 2.1.1 进程的引入 • 2.1.2 进程的定义与特征 • 2.1.3 进程描述控制表 2.2 进程基本状态及其相互转换 2.3 进程控制 2.4 线程 补充部分必要的微机原理知识
2.1.1 进程概念的引入 • 单任务环境下的“可执行”程序 • 未执行前的程序 • 可执行格式的二进制程序文件; • 通常被持久存储在外存(磁盘)中。 • 程序被加载到主存并获得CPU控制权后 • 将按其中指令所规定的逻辑顺序被依次执行 • 逻辑顺序结构:顺序、选择、重复(循环) • 通常可采用或引入前驱图[节点+有向边],来描述程序中不同单元或程序段之间的关系; • 以实模式执行,具有最大的权限,可存取控制所有计算机软硬资源; • 程序执行具有以下基本特点: • 顺序性、封闭性和(结果)可再现性。
2.1.1 进程概念的引入 S1 • 单任务环境下的“可执行”程序 • 多任务环境下多道程序并发执行 • 多道程序并发执行情况示例 • 本例中,程序片段S1与S2可并发执行 • 并发可有效提高系统的吞吐量 • 多道程序并发执行的特征 • 间断性(切换执行) • 失去封闭性(共享系统的资源) • 结果不可再现性 • 为有效管理和调度多道并发执行程序 • 须引入可完整描述每道执行中程序的数据结构; • 该思想逐步进化完善进程(process)概念 S3 S4 S2
2.1.1 进程概念的引入 • 单任务环境下的“可执行”程序 • 多任务环境下多道程序并发执行 • 进程概念的引入与意义 • 进程是现代OS最重要的概念之一 • 进程的管理、切换及调度,与保护模式密切相关,需要有保护模式知识,才能清晰理解进程的实现机制和实现过程。 • 执行进程切换的相关代码,被统称为OS的进程调度模块 • 通常被运行在比 “进程”更高的层级上; • 现代OS的调度代码,通常不是一个集中的模块,而是由分散在内核多个位置的若干代码片段构成。
数组或队列 OS进程切换示意图解
进程表数组指针 中断处理程序框架 • ;入口堆栈为当前进程的进程控制表 • ;保存当前CPU工作现场 • Push ad ; push ds,es,fs,gs,.. • ;禁止当前中断,但允许其它中断发生 • ;将堆栈切换到内核栈 • ;执行实际的中断处理,对于时钟中断 • 修改系统时间; • 修改当前进程时间配额; • 若时间配额用完,重调度—修改 p_proc_ready • ;禁止所有中断发生[cli] • ;将栈切换到下一个启动进程的进程表 • mov esp, [p_proc_ready] • lldt [esp+p_ldt_sel] • ;恢复下一个执行进程的CPU工作现场 • pop ..,gs,fs,es,ds; popad • iretd
2.1.2 进程定义 • 是具有一定独立功能的程序:在一个数据集上的一次动态执行过程。 • 一个程序可以通过多次执行,产生多个进程 • 是计算机内存中具有一定结构和具有相对独立性的动态实体(有独立的活动地址空间)。 • 是计算机系统资源的使用实体和参与系统资源分配的最基本单位。 • ★是计算机系统中可独立调度执行的实体。 • 注意,在进一步引入“线程”的OS中,可独立调度执行的实体变为线程。
Process Definition • It is a program in execution, the program defines its behavior. • It is a schedulable unit of computation that usually requires certain resources be allocated to it during execution. • It is the most fundatmental unit for resources allocation. • some modern OS may use threads or objects for the fundamental unit of computation. • The component of a process are the following: • The object program (or code) to be executed; • The data on which the program will exec. • The resources required by the prg. • The status of its exec, or more precisely, an internal data structure (the process descriptor or PCB) to describe/keep track it.
进程的基本特征 用户空间是进程的一个最主要特征! • 独立性 • 每个进程具有自己相对独立的地址空间,除非通过进程通信手段,否则不能相互影响 • 结构性 • 进程空间是结构化的、分段组织的; • 动态性 • 是或包含可在其地址空间中活动的执行体对象 • 并发性,也称异步性 • 在同一个计算机系统中允许同时存在多个进程,微观上它们可能是交替执行;但宏观上看,则似乎在同时独立运行。
一种抽象的“进程空间”视图模型 每个进程有 自己专有的 “一本帐” “一套表”
2.1.3 进程控制块(PCB) • 也称进程表,是OS维护的、用来跟踪记录进程存在和活动情况的数据结构。 • 与进程有关的信息被集中存储在这个数据结构中。 • 每个进程在OS都有一个唯一的PCB • Windows中,PCB也被称为 ‘内核进程对象’ ,是一种内核控制对象。 • 不允许进程自身访问,只允许内核代码访问。 • PCB主要内容 • 进程描述信息:PID,NAME, USERID,PROCESS GROUP • 处理器现场保护信息: CPU内部各寄存器 • 进程控制信息:当前状态、优先级、代码执行入口地址、程序外存地址、运行统计信息(执行时间、调度次数、页面调度) • 资源占用信息列表,打开资源对象句柄表 • 用于进程间同步与通信的相关信息字段 • 指向进程虚空间使用分配描述表指针(PCB->AddressSpace) (注意,因页目录/页表占空间 较大,虽位于系统空间但不能安排在核心,即∉PCB,页挂起进程页表可能会被SWAP到外存!)
PCB->AddressSpace 进程页目录的物理地址 2.1.3 进程控制块(PCB)
2.2 进程的状态及其相互转换 2.2.1 五状态图(三种基本状态+新状态+结束状态) PCB中有表示进程当前状态的字段(枚举型)
2.2.2 进程的单挂起状态模型 active suspend
★进程与程序比较(区别与联系) • 程序是静态的, 是有序代码的集合, 是进程的定义和说明 • 对应着一个持久外存文件,具有外存文件的性质(创建/复制/删除..)。 • 进程是动态的、暂时的,是程序的一次执行,通常不能在计算机之间迁移。 • 进程与程序的组成不同:进程组成包括代码段、数据段和控制块。 • 进程与程序密切关联 • 通过多次加载执行,一个程序可对应多个进程;通过调用关系,一个进程可涉及多个程序。
2.3 进程控制 • 2.3.1 原语的概念 • 2.3.2 核心态与用户态的概念 • 2.3.3 进程的创建与退出 • 2.3.4 进程的阻塞与唤醒
2.3.1 原语的概念 • 原语是由若干条机器指令构成的,用于完成某一特定功能的一段程序 • 原语在执行期间不可分割,原语操作具有原子性。
2.3.2 核心态与用户态的概念 • 为了防止操作系统及关键数据(如PCB等)受到用户有意或无意的破坏,通常将处理机的执行状态分为两种: • 核心态,又称管态,是操作系统管理代码执行时机器所处的状态。 • 它具有较高的特权,能执行一切指令,访问所有的寄存器和存储区。 • 用户态,又称目态,是用户进程执行时机器所处的状态。 • 这是具有较低特权的执行状态,它只能执行规定的指令,访问指定的寄存器和存储区 。
WINDOWS/XP核心态中的一些主要成份 • 核心部分 • 中断处理和调度;异常处理和异常调度;多处理器同步;线程安排和调度;供执行体使用的基本内核对象(包括控制对象和调度支持对象) • 控制对象:内核进程对象,异步过程调用APC,延迟过程调用DPC,以及一些供I/O系统使用对象 • 调度支持对象:线程对象,互斥体Mutex,信号量Semaphore,事件Event,定时器 • 执行体部分 • 进程和线程管理器(创建/中止)、内存管理器、I/O管理器、缓存管理器、电源管理器、即插即用设备管理器、注册表管理器、LPC、…
2.3.3 进程的基本管理 • 1. 进程创建的一些常用原语 • 2. 进程创建的基本过程 • 3. 进程终止/退出 • 4. 进程阻塞与挂起
1. 创建进程的相关原语 • 一个进程可利用系统调用来创建新进程,创建者称为父进程,被创建者称为子进程。 • 进程树 • fork(分叉克隆) • 复制现有进程的上下文来创建新进程 • Exec • 先fork, 再加载新进程映像并覆盖自身 • spawn • 创建新进程并加载新进程 (spawn )
2. 进程创建的基本过程 • 申请空白PCB(创建内核进程对象) • 为新进程分配资源 • 创建进程地址空间框架; • 创建进程打开对象句柄表; • 加载并映射新进程映像到进程用户空间,包括分配部分物理内存页; • 在进程用户空间中分配进程运行环境控制块(PEB); • 初始化进程PCB和PEB • 将新进程状态置为“就绪”,并插入就绪队列。
☆Windows系统的进程创建过程 • 分配并设置EPROCESS(含KPROCESS)数据结构。 • 为目标进程创建初始的地址空间。 • 建立初始地址VAD树;建立初始页表(页面映射方案表); • 分配并设置其他相关数据结构,例如,“打开对象表” 。 • 对目标进程的“内核进程块”KPROCESS进行初始化。 • 将NTDLL映像映射到目标进程的用户地址空间 • 将目标进程的映像映射到其自身的用户空间。 • 映射NLS有关的数据结构到用户空间。 • 创建并设置好目标进程的“进程环境块”PEB。 • 含进程运行参数、映像装入地址、NLS支持映像地址等信息 • 创建进程的第一个线程 • 分配堆栈、分配并初始化运行上下文、创建线程对象ETHREAD、分配并设置线程环境块TEB • 完成EPROCESS创建,将其首线程挂入就绪队列 • 注意,受调度的是线程队列而不是进程队列。
3.进程的终止/退出(EXIT()) • 根据被终止进程标识,从PCB中检索出该进程PCB,从中读出进程状态; • 若被终止进程处于执行状态,应立即中止该进程的执行 • 修改该进程的状态到终止状态,并立即申请再调度; • 若还有子孙进程,还应将它们终止或过继; • 释放进程拥有的所有资源; • 释放PCB
2.4 线程 • 2.4.1 线程的有关概念 • 2.4.2 线程的相关数据结构 • 2.4.3 线程的创建 • 2.4.4 线程与进程比较
2.4.1 线程的有关概念(1) • 在只有进程概念的OS中,进程是资源的分配单位,同时也是处理器的调度单位。 • 现代OS为进一步提高系统的并发性能,往往都引入了比进程粒度更细的 “线程”概念: • 一个进程内可容纳多个线程。进程仍作为参与资源分配的最基本单位,但把线程作为调度的最基本单位,从而达到以小的开销来提高进程内的并发和共享程度的目的。
2.4.1 线程的有关概念(2) • 线程是具体的(执行)上下文,是CPU调度的基本单元;而进程只是若干个共享地址空间和相同特性 (如调度优先级)的线程集合,好像是 “提取公因子”所形成的结果。 • 进程只是个空架子,实际的运行实体是里面的线程。 • 线程是1个动态对象,是CPU调度的基本单位,表示进程中的1个控制点,执行一系列指令。 • 由于同一进程内各线程都可以访问整个线程的所有资源,故它们间的通信比进程间通信要方便; • 同一进程内的线程间切换也会由于许多上下文的相同而简化。
2.4.2 线程的相关数据结构 • 线程的内核数据结构(代表对象) • 是ETHREAD,是一种调度对象,它的第一个成份是数据结构KTHREAD,也称为TCB ; • 线程在用户空间的相关数据结构 • 有自己专有堆栈; • 有自己的运行上下文; • 有自己的线程环境块TEB • PEB在用户空间的位置是固定的,PEB下方就是TEB,进程中有几个线程就有几个TEB,每个TEB占一个4KB的页面。
2.4.3 线程的创建 • 一般首个线程在进程创建的结束阶段被自动创建(由父进程代为创建);其它线程由进程自己调用系统API函数创建。 • 线程创建的基本过程 • 创建/初始化ETHREAD数据结构,并处理好与EPROCESS的关系。 • 为新线程分配堆栈、创建并初始化执行上下文。 • 在所属进程的用户空间中,创建并设置新线程TEB。 • 进一步设置目标线程的KTHREAD数据结构,包括: • 设定新线程在用户空间执行入口始址。ETHREAD数据结构中有相关成份,用来存放相关地址。 • 将其上下文中的断点(返回点)设置成指向内核中的一段程序KiThreadStartup,使得该线程一旦被调度运行时就从这里开始执行。 • 将线程对象标插入就绪队列
2.4.4 线程与进程比较(1) • 地址空间:不同进程的地址空间相互独立,而同一进程的各线程共享同一地址空间,一个进程中的线程在另一进程中是不可见的。 • 通信关系:进程间通信必须通过OS提供的进程间通信机制,而同一进程的线程间通信可以通过直接读写进程数据段如全局变量进行(仍需要同步互斥机制保证数据访问的一致性)。 • 调度切换:同一进程中的线程上下文切换比进程上下文切换快得多。
2.4.4 线程与进程比较(2) • 线程与进程相比的主要优点: • 创建、终止、切换快,系统开销少; • 通信方便 • 由于同进程内线程间共享内存和文件资源,故可直接进行不通过内核的通信; • 系统允许的最大线程数限制弱得多; 采用多线程的程序设计技术,可以更好提高系统的运行性能(如吞吐量、计算速度和响应时间等)。