进程管理

来源:互联网 发布:王药师风痹膏淘宝网 编辑:程序博客网 时间:2024/05/17 03:56

  • 1 进程的引入
    • 12 多道程序设计
    • 13 程序并发执行的特性
  • 2 进程定义与控制
    • 21 进程的概念
  • 3 进程调度
    • 32 进程调度算法
  • 4 进程间的相互作用
    • 41 进程间的同步和互斥
    • 42 进程的同步机制
    • 43 读者写者问题
    • 44 理发师问题
  • 6 线程
  • 7 UNIX进程模型

3.1 进程的引入

进程是伴随着多道程序技术,即并发的出现而出现的,进程是程序的一次执行,而且一个进程可以和其他进程并发执行

3.1.2 多道程序设计

多道程序设计的特点如下

  • 主存中有多道程序
  • 宏观上并行
  • 微观上串行

其主要优点是

1) CPU的利用率高. 当某个程序等待I/O操作时,CPU可以执行其他程序,提高了CPU的利用率
2) 设备利用率高. 在多道环境下,内存和外设也由多个程序共享, 这样也会提高内存与外设的利用率

3.1.3 程序并发执行的特性

  • 失去封闭性:共享资源,程序之间互相制约。
  • 间断性:程序之间的制约关系致使程序执行时间不连贯。
  • 不可再现性:失去封闭性,也就失去了可再现性,程序执行的结果随速度、环境的不同而不同。

可见,并发和并行是不同的概念:并行是并发的特例,并发是并行的拓展。

3.2 进程定义与控制

3.2.1 进程的概念

进程的定义

  • 进程是程序的一次执行
  • 进程是可以和别的计算并发执行的计算
  • 进程是定义在一个数据结构上并能在其上进行操作的一个程序
  • 进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位

进程组成

由程序段、数据段和进程控制块(PCB)组成。

  • 程序和数据是进程存在的物理基础,是进程的实体
  • 进程控制块是进程的灵魂,是进程存在的唯一标志
  • 操作系统为进程创建进程控制块和分配地址空间的过程就是进程创建的过程

进程控制块

是操作系统用来记录进程详细状态和相关信息的基本数据结构,包括进程的标识信息、状态信息和控制信息。

  • 标识信息:唯一的标识一个进程,主要有进程标识、用户标识和父进程标识。
  • 状态信息:与CPU有关的各种现场信息,包括寄存器状态、堆栈指针。以便该进程重新占用CPU后能够继续执行。
  • 控制信息:操作系统对进程进行调度管理时用到的信息。主要有进程状态、调度信息、队列指针、资源占有使用信息等。

进程的基本状态

  • 运行态(Running):进程已经获得所需资源,并占有CPU
  • 就绪态(Ready):已经获得所需资源,只等待CPU
  • 阻塞态(Blocked):也称为等待态、挂起态或睡眠态等,进程等待某个事件,如等待I/O完成,等待某个资源
  • 此外,还可以有新建态、终止态。

进程队列

系统将同种状态的PCB排成一个队列,利用指针组成单向链表或双向链表

系统还可以根据进程等待原因的不同,进一步将进程队列分成多个队列,并通过队列标识进行区分;

进程控制

通过原语实现

原语是指由机器指令构成的可完成特定功能的程序段。它是一个机器指令的集合,在执行时不能被中断。多采用屏蔽中断方法实现。进程控制原语有:

  • 进程创建原语(create primitive)
  • 进程撤消原语(destroy primitive)
  • 进程阻塞原语(block primitive)
  • 进程唤醒原语(wakeup primitive)
  • 进程挂起原语(suspend primitive)
  • 进程激活原语(active primitive)

进程关系的树型结构

优点

  • 资源分配严格:子进程仅能分配到父进程所拥有的资源,用完后归还。
  • 进程控制灵活:可根据需要给进程以不同的控制权限。
  • 进程结构清楚,关系明确。

进程的特征

  • 动态性:“执行”、“计算”、“运行过程”都强调动态性,进程的最基本特征。
  • 并发性:进程的重要特征,同时也是操作系统的重要特征。
  • 异步性:进程按各自独立的不可预知的顺序和速度向前推进,即进程按异步方式进行。 这导致了进程执行的不可再现性,因此,操作系统必须采用某些措施来限制各进程推进序列以保证各程序间正常、协调运行。
  • 独立性:进程是一个独立运行的基本单位,即是一个独立获得资源和独立调度的单位。
  • 制约性:一个进程的执行可能依赖其他进程的执行结果。
  • 结构性:每个进程有固定结构,包括程序、数据和PCB三部分。

