【操作系统】02-进程的描述与控制

计算机操作系统——进程



第二章 进程的描述与控制

2.1 前趋图和程序执行

2.1.1 前趋图(Precedence Graph)

前趋图是指一个有向无循环图,可记为 DAG(Directed Acyclic Graph),用于描述进程之间执行的先后顺序。

图中的每个结点可用于描述一个程序段或进程,乃至一条语句;结点间的有向边则用于表示两个结点之间存在的偏序(Partial Order,亦称偏序关系) 或前趋关系(Precedence Relation)

如果进程Pi和Pj存在前趋关系,可表示为 (Pi,Pj)∈→,也可写成 Pi→Pj,表示在Pj开始执行前Pi必须完成。称 Pi 是 Pj 的直接前趋,而称 Pj 是 Pi 的直接后继。

在前趋图中,把没有前趋的结点称为初始结点(Initial Node),把没有后继的结点称为终止结点(Final Node)。此外,每个结点还具有一个重量(Weight),用于表示该结点所含有的程序量或结点的执行时间。

2.1.2 程序顺序执行

通常可以把一个应用程序分成若干个程序段,在各程序段之间,必须按照某种先后次序顺序执行,仅当前一操作(程序段)执行完后,才能执行后继操作。

特征

  1. 顺序性:处理机严格地按照程序所规定的顺序执行,即每一操作必须在上一个操作结束之后开始,在下一个操作开始之前结束。
  2. 封闭性:程序运行时独占全机资源,资源的状态(除初始状态外)只有本程序才能改变它,程序一旦开始执行,其结果不受外界因素影响。
  3. 可再现性:只要程序执行时的环境和初始状态相同,当程序重复执行时,不论它时从头到尾不停顿地执行,还是“停停走走”地执行,都可获得相同的结果。

2.1.3 程序并发执行

只有在不存在前趋关系的程序之间才有可能并发执行。

对于具有下述四条语句的程序段:

S1 :a=x+2
S2 :b=y+4
S3 :c=a+b
S4 :d=c+b

可以看出:S3必须在 a 和 b 被赋值后方能执行;S4必须在S3之后执行;但 S1和 S2则可以并发执行,因为它们彼此互不依赖。

特征

  1. 间断性:程序在并发执行时,由于它们共享系统资源,以及为完成同一项任务而相互合作,致使在这些并发执行的程序之间,形成了相互制约的关系。相互制约将导致并发程序具有“执行—暂停—执行”这种间断性的活动规律。
  2. 失去封闭性:程序在并发执行时,是多个程序共享系统中的各种资源,因而这些资源的状态将由多个程序来改变,致使程序的运行失去了封闭性。
  3. 不可再现性:程序在并发执行时,由于失去了封闭性,也将导致其再失去可再现性。

2.2 进程的描述

2.2.1 进程的定义和特征

定义

为使参与并发执行的每个程序(含数据)都能独立运行,在操作系统中必须为之配置一个专门的数据结构,称为进程控制块(Process Control Block, PCB)。

由程序段、相关的数据段和 PCB 三部分构成了进程实体,又称进程映像。一般情况下,我们把进程实体简称为进程

所谓创建进程,实质上是创建进程实体中的 PCB;而撤消进程,实质上是撤消进程的 PCB。

较典型定义:

  1. 进程是程序的一次执行。
  2. 进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
  3. 进程是具有独立功能的程序在一个数据集合上运行的过程。它是系统进行资源分配和调度的一个独立单位。

传统OS定义:

  • 进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。

特征

  1. 动态性:进程的实质是进程实体的执行过程。进程实体有一定的生命期,而程序则只是一组有序指令的集合,是静态的。
  2. 并发性:多个进程实体同存于内存中,且能在一段时间内同时运行。
  3. 独立性:在传统的OS中,进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单位。
  4. 异步性:进程按各自独立的、 不可预知的速度向前推进。

2.2.2 进程的基本状态及转换

