操作系统进程描述及控制2.docx

上传人:b****5 文档编号:5692381 上传时间:2022-12-31 格式:DOCX 页数:18 大小:82.57KB
下载 相关 举报
操作系统进程描述及控制2.docx_第1页
第1页 / 共18页
操作系统进程描述及控制2.docx_第2页
第2页 / 共18页
操作系统进程描述及控制2.docx_第3页
第3页 / 共18页
操作系统进程描述及控制2.docx_第4页
第4页 / 共18页
操作系统进程描述及控制2.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

操作系统进程描述及控制2.docx

《操作系统进程描述及控制2.docx》由会员分享,可在线阅读,更多相关《操作系统进程描述及控制2.docx(18页珍藏版)》请在冰豆网上搜索。

操作系统进程描述及控制2.docx

操作系统进程描述及控制2

2.5经典进程的同步问题

在多道程序环境下,进程同步问题十分重荽,出现一系列经典的进程同步问题,其中有代表性有:

-生产者一消费者问题

-哲学家进餐问题

-读者一写者问题

■"生产者一消费者〃问题

•问题描述

 

P1

cl

c2

pm

cm

 

L记录型信号量解决“生产者一消费者"问题

设置两个同步信号量及一互斥信号量

empty:

说明空缓冲单元的数目,其初值为有界缓冲区的大小n。

Full:

说明满缓冲单元的数目(即产品数目),其初值为0.

Mutex:

说明该有界缓冲区是一临界资源,必须互斥使用,

其初值为1。

intin=0,out=0;itembuffer[n];semaphoremutex=1,empty=n,full=O;voidproceducerO{

do{produceranitemnextp;

•••

wait(empty);

wait(mutex);

buffer[in]=nextp;

in=(in+l)%n;signal(mutex);signal(full);

}while(TRUE);}

voidconsumerO{do{wait(full);

wait(mutex);

nextc=buffer[out];

out=(out+l)%n;signal(mutex);signal(empty);consumertheiteminnextc;

•••

}while(TRUE);}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信号量来解决生产者一消费者问题的算法描述如下:

intin=0,out=0;itembuffer[n];semaphoremutex=l,empty=n,full=O;

voidproceducerO(

do(produceranitemnextp

•••

Swait(empty,mutex);

buffer[in]=nextp;

in=(in+l)%n;

Ssignal(mutexffull);

}while(TRUE);}

voidconsumerO(

do(Swait(full,mutex);nextc=buffer[out];out=(out+l)%n;Ssignal(mutexfempty);consumertheiteminnextc;

•••

}while(TRUE);}

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);}while(TRUE);

}

voidwriter()(

do(wait(wmutex);performwriteoperation;signal(wmutex);}while(TRUE);

voidmainO

(cobeginreader();writerO;coend}

最多只允许RN个读者同时读intRN;

semaphoreL=RN,mx=l;

voidreader()(

do(Swait(L,l,l);

Swait(mxffl/O);

•••

performreadoperation;

•••

Ssignal(Lrl);

}while(TRUE);}

voidwriter()(

do(Swait(mx,l,l;LRN,O);performreadoperation;Ssignal(mx,l);}while(TRUE);

voidmain()(cobeginreader();writer();coend}

利用信号量集机制解决读者一写着问题

信号量例题

1.桌子上有一个空盘子,只允许放一个水果。

爸爸可以向盘中放苹果,也可以向盘中放橘子,儿子专等吃盘中的橘子,女儿专等吃盘中的苹果。

规定当盘空时,一次只能放一个水果,请用信号量实现爸爸、儿子、女儿三个"并发进程”的同步。

Semaphoreempty=l/orange=apple=0;father:

do(wait(empty);将水果放入盘中;if(放入的是橘子)signal(orange);elsesignal(apple);

}while(l);

Son:

do(wait(orange);从盘中取岀橘子;signal(empty);吃橘子;}while(l);

Daughter:

do{wait(apple);

从盘中取出苹果;signal(empty);

吃苹果;

}while(l);

儿子,女儿的同步过程描述如下:

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;

repeat

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.线程的创建

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1