操作系统—进程管理

1.定义

进程和程序的异同

  • 程序是指令的有序集合,是一个静态的概念;

进程是程序在CPU上的一次执行过程,是一个动态的概念。

  • 程序作为软件资料可以长期保存

进程则有生命期:诞生、执行、暂停、消亡。

  • 程序作为静态文本既不运行,也不分配和调度。

进程是一个独立运行的基本单位,实现系统资源分配和调度

  • 进程与程序之间无一一对应关系。

进程是程序的一次执行,一个程序的多次执行可以产生多个进程;

不同的进程也可以包含同一个程序。

  • 程序是记录在介质(如磁盘)上指令的有序集合

而进程则由程序段、数据段和PCB这三部分组成。

进程的组成部分

  • 进程控制块(Process Control Block) 是一个数据结构,保存操作系统对进程管理所需的信息。

  • 进程描述信息:可以让操作系统区分各个进程

  1. 进程标识符 PID(Process ID):当进程被创建时,操作系统会为该进程分配一个唯一的、不重复的 ID ;

  1. 用户标识符 UID:进程所属用户 ID;

  • 进程控制和管理信息:实现操作系统对进程的控制、调度

  1. 进程当前状态:就绪态 / 阻塞态 / 运行态等

  1. 进程的运行情况:CPU、磁盘、网络流量使用情况统计等

  • 资源分配单:实现操作系统对资源的管理

  1. 进程正在使用哪些文件

  1. 给进程分配了多少内存,正在使用哪些内存区域

  1. 进程正在使用哪些 I/O 设备

  • 处理机相关信息:实现操作系统对进程的切换

  1. 各个寄存器的值:PSW(程序状态字寄存器)、PC(指令寄存器)、通用寄存器等

PCB 是进程存在的唯一标志,当进程被创建时,操作系统为其创建 PCB,当进程结束时,会回收其 PCB。
  • 程序段:内存中存储程序的指令序列的区域;

  • 数据段:程序在运行过程中产生和使用的各种数据 (如:程序中定义的变量) 在内存中的存储区域;

程序的运行过程

  • 首先,程序经编译后成为可执行文件存到硬盘当中,然后将该程序从硬盘调入内存中,同时操作系统会为该程序的运行创建一个相对应的进程(即创建相应的 PCB);

  • 然后,组成该程序的指令序列也读入内存,该部分指令序列在内存中的存放区域被称为程序段。该程序在运行过程中产生和使用的数据在内存中的存放区域被称为数据段

  • 最后,CPU 从程序段中读取每一条指令执行。

图解进程的组成

PCB 是给操作系统用的。
程序段、数据段是给进程自己用的。
进程实体 (进程映象) 是进程在动态运行过程中某一时刻的快照,能够反映进程在某一时刻的状态
进程是进程实体的 运行过程,是系统进行 资源分配调度的一个独立单位
PCB、程序段、数据段三部分组成进程实体 (进程映象)
如无特别说明,进程的组成就指进程实体的组成

进程的特征

进程是由多程序的并发执行而引起的,它和程序是两个截然不同的概念。程序是静态的,进程是动态的。进程的基本特征是对比单个程序的顺序执行提出的,也是对进程管理提出的基本要求。

  • 动态性:进程是程序的一次执行,它有着创建、活动、暂停、终止等过程,具有一定的生命周期,是动态地产生、变化和消亡的。动态性是进程最基本的特征

  • 并发性:指多个进程实体,同存于内存中,能在一段时间内同时运行,并发性是进程的重要特征,同时也是操作系统的重要特征。引入进程的目的就是为了使程序能与其他进程的程序并发执行,以提高资源利用率。

  • 独立性:指进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单位。凡未建立PCB的程序都不能作为一个独立的单位参与运行。

  • 异步性:由于进程的相互制约,使进程具有执行的间断性,即进程按各自独立的、 不可预知的速度向前推进。异步性会导致执行结果的不可再现性,为此,在操作系统中必须配置相应的进程同步机制。

  • 结构性:每个进程都配置一个PCB对其进行描述。从结构上看,进程实体是由程序段、数据段和进程控制段三部分组成的。

