Transcript Document

(四)进程互斥
一、进程互斥的概念
1. 临界资源
例1:两个进程A、B共享一台打印机
若不加以控制,两个进程的输出结果可能交织
在一起,很难区分。
例2:两个进程共享一个变量x
设: x代表某航班已卖出的机座数,初值为0。p1和
p2为两个售票进程,功能是对共享变量x的值加
1。
这两个进程在一个处理机C上并发执行,分别
具有内部寄存器r1和r2。
两进程并发执行的两种可能次序:
序列A
p1:
P2:
r1 := x ;
r1 := r1 + 1 ;
x := r1 ;
r2 := x ;
r2 := r2 + 1 ;
x := r2 ;
执行结果:x = 2
序列B
p1:
p2:
p1:
r1 := x ;
r2 := x;
r2 := r2 + 1 ;
x := r2 ;
r1 := r1 + 1 ;
x := r1 ;
执行结果:x = 1
特点:当两个进程公用一个变量时,它们必须
顺序的访问,一个进程对公用变量操作完毕后,
另一个进程才能去访问和修改这一变量。
(1)什么是临界资源
我们把一次(一段时间内)仅允许一个进程使
用的资源称为临界资源。
许多物理设备,如输入机、打印机、磁带机等
都具有这种性质。
软件资源,如公用变量、数据、表格、队列等
也都具有这一特点。
(2)什么是临界区
每个进程中访问临界资源的那段程序段称为临
界区(临界段)。
(3)什么是互斥
在操作系统中,当某一进程正在访问某一存储区域时,
就不允许其他进程来读出或者修改存储区的内容,否则,
就会发生后果无法估计的错误。进程间的这种相互制约的
关系称为互斥。
例如:进程A正在执行CSa段时,进程B就不能进入
CSb段执行。
CSa
进程A
进程B
…
x=0
…
x=x+1
…
…
x=x+1
…
CSb
操作系统如何保证进程的互斥呢?
(1)保证进入
当有若干个进程欲进入临界区时,应在有限的时间内
使其进入;
(2)排它性
每次至多有一个进程处于临界区;
(3)有限性
进程在临界区内仅逗留有限的时间。
?这些原则如何实现呢?
二.
锁和上锁、开锁操作
1. 什么是锁
用变量w代表某种资源的状态,w称为“锁”
2. 进程使用临界资源的操作
每个临界资源设
置一个锁位:
0:资源可用
1:资源占用。
锁操作:
1.考察锁位的值;
2.若原来的值是为“0”,将锁位置
为“1”(占用该资源);
3.若原来值是为“1”,(该资源已
被别人占用),则转到1。
开锁操作:
进程使用完资源后,将锁位置为
“0”,称为开锁操作。
3. 上锁原语和开锁原语
(1)上锁原语
(2)开锁原语
算法 lock
输入:锁变量w
输出:无
{ test : if (w为1)
goto test ;/* 测试锁位的值 */
else w = 1 ;
/* 上锁 */
}
算法 unlock
输入:锁变量w
输出:无
{
w = 0 ; /* 开锁 */
}
问题:
(1)效率低。当锁已上时,当前上锁的进程忙等;
(2)无法实现。当锁已上时,当前上锁(原语)的进程占
有CPU不放,谁来开锁呢?死锁!
4. 用上锁原语和开锁原语实现进程互斥
进程A
进程B
上锁原语
上锁原语
进入临界区CSa
进入临界区CSb
开锁原语
开锁原语
三. 信号灯和P、V操作
1.
什么是信号灯
信号灯是整型变量。
a ≥ 0时,表示绿灯,进程可继续执行。
a < 0时,表示红灯,进程停止执行。
信号灯是一个确定的二元组(s,q),s是一个具有非负
初值的整型变量,q是一个初始状态为空的队列。操作
系统利用信号灯的值对并发进程和共享资源进行控制和
管理。
注意:创建信号灯时,应准确说明信号灯s的意义和初值
(这个初值绝不能为负值)。
2. P、V操作
• P操作原语的实现
入 口
信号灯的值只能由P、V操作来改
变。
s=s-1
(1)P操作
P操作定义
对信号灯s的P操作记为P(s)。
返 回
P(s)是一个不可分割的原语
操作,即取信号灯值减1,若
相减结果为负,则调用P(s)
的进程被阻,并插入到该信号
灯的等待队列中,否则可以继
续执行。

Y
s>=0
N
入信号灯等待队列
置“等待状态”
转进程调度
(2) V操作
• V操作原语的实现
入 口