三种基本状态

  • 就绪(Ready)状态:进程已分配到除 CPU 以外的所有必要资源,只要再获得 CPU,便可立即执行。
  • 执行(Running)状态:进程已获得 CPU,其程序正在执行。
  • 阻塞(Block)状态:进程的执行受到阻塞。

状态转换

处于就绪状态的进程,在调度程序为之分配了处理机之后,该进程便可执行,相应地,它就由就绪状态转变为执行状态。正在执行的进程也称为当前进程,如果因分配给它的时间片已完而被暂停执行时,该进程便由执行状态又回复到就绪状态;如果因发生某事件而使进程的执行受阻(例如,进程请求访问某临界资源,而该资源正被其它进程访问时),使之无法继续执行,该进程将由执行状态转变为阻塞态。

创建状态和终止状态

创建状态

  1. 首先由进程申请一个空白PCB,并向PCB中填写用于控制和管理进程的信息;
  2. 然后为该进程分配运行时所必须的资源;
  3. 最后把该进程转入就绪状态并插入就绪队列之中。

如果进程所需的资源尚不能得到满足,比如系统尚无足够的内存使进程无法装入其中,此时创建工作尚未完成,进程不能被调度运行,于是把此时进程所处的状态称为创建状态

终止状态

  1. 首先等待操作系统进行善后处理;
  2. 最后将其PCB清零,并将PCB空间返还系统。

当一个进程到达了自然结束点,或是出现了无法克服的错误,或是被操作系统所终结,或是被其他有终止权的进程所终结,它将进入终止状态

2.2.3 挂起操作和进程状态的转换

引入挂起操作的原因:

  1. 终端用户的需要
  2. 父进程请求
  3. 负荷调节的需要
  4. 操作系统的需要

三个进程状态转换

引入挂起原语 suspend 和 激活原语 active 后:

  1. 活动就绪→静止就绪。

    当进程处于未被挂起的就绪状态时,称此为活动就绪状态,表示为 Readya,此时进程可以接受调度。当用挂起原语 Suspend 将该进程挂起后,该进程便转变为静止就绪状态,表示为 Readys,处于 Readys 状态的进程不再被调度执行。

  2. 活动阻塞→静止阻塞。

    当进程处于未被挂起的阻塞状态时,称它是处于活动阻塞状态,表示为 Blockeda。当用 Suspend 原语将它挂起后,进程便转变为静止阻塞状态,表示为 Blockeds。处于该状态的进程在其所期待的事件出现后,将从静止阻塞变为静止就绪。

  3. 静止就绪→活动就绪。

    处于 Readys 状态的进程,若用激活原语 Active 激活后,该进程将转变为 Readya状态。

  4. 静止阻塞→活动阻塞。

    处于 Blockeds 状态的进程,若用激活原语 Active 激活后,该进程将转变为 Blockeda 状态。

五个进程状态转换

引进创建和终止状态后:

  1. NULL→创建:一个新进程产生时,该进程处于创建状态。
  2. 创建→活动就绪:在当前系统的性能和内存的容量均允许的情况下,完成对进程创建的必要操作后,相应的系统进程将进程的状态转换为活动就绪状态。
  3. 创建→静止就绪:考虑到系统当前资源状况和性能要求,不分配给新建进程所需资源,主要是主存,相应的系统进程将进程状态转为静止就绪状态,被安置在外存,不参与调度,此时进程创建工作尚未完成。
  4. 执行→终止:当一个进程已完成任务时,或是出现了无法克服的错误,或是被OS或其他有终止权的进程所终结,进程即转换为终止状态。

2.2.4 进程管理的数据结构

OS管理的这些数据结构一般分为以下四类:
内存表、设备表、文件表、进程表(进程控制块PCB)

PCB

为了便于系统描述和管理进程的运行,系统为每个进程定义了一个数据结构——进程控制块 PCB(Process Control Block)。它是进程实体的一部分,是操作系统中最重要的记录型数据结构。

PCB的作用

  1. 作为独立运行基本单位的标志
  2. 能实现间断性运行方式
  3. 提供进程管理所需要的信息
  4. 提供进程调度所需要的信息
  5. 实现与其他进程的同步与通信