2.进程的状态

进程的状态及转换

  • 创建态:进程正在被创建时,它的状态是 “创建态”,在这个阶段操作系统会为进程分配资源、初始化 PCB

  • 就绪态:当进程创建完成后,便进入 “就绪态”,处于就绪态的进程已经具备运行条件,但由于没有空闲 CPU,暂时无法运行

  • 运行态:如果一个进程此时在 CPU 上运行,那么这个进程处于 “运行态”。CPU 会执行该进程对应的程序 (执行指令序列)

  • 阻塞态:在进程运行的过程中,可能会请求等待某个事件的发生 (如等待某种系统资源的分配,或者等待其他进程的响应)。在这个事件发生之前,进程无法继续往下执行,此时操作系统会让这个进程离开 CPU 回到内存,并让它进入 “阻塞态” 。当 CPU 空闲时,又会选择另一个 “就绪态” 进程到上CPU上运行

  • 终止态:一个进程可以执行 exit 系统调用,请求操作系统终止该进程。此时该进程会进入 “终止态”,操作系统会让该进程下 CPU,并回收内存空间等资源,最后还要回收该进程的 PCB。当终止进程的工作完成之后,这个进程就彻底消失了

PCB的组织方式

  • 线性表方式

系统中 所有PCB都组织在一张线性表中,表的首地址存放在内存专用区

优点: 实现简单、开销小

缺点: 每次查找时都要扫描一整张表,因此适合进程数目不多的系统

  • 链接表方式

具有 相同状态进程的PCB分别通过PCB中的链接字链接成一个队列
  • 索引表方式

系统根据所有 进程状态的不同,建立几张索引表,并把索引表的首地址记录在内存的专用单元中。在每个索引表的表目中,记录具有相应状态的PCB在PCB表中的首地址
(其实就是改进版的线性方式,分类之后,变成了很多子表,不需要把整个PCB表都扫描一遍,需要先根据进程状态找到对应的子表,然后再扫描子表)

3.进程控制

基本定义

  • 进程控制:主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。通俗来讲,进程控制就是要实现进程状态转换

  • 如何实现进程控制:进程控制用“原语”实现;

  • 原语:是一种特殊的程序,它的执行具有原子性。也就是说,这段程序的运行必须一气呵成,不可中断。

  • 如何实现原语的原子性:使用“关中断指令”和“开中断指令”这两个特权指令实现;

进程控制的相关原语

  • 进程创建原语

  • 进程终止原语

  • 进程唤醒原语和阻塞原语

  • 进程的阻塞和唤醒原语是成对存在的,必须成对使用。

  • 阻塞原语是由被阻塞进程自我调用实现的

  • 唤醒原语是由一个被唤醒进程合作或被其他相关的进程调用实现的

  • 进程切换原语

4.线程

线程的概念

线程是比进程更小的、能够独立运行的基本单位。用于进一步提高程序并发执行的程度,降低并发执行的时空开销。

线程的引入:进程是实现系统并发运行的一种实体。获取处理器资源的时候,叫做进程调度,创建进程、调度进程、管理进程都会有很大的额外开销,为了减小额外的开销,保持系统的并发性,现代操作系统将资源的申请和调度分开,进程作为资源的申请和拥有单位,线程作为调度的基本单位。

线程拥有其进程的所有资源

线程是进程中的一个实体,是被系统独立调度的基本单位,线程本身基本上不拥有资源,只拥有一些运行中必不可少的资源(比如程序计数器、栈、寄存器等),但是它可以与同属一个进程的其他线程共享进程所拥有的全部资源。

线程的定义

线程定义线程是进程中的一个实体,是可独立参与调度的基本单位,一个进程可以有一个或者多个线程,他们共享所属进程所拥有的资源。

