操作系统——进程管理(一)

一、进程相关知识点大纲图


二、知识体系框图


三、要掌握的基本要点

1.进程是一个程序对某个数据集的一次运行活动。进程是动态概念,而程序是静态概念。

2.进程的基本特征是:动态性、并发性、独立性、异步性和结构特征。

3.程序段和数据段称为进程的实体,用PCB描述实体的存在和变化,从结构上讲,进程包括程序段、、数据段和进程控制块(PCB)。

4.在操作系统中引入线程概念的主要目的是减少程序并发执行时所需要付出的时空开销,提高程序的并发程度。

5.进程的基本状态有运行、就绪和阻塞。引起状态转化的事件通常有:时间片用完(运行态转入就绪态)、等待事件(运行转入阻塞)、等待条件发生(阻塞态转入就绪态)以及进程调度(就绪态转入运行态)。

6.三级调度的运行频率:高级调度<中级调度<低级调度。

7.进程的调度方法有两类:抢占式和非抢占式。如要使当前运行进程总是优先级最高的进程,则应该选择非抢占式优先级调度算法。时间轮转调度方法也是抢占式调度方法。

8.进程调度算法采用等时间片轮转法时,若时间片过大,则会使轮转法转化为先来先服务调度算法,若时间片过小,则会在进程切换时消耗过多的系统资源和时间,效率反而会降低。

9.在所有的调度算法中,短作业优先调度算法的平均等待时间最短。

10.同时只能一个进程使用的资源称为临界资源。在进程中,访问临界资源的代码段称为临界区。为保证进程互斥访问临界资源,应在进程的临界资源之前设置进入区,在临界区后设置退出区。

11.访问临界资源应该遵循的准则:空闲让进,忙则等待,有限等待,让权等待。

12.同步是指不同进程间互相合作、相互等待、互斥是指同类进程需要互斥使用资源。同步与互斥描述了进程的两种不同的制约关系。

13.信号量的物理意义是:当信号量值大于零时,表示可用资源的数目;当信号量值小于零时,其绝对值为在该信号量上等待的进程个数。

14.死锁产生的四个必要条件:互斥、请求与保持、不剥夺和环路等待。破坏死锁时,要注意保护互斥性,其他三个条件可以打破。

15.不让死锁发生的策略可以分为静态和动态两种,死锁避免属于动态策略。

四、进程

前言:进程可看做是正在执行的程序。进程需要一定的资源( 如CPU时间、内存、文件和I/O 设备) 来完成其任务。这些资源在创建进程或执行进程时被分配。
进程是大多数系统中的工作单元。这样的系统由一组进程组成: 操作系统进程执行系统代码,用户进程执行用户代码。所有这些进程可以并发执行。虽然从传统意义上讲,进程运行时只包含一个控制线程,但目前大多数现代操作系统支持多线程进程。操作系统负责进程和线程管理,包括用户进程与系统进程的创建与删除,进程调度,提供进程同步机制、进程通信机制与进程死锁处理机制。

4.1进程的概念

进程是执行中的程序,这是一种非正式的说法。进程不只是程序代码,程序代码有时称为文本段(或代码段)。进程还包括当前活动,通过程序计数器的值和处理器寄存器的内容来表示。另外,进程通常还包括进程堆栈段(包括临时数据,如函数参数、返回地址和局部变量) 和数据段(包括全局变量)。进程还可能包括堆(heap),是在进程运行期间动态分配的内存。内存中的进程结构如图所示。

程序本身不是进程; 程序只是被动实体,如存储在磁盘上包含一系列指令的文件内容(常被称为可执行文件),而进程是活动实体,它有一个程序计数器用来表示下个要执行的命令和相关资源集合。当一个可执行文件被装入内存时,一个程序才能成为进程。装载可执行文件通常有两种方法,即双击一个代表此可执行文件的图标或在命令行中输入该文件的文件名(如prog.exe或a.out)。虽然两个进程可以是与同一程序相关,但是它们被当作两个独立的执行序列。例如,多个用户可运行不同的电子邮件副本,或者同一用户能调用多个Web 浏览器程序的副本。这些都是独立的进程,虽然文本段相同,但是数据段、堆、堆栈段却不同。一个进程在执行时产生许多进程是很常见的。
这里给出一个常用的进程定义:
  • 进程是程序在处理器上的一次执行过程。
  • 进程是可以和别的进程并行执行的计算。
  • 进程是程序在一个数据集合上的运行过程,是系统进行资源分配和调度的一个独立单位。
  • 进程可定义为一个数据结构及能在其上进行操作的一个程序。
  • 进程是一个程序关于某个数据集合在处理器上顺序执行所发生的一切。