PCB中的信息

  1. 进程标识符:用于唯一地标识一个进程。

    通常有两种:外部标识符、内部标识符。

    外部标识符 内部标识符
    方便用户(进程)访问 方便系统对进程的使用
    由字母、数字组成 唯一的数字标识符
    创建者提供 操作系统设置
  2. 处理机状态:处理机状态信息也称为处理机的上下文,主要是由处理机的各种寄存器中的内容组成的。

    寄存器类型 作用
    通用寄存器 用户程序可访问,用于暂存信息
    指令计数器 存放要访问的下一条指令的地址
    程序状态字PSW 含有状态信息,如条件码、执行方式、中断屏蔽标志等
    用户栈指针 存放过程和系统调用参数及调用地址。栈指针指向该栈的栈顶
  3. 进程调度信息

    1. 进程状态,指明进程的当前状态,它是作为进程调度和对换时的依据;
    2. 进程优先级,是用于描述进程使用处理机的优先级别的一个整数,优先级高的进程应优先获得处理机;
    3. 进程调度所需的其它信息,它们与所采用的进程调度算法有关,比如,进程已等待CPU的时间总和、进程已执行的时间总和等;
    4. 事件,是指进程由执行状态转变为阻塞状态所等待发生的事件,即阻塞原因
  4. 进程控制信息

    1. 程序和数据的地址,进程实体中的程序和数据的内存或外存地(首)址,以便再调度到该进程执行时,能从PCB中找到其程序和数据;
    2. 进程同步和通信机制,这是实现进程同步和进程通信时必需的机制,如消息队列指针、信号量等,它们可能全部或部分地放在PCB中;
    3. 资源清单,在该清单中列出了进程在运行期间所需的全部资源(CPU以外),另外还有一张已分配到该进程的资源的清单;
    4. 链接指针,它给出了本进程(PCB)所在队列中的下一个进程的 PCB 的首地址。

PCB的组织方式

  1. 线性方式
  2. 链接方式
  3. 索引方式

2.3 进程控制

2.3.1 操作系统内核*

支撑功能

  1. 中断处理
  2. 时钟管理
  3. 原语操作

资源管理功能

  1. 进程管理
  2. 存储器管理
  3. 设备管理

2.3.2 进程的创建

层次结构与进程图

在OS中,允许一个进程创建另一个进程,通常把创建进程的进程称为父进程(Parent Process),而把被创建的进程称为子进程(Progeny Process)。

进程图(Process Graph)是用于描述一个进程的家族关系的有向树。创建父进程的进程称为祖先进程,这样便形成了一棵进程树,把树的根结点作为进程家族的祖先(Ancestor)。

引起创建进程的典型事件

  1. 用户登录
  2. 作业调度
  3. 提供服务
  4. 应用请求

进程的创建(Creation of Process)

  1. 申请空白 PCB。为新进程申请获得唯一的数字标识符,并从PCB集合中索取一个空白PCB。
  2. 为新进程分配其运行所需的资源。包括各种物理和逻辑资源,如内存、文件、I/O设备和 CPU 时间等。
  3. 初始化进程控制块(PCB)。包括:初始化标识信息;初始化处理机状态信息;初始化处理机控制信息。
  4. 将新进程插入就绪队列。如果进程就绪队列能够接纳新进程,便将新进程插入就绪队列。

2.3.3 进程的终止

引起进程终止的事件

  1. 正常结束

  2. 异常结束

    1. 越界错误。这是指程序所访问的存储区已越出该进程的区域。
    2. 保护错。这是指进程试图去访问一个不允许访问的资源或文件,或者以不适当的方式进行访问,例如,进程试图去写一个只读文件。
    3. 非法指令。这是指程序试图去执行一条不存在的指令。出现该错误的原因,可能是程序错误地转移到数据区,把数据当成了指令。
    4. 特权指令错。这是指用户进程试图去执行一条只允许 OS 执行的指令。
    5. 运行超时。这是指进程的执行时间超过了指定的最大值。
    6. 等待超时。这是指进程等待某事件的时间超过了规定的最大值。
    7. 算术运算错。这是指进程试图去执行一个被禁止的运算,例如被 0 除。
    8. I/O 故障。这是指在 I/O 过程中发生了错误等。
  3. 外界干预

    1. 操作员或操作系统干预。
    2. 父进程请求。
    3. 父进程终止。