线程具有如下属性:

  • 多个线程可以并发执行

  • 一个线程可以创建另一个线程

  • 线程具有动态性,一个线程被创建之后就开始了他的生命周期,可能处于不同状态,直到死亡。

  • 每个线程都有自己的数据结构,即线程控制块,记录了有关于线程的各种信息。

  • 在同一个进程内,所有线程共享同一个地址空间(即所属进程的存储空间)

  • 一个进程中的线程在另一个进程中是不可见的。

  • 同一个进程内的线程之间的通信主要是基于全局变量进行的。

线程的状态

同进程类似,线程也具有生命周期。

线程的状态有:运行、就绪、等待。

  1. 线程不是资源的拥有单位,挂起状态对线程是没有意义的。

  1. 进程的挂起也意味着线程的资源的失去。

  1. 进程终止也意味着线程终止。

线程的特征

进程和线程异同点:

  • 拥有资源

进程可以申请和拥有资源,而线程只拥有那些必须的资源,但是可以访问进程所有的资源。

  • 调度方面

进程是作为独立拥有资源的基本单位,线程是独立参与调度的基本单位。同一个进程内的线程切换不会引起进程切换。

  • 并发性方面

线程加强并发执行强度,同一个进程的多个线程间亦可并发执行

  • 系统开销

相比于没有引入线程的操作系统,引入线程的系统其系统开销将显著降低。同一个进程内线程之间的通信由于共享所属进程的存储空间,因此也比进程通信更加容易。

线程的分类

内核级线程

内核级线程指的是线程的管理工作都由内核来完成,由内核所提供的线程API来使用线程。任务提交给操作系统进行的时候,内核为其创建进程和一个基线程 。线程在执行过程中通过内核的创建线程原语来创建其他线程 。应用程序的所有线程均在一个进程中获得支持 。

  • 内核级线程的优点

在多处理器上,内核能够同时调度同一进程中的多个线程并行执行 。若进程中的一个线程被阻塞,内核能够调度同一进程的其他线程占有处理器运行,也可以运行其他进程中的线程 。切换速度比较快,内核自身也可用多线程技术实现,从而提高系统的执行效率。

  • 内核级线程的缺点

线程在用户态运行,而线程的调度和管理在内核实现 。线程需要用户态→核心态→用户态的模式切换,系统开销较大(线程模式切换) 。

用户级线程

用户级线程是指线程的管理由应用程序完成,在用户空间中实现,内核无须感知线程的存在 。由用户空间中的线程库来完成

  • 用户级线程优点

线程切换无须使用内核特权方式

允许进程按照应用的特定需要选择调度算法,且线程库的线程调度算法与操作系统的低级调度算法无关

能够运行在任何操作系统上,内核无须做任何改变

  • 用户级线程的缺点

一个用户级线程的阻塞将引起整个进程的阻塞

进程执行不可能得益于多线程的并发执行

混合式线程:

操作系统既支持用户级线程,又支持内核级线程 。

线程的实现分为两个层次 :

  • 用户层

用户层线程在用户线程库中实现 (用户级线程 )

  • 内核层

内核层线程在操作系统内核中实现 (内核级线程 )

宏观上和微观上都具有很好的并行性

在混合式线程中,一个应用程序中的多个用户级线程能分配和对应于一个或多个内核级线程,内核级线程可同时在多处理器上并行执行,且在阻塞一个用户级线程时,内核可以调度另一个线程执行

线程与进程的结构

单线程进程结构

多线程进程结构

5. 处理器调度

  • 作业调度(高级调度):其主要任务是按一定的原则从外存上处于后备状态的作业中挑选一个(或多个)作业,给它(们)分配内存、输入/输出设备等必要的资源,并建立相应的进程,以使它(们)获得竞争处理机的权利。简言之,就是内存与辅存之间的调度。对于每个作业只调入一次、调出一次。

多道批处理系统中大多配有作业调度,而其他系统中通常不需要配置作业调度。作业调度的执行频率较低,通常为几分钟一次。
  • **中级调度(内存调度):**引入中级调度是为了提高内存利用率和系统吞吐量。为此,应使那些暂时不能运行的进程,调至外存等待,把此时的进程状态称为挂起状态。当它们已具备运行条件且内存又稍有空闲时,由中级调度来决定,把外存上的那些已具备运行条件的就绪进程,再重新调入内存,并修改其状态为就绪状态,挂在就绪队列上等待。

  • **进程调度(低级调度):**其主要任务是按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它。进程调度是操作系统中最基本的一种调度,在一般操作系统中都必须配置进程调度。进程调度的频率很高,一般几十毫秒一次。

三层调度的联系和对比

要做什么

调度发生在

发生频率

对进程状态的影响

高级调度 (作业调度)

按照某种规则,从作业后备队列中选择合适的作业将其调入内存,并为其创建进程

外存→内存 (面向作业)

最低

无→创建态→就绪态

中级调度 (内存调度)

按照某种规则,从挂起队列中选择合适的进程将其数据调回内存

外存→内存 (面向进程)

中等

挂起态→就绪态 (阻塞挂起→阻塞态)

低级调度 (进程调度)

按照某种规则,从就绪队列中选择一个进程为其分配处 理机

内存→CPU

最高

就绪态→运行

6.进程调度

  • 进程调度:操作系统管理了系统的有限资源,当多个进程(或多个进程发出的请求)要使用这些资源时,因为资源的有限性,必须按照一定的原则选择进程(请求)来占用资源。这就是进程调度。

  • 调度目的:控制资源使用者的数量,选取资源使用者许可占用资源或占用资源。

CPU调度时机

  • CPU调度可能发生在当一个进程

  • 从运行转到等待(非抢占式)

  • 从运行转到就绪(抢占式)

  • 从等待转到就绪(抢占式)

  • 终止运行(非抢占式)

进程在 操作系统内核程序临界区中不能进行调度与切换。但是进程在 普通临界区中是可以进行调度、切换的
临界资源:一个时间段内只允许一个进程使用的资源。各进程需要互斥地访问临界资源。
临界区:访问临界资源的那段代码。
内核程序临界区一般是用来访问 某种内核数据结构的。例如:进程的就绪队列 (由各就绪进程的 PCB 组成)
内核程序临界区访问的临界资源如果不尽快释放的话,极有可能影响到操作系统内核的其他管理工作。因此在访问内核程序临界区期间不能进行调度与切换。
普通临界区访问的临界资源不会直接影响操作系统内核的管理工作。因此在访问普通临界区时可以进行调度与切换