3.3 进程调度

进程调度就是按照一定的算法,从就绪队列中选择某个进程占用CPU,对CPU资源进行合理的分配使用,以提高处理机利用率,并使各进程公平地得到处理机资源的方法

3.3.2 进程调度算法

1) 先进先出进程调度算法

2) 基于优先数的调度

3) 时间片轮转程序调度算法

系统规定一个时间长度作为允许进程运行的时间,如果进程在这段时间里没有执行完,它就必须让出CPU,等待下一次分配时间片.

时间就好像一个不停旋转的轮子,只有转到那个进程前,该进程才可以占用CPU,否则只有等待.

4) 多级队列轮转调度算法

解释见书p70

3.4 进程间的相互作用

3.4.1 进程间的同步和互斥

同步:一个进程的某个操作与协作进程的某个操作之间在时序上有一定的关系。如果协作进程的某个操作没有完成,那么该进程就要等待这个操作完成才能继续下去,这种需要相互合作、协同工作的进程之间的相互关系称为进程的同步。

互斥:当两个或两个以上进程竞争同一临界资源时,进程间的制约关系称为进程的互斥。

临界资源(独占资源):指在一 段时间内只允许一个进程访问的资源。

实现进程互斥的方法有硬件方法和软件方法. 软件方法中比较著名的有Dekker算法和Peterson算法

Dekker算法

设置一个整型变量turn,指示允许进入临界区的进程标识。假设现有两个进程P1和P2,当turn的值为1时,P1被允许进入;当turn的值为2时,P2被允许进入。进程退出临界区时,要把turn的值改为对方的标识符,就等于允许对方的进入。

Peterson算法

它除设置整型变量turn外,还为每一个进程设置一个标志,指示该进程是否进入临界区。假设还是两个进程,都在等待进入临界区。先检查对方的标志,如果不在临界区,则检查turn的值,以确定是否可以进入。

3.4.2 进程的同步机制

操作系统中使用更为一般的同步机制,即使用信号量及有关的P,V操作. 下面就来详细介绍这种方法

proberen意为检测,verhogen意为增量

P操作是检测整数变量是否为正值,若不是,则阻塞调用进程

V操作是唤醒一个阻塞进程恢复执行

信号量是表示资源的实体,是一个与队列有关的整形变量

信号量分为公用信号量和私用信号量

公用信号量用于实现进程间的互斥,初值通常设为1. 私用信号量用于实现进程间的同步,初始值通常设为0或n

信号量的数据结构定义如下

 struct semaphore  {    int value;    pointer_PCB queue; }

信号量声明

semaphore s;

P操作

P(s){    s.value = s.value - 1;    if (s.value < 0)  {       该进程状态置为阻塞状态;       将该进程的PCB插入相应的阻塞队列末尾       s.queue;    }}

V操作

V(s){  s.value = s.value + 1;  if (s.value < = 0)  {    唤醒相应阻塞队列s.queue中等待的一个进程    改变其状态为就绪态    并将其插入就绪队列   }}

信号量值的含义

s.value >= 0时,其值表示还有可用的资源数;
s.value < 0 时,其绝对值表示有多少个进程因申请该信号量表示的资源,得不到而进入阻塞态;

P操作与V操作的含义


进程互斥举例

例: “飞机订票系统”。一个飞机订票系统可以有多个订票处的n个订票终端。现假设n=2,公共数据区为Hi(i=1,2,…,m),分别存放各次班机的现存票数, Pi(i=1,2,…,n)表示售票终端的进程。

semaphore S;S = 1;   // 公用信号量cobegin {    process Pi (i=1,2,…,n){    int  temp;    按照定票要求找到单元Hi;    P(S);    temp = Hi ;         if  temp ≥ 1 {        temp =temp -1;        Hi = temp;        V(S);        输出一张票    }     else{        V(S);        输出提示“票已售完”;    }}coend

用PV操作实现司机与售票员同步,私有信号量S车,S门初值均为0

生产者与消费者问题

单缓冲区时

n个缓冲区时

n个缓冲区,k个生产者和m个消费者

3.4.3 读者,写者问题

多个读进程可以同时共享资源,但不能和写进程共享;写进程之间互斥,访问时必须独占资源。现假设读者优先。

需设置一个全局变量(readnum)对读进程进行计数,初值为0;

mutex是对readnum进行互斥操作的信号量,初值为1;

write是写信号量,为互斥信号量,初值为1;当第一个读进程开始进行访问时执行P操作,当最后一个读进程结束访问时执行V操作。