进程的终止过程

OS 调用进程终止原语,按下述过程执行:

  1. 检索PCB。根据被终止进程的标识符,从 PCB 集合中检索出该进程的 PCB,从中读出该进程的状态。
  2. 终止进程执行。若被终止进程正处于执行状态,应立即终止该进程的执行,并置调度标志为真,用于指示该进程被终止后应重新进行调度。
  3. 终止子进程。若该进程还有子孙进程,还应将其所有子孙进程予以终止,以防它们成为不可控的进程。
  4. 归还资源。将被终止进程所拥有的全部资源,或者归还给其父进程,或者归还给系统。
  5. 移出队列。将被终止进程(PCB)从所在队列(或链表)中移出,等待其他程序来搜集信息。

2.3.4 进程的阻塞与唤醒

引起进程阻塞和唤醒的事件

  1. 向系统请求共享资源失败
  2. 等待某种操作的完成
  3. 新数据尚未到达
  4. 等待新任务的到达

进程阻塞过程

进程的阻塞是进程自身的一种主动行为。

进入 block 过程后,由于此时该进程还处于执行状态,所以应先立即停止执行,把进程控制块中的现行状态由“执行”改为“阻塞”,并将 PCB 插入阻塞队列。

如果系统中设置了因不同事件而阻塞的多个阻塞队列,则应将本进程插入到具有相同事件的阻塞队列。

最后,转调度程序进行重新调度,将处理机分配给另一就绪进程,并进行切换,亦即,保留被阻塞进程的处理机状态(在 PCB 中),按新进程的PCB中的处理机状态设置 CPU 的环境。

进程唤醒过程

当被阻塞进程所期待的事件发生时,比如它所启动的I/O操作已完成,或其所期待的数据已经到达,则由有关进程(比如提供数据的进程)调用唤醒原语wakeup,将等待该事件的进程唤醒。

wakeup的执行过程:首先把被阻塞的进程从等待该事件的阻塞队列中移出,将其PCB中的现行状态由阻塞改为就绪,然后再将该PCB插入到就绪队列中。

block 原语和 wakeup 原语是一对作用刚好相反的原语,在使用它们时,必须成对使用

2.3.5 进程的挂起与激活

进程的挂起

当出现引起进程挂起的事件时,OS将利用挂起原语suspend将指定进程或处于阻塞状态的进程挂起。

suspend的执行过程:首先检查被挂起进程的状态,若处于活动就绪状态,便将其改为静止就绪;对于活动阻塞状态的进程,则将之改为静止阻塞。

进程的激活过程

当系统中发生激活进程的事件时,OS将利用激活原语active,将指定进程激活。

active的执行过程:激活原语先将进程从外存调入内存,检查该进程的现行状态,若是静止就绪,便将之改为活动就绪;若为静止阻塞,便将之改为活动阻塞。


2.4 进程同步

2.4.1 进程同步的基本概念

两种形式的制约关系

  1. 间接相互制约关系:由于在并发执行时共享系统资源。互斥问题
  2. 直接相互制约关系:源于进程间的相互合作。同步问题

临界资源(Critical Resouce)

一段时间内只允许一个进程访问的资源。许多硬件资源如打印机、磁带机等,都属于临界资源,诸进程间应采取互斥方式,实现对这种资源的共享。

生产者-消费者问题*

临界区(critical section)

人们把在每个进程中访问临界资源的那段代码称为临界区

若能保证诸进程互斥地进入自己的临界区,便可实现诸进程对临界资源的互斥访问。为此,每个进程在进入临界区之前,应该先对欲访问的临界资源进行检查,看它是否正在被访问。