调度方式

  • 非抢占式调度(非剥夺调度方式

  • 一旦把CPU分配给某个进程后,系统不可以抢占已分配的CPU并分配给其他进程

  • 只有进程自愿释放CPU,才可以把CPU分配给其他进程

  • 优点:容易实现,调度开销小,适合批处理系统

  • 缺点:响应时间长,无法及时处理紧急任务,不适合交互系统

  • 抢占式调度(剥夺调度方式

  • 调度程序可以根据某种原则暂停某个正在执行的进程,将已分配给它的CPU重新分配给另一个进程

  • 当多个进程共享数据时,抢占调度可能导致竞争情况

  • 抢占也影响操作系统的内核设计

  • 可防止单一进程长时间独占CPU

  • 系统开销大

  • 受中断影响的代码应加以保护,从而避免同时使用,为了这些代码段不被多个进程同时访问,在进入时禁止中断而退出时启用中断

  • 抢占式与非抢占式的区分

  • 运行进程是否是自愿放弃CPU

调度准则

  • CPU利用率:固定时间内CPU运行时间的比例

  • 利用率=CPU运行的时间/总时间

  • 吞吐量:单位时间内运行完的进程数

  • 周转时间:进程从提交到运行结束的全部时间

  • 等待时间:进程等待调度(不在运行)的时间片总和

  • 响应时间:从进程提出请求首次被响应(而不是输出结果)的时间段(在分时系统环境下),也就是第一段的等待时间

  • 周转时间:是指从作业被提交给系统开始,到作业完成为止的这段时间间隔。

  • (作业)周转时间=作业完成时间 – 作业提交时间

  • (作业)周转时间= 等待时间 + 运行时间

  • 带权周转时间:周转时间/运行时间

调度算法

1.先来先服务调度算法(FCFS)

  • 调度策略:按照进程请求CPU的先后顺序来使用CPU

  • 调度依据:进入就绪队列的时间

  • 调度方法:先进入就绪队列的进程被优先选中运行

  • 使用FIFO队列实现

  • 特点

  • 实现简单,可使用FIFO队列实现

  • 非抢占式调度

  • 公平,每个进程都有被调度的机会

  • 适用于长程调度,后台批处理系统的短程调度

  • 对长CPU脉冲的进程有利,对短CPU脉冲的进程不利

  • 护航效果:当一个长进程后面的多个短进程,让长进程先执行,会让后面的短进程等待较长时间,从而导致CPU和设备利用率降低

  • 举个栗子

2.短作业优先调度算法(SJF)

  • 调度策略:关联到每个进程下次运行的CPU脉冲长度,调度最短的进程

  • 调度依据:每个进程下次运行的CPU脉冲长度

  • 调度方法:调度最短的进程运行

  • 两种模式

  • 非抢占式调度:一旦进程拥有CPU,它可在该CPU脉冲结束后让出CPU

  • 抢占式调度:有比当前进程剩余时间更短的进程到达时,新来的进程抢占当前运行进程的CPU,也称为最短剩余时间优先调度

  • SJF最优:对一组的进程而言,它给出了最短的平均等待时间

  • SJF算法困难:如何知道下一个CPU区间的长度

  • SJF通常用于长程调度

  • 指数估算法:通过先前的CPU区间长度及其指数平均进行预测

  • 饥饿:长进程可能长时间等待,

知道进程会运行但不知道什么时候运行

  • 死锁:进程长时间等待,不会运行

  • 举个栗子

3.优先级调度算法

  • 目前主流的操作系统调度算法

  • 调度依据:优先级

  • 就绪队列中的排列方式:优先级高的在前,优先级低的在后

  • 调度方法:调度优先级最高进程运行

  • 优先数:表示优先级的整数

  • 可以参考不同的因素来设置(时间极限,内存要求,进程的重要性)

  • 优先数可用某一范围的整数来表示

  • 静态优先级:

  • 进程创建时确定,在运行期间不变

  • 简单易行,系统开销小

  • 不够精确,可能会出现饥饿问题

  • 动态优先级:

  • 进程创建时的优先级随进程推进或等待时间增加而改变

  • 调度模式:

  • 抢占式调度

  • 非抢占式调度

  • 特点

  • 实现简单,考虑了进程的紧迫程度

  • 策略灵活,可模拟其他算法

  • 存在问题:饥饿(低优先级的进程可能永远得不到运行)

  • 解决问题:视进程等待时间的延长提高其优先级

  • 举个栗子

4.时间片轮转(RR)

  • 为分时系统设计

  • 算法原理:把一段时间分割成若干个小碎片,每个需要运行的进程获得一个碎片运行,即在这段时间内,每个进程都得到运行

  • 时间片:较小单位的CPU时间,通常为10-100毫秒

  • RR算法的性能很大程度上取决于时间片的大小

  • 时间片大->FCFS

  • 时间片小->系统开销大

  • 一般准则:时间片/10>进程上下文切换时间

  • 周转时间也依赖时间片的大小

  • 调度依据:进入就绪队列的时间

  • 调度方法:每个进程运行时间长度为一个时间片,时间片用完后,该进程被抢占并插入就绪队列末尾

  • 假定就绪队列中有n个进程、时间片q

  • 则每个进程每次得到不超过q单位的成块CPU时间

  • 没有一个进程的等待时间会超过(n-1)q

  • 在不超过nq时间内,n个进程都运行一次

  • 举个栗子

总结反思

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值