V操作定义
对信号灯s的V操作记为
V(s)。
s=s+1
N
S<=0
V(s)是一个不可分割
Y
的原语操作,即取信号
灯值加1,若相加结果
从该信号灯的等待队列中取出首元素
大于零,进程继续执行,
返 回
否则,要帮助唤醒在信
号灯等待队列上的一个
进程。
入就绪队列
置“就绪状态”
转进程调度
3. 用信号灯的P、V操作实现进程互斥
设:mutex为互斥信号灯,初值为1。
(1)框图描述
进程Pa
进程Pb
P(mutex)
P(mutex)
进入临界区CSa
进入临界区CSb
V(mutex)
V(mutex)
(2)程序描述
Main( )
{
int mutex = 1;
/*互斥信号灯
*/
cobegin
Pa();
Pb();
coend
}
Pa( )
{ …
P(mutex);
CSa;
V(mutex);
…
}
Pb( )
{ …
P(mutex);
CSb;
V(mutex);
…
}
用两个进程共享打印机的例子
设信号灯print表示打印机,初值为1,表示打印机可用(也可理
解为有一台打印机)。
(print也是用于互斥的信号灯,教材上设置为mutex。)
(3)信号灯可能的取值
假设有N个并发进程共用一台打印机,设互
斥信号灯mutex的初值为1,则:
mutex的取值范围为多少?信号灯的值分别
代表什么含义?
(3)信号灯可能的取值
诸N个并发进程,互斥信号灯mutex的初值为1时,则:
mutex的取值为:1~-(N-1).
其含义为:
1 :表示有进程进入临界区。有一个资源,无进程等待;
0 :表示有1个进程进入临界区。无资源,无进程等待;
-i :表示一个进程进入临界区。无资源,且有i (i<=N)个
进程等待进入。
(五)进程同步
一、进程同步的概念
1. 进程同步的例子
引例 1 :两位同学约好
星期天去东湖,早
上8:00在校门口,不
见不散。
当一个同学先来到
校门口,要等另一
个同学,到齐后一
道打的去东湖。
2. 什么是进程同步

同步:
所谓同步就是并发进程在一些关键点上可能需
要相互等待与互通消息,这样的相互制约关系称为
进程同步。



互斥的概念来自于诸进程对独占使用资源(设备)的竞
争
同步来源于多个进程的合作
在人类社会中竞争与合作是永恒的。
病人就诊的例子
病人看病活动:
医生化验活动:
…
要病人去化验;
…
等待
…
唤
醒
后
…
等化验结果;
…
继续诊病;
等要化验的病人;
进行化验;
等待
开出化验单;
…
唤
醒
后
3. 进程同步的分类

在操作系统中,同步有各种各样,
但归纳起来有两类:

诸进程合作完成某工作的逻辑顺序。

对系统资源的共享。如两个进程共享
一个缓冲区完成誊抄问题
a.合作进程的执行次序
用进程流图来描述诸进程合作完成某一任务的
次序。
1、说明进程的同步关系
进程P1、P2可并行执行,P3的执行
必须等待P1、P2都完成后才能开始
执行。
2、设置信号灯,说明含义、初值。
s13 = 0 表示进程P1尚未执行完成
s23 = 0 表示进程P2尚未执行完成
3、写出程序描述
P1( )
P3( )
{ …;
{ p(s13);
v(s13);
p(s23);
}
P2( )
{
…;
v(s23);
}
….;
}
b.共享缓冲区的合作进程的同步
设有一个缓冲区buffer,大小为一
个字节,CP进程不断产生字符,
送 buffer , IOP 进 程 从 buffer 中 取
出字符打印。如不加控制,会有
多种打印结果,这取决于这两个
进程运行的相对速度。在这众多
的打印结果中,只有CP、IOP进
程的运行刚好匹配的一种是对的,
其它均为错误,并且不能重现。
要保证打印结果的正
确 , CP 、 IOP 必 须 遵 循 解决这个问题的步骤:
以下同步规则:
(1)分析问题,弄清楚同步
(1)当CP把结果送入buffer后, 关系,如上分析;
IOP 才 能 从 buffer 中 取 ,
(2)设置信号灯,说明含义、
否则IOP必须等待;
初值;
(2)当IOP从buffer中取走数
(3)写出程序描述。
据后,CP才能将新产生
数据送buffer,否则也必
须等待。
c. 生产者-消费者问题
我们把上面的例子扩充,
假定缓冲区buffer是一个有界
缓冲区,可存放n个数据,同
时假定有n个CP进程不断地
产生数据,并送buffer;有m
个 IOP 进程从缓冲区中取数
据打印。
在我们生活中有很多这
样的例子。
生产者-消费者问题




对于生产者进程:产生一个数据,当要送入缓冲
区时,要检查缓冲区是否已满,若未满,则可将
数据送入缓冲区,并通知消费者进程;否则,等
待;
对于消费者进程:当它去取数据时,要看缓冲区
中是否有数据可取,若有则取走一个数据,并通
知生产者进程,否则,等待。
这种相互等待,并互通信息就是典型的进程同步。
同时,缓冲区是个临界资源,因此,诸进程对缓
冲区的操作程序是一个共享临界区,因此,还有
个互斥的问题。
生产者-消费者问题
生产者-消费者问题
练习题
用PV操作解决下面问题:
售票员进程:
司机进程:
Repeat
Repeat
关门;
启动车辆;
售票;
正常行驶;
开门;
到站停车;
Until ……
Until ……
练习题:
有十个读者和两个编辑同时处理一篇文章,对于读
操作是可以同时进行的;若有读者正在读,编辑就
不能工作;若编辑正在处理,读者就不能读,编辑
与编辑的工作也是互斥的,试用信号灯及P、V操作
描述读者与编辑之间协同工作,并给出类C程序。
33
(六)线程的基本概念