在临界区前面增加一段用于进行上述检查的代码,称为进入区(entry section)。
在临界区后面也要加上一段称为退出区(exit section)的代码,用于将临界区正被访问的标志恢复为未被访问的标志。
进程中除了上述进入区、临界区及退出区之外的其它部分的代码,都称为剩余区(remainder section)。

访问临界资源的循环进程描述如下:

repeat 
   entry section
   critical section
   exit section
   remainder section
until false;

同步机制应遵循的规则

四条准则:

  • 空闲让进

    当无进程处于临界区时,表明临界资源处于空闲状态,应允许一个请求进入临界区的进程立即进入自己的临界区,以有效地利用临界资源。

  • 忙则等待
    当已有进程进入临界区时,表明临界资源正在被访问,因而其它试图进入临界区的进程必须等待,以保证对临界资源的互斥访问。

  • 有限等待

    对要求访问临界资源的进程,应保证在有限时间内能进入自己的临界区,以免陷入“死等”状态。

  • 让权等待
    当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入“忙等”状态。

2.4.2 硬件同步机制*

  1. 关中断
  2. 利用 Test-and-Set 指令实现互斥
  3. 利用Swap指令实现进程互斥

2.4.3 信号量机制

  1. 整型信号量

    除初始化外,仅能通过两个标准的原子操作wait(S)和signal(S)访问,分别称为P、V操作。(原子操作,执行时是不可中断的)

    wait(S){
      while(S<=0);			/*  do no-op */
      S--;
    }
    signal(S){
      S++;
    }
    
  2. 记录型信号量

    记录型信号量机制是一种不存在“忙等”现象的进程同步机制。
    但在采取了“让权等待”的策略后,又会出现多个进程等待访问同一临界资源的情况。为此,在信号量机制中,除了需要一个用于代表资源数目的整型变量value外,还应增加一个进程链表指针list,用于链接上述的所有等待进程。

    typedef struct {
    	int value;
    struct process_control_block *list;
    }semaphore;
    
    wait(semaphore *S){
     S->value--;
     if (S->value<0) block(S->list); 
    }
    signal(semaphore *S){
     S->value ++;
     if (S->value<=0) wakeup(S->list);
    }
    

    S->value的值:
    若 <0,表示因竞争失败而被挂起的资源数目;
    若 =0,表示资源为空;
    若 >0,表示资源的可用数目。

  3. AND信号量

    AND同步机制的基本思想:将进程在整个运行过程中需要的所有资源,一次性全部地分配给进程,待进程使用完后再一起释放。

  4. 信号量集

2.4.4 信号量的应用*

2.4.5 管程机制*

定义

一个管程定义了一个数据结构和能为并发进程所执行的一组操作,这组操作能同步进程和改变管程中的数据。

特性

  1. 模块化
  2. 抽象数据类型
  3. 信息掩蔽

管程和进程的区别

  1. 虽然二者都定义了数据结构,但进程定义的是私有数据结构 PCB,管程定义的是公共数据结构,如消息队列等;
  2. 二者都存在对各自数据结构上的操作,但进程是由顺序程序执行有关的操作,而管程主要是进行同步操作和初始化操作;
  3. 设置进程的目的在于实现系统的并发性,而管程的设置则是解决共享资源的互斥使用问题;
  4. 进程通过调用管程中的过程对共享数据结构实行操作,该过程就如通常的子程序一样被调用,因而管程为被动工作方式,进程则为主动工作方式;
  5. 进程之间能并发执行,而管程则不能与其调用者并发;
  6. 进程具有动态性,由“创建”而诞生,由“撤销”而消亡,而管程则是操作系统中的一个资源管理模块,供进程调用。

条件变量*


2.5 经典进程的同步问题

2.5.1 生产者-消费者问题(The proceducer-consumer problem)

