第三章 进程线程模型
1. . 多道程序设计
所谓多道程序设计,就是允许多个程序同时进入内存并运行。多道程序设计是操作系统所采用的最基本、最重要的技术,其根本目的是提高整个系统的效率。
采用多道程序设计可以提高 CPU 的利用率。多道程序设计技术充分发挥了处理器与外围设备以及外围设备之间的并行工作能力,从而提高处理器和其他各种资源的利用率。
从宏观上看,CPU 与外部设备始终可以并行工作,这样使得 CPU 的运行效率达到最大化,不至于空闲。
2. 多道程序设计环境特点
独立性
随机性
资源共享性
3. 程序并发执行
所谓程序并发执行,是指两个或两个以上程序在计算机系统中同处于已开始执行且尚未结束的状态。
能够参与并发执行的程序称为并发程序。
引入程序并发执行,是为了充分利用系统资源,提高计算机的处理能力。
但是,程序并发执行产生了一些和程序顺序执行时不同的特性,概括如下:
① 并发程序在执行期间具有相互制约关系
② 程序与计算不再一一对应
③ 并发程序执行结果不可再现
4. 进程和程序的区别
程序是构成进程的组成部分之一,一个进程的运行目标是执行它所对应的程序,如果没有程序,进程就失去了其存在的意义。
进程是由程序、数据和进程控制块(PCB)3 部分组成。
程序是静态的,进程是动态的。
程序的存在是永久的,进程的存在是暂时的,动态地产生和消亡。
一个进程可以执行一个或几个程序,一个程序亦可以构成多个进程。
进程具有创建其他进程的功能。被创建的进程称为子进程,创建者称为父进程,从而构成进程家族。
程序是指令、数据及其组织形式的描述,进程是程序的实体;
① 每一个进程都有它自己的地址空间,一般情况下,包括文本区域、数据区域和堆栈。
② 文本区域存储处理器执行的代码;
③ 数据区域存储变量和进程执行期间使用的动态分配的内存;
④ 堆栈区域存储着活动过程调用的指令和本地变量。
5. 进程特性:
1) 并发性
可以同其他进程一道向前推进,即一个进程的第一个动作可以在另一个进程的最后一个动作结束之前开始。
2) 动态性
进程对应程序的执行过程,体现在两方面:
① 进程动态产生、动态消亡;
② 在进程生命周期内,其状态动态变化。
3) 独立性
一个进程是一个相对完整的资源分配单位。
4) 交往性
一个进程在运行过程中可能会与其他进程发生直接的或间接的相互作用。
5) 异步性
每个进程按照各自独立的、不可预知的速度向前推进。
6.3 状态进程模型
运行中的进程可以处于以下 3 种状态之一:运行、就绪、等待。
在任何时刻,任何进程都处于且仅处于 3 种状态之一。
1) 运行状态( Running)
① 运行状态是指进程已获得 CPU,并且在 CPU 上执行的状态。
② 在一个单 CPU 系统中,最多只有一个进程处于运行态。
2) 就绪状态( Ready)
① 就绪状态是指一个进程已经具备运行条件,但由于没有获得 CPU 而不能运行所处的状态。
② 一旦把 CPU 分配给它,该进程就可运行。
③ 处于就绪状态的进程可以是多个。
3) 等待状态( Waiting)
① 等待状态也称阻塞状态或封锁状态。
② 是指进程因等待某种事件发生而暂时不能运行的状态。
③ 系统中处于等待状态的进程可以有多个。
7. 五状态进程模型
五状态进程模型中,进程状态被分成下列五种状态。
进程在运行过程中主要是在就绪、运行和阻塞 3 种状态间进行转换。
创建状态和退出状态描述进程创建的过程和进程退出的过程。
① 运行状态( Runing):进程占用处理机资源;处于此状态的进程的数目小于等于处理机的数目。在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。
② 就绪状态( Ready):进程已获得除处理机外的所需资源, 等待分配处理机资源; 只要分配处理机就可执行。
③ 阻塞状态( Blocked):由于进程等待 I/O 操作或进程同步等条件而暂停运行时处于阻塞状态。
④ 创建状态( New):进程正在创建过程中, 还不能运行。
⑤ 结束状态( Exit):进程已结束运行,回收除进程控制块之外的其他资源,并让其他进程从进程控制块中收集有关信息(如记账和将退出代码传递给父进程)。
8. 七状态模型
1) 七状态进程模型把原来的就绪状态和阻塞状态进行了细分,增加了就绪挂起和阻塞挂起两个状态; 这时原来的就绪状态和阻塞状态的意义也发生了一些变化:
① 就绪状态( Ready):进程在内存且可立即进入运行状态;
② 阻塞状态( Blocked):进程在内存并等待某事件的出现;
③ 阻塞挂起状态( Blocked,Suspend):进程在外存并等待某事件的出现。
④ 就绪挂起状态( Ready,Suspend):进程在外存,但只要进入内存, 即可运行;
2) 在七状态进程模型中,新引入的状态转换有挂起和激活两类,意义有变化的转换有事件出现和进程提交两类。
挂起(Suspend):把一个进程从内存转到外存;可能有以下几种情况:
① 阻塞到阻塞挂起:没有进程处于就绪状态或就绪进程要求更多内存资源时,会进行这种转换,以提交新进程或运行就绪进程。
② 就绪到就绪挂起:当有高优先级阻塞(系统认为会很快就绪的)进程和低优先级就绪进程时,系统会选择挂起低优先级就绪进程。
③ 运行到就绪挂起:对抢先式分时系统,当有高优先级阻塞挂起进程因事件出现而进入就绪挂起时,系统可能会把运行进程转到就绪挂起状态。
激活(Activate):把一个进程从外存转到内存;可能有以下几种情况:
① 就绪挂起到就绪:就绪挂起进程优先级高于就绪进程或没有就绪进程时,会进行这种转换。
② 阻塞挂起到阻塞:当一个进程释放足够内存时,系统会把一个高优先级阻塞挂起进程激活,系统认为会很快出现该进程所等待的事件。
事件出现(Event Occurs):进程等待的事件出现;如操作完成、申请成功等;可能的情况有:
① 阻塞到就绪:针对内存进程的事件出现。
② 阻塞挂起到就绪挂起:针对外存进程的事件出现。
提交(Admit):完成一个新进程的创建过程,新进程进入就绪状态或就绪挂起状态。进入就绪挂起的原因是系统希望保持一个大的就绪进程表(挂起和非挂起)。
9. 进程控制块(Process Control Block,PCB)
为了便于系统控制和描述进程的活动过程,在操作系统核心中为进程定义了一个专门的数据结构,称为进程控制块(Process Control Block,PCB)。
PCB 是进程存在的唯一标志,当系统创建一个进程时,为进程设置一个 PCB,再利用 PCB 对进程进行控制和管理。
撤销进程时,系统收回它的 PCB,进程也随之消亡。
PCB 的内容可以分成调度信息和现场信息两大部分:
① 调度信息供进程调度时使用,描述了进程当前所处的状况,它包括进程名、进程号、存储信息、优先级、当前状态、资源清单、“家族”关系、消息队列指针、进程队列指针和当前打开文件等。
② 现场信息刻画了进程的运行情况,由于每个进程都有自己专用的工作存储区,其他进程运行时不会改变它
的内容。所以,PCB 中的现场信息只记录那些可能会被其他进程改变的寄存器,如程序状态字、时钟、界地址寄存器等。一旦中断进程的运行,必须把中断时刻的内容记入 PCB 的现场信息。
10. PCB 的 3 种组织方式
线性方式
索引方式
链接方式
11. 进程控制原语
用于进程控制的原语一般有:创建进程、撤销进程、挂起进程、激活进程、阻塞进程、唤醒进程以及改变进程优先级等。
进程原语
1) 创建原语
一个进程可以使用创建原语创建一个新的进程,前者称为父进程,后者称为子进程,子进程又可以细建新的子进程,构成新的父子关系。从而整个系统可以形成一个树形结构的进程家族。
创建一个进程的主要任务是建立进程控制块 PCB。
具体操作过程是:先申请一空闲 PCB 区域,将有关信息填入 PCB,置该进程为就绪状态,最后把它插入就绪队列中。
2) 撤销原语
当一个进程完成任务后,应当撤销它,以便及时释放它所占用的资源。
撤销进程的实质是撤销 PCB。一旦 PCB 撤销,进程就消亡了。
具体操作过程是:找到要被撤销进程的 PCB,将它从所在队列中消去,撤销属于该进程的一切“子孙进程”,
释放被撤销进程所占用的全部资源,并消去被撤销进程的 PCB。
3) 阻塞原语
某进程执行过程中,需要执行 I/O 操作,则由该进程调用阻塞原语把进程从运行状态转换为阻塞状态。
具体操作过程是:由于进程正处于运行状态,因此首先应中断 CPU 执行,把CPU 的当前状态保存在 PCB 的现场信息中,把进程的当前状态置为等待状态,并把它插入到该事件的等待队列中去。
4) 唤醒原语
一个进程因为等待事件的发生而处于等待状态,当等待事件完成后,就用唤醒原语将其转换为就绪状态。
具体操作过程是:在等待队列中找到该进程,置进程的当前状态为就绪状态,然后将它从等待队列中撤出并插入到就绪队列中排队,等待调度执行。
12. 操作系统创建新进程
操作系统创建一个新进程的过程如下:
①申请空白 PCB;
②为新进程分配资源;
③初始化进程控制块;
④将新进程插入就绪队列,如果进程就绪队列能够接纳新进程,便将新进程插入到就绪队列中。
13. fork()函数
在 UNIX 类操作系统中,父进程通过调用 fork()函数创建子进程,子进程获得与父进程地址空间相同的一份拷贝,包括文本、数据和 bss 段、堆以及用户栈,fork()函数被调用一次,却返回 2 次:一次是在调用进程中,一次是在新创建的子进程中,
14. 线程的基本概念
在引入线程的操作系统中,线程是进程中的一个实体,是 CPU 调度和分派的基本单位。
线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器、一组寄存器和栈),但它可与同属一个进程的其他线程共享进程所拥有的全部资源。
在操作系统中再引入线程,则是为了减少程序并发执行时所付出的时间和空间开销,使操作系统具有更好的并发性。
15. 引入线程的好处
创建一个新线程花费时间少(结束亦如此)。创建线程不需另行分配资源,因而创建线程的速度比创建进程的速度快,且系统的开销也少。
两个线程的切换花费时间少。由于同一进程内的线程共享内存和文件,线程之间相互通信无须调用内核, 故不需要额外的通信机制,使通信更简便,信息传送速度也快。
l 线程能独立执行,能充分利用和发挥处理器与外围设备并行工作能力。
16. Pthread 函数调用
线程调用 | 描述 |
pthread_create | 创建一个新线程 |
pthread_exit | 结束调用的线程 |
pthread_join | 等待一个特定的线 程退出 |
pthread_yiel | 释放 CPU 来 运 行 另 外 一 个 线 程 |
pthread_attr | 创建并初始化一个 线程的属性结构 |
pthread_attr | 删除一个线程的属 性结构 |
17. 进程(线程)调度的时机
执行进程调度一般是在下述情况下发生的:
● 正在执行的进程( 线程) 运行完毕;
● 正在执行的进程( 线程) 调用阻塞原语将自己阻塞起来进入等待状态;
● 正在执行的进程( 线程)调用了阻塞原语操作,并且因为资源不足而被阻塞;或调用了唤醒原语操作激活了等待资源的进程(线程);
● 时间片用完;
以上都是在 CPU 为不可抢占方式下的引起进程调度的原因。在 CPU 方式是可抢占方式时,还有下面的原因:
● 就绪队列中的某个进程( 线程)的优先级高于当前运行进程( 线程)的优先级时,引发进程( 线程) 调度。
18. 计算密集型 I/O 密集型
某些进程花费了绝大多数时间在计算上,而其他进程则在等待 I/O 上花费了绝大多数时间。前者称为计算密集型( Compute-Bound),也称为 CPU 密集型,后者称为 I/O 密集型( I/O-Bound),典型的计算密集型进程具有较长时间的 CPU 集中使用和较小频度的 I/O 等待。
19. 批处理检测指标
运行大量批处理作业的大型计算中心的管理者们为了掌握其系统的工作状态,通常检查 3 个指标: 吞吐量、周转时间以及 CPU 利用率。
对于交互式系统,特别是分时系统和服务器,则有不同的指标。最重要的是最小响应时间和均衡性。
实时系统有着与交互式系统不一样的特性,所以有不同的调度目标。实时系统的特点是或多或少必须满足截止时间。
实时系统最主要的要求是满足所有的(或大多数)截止时间要求。
为了避免这些问题,进程调度程序必须是高度可预测的和有规律的。
20. 进程调度策略
操作系统中进程调度策略主要有:
① FCFS(先来先服务)
② 最短作业优先
③ 最短剩余时间优先
④ 时间片轮转
⑤ 最高优先级算法
⑥ 多级反馈队列算法
⑦ 最短进程优先
21. 交互式操作系统
交互式操作系统是指用户交互式地向系统提出命令请求,系统接受每个用户的命令,采用时间片轮转方式处理服务请求,并通过交互方式在终端上向用户显示结果。
多级反馈队列、时间片轮转和高优先级优先适用于交互式操作系统。
批处理系统常用的调度算法有:先来先服务、最短作业优先、最短剩余时间优先、响应比最高者优先;
22. linux 上进程的 5 种状态
① 运行状态
② 中断状态
③ 不可中断状态
④ 僵尸状态
⑤ 停止状态
23. 引起进程调度的原因
① 正在执行的进程执行完毕;
② 正在执行的进程调用阻塞原语将自己阻塞起来进入等待状态;
③ 正在执行的进程调用了阻塞原语操作,并且因为资源不足而被阻塞;或调用了唤醒原语操作激活了等待资源的进程;
④ 时间片已经用完;
⑤ 就绪对列中的某个进程的优先级高于当前运行进程的优先级。
24. 运行状态转换为就绪状态原因
在抢占式调度系统中,进程从运行状态转换为就绪状态的可能原因有:进程创建完成、时间片用完和被调度程序抢占处理机。
25. 引起进程阻塞的事件
引起进程阻塞的事件有请求系统服务、启动某种操作、新数据尚未到达与无新工作可做。
26. 引起创建进程的事件
在多道程序环境中,只有进程才能在系统中运行。因此,为使程序能运行,就必须为它创建进程。导致一个进程去创建另一个进程的典型事件,可以有以下四类:
① 用户登录:在分时系统中,用户在终端键入登录命令后,如果是合法用户,系统将为该终端建立一个进程, 并把它插入到就绪队列中。
② 系统初始化:在批处理系统中,会创建 0 号、1 号系统进程。
③ 用户系统调用:用户采用系统调用创建进程。
④ 初始化批处理作业:在初始化批处理作业时,采用一个后台进程以便使新进程以并发的运行方式完成特定任务。设备分配不是会引起创建新的进程。
27. 管程
一个管程定义了一个数据结构和能为并发进程所执行(在该数据结构上)的一组操作,这组操作能同步进程和改变管程中的数据。
局部于管程的数据结构,只能被局部于管程的过程所访问,任何管程之外的过程都不能访问它;反之,局部于管程的过程也只能访问管程内的数据结构。
由此可见,所有进程要访问临界资源时,都必须经过管程才能进入,而管程每次只允许一个进程进入管程, 从而实现了进程的互斥,但是管程无法保证本身互斥。
28. 可再入程序
可再入程序是由可重入代码组成的程序,可以被安全的并行执行,当该程序正在运行时,可以再次载入内存并执行它。
具有如下特点:它是纯代码的,即在执行过程中不可修改;调用它的进程应该提供属于它自己的数据区。
29. 进程调度功能
处理器调度负责动态地把处理器分配给进程。因此,它又叫分派程序或低级调度。它的主要功能是:
① 记录和保持系统中所有进程的有关情况及状态特征;
② 决定某个进程什么时候获得处理器,以及占用多长时间;
③ 把处理器分配给进程;
④ 收回处理器:将处理器有关的寄存器内容送入该进程的进程控制块内相应单元,以保护该进程的现场,并修改该进程的状态,从而使进程让出处理器。
30. 进程优先级
在进程调度算法中若采用最高优先级算法则会根据进程的优先级来决定进程调度的优先次序,分为静态优先级和动态优先级两种方法确定进程的优先级。
一般地,系统进程的优先级应高于用户进程的优先级;
若采用静态优先级,在进程创建时确定了优先级,进程运行期间优先级不会改变;
若采用动态优先级,在创建时先确定一个初始优先级,在进程运行中随着进程特性改变(如等待时间增长),不断改变先级。
31. 线程描述表
每个线程有一个唯一的标识符和一张线程描述表
线程描述表记录的信息有:线程 ID、指令地址寄存器、处理器寄存器,硬件设备寄存器,栈现场状态等少量线程私有信息。
32. 线程的实现机制
有 3 种途径:用户级线程、内核级线程、混合实现方式。
上一篇
第二章 操作系统运行机制
下一篇