在OS中,进程的引入提高了系统资源的利
用率。

进一步提高进程的并发性时问题:
 进程切换开销起来越大
 进程间通信效率受限
 多处理机系统调度
在只有进程概念的操作系统中进程是:


系统资源分配的单位
处理器调度的对象
在引入线程的操作系统中:

线程是处理机调度的对象;

进程是系统资源的分配单位;

一个进程可同时具有多个线程。
(六)线程的基本概念
1. 什么是线程
线程是比进程更小的活动单位,它是进程
中的一个执行路径。
线程可以这样来描述:
进程中的一条执行路径;
 它有自己私用的堆栈和处理机执行环境;
 它与父进程共享分配给父进程的主存;
 它是单个进程所创建的许多个同时存在的线程
中的一个。

2. 线程的特点
创建一个线程比创建一个进程开销要小得多;
 线程(Thread)是一个动态的对象,是处理机
调度的基本单位,表示一个进程中的一个控制
点,执行一系列的指令。
 实现线程间通信十分方便,因为一个进程创建
的多个线程可以整个进程的所有资源,包括共
享地址区域和数据。
 在进程内创建多线程,可以提高系统的并行处
理能力,加快进程的处理速度。

单进程
单进程
多线程
多进程
单线程
每个进程只有一个线程
多进程 多线程
每个进程只有多个线程
线程的实现机制

内核线程(Kernel-Level Thread)

在OS内核完成创建、撤消、执行一个指定的函数线程。

在支持内核线程OS中,内核维护进程和线程上下文,线程切换由内核
完成。处理机分配对象是线程。某个线程因中断阻塞不影响其它线程
的执行。

多线程的进程可获得更多的处理机时间。Windows Server 2003支持内
核线程。

用户线程(User-Level Thread)


不依赖OS核心,由应用进程利用线程库提供创建、同步、调度和管理
线程。
由于不需要操作系统支持,任何操作系统都可以支持。甚至单用户操
作系统。
(七)Unix进程

Unix进程树的结构
进程图象的组成

基本进程控制块 proc结构
在UNIX系统核心中有一进程表,每个进程占用一个表目,称为基本
进程控制块,存放进程的最基本的管理和控制信息,不论进程是否处
于运行状态,系统都要访问这些信息,因此它必须常驻内存。基本进
程控制块定义为proc结构。

进程的进程图象(有的文献上称上下文,context)
U区、共享正文区、数据区和用户栈区组成 。
共享
正文
区
代码
数据
用户栈区
用户栈
数据区
用户地
址空间
U
区
user
核心栈
进程图象
进程控制块(PCB)

proc结构
proc.h (基本的)
基本进程控制块,它包含进程控制和管理的最基本的信息

user结构
user.h (扩充的)
包括进程调度、用户管理、进程图象管理、文件系统及缓
冲区管理方面的信息

正文控制表
text.h
系统的正文控制表,管理共享正文区,每个共享程序装入
内存之后,就占用该结构的一个表目,使用该共享程序的
进程,在其proc结构中有一个指针指向该表目
数据结构之间的关系
UNIX进程状态转换
僵死
用户态运行
中断
自陷
中断自陷及返回
fork
被抢占
中断自陷
及返回
exit
核心态运行
swith
sleep
有内存
内存就绪
wakeup
内存睡眠
创
建
换出
无
内
存
换进
外存就绪
换出
wakeup
外存睡眠
UNIX系统的进程控制

运行状态转换成睡眠状态 sleep()

运行状态转换成僵死状态 exit()

睡眠状态转换成就绪状态 wakeup()

新创建进程
fork()

等待进程终止
wait()

执行用户程序
exec()
第四章
小结
一. 进程概念
1. 进程引入 程序的顺序执行、并发执行的定义与特点
2. 与时间有关的错误:定义、誊抄实例
3. 进程定义、进程与程序的区别
4. 进程状态 三个基本状态、状态变迁图
5. 进程描述 pcb结构与作用、进程的组成、Unix进程控制块
结构、Unix进程的组成
二. 进程控制
1. 进程控制的功能
2. 基本进程控制原语
创建原语、撤销原语、等待原语、唤醒原语
3. 进程控制原语的主要功能及结构变化
三. 进程同步机构
1. 锁
上锁原语、开锁原语
2. 信号灯
P操作、V操作
四. 进程互斥
1. 临界资源 临界区
2. 互斥
3. 用信号灯的P、V操作实现进程互斥
五. 进程同步
1. 同步概念
2. 合作进程的执行次序
3. 共享缓冲区的合作进程的同步
4. 生产者-消费者问题
六、线程