描述:有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程与消费者进程能并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程将它所生产的产品放入一个缓冲区中;消费者进程可从一个缓冲区中取走产品去消费。尽管所有的生产者进程和消费者进程都是以异步方式运行的,但它们之间必须保持同步,即不允许消费者进程到一个空缓冲区去取产品,也不允许生产者进程向一个已装满产品且尚未被取走的缓冲区中投放产品。

  1. 利用记录型信号量解决生产者-消费者问题

    假定在生产者和消费者之间的共用缓冲池中具有 n 个缓冲区,这时可以利用互斥信号量mutex(初始值 1)实现进程对缓冲池的互斥作用;利用信号量 empty(初始值为n)和 full(初始值为0)分别表示缓冲池中空缓冲区和满缓冲区的数量。又假定这些生产者和消费者相互等效,只要总缓冲区未满,生产者便可将消息送入缓冲池中,只要缓冲池没空,消费者便可从缓冲池中取走一个消息。

    int in=0, out=0;
    item buffer[n];
    semaphore mutex =1, empty = n, full = 0;
    void producer(){
    	do{
    		producer an item next p;	//生产者产生一条消息
    		...
    		P(empty);	//判断缓冲池中是否仍有空闲的缓冲区
    		P(mutex);	//判断是否可以进入临界区(操作缓冲池)
    		buffer[in] = nextp;	//向缓冲池中投放消息
    		in = (in+1) % n;	//移动入队指针
    		V(mutex);	//退出临界区,允许别的进程操作缓冲池
    		V(full);	//缓冲池中数量的增加,可以唤醒等待的消费者进程。
    	}while(TRUE);
    }
    void consumer(){
    	do{
    		P(full);	//判断缓冲池中是否有非空的缓冲区
    		P(mutex);	//判断是否可以进入临界区(操作缓冲池)
    		nextc = buffer[out];
    		out = (out+1) % n;	//移动出队指针
    		V(mutex);	//退出临界区,允许别的进程操作缓冲池
    		V(empty);	//缓冲池中空缓冲区数量加1,可以唤醒等待的生产者进程
    		consumer the item in nextc;	//消费消息
    		...
    	}while(TRUE);
    }
    

    注:

    1. 在每个程序中用于实现互斥的 P:wait(mutex)和V: signal(mutex) 必须成对地出现
    2. 对资源信号量 empty 和 full 的 wait 和 signal 操作,同样需要成对地出现,但它们分别处于不同的程序中
    3. 在每个程序中的多个 wait 操作顺序不能颠倒
  2. 利用AND信号量解决生产者-消费者问题

    • 用 Swait(empty,mutex) 来代替 wait(empty) 和 wait(mutex)
    • 用 Ssignal(mutex,full) 来代替 signal(mutex) 和 signal(full)
    • 用 Swait(full,mutex) 来代替 wait(full) 和 wait(mutex)
    • 用 Ssignal(mutex,empty) 来代替 signal(mutex) 和 signal(empty)
  3. 利用管程来解决生产者-消费者问题*

2.5.2 哲学家进餐问题(The Dinning Philosophers Problem)

描述:有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子,他们的生活方式是交替地进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐。进餐完毕,放下筷子继续思考。

  1. 利用记录型信号量解决哲学家进餐问题

    方法:当哲学家饥饿时,总是先去拿他左边的筷子,即执行 wait(chopstick[i]);成功后,再去拿他右边的筷子,即执行 wait(chopstick[(i+1)mod 5]);又成功后便可进餐。进餐完毕,又先放下他左边的筷子,然后再放右边的筷子。

    该方法可保证不会有两个相邻的哲学家同时进餐,但有可能引起死锁。

    解决死锁方法:

    1. 至多只允许四位哲学家同时去拿左边的筷子,最终能保证至少有一位哲学家能够进餐,并在进餐后释放两只筷子。
    2. 仅当哲学家的左、右两只筷子均可用时,才允许他进餐。
    3. 规定奇数号哲学家先拿他左边的筷子,然后再去拿右边的筷子,而偶数号哲学家则相反。
  2. 利用AND信号量解决哲学家进餐问题

    要求每个哲学家先获得两个临界资源(筷子)后方能进餐,本质就是 AND 同步问题,故用使用 AND 信号量机制是最简洁的解法。

2.5.3 读者-写者问题(Reader-Writer Problem)