4.2进程的组成与特征

进程一般由以下几个部分组成:
  • 进程控制块(PCB)。每个进程均有一个PCB,他是一个技能标识进程的存在、又能刻画执行瞬间特征的数据机构。当进程创建时,系统为它申请和构造一个相应的PCB。
  • 程序段。程序段是进程中能被进程调度程序调度到CPU上执行的程序代码段,能实现相应的特定功能。
  • 数据段。一个进程的数据段可以是进程对应的程序加工处理的原始数据,也可以是程序执行时产生的中间或结果数据。

系统根据PCB感知进程的存在。PCB是进程存在的唯一标志。一般来说,根据操作系统的要求不同,PCB所包含的内容多少都会有些不同。但通常有以下内容。
  • 进程标识符(PID)。每个进程都有唯一的进程标识符,以区别于系统内部的其他进程。在创建进程时,由系统为进程分配唯一的进程标识号。
  • 进程当前状态。说明进程的当前状态,以作为进程调度程序分配处理器的依据。
  • 进程队列指针。用于记录PCB队列中下一个PCB的地址。系统中的PCB可能组织成多个队列,如就绪队列、阻塞队列。
  • 程序和数据地址。指出进程的程序和数据所在的地址。
  • CPU现场保护区。当进程因某中原因释放处理器时,CPU现场信息(指令计数器、状态寄存器、通用寄存器)被保护在PCB的该区域中,以便该进程重新获得处理器后能继续执行。
  • 通信信息。记录进程在执行过程中与别的进程所发生的信息交换情况。
  • 家族联系。有的系统允许进程创建子进程,从而形成进程家族树。在PCB中,本进程与家族的关系必须指明。
  • 占有资源清单。进程所需要资源及当前已分配资源清单。
程序控制块如下图所示:
CPU在进程间的切换:


进程的特征:
  • 动态性。进程是程序在处理器上的一次执行过程,因而是动态的。动态特性还表现在它因创建而产生,由调度而执行,因得不到资源而暂停,最后因撤销而消亡。
  • 并发性。并发性是指多个进程同时存在于内存中,能在一段时间内同时运行。引入进程的目的就是使程序能够与其他程序并发执行,以提高资源利用率。
  • 独立性。进程是一个能独立运行的基本单位,也是系统进行资源分配和调度的独立单位。
  • 异步性。异步性是指进程以各自独立的。不可预知的速度向前推进。
  • 结构特征。为了描述和记录进程的运动变化的过程,并使之能正确运行,应为每个进程配置一个进程控制块。这样从结构上看,每个进程都是由程序段、数据段和一个进程控制块组成。

4.3进程的状态与转换

进程在执行时会改变状态。进程状态在某种程度上是由当前活动所定义的。每个进程可能处于下列状态之一:
  • 新的状态: 进程正在被创建。
  • 运行状态(执行状态): 当一个进程获得了必要的资源并在CPU上被执行。
  • 等待状态(阻塞状态):正在执行的程序,由于发生某件事情而暂时无法执行下去(如等待I/O 完成或收到信号)。处于阻塞状态时,即使将处理器分配给该进程,它也无法运行。
  • 就绪状态: 进程已经获得了除处理器外所有的资源,等待分配处理器。
  • 终止状态: 进程完成执行。
这些状态的名称较随意,且随操作系统不同而变化。不过,它们所表示的状态可以出现在所有系统上。有的系统更为详细地描述了进程状态。必须认识到一次只有一个进程可在一个处理器上运行,但是多个进程可处于就绪或等待状态。与这些状态相对的状态图如下所示:

状态转换的典型原因:
  • 就绪状态->执行状态。一个进程被进程调度程序选中。
  • 执行状态->阻塞状态。请求并等待某个事件发生。
  • 执行状态->就绪状态。时间片用完或在抢占式调度中有更高优先级的进程变成就绪状态。
  • 阻塞状态->就绪状态。进程因为等待的某个条件发生而被唤醒。
进程状态转换的原因如下:
  • 进程状态的转换并非都是可逆的,进程既不能从阻塞状态转换成执行状态,也不能从就绪状态转换成阻塞状态。
  • 进程之间的转换状态并非都是主动的,在很多情况下都是被动的,只有从执行状态到阻塞状态是程序的自我行为,其他都是被动的。例如,从执行状态到就绪状态,通常由时钟中断引起的,从阻塞状态到就绪状态,是上一个使用处理器的进程把一个阻塞程序唤醒的。
  • 进程状态的唯一性。一个具体的进程在任何一个指定的时刻必须且只能处于一种状态。
执行状态只能由就绪状态转换,而无法由阻塞状态直接转换。处于阻塞状态的进程当期待的时间发生后,是转换为就绪状态而非执行状态,因为还没有经过进程调度得到处理器,所以处理器在判断进程状态时是一个关键因素。

4.4进程的调度

多道程序设计的目的是无论何时都有进程在运行,从而使CPU 利用率达到最大化。分时系统的目的是在进程之间快速切换CPU 以便用户在程序运行时能与其进行交互。为了达到此目的,进程调度选择一个可用的进程(可能从多个可用进程集合中选择)到CPU上执行。单处理器系统从不会有超过一个进程在运行。如果有多个进程,那么余下的则需要等待CPU 空闲并重新调度。

4.4.1调度队列

进程进入系统时,会被加到作业队列中,该队列包括系统中的所有进程。驻留在内存中就绪的、等待运行的进程保存在就绪队列中。该队列通常用链表来实现,其头节点指向链表的第一个和最后一个PCB 块的指针。每个PCB 包括一个指向就绪队列的下一个PCB的指针域。

Linux 操作系统中的进程控制块是通过C结构task struct 来表示的。这个结构包含了表示一个进程所需要的所有信息,包括进程的状态、调度和内存管理信息、打开文件列表和指向父进程和所有子进程的指针(创建进程的进程是父进程,被进程创建的进程为子进程)。task struct 的这些字段包括:
pid_t pid;       //process identifier
long state;      //state of the process
unsigned int time_slice;  // list of open files
struct mm_stuct *mm; //address space of this process
例如,进程的状态是通过这个结构中的longstate 字段来表示的。在Linux 内核里,所有活动的进程是通过一个名为taskstruct 的双向链表来表示的,内核为当前正在运行的进程保存了一个指针(current),如图所示。
解释一下内核如何操作一个指定进程的task_struct 字段。假定操作系统想把当前运行进程的状态值修改成new_state。如果current 是指向当前进程的指针,那么要改变状态可以如下进行:
current->state new_state;
操作系统也有其他队列。当给进程分配了CPU 后,它开始执行并最终完成,或被中断,或等待特定事件发生(如完成I/O请求)。假设进程向一个共享设备(如磁盘) 发送I/O请求,由于系统有许多进程,磁盘可能会忙于其他进程的I/O 请求,因此该进程可能需要等待磁盘。等待特定I/O 设备的进程列表称为设备队列。每个设备都有自己的设备队列。如图所示:

讨论进程调度的常用表示方法是队列图,如下图所示。每个长方形表示一个队列。有两种队列:就绪队列和一组设备队列。圆形表示为队列服务的资源,箭头表示系统内进程的流向。
新进程开始处于就绪队列。它在就绪队列中等待直到被选中执行或被派遣。当进程分配到CPU并执行时,可能发生下面几种事件中的一种:
  • 进程可能发出一个/O请求,并被放到/O 队列中。
  • 进程可能创建一个新的子进程,并等待其结束。
  • 进程可能会由于中断而强制释放CPU,并被放回到就绪队列中。

对于前两种情况,进程最终从等待状态切换到就绪态,并放回到就绪队列中。进程继续这一循环直到终止,到时它将从所有队列中删除,其PCB 和资源将得以释放。

4.4.2调度程序

进程在其生命周期中会在各种调度队列之间迁移。为了调度,操作系统必须按某种方式从这些队列中选择进程。进程选择是由相应的调度程序(scheduler) 来执行的。

通常对于批处理系统,进程更多地是被提交,而不是马上执行。这些进程被放到大容量存储设备(通常为磁盘)的缓冲池中,保存在那里以便以后执行。长期调度程序(long-term scheduler) 或作业调度程序(job scheduler) 从该池中选择进程,并装入内存以准备执行。短期调度程序(short-term scheduler) 或CPU 调度程序从准备执行的进程中选择进程,并为之分配CPU。

这两个调度程序的主要差别是它们执行的频率。短期调度程序必须频繁地为CPU 选择新进程。进程可能执行数毫秒(ms) 就会进行I/O 请求,短期调度程序通常每100ms至少由于来执行一次。每次执行之间的时间较短,短期调度程序必须要快。如果需要10 ms 确定执行一个运行100ms 的进程,那么10/(100+10)-9%的CPU 时间会用于(或浪费在) 调度工作上。

长期调度程序执行得并不频繁,在系统内新进程的创建之间可能有数分钟间隔。长期调度程序控制多道程序设计的程度(内存中的进程数量)。如果多道程序的程度稳定,那么创建进程的平均速度必须等于进程离开系统的平均速度。因此,只有当进程离开系统后,才可能需要调度长期调度程序。由于每次执行之间时间间隔得较长,长期调度程序能使用更多时间来选择执行进程。

长期调度程序必须仔细选择。通常,绝大多数进程可分为: I/O 为主或CPU为主。I/O为主的进程(1/O-bound process)在执行I/O 方面比执行计算要花费更多的时间。另一方面,CPU为主的进程(CPU-bound process)很少产生I/O 请求,与I/O 为主的进程相比将更多的时间用在执行计算上。因此,长期调度程序应该选择一个合理的包含I/O 为主的和CPU为主的组合进程。如果所有进程均是I/O 为主的,那么就绪队列几乎为空,从而短期调度程序没有什么事情可做。如果所有进程均是CPU 为主的,那么I/O 等待队列将几乎总为空,从而几乎不使用设备,因而系统会不平衡。为了达到最好性能,系统需要一个合理的I/O为主和CPU为主的组合进程。

对于有些系统,可能没有或很少有长期调度程序。例如,UNIX 或微软Windows的分时系统通常没有长期调度程序,只是简单将所有新进程放在内存中以供短期调度程序使用。这些系统的稳定性依赖于物理限制(如可用的终端数) 或用户的自我调整。如果多用户系统性能下降到令人难以接受,那么将有用户退出。有的操作系统如分时系统,可能引入另外的中期调度程序(medium-term scheduler),如图所示。中期调度程序的核心思想是能将进程从内存(或从CPU 竞争)中移出,从而降低多道程序设计的程度。之后,进程能被重新调入内存,并从中断处继续执行。这种方案称为交换(swapping)。通过中期调度程序,进程可换出,并在后来可被换入。为了改善进程组合,或者因内存要求的改变引起了可用内存的过度使用而需要释放内存,就有必要使用交换。


4.4.3上下文切换

中断使CPU从当前任务改变为运行内核子程序,这样的操作在通用系统中发生得很频繁。当发生一个中断时,系统需要保存当前运行在CPU中进程的上下文,从而在其处理完后能恢复上下文,即先中断进程,之后再继续。进程上下文用进程的PCB表示,它包括CPU 寄存器的值、进程状态和内存管理信息等。通常,通过执行一个状态保存(state save) 来保存CPU当前状态(不管它是内核模式还是用户模式),之后执行一个状态恢复(state restore) 重新开始运行。
将CPU切换到另一个进程需要保存当前进程的状态并恢复另一个进程的状态,这一任务称为上下文切换(contextswitch)。当发生上下文切换时,内核会将旧进程的状态保存在其PCB中,然后装入经调度要执行的并已保存的新进程的上下文。上下文切换时间是额外开销,因为切换时系统并不能做什么有用的工作。上下文切换速度因机器而不同,它依赖于内存速度、必须复制的寄存器的数量、是否有特殊指令(如装入或保存所有寄存器的单个指令),一般需几亳秒。
上下文切换时间与硬件支持密切相关。例如,有的处理器(如SunUltraSPARC) 提供了多组寄存器集合,上下文切换只需要简单地改变当前寄存器组的指针。当然,如果活动进程数超过了寄存器集合数量,那么系统需要像以前一样在寄存器与内存之间进行数据复制。而且,操作系统越复杂,上下文切换所要做的工作就越多。如第8 章将要谈到的,高级内存管理技术在各个上下文切换中要求切换更多的数据。例如,在使用下一个任务的空间之前,当前进程的地址空间需要保存。进程空间如何保存和保存它需要做多少工作,取决于操作系统的内存管理方法。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值