前面程序中,写者会出现“饥饿”现象,可以设计另一种算法,使写者优先,即当有进程读文件时,如果有写进程请求写,那么新的读进程被拒绝,待现有读进程读完后,立即让写进程开始运行,当无写进程运行时才让读进程运行。

设置信号量S实现读者与写者或写者之间的互斥,初值为1;用信号量Sn限制系统中最多n个进程,初值为n。

3.4.4 理发师问题

理发店里有一个理发师、一把理发椅、n把供等候理发的顾客坐的椅子。如果没有顾客,则理发师便在理发椅上睡觉。当一个顾客到来时,他必须先叫醒理发师,进行理发。如果理发师在理发时又有顾客到来,则如果有空椅子可坐,他就坐下来等,如果没有空椅子,他就离开。为理发师和顾客各编写一段程序描述他们的行为,要求不能带有竞争条件。

设三个信号量:

1)customers,用来记录等待理发师的顾客数(不包括正在理发的顾客),初值为0;
2)barbers,记录正在等候顾客的理发师数,为0或1,初值为0;
3)mutex,用于互斥,初值为1。还需一个变量waiting,初值为0,也用于记录等候的顾客数,实际上是customers的一个副本。

之所以使用waiting是因为无法读取信号量的当前值。在该解法中,进入理发店的顾客必须先看等待的 顾客数,如果少于椅子数,他留下来等,否则他就离开。

管程

信号量虽然解决了同步的问题,但是很容易造成死锁的问题. 所以我们引入了管程这个抽象数据类型.

任一时刻,管程中只能有一个活跃进程。进程可以调用管程中的过程,但不能在管程外的过程中直接访问管程内的数据结构。

但是管程也有支持的编程语言过少这种缺点

3.6 线程

进程作为调度的基本单位的问题

  • 调度工作量大,耗费系统资源;
  • 进程间通信延迟大,频率高的通信过程效率低下;
  • 没有达到理想的并行度。

线程(thread):也叫轻型进程,是可执行的实体单元,可代替以往的进程,是处理机调度的基本单位。

多线程:单个进程中执行多个线程。典型操作系统有Windows NT、Solaris、Mach和OS/2。
在多线程环境中,进程被定义为保护单位和资源分配单位,在一个进程内部可以有多个线程(通常,线程间不存在父子关系,它们之间是平等的)。

线程的特征

执行状态包括创建、就绪、运行、阻塞等
当不处于执行状态时,要保存线程上下文环境
一个执行栈
进程中的所有线程共享所属进程内的主存和其它资源。

进程和线程的区别

单进程单线程:进程就是线程,线程就是进程。
单进程多线程:一个进程中包括多个线程,共享该进程的资源。当一个线程修改了数据,其它线程将读出修改后的数据。
多进程单线程:等价于单进程单线程的并发执行。
多进程多线程:多个进程并发执行,每个进程内多个线程并发执行。进程内线程也存在调度问题。

线程和进程的比较

调度方法类似:线程调度是在运行进程内部的调度;
都具有并发性:进程的并发执行转化为线程的并发执行;
同一进程中的线程共享进程的资源和状态,但这些资源和状态不归线程所有。线程具有寄存器和栈,进程具有PCB、用户地址空间、执行程序和数据。
进程调度开销比线程调度开销大得多。

多线程降低了时间开销

线程的实现机制

用户级线程

  1. 由应用程序完成所有线程的管理
  2. 核心不知道线程的存在
  3. 线程切换不需要核心态的权限

但是这样的方式也是有缺点的. 如果核心阻塞进程,那么这个进程所有的线程都会被阻塞

核心级线程

  1. 所有的线程的管理由核心来完成
  2. 核心维护进程和线程的上下文
  3. 线程之间的切换需要核心的支持

核心级线程具有以下显著的优点

  1. 对于多处理器,核心可以调用同一进程的多个线程
  2. 阻塞发生在线程级
  3. 运行的程序是多线程的

但是其缺点就是调用内核导致速度变慢

我们可以结合二者的优势来创建一种新的方法

3.7 UNIX进程模型

多进程单线程模型

Unix的进程由三部分组成:

  1. proc结构:常驻内存的PCB;
  2. 数据段:包括进程系统数据区、数据栈和用户栈;
  3. 正文段:代码段,其共享正文段的起始块号存放于text表中;

多进程多线程模型

其中的进程是执行程序实例的线程. 线城是CPU调度的单位,每一个进程都有一个主线程

原创粉丝点击