📄 【操作系统】进程同步与通信.doc
字号:
<tr>
<td height="22" colspan="3" valign="top"><!--DWLayoutEmptyCell--> </td>
</tr>
<tr>
<td height="34"> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td height="4827"> </td>
<td valign="top"><table class="frame" width="100%" cellpadding="30" cellspacing="1" style="table-layout:fixed; word-break:break-all" >
<!--DWLayoutTable-->
<tr>
<td width="626" height="4809" valign="top" > <center>
<font style="font-size=12pt;font-family='黑体'">进程同步与通信</font>
<hr width="100%" noshadow size=1 color=#91c1f7>
作者:晓津
</center>
<br> <table width="100%">
<tr>
<td align=left class="normal" id="post1" style="line-height:26px;font-size:10.5pt">
<P> </P>
<P>“进程”是操作系统中的基本执行单位,在多道程序设计的系统中往往同时有许多进程存在,它们要轮流占用处理器。这些交叉执行的并发进程相互之间可能是无关,也可能是相关的。当并发进程竞争共享资源时会出现与时间有关的错误,因此,应采用进程同步与互斥手段使其合理使用共享资源,以保证系统安全。当进程间必须通过信息交换进行协作时,可用进程通信的方式达到目的。</P>
<P><FONT color=#ff0000>重点</FONT>是:分析与时间有关的错误;用PV操作实现进程的同步与互斥;用信箱实现进程通信。
</P>
<P><B>一、进程的顺序性与并发性</B></P>
<TABLE width="30%" align=right bgColor=#ccccff border=0>
<TBODY>
<TR>
<TD> 有人说,在程序中不是有跳转语句和重复语句,怎么就是顺序执行?注意,这里是指进程在处理器中的执行,因为处理器每次只能执行一个操作,因此每条指令必须按顺序进入CPU执行,假使有一条指令是跳转的,那么执行本指令后,会取出跳转目的地址的指令进入CPU运行,这个顺序是程序规定的。所以对CPU而言,进程总是按顺序执行。<BR>
进程是一个程序在一个数据集合上的一次执行,同一个程序和同一个数据集的运行结果必然是相同的。这就是可再现性。<BR>
<BR>
<HR SIZE=1> <BR>
同时执行并不是真的同时,因为任一时刻CPU中只能有一个进程运行。</TD>
</TR>
</TBODY>
</TABLE>
<P>1、进程的<FONT color=#0000ff>顺序性</FONT>:任何进程在顺序的处理器上的执行是严格按照顺序进行的,这就是进程的顺序性。当一个进程独占处理器顺序执行时,具有两个特性:<FONT color=#0000ff>一、封闭性
二、可再现性</FONT>。</P>
<P>2、进程的<FONT color=#0000ff>同时执行</FONT>:在多道程序设计系统中,一个进程的工作没有全部完成之前,另一个进程就可以开始工作,它们的执行在时间上重迭的,我们把它们称为是“可同时执行的”。
<P>3、进程的<FONT color=#0000ff>并发性</FONT>:若系统中存在一组可同时执行的进程,则说该组进程具有并发性,并把可同时执行的进程称为“并发进程”
。
<P>4、并发进程间的关系:并发进程相互之间可能是<FONT color=#0000ff>无关的</FONT>,也可能是<FONT color=#0000ff>交往的</FONT>。如果一个进程的执行不影响其他进程的执行,且与其他进程的进展情况无关,即它们是各自独立的,则这些并发进程相互之间是无关的。如果一个进程的执行依赖其他进程的执行,则这些并发进程之间是有交往的。
<HR SIZE=1> <P><B>二、与时间有关的错误</B>
<P>1、并发进程的执行速度取决于自身和进程调度策略。一个进程运行时会被中断,且断点是不固定的,一个进程被中断后,哪个进程可以运行,被中断的进程什么时候占用处理器,是与进程调度策略有关的。因此进程的执行速度不能由自己决定。
<P>2、并发进程交替使用共享资源时会出现与时间有关的错误。 由于共享资源的原因,加上进程并发执行的随机性,一个进程对另一个进程的影响是不可预测的。造成不正确的因素与进程占用处理器的时间、执行的速度以及外界的影响有关。因此被称为与时间有关的错误。
<P>3、分析并发进程中与时间有关的错误,请理解教材上的例子。
<HR SIZE=1> <P><B>三.相关临界区</B>
<P>1、<FONT color=#0000ff>临界区</FONT>的定义:并发进程中与共享变量有关的程序段称为“临界区”
<P>(C++)<br>
临界区(Critical Section)是一段独占对某些共享资源访问的代码,在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。
<p> 临界区在使用时以CRITICAL_SECTION结构对象保护共享资源,并分别用EnterCriticalSection()和LeaveCriticalSection()函数去标识和释放一个临界区。所用到的CRITICAL_SECTION结构对象必须经过InitializeCriticalSection()的初始化后才能使用,而且必须确保所有线程中的任何试图访问此共享资源的代码都处在此临界区的保护之下。否则临界区将不会起到应有的作用,共享资源依然有被破坏的可能。</p>
<p>(DELPHI)<br>
临界区(CriticalSection)则是一项共享数据访问保护的技术。<br>
它其实也是相当于一个全局的布尔变量。但对它的操作有所不同,它只有两个操作:Enter和Leave,同样可以把它的两个状态当作True和False,分别表示现在是否处于临界区中。这两个操作也是原语,所以它可以用于在多线程应用中保护共享数据,防止访问冲突。</p>
<p>用临界区保护共享数据的方法很简单:在每次要访问共享数据之前调用Enter设置进入临界区标志,然后再操作数据,最后调用Leave离开临界区。它的保护原理是这样的:当一个线程进入临界区后,如果此时另一个线程也要访问这个数据,则它会在调用Enter时,发现已经有线程进入临界区,然后此线程就会被挂起,等待当前在临界区的线程调用Leave离开临界区,当另一个线程完成操作,调用Leave离开后,此线程就会被唤醒,并设置临界区标志,开始操作数据,这样就防止了访问冲突。</p>
<P>2、什么是<FONT color=#0000ff>相关临界区</FONT>: 相关临界区是指<FONT color=#0000ff>并发进程</FONT>中涉及到<FONT color=#0000ff>相同变量</FONT>的那些<FONT color=#0000ff>程序段</FONT>。
<P>3、对相关临界区的管理要求。
<UL>
<LI>1)<FONT color=#0000ff>一次最多让一个</FONT>进程在临界区执行,当有进程在临界区时其他想进入临界区执行的进程必须等待。
<LI>2)任何一个进入临界区执行的进程必须在<FONT color=#0000ff>有限的时间内退出</FONT>临界区,即任何一个进程都不应该无限地逗留在自己的临界区。
<LI>3)不能强迫一个进程无限地等待进入它的临界区,即有进程退出时应<FONT color=#0000ff>让一个等待进入临界区的进程进入</FONT>它的临界区。
</LI>
</UL>
<HR SIZE=1> <P><B>四、进程的互斥</B>
<P>1、<FONT color=#0000ff>进程互斥</FONT>的含义:进程的互斥是指当有若干进程都要使用某一共享资源时,任何时刻最多只允许一个进程去使用,其他要使用该资源的进程必须等待,直到占用资源者释放了该资源。
<TABLE cellSpacing=5 cellPadding=5 width="40%" align=right border=0>
<TBODY>
<TR>
<TD bgColor=#ccccff height=252> PV操作是两个过程,由他们两个来控制一个信号S,假设S是红灯的个数。<BR>
每个进程进入临界区前都要先执行P操作。退出临界区时执行V操作。用下面的比喻很容易理解:<BR>
<BR>
临界区门前有棵树(S)<BR>
用来挂红灯<BR>
进程想进CPU的门<BR>
先得上树取盏灯(调用一次P操作)<BR>
取下一个去敲门(S=S-1)<BR>
如果树上没灯取(S≤0)<BR>
树说欠你一盏灯(S为负时)<BR>
没辙只好外边排队等(<FONT color=#ff0000>W</FONT><FONT color=#666666>ait</FONT>(S))<BR>
<BR>
得灯进程续运行<BR>
运行完了要出门(调用一次V操作)<BR>
马上还回一盏灯(S=S+1)<BR>
若有进程在催债(S≤0)<BR>
放个进去事完成(<FONT color=#ff0000>R</FONT><FONT color=#666666>elease</FONT>(S))</TD>
</TR>
</TBODY>
</TABLE>
<P>2、实现进程互斥的工具--PV操作。
<P><FONT color=#0000ff>PV操作</FONT>是由两个操作,即P操作和V操作组成。P操作和V操作是两个在信号量上进行操作的过程。假定用S表示信号量则把这两个过程记作P(S)和V(S),它们的定义如下:
<TABLE>
<TBODY>
<TR>
<TD><PRE> Procedue P(Var S: Semaphore);
begin S:=S-1;
if S<0 then W(S)
end; {P}
Procedue V(Var S: Semaphore);
begin S:=S+1;
if S<=0 then R(S)
end; {V} </PRE></TD>
</TR>
</TBODY>
</TABLE>
<P>为了确保PV操作自身的正确执行,因此P(S)和V(S)操作中不可中断,这种<FONT color=#0000ff>不可被中断的过程称为“原语</FONT>”。
<P>3、用PV操作管理相关临界区的一般形式
<UL>
<LI>一个信号量与一组涉及共享变量的相关临界区联系起来,信号量的初值定为“1”<BR>
<BR>
<LI>任何一个进程要进入临界区前先调用P操作,执行临界区的操作后,退出临界区时调用V操作。<BR>
<BR>
<LI>由于信号量的初值为“1”,P操作起到了限制一次只有一个进程进入临界区的作用,其余进程欲进入临界区必须符合对临界区管理的第一个要求,即一次最多让一个进程在临界区执行。进程退出后执行V操作,若有进程在等待则释放一个进程,这样就达到了对临界区管理的第二个和第三个要求(即不能无限逗留也不能无限等待)。
</LI>
</UL>
<P>4、分析进程互斥问题并用PV操作实现进程互斥。
<TABLE width="30%" align=right border=0>
<TBODY>
<TR>
<TD bgColor=#ccccff>仔细领会教材中的例子,关于PV操作,在考试中出现的可能性极大,但是难度基本不超过教材上例题.</TD>
</TR>
</TBODY>
</TABLE>
<P>
<P><FONT color=#0000ff>进程的互斥</FONT>是指当有若干进程都要使用某一共享资源时,任何时刻最多只允许一个进程去使用,其他要使用该资源的进程必须等待,直到占用资源者释放了该资源。
<P>在写程序时要注意以下几点:
<UL>
<LI>PV操作中间只执行相关临界区内容,不能把临界区外的程序段放到PV操作中间,否则会降低系统并发执行能力或引起系统瘫痪。
<LI>另外当有条件语句时要注意在临界区内每个条件分支出口均要调用V操作,否则会违反对临界区管理的第二、三两个要求。
</LI>
</UL>
<HR SIZE=1> <P><B>五、进程的同步</B>
<P>1、<FONT color=#0000ff>进程同步</FONT>的含义:进程的同步是指并发进程之间存在一种制约关系,一个进程的执行依赖另一个进程的消息,当一个进程没有得到另一个进程的消息时应等待,直到消息到达才被唤醒。
<TABLE cellSpacing=2 cellPadding=2 width="30%" align=right bgColor=#ccccff border=0>
<TBODY>
<TR>
<TD>“生产者”与“消费者”是同步问题的典型例子。 <BR>
这里有两个消息量:一是“缓冲器里有物品”,二是“可把物品存入缓冲器”,这两个消息量对应需要两个信号量SP<FONT color=#999999>ut</FONT>和SG<FONT color=#999999>et</FONT>。SP的初始值为1,如果初始时可用的缓冲器为n个,则SP=n;SG的初始值为0。<BR>
生产者进程调用P(SP)和V(SG),<BR>
消费者进程调用P(SG)和V(SP),根据SG和SP的值来决定是否可以存或取物。<BR>
</TD>
</TR>
</TBODY>
</TABLE>
<P>2、正确使用PV操作实现进程同步。
<UL>
<LI>(1)用<FONT color=#0000ff>一个信号量与一个消息联系</FONT>起来,当信号量的值为0时表示期望的消息尚未产生,当信号量值为非0时表示期望的消息已经存在。
<LI>(2)在用PV操作实现同步时,一个信号量与一个消息量联系在一起,当有<FONT color=#0000ff>多个消息时必须定义多个信号量</FONT>;测试不同的消息是否到达或发送不同消息时,应对不同的信号调用P操作或V操作。
</LI>
</UL>
<P>3、使用PV操作实现进程同步与互斥的混合问题。 <BR>
进程的同步与进程的互斥都涉及到并发进程访问共享资源的问题。可以看到进程的互斥实际上是进程同步的一种特殊情况。若干进程互斥使用资源时,一个等待使用资源的的进程在得到占用资源的进程发出“归还资源”的消息(调用了V操作)后,它就可去使用资源。因此,互斥使用资源的进程之间实际上也存在一个进程依赖另一个进程发出信息的制约关系。所以,也把进程的互斥与进程的同步称为进程的同步。
<P>4、PV操作实现进程同步与互斥时怎样定义信号量,信号量的物理含义及其作用
<P>利用PV操作实现<FONT color=#0000ff>进程互斥</FONT>时,用<FONT color=#0000ff>一个信号量与一组</FONT>相关临界区对应,这些进程在<FONT color=#0000ff>同一个信号量</FONT>上调用P操作和V操作来实现互斥。
<P>利用PV操作实现<FONT color=#0000ff>进程同步</FONT>时,<FONT color=#0000ff>每一个消息与一个</FONT>信号量对应,进程在<FONT color=#0000ff>不同信号量</FONT>上调用P操作以测试自己需要的消息是否到达,在<FONT color=#0000ff>不同信号量</FONT>上调用V操作把不同的消息发送出去。
<P>信号量的物理含义:
<UL>
<LI><FONT color=#0000ff>S>0</FONT>时表示<FONT color=#0000ff>可使用</FONT>的资源数或表示可使用资源的进程数。
<LI><FONT color=#0000ff>S=0</FONT>时表示<FONT color=#0000ff>无资源</FONT>可供使用或不允许进程进入临界区。
<LI><FONT color=#0000ff>S<0</FONT>时表示<FONT color=#0000ff>等待使用资源</FONT>的进程个数或表示等待进入临界区的进程个数。
</LI>
</UL>
<P>根据PV操作的性质,任何进程在使用共享资源前应调用P操作。当有可以使用的资源或允许使用资源时(S>0),调用P(S)后不会成为等待,进程可以使用资源。当无资源可使用或不允许使用资源时(S≤0)调用P(S)后必然等待。任何进程可调用V操作来归还共享资源的使用权,当S>0时调用V(S)后使可用资源数加1或使可用资源的进程数加1(也就是树上多挂上一个红灯笼)。当S≤0时调用V(S)后将释放一个等待使用资源或者释放一个等待进入临界区者。
<HR SIZE=1> <P><B>六、进程通信</B>
<P>1、<FONT color=#0000ff>进程通信</FONT>的含义:通过专门的通信机制实现进程间<FONT color=#0000ff>交换大量信息</FONT>的通信方式称为“<FONT color=#0000ff>进程通信</FONT>”
<P>2、实现进程通信的基本原语:有两条:“send(发送)”和“receive(接收)”原语。
<P>3、利用信箱通信时“发送”和“接收”原语的功能。
<UL>
<LI>send(N,M) 功能:把信件M送到指定的信箱N中。
<LI>receive(N,X) 功能:从指定信箱N中取出一封信,存放到指定的地址X中。 </LI>
</UL>
<P>4、信箱的基本结构:一个信箱由“<FONT color=#0000ff>信箱说明</FONT>”和“<FONT color=#0000ff>信箱体</FONT>”两部分组成。
<HR SIZE=1> <P><B>七、线程的概念</B>
<P><FONT color=#0000ff>线程</FONT>是进程中可独立执行的<FONT color=#0000ff>子任务</FONT>,一个进程中可以有一个或多个线程,每个线程都有一个唯一的标识符。
<P>支持线程管理的操作系统有Mach,OS/2,WindowsNT,UNIX等。 </P></p>
</td>
</tr>
</table>
<p align=right>
<p align="right">〖<a href=#stop onClick="window.close()">关闭窗口</a>〗
</td>
</tr>
<tr>
<td height="39" > </td>
</tr>
</table></td>
<td> </td>
</tr>
</table>
</body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -