操作系统原理课堂笔记——第二章进程的描述与控制

本文深入探讨了操作系统中的进程管理,包括进程的描述、状态转换、同步与通信、线程概念及其与进程的比较。重点阐述了前趋图、程序并发执行的特征、进程的创建与终止、阻塞与唤醒、挂起与激活,以及信号量和管程机制。同时介绍了线程的引入、优缺点和实现方式,强调了线程在提高并发性和系统效率上的作用。
摘要由CSDN通过智能技术生成

2.1 前趋图和程序执行

2.1.1 前趋图

前趋图(Precedence Graph)
• 一个有向无循环图,记为DAG。用于描述进程之间执行的先后顺序。
• 结点:可表示一个语句、一个程序段或一个进程;
• 有向边:描述程序或程序段之间执行的前后关系
• 注意:前趋图中不能存在循环
前趋关系“→”

2.1.2 程序顺序执行

1. 程序的顺序执行
• 一个程序由若干程序段组成,这些程序段的执行必须是顺序的;同时程序与程序之间也必须顺序执行。

2.程序顺序执行时的特征
•顺序性:指处理机严格地按照程序所规定的顺序执行。
•封闭性:指程序在封闭的环境下运行,即程序运行时独占全机资源。
•可再现性:只要程序执行时的环境和初始条件相同,执行结果然相同。

2.1.3 程序并发执行

(一段时间内有多个程序)
1.程序的并发执行
•多个程序同时在系统中运行,这些程序的执行在时间上是重叠的,即前一程序的执行尚未结束,后一程序的执行已经开始。


•程序与程序之间、同一程序中程序段与程序段之间均可并发执行。
2. 程序并发执行时的特征
• 间歇性:程序执行有“执行-- 暂停–执行”的活动规律。
• 失去封闭性:在系统资源共享是程序执行时,必然受到参与并发执行的其它程序的影响。
•不可再现性:计算结果与并发程序执行速度有关。即同一程序,使用相同输入、在相同环境下运行,却可能获得完全不同的结果。
例 子 \color{red}{例子}


程序并发执行的条件(Bernstein条件,1966年提出)
• 若两个程序p1和p2能满足下述条件,它们便能并发执行,且具有可再现性:R(P1)∩W(P2)∪R(P2)∩W(P1)∪W(P1)∩W(P2)={}
• 当两个程序的读集与写集的交集以及写集与写集的交集都为空时,它们可以并发执行。
• 其中:
读集R(pi):程序pi在执行期间要参考的所有变量的集合;
写集W(pi):程序pi在执行期间要改变的所有变量的集合。
• 注:在实际的程序执行过程中很难对这个条件进行检查。
OS基本特性:并发和共享

2.2 进程的描述

2.2.1 进程的定义和特征

1. 进程的定义
• 曾经的定义
进程是程序的一次执行;
进程是可以和别的计算并发执行的计算;
进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立
单位。
• 教材中的定义
进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
2. 进程的特征
1)动态性
由“创建”而产生,由“调度”而执行;由得不到资源而阻塞;由撤消而消亡。(而程序是静态的)。
2)并发性
只有建立了进程,才能并发执行。
3)独立性
独立运行,独立获得资源和接受调度的基本单位。
4)异步性
间断性:进程按各自独立的、不可预知的速度向前推进。

4. 进程与程序的区别和联系
(1)程序是静态的,进程是动态的。程序是有序代码的集合;进程是程序的一次执行。
(2)进程是暂时的,程序的永久的。进程是一个变化的过程,有生命周期,暂时存在,程序没有生命周期,可长久保存。
(3)进程还是操作系统资源分配和保护基本单位,程序没有此功能。
(4)进程与程序的对应关系。通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包括多个程序。
(5)进程与程序的结构不同。

2.2.2 进程的基本状态及转换

1. 进程的三种基本状态
(1)就绪状态(ready)(无CPU)
进程等待分配CPU。系统中同时处于就绪状态的进程会排成一个或多个就绪队列。
(2)执行状态(running)
进程正占用CPU执行其程序中的指令。在单处理机系统中,任何时刻至多只有一个进程处于执行状态。
(3)阻塞状态(blocked) (等待状态)
进程在等待某个事件的发生,故也称为等待状态(waiting)。系统按等待原因的不同将阻塞状态的进程排成多个阻塞队列。
(阻塞到运行、就绪到阻塞都不会出现)

3. 创建状态和终止状态
• 创建状态
进程所需的资源尚不能得到满足,创建工作尚未完成,进程不能被调度运行,于是把此时进程所处的状态称为创建状态。
• 终止状态
进程已经结束执行。

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

1. 挂起操作的引入
• 终端用户的需要
• 父进程请求
• 负荷调节的需要
• 操作系统的需要
2. 引入挂起原语操作后三个进程状态的转换
• 增加了两个状态
• 挂起就绪(静止就绪)Readys
• 挂起阻塞(静止阻塞)Blockeds
• 活动就绪→静止就绪
• 活动阻塞→静止阻塞
• 静止就绪→活动就绪
• 静止阻塞→活动阻塞

2.2.4 进程管理中的数据结构

1. 操作系统中用于管理控制的数据结构
创建进程时创建PCB,撤销进程时同时撤销PCB
进程:程序+PCB
内存表、设备表、文件表和用于进程管理的进程表(PCB)

进程控制块(PCB)
定义:是操作系统用来记录进程详细状态和相关信息的基本数据结构,它和进程一一对应的,是进程存在的唯一标识
说明:
• PCB只能OS访问,不允许用户进程访问。
• 一个系统中的PCB数目是一定的,它规定了该系统可同时拥有的进程的最大数目。
• 每个PCB是系统PCB表中的一个表目。
• PCB表常驻内存,存放于OS中专门开辟的PCB区。
• PCB的组织方式可采用链接方式索引方式
2. 进程控制块PCB的作用
(1) 作为独立运行基本单位的标志
(2) 能实现间断性运行方式
(3) 提供进程管理所需要的信息
(4) 提供进程调度所需要的信息
(5) 实现与其它进程的同步与通信


4. 进程控制块的组织方式
数目:一个系统中,数十个、数百个甚至数千个
(1)线性方式
将系统中所有的PCB都组织在一张线性表中

(2)链接方式
把具有同一状态的PCB链接成一个队列
就绪队列、若干个阻塞队列、空队列

(3)索引方式
建立相应的索引表
就绪索引表、阻塞索引表

2.3 进程控制

2.3.1 操作系统内核

操作系统内核
• 操作系统内核安排在紧靠硬件的软件层次中,常驻内存。
处理机状态
• 系统态:管态。
它具有较高的特权,能执行一切指令,访问所有寄存器和存储区。
• 用户态:目态。
它具有较低的特权,仅能执行规定的指令,访问指定的寄存器和存储区
1. 支撑功能
(1)中断处理。
• 中断处理是内核最基本的功能,是整个操作系统活动的基础。
(2)时钟管理。
• 时钟管理是内核的一项基本功能。
(3)原语操作。
• 原语是完成一定功能的一个过程。
原语操作(Atomic Operation)
• 原语是操作系统内核中由若干条指令构成用于完成特定功能的小过程(函数)。
• 原语是一个不可分割的基本单位。原语在执行过程中不允许中断。原语是
“原子操作”。
• 在系统态下执行,常驻内存。原语属于OS内核(Kernal)。
• 分类
进程控制原语
进程通信原语
进程管理原语
其他方面的原语
2. 资源管理功能
(1) 进程管理
将进程管理中使用频繁的模块或所需的原语放在内核中。
(2) 存储器管理
将存储管理中使用频率高的基本功能放在内核中。
(3) 设备管理
设备管理和硬件紧密相关,大部分功能也放在内核中。

2.3.2 进程的创建

1. 进程的层次结构
• 在OS中,允许一个进程创建另一个进程,通常把创建进程的进程称为父进
程,而把被创建的进程称为子进程。
• 子进程可继续创建更多的孙进程,由此便形成了一个进程的层次结构。
• 如在UNIX中,进程与其子孙进程共同组成一个进程家族(组)。
在Windows中不存在任何进程层次结构的概念
2. 进程图
• 描述了进程间关系的一颗有向树。
• 结点代表进程。父进程、子进程、祖先进程。
• 子进程可继承父的资源,撤消时应归还给父进程,父的撤消会撤消全部子
进程。

3. 引起创建进程的事件

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

2.3.3 进程的终止

1.引起进程终止(Termination of Process)的事件
• 正常结束:
• 执行到最后的结束指令、中断
• 异常结束:
• 出现错误或因故障而被迫终止(越界保护、保护错、非法指令、特权指令错、运行超
时等)
• 外界干扰:
• 进程应外界的请求而终止运行(操作员或操作系统干预、父进程请求、父进程终止)
2. 进程的终止过程
(1)根据被终止进程的标识符,从PCB集合中检索出该进程的PCB,从中读出该进程的状态,检查进程状态;
(2)若被终止进程正处于执行状态,执行态――>中止,且置调度标志为真。
(3)有无子孙进程需终止。有,终止所有子孙进程。
(4)归还资源给其父进程或系统。
(5)从PCB队列中移出PCB。

2.3.4 进程的阻塞与唤醒

1. 引起进程阻塞和唤醒的事件
• 向系统请求共享资源失败
• 等待某种操作的完成
• 新数据尚未到达
• 等待新任务的到达
2. 进程阻塞过程
• 发现上述事件,调用阻塞原语Block()把自己阻塞
• 停止进程的执行,修改PCB中的状态信息,并将其插入相应的阻塞队列
• 转调度程序,进行进程切换
3. 进程唤醒的过程
• 阻塞进程所期待的事件出现,有关的进程调用唤醒原语Wakeup(),将等待
该事件的进程唤醒。
• 将PCB从阻塞队列中移出,修改PCB中的状态信息,再将其插入到就绪进
程队列中。
注意:阻塞与唤醒要匹配使用,以免造成“永久阻塞

2.3.5 进程的挂起与激活

1. 进程的挂起过程
• 由进程自己或其父进程调suspend原语完成,改变进程状态,将该进程PCB移到指定区域,注意状态的改变,有可能要重新调度。
2. 进程的激活过程
• active原语(如在外存,调入内存,改变状态,根据情况看是否调度,如抢先或非抢先)。
注意:阻塞、唤醒一般由OS实现,而挂起与激活可由用户干预

2.4 进程同步(重要)

2.4.1 进程同步的基本概念

1. 两种形式的制约关系
• 具体表现:
1)进程之间由于共享系统资源而产生的间接制约关系。
2)进程之间由于相互合作而产生的直接制约关系。
• 解决方法
解决1)的方法是:保证诸进程互斥访问临界资源。
解决2)的方法是:协调相互合作的诸进程的执行次序。–狭义的同步
进程同步(eg.司机和售票员的行为)
(若干合作进程为了完成一个共同的任务,需要相互协调运行步伐,一个进程开始某个操作之前必须要求另一个进程已经完成某个操作否则前面的进程只能等待。)
• 使并发执行的诸进程之间能有效地相互合作,从而使程序的执行具有可再现性。
• 简单说来就是:多个相关进程在执行次序上的协调。
• 制约关系:直接制约
互斥
• 临界资源:也称独占资源,是指在一段时间内只允许一个进程访问的资源。
• 要求:共享临界资源的诸进程必须互斥访问临界资源。
• 定义:当多个进程因为争夺临界资源而互斥执行称为进程的互斥。
• 制约关系:间接制约。

2. 临界资源(Critical Resouce)
• 结论:
counter是临界资源,生产者和消费者应互斥访问。
即:虽然生产者、消费者并发执行,但在执行counter的加1、减1的语句时,只能顺序进行。
即:只能按可能性中A或B的顺序进行,绝不能交替进行。
• 临界资源实例:
硬件中的打印机、磁带机等,软件中的变量、队列、缓冲区等。
3. 临界区(critical section)

• 临界区:每个进程中访问临界资源的那段代码。
• 访问临界资源的描述:
进入区:检查有无进程进入
临界区
退出区:将访问标志复位
• 要求:
为实现对临界资源的互斥访问,应保证诸进程互斥 进入各自的临界区。(两个互斥是一致的)
4. 同步应遵循的规则
• 空闲让进
• 忙则等待
• 有限等待
• 让权等待(等待进程放弃CPU)
• 多种择一

2.4.2 硬件同步机制

1.关中断
• 开关中断指令
• 在进入锁测试之前关闭中断,直到完成锁测试并上锁之后才能打开中断。进程在临界区执行期间,计算机系统不响应中断,从而不会引发调度,就不会发生进程或线程切换。
• 关中断存在许多缺点。
2. 利用Test-and-Set指令实现互斥
• 测试和设置指令

3. 利用Swap指令实现进程互斥
• 对换指令

2.4.3 信号量机制

信号量(Semaphore)和P、V操作
• 信号量:1965年由荷兰学者Dijkstra提出,它是一种特殊的数据结构。
功能:表示资源的实体。
特殊之处:
每个信号量与一个队列关联;
其值只能通过初始化和P、V操作来访问。
本书中将P、V操作称做 wait 和 signal 操作。
• 信号量的类型:
公用信号量:用于进程间的互斥,初值通常为1
私有信号量:用于进程间的同步,初值通常为0或n
P操作(wait操作):
• 荷兰语“proberen”——“检测”之意。意味着请求分配一个单位资源。
wait(s) 原语操作的主要动作: (P(S) )
• S=S-1 • 若S≥0,则进程继续执行
• 若S<0,则该进程被阻塞
• 转进程调度

V操作(signal操作):
• 荷兰语“verhogen”——“增量”之意,意味着释放一个单位资源。
signal(s) 原语操作的主要动作: (V(S) )
• S=S+1
• 若S>0,则进程继续执行
• 若S≤0,则唤醒一等待进程
• 返回原进程继续执行或转进程调度

1. 整型信号量
• S是一个整型量,通过2个原子操作wait(s)和signal(s)来访问。
• Wait(s): while s<= 0 /do no-op/
• s:=s-1;
• Signal(s): s:=s+1;
2. 记录型信号量
• 由于整型机制中会不断测试不满足“让权等待”而引入

• L:为进程链表,用于链接所有等待该类资源进程。

• 用wait(s)和signal(s)实现同步与互斥。
• 在记录型信号量机制中:
• s.value初值:表示系统中某类资源的数目。
• s.value<0:表该信号量链表中已阻塞进程的数目。

• AND同步机制的基本思想:将进程在整个运行过程中需要的所有资源,一次性全部地分配给进程,待进程使用完后再一起释放。只要尚有一个资源未能分配给进程,其它所有可能为之分配的资源也不分配给它

4. 信号量集
• 当一次需要N个某类临界资源时,如何完成?
• 解决方式:“信号量集”机制。
• Swait操作可描述如下:S为信号量,d为需求值,而t为下限值。

(1) Swait(S,d,d)。此时在信号量集中只有一个信号量S,但允许它每次
申请d个资源,当现有资源数少于d时,不予分配。
(2) Swait(S,1,1)。此时的信号量集已蜕化为一般的记录型信号量(S>1
时)或互斥信号量(S=1时)。
(3) Swait(S,1,0)。这是一种很特殊且很有用的信号量操作。当S≥1时,
允许多个进程进入某特定区;当S变为0后,将阻止任何进程进入特定区。

使用Wait、Signal操作时的注意事项
• Wait、Signal操作总是成对出现的;互斥操作时他们处于同一进程中;同
步操作时他们处于不同进程中。

• Wait、Signal操作的位置十分重要,放置不当会造成严重后果,注意逻辑
关系。

2.4.5 管程机制

1.管程的定义
• 定义:
• 1973年,Hoare和Brinch Hanson提出,他们给出的定义“一个管程定义了一个数据结构和能为并发进程所执行(在该数据结构上)的一组操作,这组操作能同步进程和改变管程中的数据”。
• 简单说来:管程是由若干公共变量和所有访问这些变量的过程所组成的一个特殊的模块或软件包。
• 基本思想:
集中管理各进程中的临界区:管程把分散在各个进程中互斥地访问公共变量的那些临界区集中起来管理。

• 特点
管程的局部变量只能由该管程的过程存取;
系统保证进程只能互斥地调用管程中的过程。
• 管程的特征
模块化:一个管程是一个基本程序单位,可以单独编译;
抽象数据类型:管程是一种特殊的数据类型,其中不仅有数据,而且有对数据进行操作的代码,是对数据和操作的封装。
信息掩蔽:管程如何实现其功能相对于外部程序是半透明的
• 管程和进程的区别
设置目的不同:管程是对共享资源进行管理,进程是资源分配和执行的基本单位。
数据结构不同:管程定义公用数据结构,进程定义私有数据结构。
存在方式不同:进程有生命周期,管程是操作系统固有的部分,没有生命周期。
执行方式不同:管程被进程调用,没有并发性,进程具有并发执行性。
2. 条件变量
• 管程实现进程同步:
(1)同步工具 (2) 条件变量(防止进程永久占有管程)
• 条件变量形式为:var x,y:condition。
每个条件变量保存了一个链表,用于记录因该条件变量而阻塞的所有进程,同时提供的两个操作即可表示为x.wait和x.signal。
① x.wait:正在调用管程的进程因x条件需要被阻塞或挂起,则调用x.wait将自己插入到x条件的等待队列上,并释放管程,直到x条件变化。
② x.signal:正在调用管程的进程发现x条件发生了变化,则调用x.signal,重新启动一个因x条件而阻塞或挂起的进程

2.5 经典进程的同步问题

生产者-消费者问题
• 生产者与消费者互斥访问公用数据缓冲区
• 生产“数据”,消费“数据”
读者-写者问题
• 数据文件或记录被多个进程共享并互斥访问的问题
• 允许多个Reader同时访问,但不允许一个Writer和其它Reader或任何两个以上的Writer同时访问
哲学家就餐问题
• 多资源共享及互斥访问
• 五个哲学家的思考与互斥共享五根筷子就餐的问题

2.5.1 生产者-消费者问题

问题描述:
• 一群生产者进程在生产消息,并将此消息提供给消费者进程去消费。为使
生产者进程和消费者进程能并发执行,在它们之间设置了一个具有n个缓冲
区的缓冲池,生产者进程可以将它所生产的消息放入一个缓冲区中,消费
者进程可以从一个缓冲区中取得一个消息消费。规定:不允许消费者进程
到一个空缓冲区中取消息,也不允许生产者进程向一个已装有消息且尚未
被取走消息的缓冲区中投放消息

1.基本工作:
• 生产者:生产消息;放消息。
• 消费者:取消息;消费消息
2.互斥:
• 临界资源(缓冲池) 一个互斥信号量mutex(初值=1)
3.同步:
• 生产者:放 有空缓冲区:放
• 无空缓冲区:阻塞
• 消费者:取 有满缓冲区:取
• 无满缓冲区:阻塞
• 设两个公用信号量 empty:空缓冲区的数目(初值=n)
• full: 满缓冲区的数目(初值=0)

2.5.2 哲学家进餐问题

问题描述
• 有5位哲学家,他们的生活方式是交替进行思考和就餐。哲学家们共用一张圆桌,分别坐在周围的五张椅子上。在圆桌上有五支筷子,每个哲学家饥饿时必须拿到其左、右最靠近他的各一支筷子时才能就餐。进餐毕,放下筷子又继续思考
1.基本工作:
• 哲学家:思考;就餐。
2.同步:无。
3.互斥:
• 临界资源是筷子
• 一支筷子(编号为[i]) 一个互斥信号量chopstick[i](初值=1)。

遗留问题:
• 五位哲学家同时拿起左边的筷子,则因五位哲学家均在等待右边的筷子而
使他们饥饿而“死”。
解决的办法如下:
• 至多只允许四位哲学家同时去拿左边的筷子;
• 仅当哲学家左右两边的筷子均可用时才允许他拿起筷子;
• 规定奇数号哲学家先拿起他左边的筷子,而偶数号哲学家先拿起他右边的
筷子。

2.5.3 读者-写者问题

读者-写者问题
• 问题描述:一个数据对象(文件、记录)可以为多个并发进程共享。其中有的进程只需要读其中的内容,我们称为“读者”;有的进程负责更新其中内容(读/写),我们称为“写者”。“读者”可以同时读取共享数据对象;“写者”不能和其它任何进程同时访问数据对象。如何实现?
基本工作:
• reader(读者):读数据对象。
• writer(写者):写数据对象。
同步:
• 无,因要求中没有说明读者和写者要合作。
互斥:
• 数据对象互斥信号量wmutex(初值=1),用于读者进程和写者进程互斥访问数据对象。
• “读-写”:互斥访问
• “写-写”:互斥访问
• “读-读”:允许同时访问
某个读者:
• 想进入读:写者正在写,该读者阻塞;其它读者在读,该读者可进入
• 正在读 : 写者想进入写,该写者阻塞其它读者想进入读,可以进入
• 故读者:进入时判断写者是否在内,读完后要释放数据对象。第一个要求进入的读者→最后一个离开的读者
• 增加变量readcount,来表示正在读的读者数目。
• 由于多个读者共享readcount ,故也应作为临界资源处理。
• 设互斥信号量rmutex(初值=1),用于读者互斥访问readcount。

2.6 进程通信

进程通信IPC(Inter Process Communication)
• 指合作进程之间的信息交换。
方式:
• 1. 低级通信方式:信号量和管程
信号量的缺点:一次只传递一个信号量,大量信息的传递需借助共享数据结构进行,而共享数据结构的定义和操作以及同步控制均要由程序员自己实现。
管程的缺点:管程在少数几种编程语言以外无法使用。
• 2. 高级通信方式:例如消息传递系统
优势:一次可以传递大量信息;进程中使用通信命令即可通信;通信过程由OS实现。

2.6.1 进程通信的类型

1. 共享存储器系统(Shared-Memory System)
• 1.基于共享数据结构的通信方式
produce-consume中的缓冲区,低效,不透明。
系统只提供了一共享存贮器,适于少量数据通信,属于低级通信。
• 2.基于共享存储区的通信方式
系统提供:共享存储区。
通信过程:
(1)向系统申请一个或多个分区
(2)获得分区获后即可读/写 • 特点:大量数据,高效,速度快。
特点:大量数据,高效,速度快
2. 管道(pipe)通信系统
• 管道:用于连接一个读进程和一个写进程以实现它们之间通信的一个共享
文件,又名pipe文件。
• 功能:大量的数据发收。
• 注意:三方面的协调能力
(1)互斥
(2)同步
(3)对方是否存在
3. 消息传递系统(Message passing system)
• 信息单位:格式化的消息(报文)
• 消息传递系统是目前的主要通信方式
• 类型:
直接通信方式
间接通信方式
• 实现
一组通信命令(原语),具有透明性—> 同步的实现。
4. 客户机-服务器系统(Client-Server system)

  1. 套接字(Socket)
    • 套接字起源于20世纪70年代加州大学伯克利分校版本的UNIX。
    • 套接字是UNIX 操作系统下的网络通信接口。
    • 套接字的类型
    • 基于文件型
    • 基于网络型
  2. 远程过程调用和远程方法调用
    • 远程过程(函数)调用RPC(Remote Procedure Call),是一个通信协议,用于通过网络连接的系统。
    • 该协议允许运行于一台主机(本地)系统上的进程调用另一台主机(远程)系统上的进程,而对程序员表现为常规的过程调用,无需额外地为此编程。
    • 负责处理远程过程调用的进程有:一个本地客户进程,一个远程服务进程。
    • 远程过程调用的主要步骤:(见书)
    消息传递模式
    • 消息(message):由发送方形成,通过一定的机制传递给接收方的一组信息,它的长度可以固定,也可以变化。
    在这里插入图片描述

1. 直接消息传递系统
• 直接通信方式:发送进程利用OS所提供的发送命令(原语),直接把消息发
送给目标进程。(点到点的发送)
1)直接通信原语
• 对称寻址方式
send (receiver, message);
receive (sender, message);
• 非对称寻址方式
send (P, message);
receive (id, message);
2) 消息的格式
• 消息头:含控制信息如:收/发进程名,消息长度、类型、编号
• 消息内容:
• 定长消息:系统开销小,用户不便(特别是传长消息用户)
• 变长消息:开销大,用户方便。
3) 进程的同步方式
1.发送和接收进程阻塞(汇合)
• 用于紧密同步,无缓冲区时。
2.发送进程不阻塞,接收进程阻塞(多个)
• 相当于接收进程(可能是多个)一直等待发送进程,如:打印进程等待打印任务。
3.发送/接收进程均不阻塞
• 一般在发、收进程间有多个缓冲区时。
4) 通信链路
• 建立方式
(1)显式建立:(进程完成)
(2)隐式建立:(系统提供原语完成)
• 链路类型:
(1)单向通信链路
(2)双向通信链路
2. 信箱通信

  1. 信箱的结构
    • 信箱定义为一种数据结构。在逻辑上,可以将其分为两个部分:
    • (1) 信箱头:存放有关信箱的描述信息
    • (2) 信箱体:由若干个存放消息的信箱格组成
  2. 信箱通信原语
    • (1) 邮箱的创建和撤消
    • (2) 消息的发送和接收
    send (mailbox, message);
    receive (mailbox, message);

    信箱:
    • 每个信箱的标识符是唯一的。
    • 信箱的拥有者可以是OS,也可以是用户进程。归OS所有的信箱是独立的,它不附属
    于任何进程。
    • 如果OS提供了有关信箱的创建、撤消及通过信箱发送和接收消息的原语,则一个用户
    进程可为自己建立一个信箱,它就是该信箱的拥有者。当它终止时,该信箱自动消失。
    • 进一步说明:
  1. 要区分信箱的拥有者(只能从该信箱接收消息)和使用者(只能向该信箱发消息)。
  2. 信箱创建后,其所有权和接收权可以通过系统调用命令传递给其它进程,这就可能导致一个信箱有多个接收者。
    • 信箱类型
    (1)私用:拥有者有读权,其它只有写权,(单向)存在期=进程存在期。
    (2)公用:系统创建,双向,存在期=系统存在期。
    (3)共享信箱:一般进程创建,指明其共享者,是双向
    • 发送—接收进程之间的关系:
    (1)一对一关系;
    (2)多对一关系;
    (3)一对多关系;
    (4)多对多关系:公用信箱。
    Hansen教授首先提出的,在RC4000系统上实现
  3. 消息缓冲队列通信机制中的数据结构
    • 消息缓冲区


2.7 线程(Threads)的基本概念

2.7.1 线程的引入

1. 进程的两个基本属性
• 引入进程:使多个程序并发运行。
• 进程的两个属性:
1)拥有资源的独立单位。
2)独立调度和分派的基本单位。
2. 程序并发执行所需付出的时空开销
• 使系统在创建、撤消进程及进行进程切换时须付出较大的时空开销。
• 系统会限制参与并发运行的进程数目及切换频率。
• 限制了更高程度上的并发。
3. 线程——作为调度和分派的基本单位
• 引入线程:减少程序并发执行时的时空开销,使并发性更好。
• 将进程的两个属性分开。
进程:拥有资源的独立单位;
线程:进程中的一个实体,是独立调度分派基本单位
----轻型进程
线程包含一个线程ID、一个程序计数器、一组寄存器和栈;它可与其它线程共享所属进程的全部资源

2.7.2 线程与进程的比较