描述:一个数据文件或记录,可被多个进程共享,把只要求读该文件的进程称为 Reader 进程,其他进程则称为 Writer 进程。允许多个进程同时读一个共享对象,但不允许一个 Writer 进程和其他 Reader 进程或 Writer 进程同时访问共享对象。

所谓读者—写者问题,是指保证一个 Writer 进程必须与其他进程互斥地访问共享对象的同步问题。

  1. 读者优先
  2. 写者优先
  3. 公平竞争

详细参考:https://blog.csdn.net/yanfeivip8/article/details/12527047


2.6 进程通信*

2.6.1 进程通信的类型

  1. 共享存储器系统(Shared-Memory System)
    两种类型:基于共享数据结构的通信方式;基于共享存储区的通信方式。

  2. 管道(pipe)通信系统
    管道是指用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件,又名pipe文件。

  3. 消息传递系统(Message passing system)
    以格式化的消息(message)为单位,将通信的数据封装在消息中,利用OS提供的一组通信命令(原语,send/receive),完成进程间的数据交换。

  4. 客户机-服务器系统(Client-Server system)

    三种实现方法:套接字(socket);远程过程调用(RPC);远程方法调用(RMC)


2.7 线程(Threads)的基本概念

2.7.1 线程的引入

在操作系统中引入进程的目的,是为了使多个程序能并发执行,以提高资源利用率和系统吞吐量,那么,在操作系统中再引入线程,则是为了减少程序在并发执行时所付出的时空开销,使 OS 具有更好的并发性。

进程的两个基本属性:进程是一个可拥有资源的独立单位;进程同时又是一个可独立调度和分派的基本单位。

进程并发执行所需付出的时空开销:创建进程;撤消进程;进程切换。

线程——作为调度和分配的基本单位

2.7.2 线程与进程的比较

特性 进程 线程
调度的基本单位 在传统OS中,进程是作为独立调度和分配的基本单位,因而进程是能独立运行的基本单位。 在引入线程的OS中,线程作为调度和分配的基本单位,因而线程是能独立运行的基本单位。
并发性 进程之间可以并发执行。 在引入线程的OS中,不仅进程之间可以并发执行,一个进程中的多个线程之间亦可并发执行,甚至一个进程中的所有线程都能并发执行。不同进程中的线程也能并发执行。
拥有资源 进程可以拥有资源,并作为系统中拥有资源的一个基本单位。 线程本身并不拥有系统资源,而是仅有一点必不可少的、能保证独立运行的资源。
独立性 不同进程之间具有独立性。 在同一进程中的不同线程之间的独立性要比不同进程之间的独立性低得多。它们共享进程的内存地址空间和资源。
系统开销 在创建或撤消进程时,系统都要为之分配和回收进程控制块、分配或回收其它资源。OS为此所付出的开销明显大于线程创建或撤消时所付出的开销。 由于一个进程中的多个线程具有相同的地址空间,线程之间的同步和通信也比进程的简单。在一些OS中,线程的切换、同步和通信都无需OS内核的干预。
支持多处理机系统 在多处理机系统中,对于传统的进程,即单线程进程,不管有多少处理机,该进程只能运行在一个处理机上。 对于多线程进程,可以将一个进程中的多个线程分配到多个处理机上,使它们并行执行。

2.7.3 线程的状态和线程控制块

线程运行的三个状态:

  1. 执行状态
  2. 就绪状态
  3. 阻塞状态

线程控制块TCB:系统为每个线程配置了一个线程控制块TCB,将所有用于控制和管理线程的信息记录在线程控制块中。

多线程OS中的进程属性

  1. 进程是一个可拥有资源的基本单位
  2. 多个线程可并发执行
  3. 进程已不再是可执行的实体

2.8 线程的实现*

2.8.1 线程的实现方式

  1. 内核支持线程 KST(Kernel Supported Threads)
  2. 用户级线程 ULT(User Level Threads)
  3. 组合方式


posted @ 2022-11-08 22:52  0dot7  阅读(130)  评论(0编辑  收藏  举报