操作系统进程描述及控制2Word文档格式.docx
《操作系统进程描述及控制2Word文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统进程描述及控制2Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
signal(empty);
consumertheiteminnextc;
}voidmainO{cobeginproceducerQ;
consumerQ;
coend}
1.互斥信号量的RV操作在每一程序中必须成对岀现.
2.资源信号量(full,empty)也必须成对出现,但可分别处于不同的程序中.
3.多个P操作顺序不能颠倒.
4.先执行资源信号量的P操作,再执行互斥信号量的P操作,否则可能引起进程死锁.
5.它是一个同步问题:
(1)消费者想要取产品,有界缓冲区中至少有一个单元是满的。
(2)生产者想要放产品,有界缓冲区中至少有一个是空的。
6.它是一互斥问题
有界缓冲区是临界资源,因此,各生产者进程和各消费者进程必须互斥执行。
2.利用AND信号量解决生产者一消费者问题
对于生产者一消费者问题,也可利用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)o
利用AND信号量来解决生产者一消费者问题的算法描述如下:
itembuffer[n];
semaphoremutex=l,empty=n,full=O;
voidproceducerO(
do(produceranitemnextp
•••
Swait(empty,mutex);
buffer[in]=nextp;
in=(in+l)%n;
Ssignal(mutexffull);
voidconsumerO(
do(Swait(full,mutex);
nextc=buffer[out];
out=(out+l)%n;
Ssignal(mutexfempty);
voidmain()(cobeginproceducerO;
consumer。
;
coend)
3.用管程机制解决生产者一消费者问题
建立Producer-consumer(PC)管程
Dput(x)过程
生产者利用此过程将自已的消•息放到缓冲池中,若发现缓冲已满(count>
n)测等待。
Dget(x)过程
消费者利用此过程将缓冲池中的消息取走,若发现缓冲已空(count《0),则等待。
过程cwait和csignal对条件变量notfull和notempty进行操作
(1)cwait(condition)
当管程被一个进程占用时,其他进程调用该过程时阻塞,并挂在条件condition队列上
(2)csignal(condition)
唤醒在cwait执行后阻塞在条件condition队列上的进程,如果这样的进程不止一个,则选择其中一个实施唤醒操作;
如果队列为空,则无操作而返回。
PC管程可描述如下
Monitorprocducerconsumer(itembuffer[N];
intin,out;
conditionnotfulLnotempty;
intcount;
public:
voidput(itemx)(
if(count>
=N)cwait(notfull);
buffer[in]=x;
in=(in+l)%N;
count++;
csignal(notempty);
Voidget(itemx)(
if(count<
=0)cwait(notempty):
x=buffer[out];
out=(out+l)%N;
count--;
csignal(notfull);
)
(in=O;
out=O;
count=0;
}
}PC
voidmain()
(cobeginproceducer();
consumerO;
coend}
nextc;
})
生产者一消费者描述
voidproducerO(itemx;
while(TRUE)(
•••produceaniteminnextp;
PC.put(x);
))
VoidconsumerQ(itemx;
while(TRUE)(PC.get(x);
consumetheitem
"
哲学家进餐〃问题
问题描述
有五个哲学家,他们的生活方式是交替地进行思考和进餐。
他们共用一张圆桌,分别坐在五张椅子上。
在圆桌上有五个碗和五支筷子,平时一个哲学家进行思考,饥饿时便试图取用其左.右最靠近他的筷子,只有在他拿到两支筷子时才能进餐。
进餐毕,放下筷子又继续思考。
哲学家进餐问题可看作是并发进程并发执行时,处理共享资源的一个有代表性的问题。
哲学家4
筷了cp2
哲学家进餐结构图
所有信号量均被初始化为],第i位哲学家的活动可描述为:
do(
wait^chopstick[i]);
wait(chopstick[(i+l)%5]);
eat;
:
signal(chopstick[i]);
signal(chopstick[(i+l)%5]);
think;
}while(TRUE);
三、“读者一写者〃问题
•问题描述:
一个数据对象(数据文件或记录)可被多个进程共享。
其中,reader进程要求读,writer进程要求写或修改。
允许多个reader进程同时读共享数据,但绝不允许一个writer进程与其它的reader进程或writer进程同时访问,即writer进程必须与其它进程互斥访问共享对象。
•"
读者一写者〃问题的同步算法描述
设置一个共享变量和两个信号量:
共享变量Readcount:
记录当前正在读数据集的读进程数目,初值为0。
读互斥信号量Rmutex:
表示读进程互斥地访问共享变量readcount,初值为1.
写互斥信号量wmutex:
表示写进程与其它进程(读,写)互斥地访问数据集,初值为1.
读者一写者问题可描述如下:
semaphorermutex=l,wmutex=l
intreadcount=0;
voidreader()(
do(
wait(rmutex);
if(readcount==0)wait(wmutex);
readcount++;
signal(rmutex);
performreadoperation;
wait(rmutex);
readcount--;
if(readcount==0)signal(wmutex);
signal(rmutex);
voidwriter()(
do(wait(wmutex);
performwriteoperation;
signal(wmutex);
voidmainO
(cobeginreader();
writerO;
coend}
最多只允许RN个读者同时读intRN;
semaphoreL=RN,mx=l;
do(Swait(L,l,l);
Swait(mxffl/O);
performreadoperation;
Ssignal(Lrl);
}while(TRUE);
do(Swait(mx,l,l;
LRN,O);
performreadoperation;
Ssignal(mx,l);
voidmain()(cobeginreader();
writer();
利用信号量集机制解决读者一写着问题
信号量例题
1.桌子上有一个空盘子,只允许放一个水果。
爸爸可以向盘中放苹果,也可以向盘中放橘子,儿子专等吃盘中的橘子,女儿专等吃盘中的苹果。
规定当盘空时,一次只能放一个水果,请用信号量实现爸爸、儿子、女儿三个"
并发进程”的同步。
Semaphoreempty=l/orange=apple=0;
father:
do(wait(empty);
将水果放入盘中;
if(放入的是橘子)signal(orange);
elsesignal(apple);
}while(l);
Son:
do(wait(orange);
从盘中取岀橘子;
吃橘子;
}while(l);
Daughter:
do{wait(apple);
从盘中取出苹果;
signal(empty);
吃苹果;
儿子,女儿的同步过程描述如下:
2.6进程通信一高级通信
一、进程通信的类型
进程通信是指进程之间的信息交换。
根据所交换的信息量的多少分为:
•:
•低级通信进程之间交换的信息量较少且效率低。
如进程同步和互斥。
以信号量机制为例来说明,它们之所以低级的原因在于:
1效率低,生产者每次只能向缓冲池投放一个产品(消息),消费者每次只能从缓冲区中取得一个消息;
2通信对用户不透明,OS只为进程之间的通信提供了共享存储器。
在进程之间要传送大量数据时,应当利用OS提供的高级通信工具,该工具最主要的特点是:
(1)使用方便。
OS隐藏了实现进程通信的具体细节,向用户提供了一组用于实现高级通信的命令(原语),用户可方便地直接利用它实现进程之间的通信。
或者说,通信过程对用户是透明的。
这样就大大减少了通信程序编制上的复杂性。
(2)高效地传送大量数据。
用户可直接利用高级通信命令(原语)高效地传送大量的数据。
高级通信进程之间交换的信息量较多且效率高。
又分:
A共享存储器系统指进程之间通过对共享存储区读写来交换数据。
(1)基于共享数据结构的通信方式。
(2)基于共享存储区的通信方式。
A消息传递系统指进程间的通信以消息为单位,程序员可通过通信原语实现通信,按其实现方式不同可分为:
(1)直接通信方式发送进程直接把消息发送给接收进程。
(2)间接通信方式发送进程把消息发送到某个中间实体(信箱),接收进程从中取得消息。
A管道通信系统发送进程(写进程)以字符流形式将大量数据送入管道(管道:
用于连接读进程和写进程以实现它们之间通信的共享文件。
),接收进程(读进程)从管道接收数据。
A客户机•服务器系统实现方法:
套接字(Socket),远程过程调用和远程方法调用RPC(RemoteProcedureCall)
二,•消息传递系统
■■直接通信方式(消息缓冲通信)
发送进程利用OS所提供的发送命令,直接把消息发送给接收进程。
。
要求:
发送进程和接收进程都以显式方式提供对方的标识符。
D系统提供的两条通信原语:
Send(Receiver,message);
发送一个消息给接收进程;
Receive(Senderfmessage);
^收Sender发来的消息;
生产者.消费者问题的解决
repeat
Produceaniteminnextp;
.
send(consumer,nextp);
untilfalse;
Receive(producer,nextc);
;
consumetheiteminnextcuntilfalse
二、消息传递系统
---间接通信方式(信箱通信)
发送进程把消息发送到某个中间实体(信箱),接收进程从中取得消息。
•系统提供的若干条原语
。
信箱创建和撤消原语
两条通信原语
Send(maiIbox,message)将一个消息发送给指定信箱;
Receive(maiIbox,message)从指定信箱中接收一个消息;
•信箱的分类:
私用信箱,公用信箱,共享信箱
2.7线程
线程是近年来操作系统领域出现的一个非常重要的技术,其引入进一步提高了程序并发执行的程度,从而进一步提高了资源的利用率和系统的吞吐量。
-线程的基本概念
・线程间的同步和通信
-内核支持线程和用户级线程
-线程控制
一、线程的引入
操作系统中引入进程的目的,是为了使多个程序能并发执行,以提高资源利用率和系统吞吐量,那么,在操作系统中再引入线程,则是为了减少程序在并发执行时所付出的时空开销,使OS具有更好的并发性。
进程的两个基本属性:
®
进程是一个可拥有资源的独立单位;
②进程同时又是一个可独立调度和分派的基本单位。
正是由于进程有这两个基本属性,才使之成为一个能独立运行的基本单位,从而也就构成了进程并发执行的基础。
然而,为使程序能并发执行,系统还必须进行以下的一系列操作。
1)创建进程
系统在创建一个进程时,必须为它分配其所必需的,除处理机以外的所有资源,如内存空间、I/O设备,以及建立相应的PCB。
2)撤消进程
系统在撤消进程时,又必须先对其所占有的资源执行回收操作,然后再撤消PCB。
3)进程切换.
对进程进行切换时,由于要保留当前进程的CPU环境和设置新选中进程的CPU环境,因而须花费不少的处理机时间。
换言之,由于进程是一个资源的拥有者,因而在创建,撤消和切换中,系统必须为之付出较大的时空开销。
正因如此,在系统中所设置的进程,其数目不宜过多,进程切换的频率也不宜过高,这也就限制了并发程度的进一步提高。
线程的组成主要包括:
(1)一个被称为线程ID(threadID,线程标识符)的唯一标识符;
(2)两个栈,分别用于记录在内核模式下和用户模式下执行的;
(3)—个被称为线程局部存储器(TLS,thread-localstorage)的私有存储区域,各个子系统、运行库和DLL都会用到该存储区域;
(4)一组代表处理器状态的CPU寄存器中的内容;
(5)有时候线程也有它们自己的安全环境,如果多线程服务器应用程序
要模仿其客户的安全环境,则往往可以利用线程的安全环境。
二.线程与进程的比较
1)调度
2)并发性
3)拥有资源
4)独立性
5)系统开销
6)支持多处理机系统
三、线程的状态和线程控制块
(1)线程运行的三个状态
与传统的进程一样,在各线程之间也存在着共享资源和相互合作的制约关系,致使线程在运行时也具有间断性。
相应地,线程在运行时也具有下述三种基本状态:
1)执行状态,表示线程已获得处建机而正在运行;
2)就绪状态,指线程已具备了各种执行条件,只须再获得CPU便可立即执行;
3)阻塞状态,指线程在执行中因某事件受阻而处于暂停状态,例如,当一个线程执行从键盘读入数据的系统调用时,该线程就被阻塞。
(2)线程控制块TCB
如同每个进程有一个进程控制块一样,系统也为每个线程配置了一个线程控制块TCB,将所有用于控制和管理线程的信息记录在线程控制块中。
(3)多线程OS中的进程属性
通常在多线程OS中的进程都包含了多个线程,并为它们提供资源。
OS支持在一个进程中的多个线程能并发执行,但此时的进程就不再作为一个执行的实体。
多线程OS中的进程有以下属性:
1)进程是一个可拥有资源的基本单位。
2)多个线程可并发执行。
3)进程已不是可执行的实体。
2.8线程的实现
一.线程的实现方式
1.内核支持线程
所谓的内核支持线程KST(KernelSupportedThreads),也都同样是在内核的支持下运行的,即无论是用户进程中的线程,还是系统进程中的线程,他们的创建,撤消和切换等也是依靠内核,在内核空间实现的。
此外,在内核空间还为每一个内核支持线程设置了一个线程控制块,内核
是根据该控制块而感知某线程的存在,并对其加以控制。
当前大多数OS
都支持内核支持线程。
内核支持线程主要有如下四个优点:
(1)在多处理器系统中,内核能够同时调度同一进程中多个线程并行执行;
(2)如果进程中的一个线程被阻塞了,内核可以调度该进程中的其它线程占有处理器运行,也可以运行其它进程中的线程;
(3)内核支持线程具有很小的数据结构和堆栈,线程的切换比较快,切换开销小;
(4)内核本身也可以采用多线程技术,可以提高系统的执行速度和效率。
内核支持线程的主要缺点是:
对于用户的线程切换而言,其模式切换的开销较大,在同一个进程中,
从一个线程切换到另一个线程时,需要从用户态转到内核态进行,这是因为用户进程的线程在用户态运行,而线程调度和管理是在内核实现的,系统开销较大。
2.用户级线程
用户级线程ULT(UserLevelThreads)仅存在于用户空间中。
对于这种线程的创建、撤消、线程之间的同步与通信等功能,都无须利用系统调用来实现。
对于用户级线程的切换,通常发生在一个应用进程的诸多线程之间,这时,也同样无须内核的支持。
由于切换的规则远比进程调度和切换的规则简单,因而使线程的切换速度特别快。
可见,这种线程是与内核无关的。
我们可以为一个应用程序建立多个用户级线程。
在一个系统中的用户级线程的数目可以达到数百个至数干个。
由于这些线程的任务控制块都是设置在用户空间,而线程所执行的操作也无须内核的帮助,因而内核完全不知道用户级线程的存在。
用户级线程的优点:
(1)线程切换不需要转换到内核空间,对一个进程而言,其所有线程
的管理数据结构均在该进程的用户空间中,管理线程切换的线程库也在用户地址空间运行。
因此,进程不必切换到内核方式来做线程管理,从而节省了模式切换的开销,也节省了内核的宝贵资源。
(2)调度算法可以是进程专用的。
在不干扰操作系统调度的情况下,不同的进程可以根据自身需要,选择不竹的调度算法对自己的线程进行管理和调度,而与操作系统的低级调度算法是无关的。
(3)
=i
用户级线程的实现与操作系统平台无关,因为对于线程管理的代码是在用户程序内的,属于用户程序的一部分,所有的应用程序都可以对之进行共享。
因此,用户级线程甚至可以在不支持线程机制的操作系统平台上实现。
用户级线程实现方式的主要缺点:
系统调用的阻塞问题。
在基于进程机制的操作系统中,大多
系统调用将阻塞进程,因此,当线程执行一个系统调用时,不仅该线程
被阻塞,而且进程内的所有线程都会被阻塞。
而在内核支持线程方式中,
则进程中的其它线程仍然可以运行。
(2)在单纯的用户级线程实现方式中,多线程应用不能利用多处理机进行多重处理的优点。
内核每次分配给一个进程的仅有一个CPU,因此进程中仅有一个线程能执行,在该线程放弃CPU之前,其它线程只能
等待。
3.组合方式
有些操作系统把用户级线程和内核支持线程两种方式进行组合,提供了组合方式ULT/KST线程。
在组合方式线程系统中,内核支持多KST线程的建立、调度和管理,同时,也允许用户应用程序建立、调度和管理用户级线程。
一些内核支持线程对应多个用户级线程,程序员可按应用需荽和机器配置对内核支持线程数目辺行调整,以达到较好的效果。
组合方式线程中,同一个进程内的多个线程可以同时在多处理器上并行执行,而且在阻塞一个线程时,并不需要将整个进程阻塞。
所以,组合方式多线程机制能够结合KST和ULT两者的优点,并克服了其各自的不足。
用户空间
内核空间
图2.18多线程模型
二,线程的实现
1.内核支持线程的实现
在仅设置了内核支持线程的OS中,一种可能的线程控制方法是,系
统在创建一个新进程时,便为它分配一个任务数据区PTDA(PerTask
DataArea),其中包括若干个线程控制块TCB空间,如图2・19所示。
在
每一个TCB中可保存线程标识符,优先级,线程运行的CPU状态等信息。
虽然这些信息与用户级线程TCB中的信息相同,但现在却是被保存在内核空间中。
PTDA进程资源
TCB#1
TCB#2*
TCB#3
图2.19任务数据区空间
内核支持线程的调度和切换与进程的调度和切换
十分相似,也分抢占式方式和非抢占方式两种。
在线程的调度算法上,同样可采用时间片轮转法.优先权算法等。
当线程调度选中一个线程后,便将处理机分配给它。
当然,线程在调度和切换上所花费的开销,要比进程的小得多。
2・用户级线程的实现
用户级线程是在用户空间实现的。
所有的用户级线程都具有相同的结构,它们都运行在一个中间系统的上面。
当前有两种方式实现的中间系统,即运行时系统和内核控制线程。
1)运行时系统(RuntimeSystem)
所谓〃运行时系统"
,实质上是用于管理和控制线程的函数(过程)的集合,其中包括用于创建和撤消线程的函数、线程同步和通信的函数以及实现线程调度的函数等。
正因为有这些函数,才能使用户级线程与内核无关。
运行时系统中的所有函数都驻留在用户空间,并作为用户级线程与内核之间的接口。
2)内核控制线程
这种线程又称为轻型进程LWP(LightWeightProcess)o每一个
进程都可拥有多个LWP,同用户级线程一样,每个LWP都有自己的對
据结构(如TCB),其中包括线程标识符,优先级,状态,另外还有栈和局部存储区等。
它们也可以共享进程所拥有的资源。
LWP可通过系统调用来获得内核提供的服务,这样,半一个用户级线程运行时,只要
将它连接到一个LWP上,此时它便具有了内核支持线程的所有属性。
这种线程实现方式就是组合方式。
任务1
任务2
任务3
内核线程
图2-20利用轻型进程作为中间系统
三.线程的创建和终止
1.线程的创建