1. 调度的基本单位
• 进程作为资源分配基本单位,线程作为调度和分派的基本单位。
2. 并发性
• 进程间并发,线程间并发。
3. 拥有资源
• 进程拥有资源,线程不拥有系统资源,共享该进程所拥有的资源。
4. 独立性
• 同一进程中不同线程的独立性低于进程间独立性。
5. 系统开销
• 进程操作的系统开销大于线程操作的系统开销。
6. 支持多处理机系统
• 多线程支持多处理机系统
线程的优点:
1)线程的创建时间比进程短;
2)线程的终止时间比进程短;
3)同进程内的线程的切换时间比进程短;
4)由于同进程内的线程之间共享内存和文件资源,因此可直接进行不通过内核的通信。

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

1. 线程运行的三个状态
• 执行状态
• 就绪状态
• 阻塞状态
2. 线程控制块TCB
• 线程标识符
• 一组寄存器
• 线程运行状态
• 优先级
• 线程专有存储区
• 信号屏蔽

3. 多线程OS中的进程属性
(1) 进程是一个可拥有资源的基本单位。
(2) 多个线程可并发执行
(3) 进程已不是可执行的实体

2.8 线程的实现

2.8.1 线程的实现方式

1. 内核支持线程KST(Kernel Supported Threads)
• 内核支持线程KST的创建、阻塞、撤消和切换等,都在内核空间实现的。
• 优点
(1)在SMP系统中,内核能够同时调度同一进程中的多个线程并行执行;
(2)如果一个线程被阻塞,内核可以调度该进程中的其它线程运行,也可以运行其它进程中的线程;
(3)内核支持线程具有很小的数据结构和堆栈,线程的切换比较快,切换开小;
(4)内核本身也可以采用多线程技术,可以提高系统的执行速度和效率。
• 缺点:对用户线程的切换,系统开销较大。
2. 用户级线程ULT(User Level Threads)
• 用户级线程是在用户空间中实现的。其调度是以进程为单位进行。
• 对线程的创建、 撤消、同步与通信等功能,都无需内核的支持,即用户级
线程是与内核无关的。
• 优点
(1) 线程切换不需要转换到内核空间。
(2) 调度算法可以是进程专用的。
(3) 用户级线程的实现与OS平台无关
• 缺点
(1) 系统调用的阻塞问题。
(2) 线程应用不能利用多处理机进行多重处理
3. 组合方式
• 把用户级线程和内核支持线程两种方式进行组合。

2.8.2 线程的实现

1. 内核支持线程的实现
• 创建进程,分派进程的任务数据区PTDA(Per Task Data Area)
• 线程控制块(TCB)
• 实现过程:进程创建线程,分配TCB,填写信息,分配必要资源。其创建和撤销与进程相似。
• 系统中TCB数量固定。
• 内核支持线程的调度和切换与进程的调度和切换十分相似。

2. 用户级线程的实现

  1. 运行时系统(Runtime System)
    • “运行时系统”,是用于管理和控制线程的函数(过程)的集合。
    • 函数:用于创建和撤消线程的函数、线程同步和通信的函数,以及实现线程调度的函数等。
    • 运行时系统中的所有函数都驻留在用户空间,并作为用户级线程与内核之间的接口。
    • 中间层(接口)使用户级线程与内核无关。
  2. 内核控制线程
    • 又称轻型进程LWP(light Weight Process),用户线程和内核线程通信是使用。LWP也可以共享进程所拥有的资源。
    • LWP可通过系统调用来获得内核提供的服务。

2.8.3 线程的创建和终止

1. 线程的创建
• “初始化线程”,它的主要功能是用于创建新线程。
• 在创建新线程时,需要利用一个线程创建函数(或系统调用),并提供相应的参数。
• 在线程的创建函数执行完后,将返回一个线程标识符供以后使用。
2. 线程的终止
• 由终止线程通过调用相应的函数(或系统调用)对它执行终止操作。
• 大多数的OS中,线程被中止后并不立即释放它所占有的资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

King✪ω✪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值