目录

学习建议:

基本内容:

一、概述:

二、进程的顺序性:

三、进程的并发性:

四、与时间有关的错误:

五、临界区的概念:

六、进程的互斥:

(一)PV操作:

(二)临界区的管理:

(三)用PV操作实现的互斥:

七、硬件指令:

八、进程同步和协作:

九、进程的同步:

(一)同步机制:

(二)生产者消费者问题:

(三)同步与互斥混合问题:

十、进程通信机制:

(一)信件:

(二)通信原语:

十一、间接通信:

十二、用进程通信实现进程同步:

十三、管道通信:

十四、线程的概念:

十五、进程与线程:

重点难点:

1.并发进程的特征:

  (1)并发进程的不确定性:

  (2)并发进程的执行结果与它们的相对速度有关:

  (3)并发进程之间存在这相互依赖和彼此制约的关系:

  (4)并发进程与其执行过程并非一一对应:

2.错误的产生原因:

3.使用互斥区的原则:

4.P.V操作的物理意义:

5.信号量实现进程的阻塞和唤醒:

概念辨析:

1.并发进程:

2.与时间有关的错误:

3.进程的互斥(间接作用)mutual exclusion:

4.临界资源:critical resource:

5.临界区(互斥区):critical section:

6.同步:

7.进程通信:

8.线程:

本章小结:

同步练习:


学习建议:

本章可以说是操作系统学习中的重点与难点,主要重点掌握如下内容:分析与时间有关的错误;用PV操作实现进程的同步与互斥;用信箱实现进程通信。理解"进程"是操作系统中的基本执行单位,在多道程序设计的系统中往往同时有许多进程存在,它们要轮流占用处理器。这些交叉执行的并发进程相互之间可能是无产在,也可能是相关的。当并发进程竞争共享资源时会出现与时间有关的错误,因此,应采用进程同步与互斥手段使其合理使用共享资源,以保证系统安全。当进程间必须通过信息交换进行协作时,可用进程通信的方式达到目的。在学习PV操作过程中,读者应该自己尝试编写相关的程序,这样可以更好的帮助您理解互斥与同步的概念,以及PV操作设计的思想。掌握这一章的内容,也可以帮助您理解下一章死锁的有关内容。

基本内容:

一、概述:

在计算机中有许多资源在同一时间内只允许一个进程使用,如果有多个进程同时去使用主类资源,就会引起激烈的竞争,就要发生互斥现象。因此,必须保护这些资源,以防止两个或多个进程同时存取或改变它们。
  几个进程若共享同一临界资源,它们必须以互斥方式使用,即当一个进程正在使用临界资源且尚未使用完毕时,其它进程必须延迟对该资源的操作,不能在当前进程操作完成之前,从中插进去使用这个临界资源,否则,将会造成信息混乱和操作出错。
  并行运行的多个进程看起来好像彼此之间以互不相干的速度向前推进,而实际上每个进程在其运行过程中并非相互隔绝。
  一方面它们相互协作以达到运行用户作业预期的目的,另一方面它们又相互竞争使用系统中有限的资源。所以它们之间总是存在着某种间接或直接的制约关系。如两个进程配合起来完成同一计算任务时。
  常常会发生这种情况,即一个进程到达某一步时,必须等待另一个进程发来信息才能继续运产下去,有时还需要两个进程相互交换信息之后才能共同执行下去。

二、进程的顺序性:

目前使用的计算机基本上是冯·诺依曼(Von Neumann)式结构,其基本特点是处理器顺序执行指令,即按照程序规定的操作顺序执行,只有在前一个操作结束后才能开始后继操作。
  因此,进程在顺序的处理器上的执行是严格按顺序进行的,这就是进程的顺序性。当-个进程独占处理器顺序执行时,具有两个特性:

封闭性 进程执行的结果只取决于进程本身,不受外界影响。也就是说,进程在执行过程中不管是不停顿地执行,还是走走停停,进程的执行速度不会改变它的执行结果。
可再现性 当进程再次重复执行时,必定获得相同的结果。也即,只要进程的初始条件相同无论在什么时间执行,无论执行多少次,都将产生相同的结果。

三、进程的并发性:

在多道程序设计的系统中,若干个作业可以同时执行,而每一个作业又需要有多个进程的协作来完成。
  因此,系统中会同时存在着许多进程,在单处理器的情况下,这些进程要竞争处理器。这些进程什么时候能占用处理器?能占用多长时间?不仅取决于进程自身,还取决于进程调度策略。例如,有两个进程A和B,它们要求顺序执行的操作如下:

进程A a1,a2,a3,…,an
  进程B b1,b2,b3,…,bn
  但是,这两个进程在单处理器上执行时,它们的操作将出现交叉执行。例如,可能按序列 a1,b1,a2,b2,…执行,也可能按序列a1,a2,b1,b2,b3,a3,…执行,或按其他序列执行。也就是说,一个进程的工作没有全部完成之前,另一个进程就可以开始工作,它们的执行在时间上是重迭的,我们把它们称为是"可同时执行的"。

  若系统中存在一组可同时执行的进程,则就说该组进程具有并发性,并把可同时执行的进程称为"并发进程"。

  并发进程相互之间可能是无关的,也可能是有交往的。如果一个进程的执行不影响其他进程的执行,且与其他进程的进展情况无关,即它们是各自独立的,则说这些并发进程相互之间是无关的。显然,无关的并发进程一定没有共享的变量,它们分别在各自的数据集合上操作。
  例如,为两个不同的源程序进行编译的两个进程,它们可以是并发执行的,但它们之间却是无关的。因为这两个进程分别在不同的数据集合上为不同的源程序进行编译,虽然这两个进程可交叉地占用处理器为各自的源程序进行编译,但是,任何一个进程都不依赖另-个进程。甚至当一个进程发现被编译的源程序有错误时,也不会影响另一个进程继续对自己的源程序进行编译,它们是各自独立的。

  然而,如果一个进程的执行依赖其他进程的进程情况,或者说,一个进程的执行可能影响其他进程的执行结果,则说这些并发进程相互之间是有交往的。

四、与时间有关的错误:

一个进程运行时由于自身或外界的原因而可能被中断,且断点是不固定的。一个进程被中断后,哪个进程可以运行,被中断的进程什么时候再去占用处理器,这是与进程调度策略有关的。
  所以,进程执行的速度不能由自己来控制,对于有交往的并发进程来说,可能有若干并发进程同时使用共享资源,即一个进程一次使用未结束,另一进程也开始使用,形成交替使用共享资源。对这种情况不加控制的话,在共享资源(变量)时就会出错,出现不正确的结果。

五、临界区的概念:

临界资源定义
  临界区概念
  有交往的并发进程执行时出现与时间有关的错误,其根本原因是对共享资源(变量)的使用不受限制,当进程交叉使用了共享变量就造成了错误。为了使并发进程能正确地执行,必须对共享变量的使用加以限制。
  "相关临界区"是指并发进程中涉及到相同变量的那些程序段。
  如果有进程在相关临界区执行时,不让另一个进程进入相关的临界区执行,就不会形成多个进程对相同的共享变量交叉访问,于是就可避免出现与时间有关的错误。
  可见,只要涉及相同变量的若干进程的相关临界区互斥执行,就不会造成与时间有关的错误。因而,对若干进程共享某一变量的相关临界区的管理应满足如下三个要求:

六、进程的互斥:

进程的互斥是指当有若干进程都要使用某一共享资源时,任何时刻最多只允许一个进程去使用,其他要使用该资源的进程必须等待,直到占用资源者释放了该资源。

  实际上,共享资源的互斥使用就是限定并发进程互斥地进入相关临界区。如果能提供一种方法来实现对相关临界区的管理,则就可实现进程的互斥。

  互斥原则
  实现对相关临界区管理的方法有多种,例如可采用标志方式、上锁开锁方式、PV操作方式和管程方式等。
  在这里,我们仅介绍怎样用PV操作来管理相关临界区,亦即用PV操作实现进程的互斥。

(一)PV操作:

PV操作是由两个操作,即P操作和V操作组成。P操作和V操作是两个在信号量上进行操作的过程,假定用S表示信号量则把这两个过程记作P(S)和V(S),它们的定义如下:

Procedure P(Var S:Semaphore)
        begin S:=S-1;
        if S<0 then W(S)
        end;{P}
      Procedure V(VarS:Semaphore)
        begin S:=S+1
        if S≤0 then R(S)
      end;{V}
  其中W(S)表示将调用P(S)过程的进程置成"等待信号量S"的状态,且将其排入等待队列, R(S)表示释放一个"等待信号量S"的进程,使该进程从等待队列退出并加入到就绪队列中。
  要用PV操作来管理临界区,首先要确保PV操作自身执行的正确性。由于P(S)和 V(S)都是在同一个S上操作,为了使得它们在执行时不发生交叉访问S而可能出现的错误,约定P(S),V(S)必须是两个不可被中断的过程,即让它们在屏蔽中断下执行。
  我们把不可被中断的过程称为"原语",于是,P操作和V操作实际上应该是"P操作原语"和"V操作原语"。

(二)临界区的管理:

为了实现对相关临界区的管理要求,我们分析一下PV操作的两个过程,当有进程调用 P(S)时,P(S)将信号量S减去"1",若结果小于"0"则调用P(S)的进程被置成等待信号量 S的状态,否则P(S)进程执行结束后调用P(S)的进程可以继续执行下去。
  如果把信号量S的初值定为"1",此时有若干个进程都要调用P(S),则只有第一个调用P(S)的进程不会处于等待状态而可以继续执行下去。
  P(S)被调用一次后S的值成为"0",以后其他进程调用P(S)时,P(S)在执行了S:=S-1后,S的值总是小于"0",于是这些进程均被置成等待信号量S的状态。直到有进程调用一次V(S),V(S)将信号量S加"1",若其结果不大于"0",说明有进程正处于等待信号量S的状态,这时V(S)将释放其中的一个进程,每调用一次V(S)就可释放一个等待信号量S的进程。
  因此,用PV操作能够实现对相关临界区的管理要求。只要用一个信号量与一组涉及共享变量的相关临界区联系起来,信号量的初值定为"1",任何一个进程要进入临界区前先调用P操作,执行完临界区的操作后,退出临界区时调用V操作。
  由于信号量的初值为"1", P操作起到了限制一次只有一个进程进入临界区的作用,其余进程欲进入临界区必须等待,符合对临界区管理的第一个要求。
  任何进程执行完临界区的操作后调用V操作,当有进程在等待进入临界区(即有等待信号量的进程)时,V操作将释放一个进程,因而不会出现进程无限地逗留在临界区和无限地等待进入临界区的情况,这又达到了对临界区管理的第二、第三两个要求。

假定有n个进程P1,P2,…,P1,…,Pn共享某一资源,它们各自的临界区分别为C1 C2,…,Ci,…,Cn,显然这些Ci(I=1,2,…,n)是相关临界区。用PV操作实现相关临界区管理的一般形式应该是
      begin
        S:Semaphore:
        S:=1;
        …
      cobegin
        …
        PROCESS Pi
        begin
        …
        P(S);
        {临界区Ci};
        V(S);
        …
        end;
        …
      coend;
      end;
  进程由于自身或外界原因,执行会随时被中断,如果一个进程在临界区执行时被中断,能不能让另一个进程进入临界区执行呢?回答是否定的。因为一个进程在临界区执行时虽然被中断,但它在临界区的操作并没有完成,因而不应该让其他进程进入临界区。

按照上面的管理模式,即使-个进程在临界区执行被中断,由另一个进程占有处理器,由于进入临界区前先要调用P(S),而此时被中断的进程尚未退出临界区,所以S的值仍为"0",想进入临界区的进程调用P(S)的结果必然是等待。只有当被中断的进程再次占用处理器完成了临界区的操作后,调用了V(S)才允许另一进程进入临界区。所以,不会出现多个进程同时进入临界区,也就不会发生交叉使用共享资源的情况。

(三)用PV操作实现的互斥:

我们将通过几个例子来讨论如何实现进程的互斥,首先讨论怎样用PV操作管理交通路口的自动计数系统。

该系统中两个并发进程的共享资源是计数器count,它们的相关临界区分别是"。用PV操作管理时,应定义一个信号量S,S的初值为"1",于是,该系统中两个进程的程序如下:

      begin
        count:integer;
        count:=0;
        S:semaphore;
        S:=1;
      cobegin
        PROCESS Obsrver
        begin
          L1:obServe a lorry;
            P(S);
            count:=count+1;
            V(S)
          goto L1
        end;
        PROCESS Reporter
        begin
          P(S);
          print count;
          count:=0
          V(S)
        end;
      coend;
      end;
  每个进程进入临界区之前均调用了P(S),由于S的初值位"1",故不可能两个进程同时进入临界区,因而就不会出现如下交叉执行的序列"print count;count:=count+1;count:=0",当然就不出现与时间有关的错误。每个进程在执行完临界区的操作后均调用了V(S),使自己退出临界区,允许另一进程进入临界区。

在这个问题中,应注意两个可能出现的错误管理方法。
  第一种错误是把观察者的程序写成如下:

                 PROCESS Obsrver
      begin
        L1:P(S);
          obServe a lorry;
          count:=count+1;
          V(S)
        goto L1
      end;

把不属于临界区的语句"observer a lorry"也放进了临界区,降低了系统并发执行的能力。我们的原则是能并发执行的部分要保持其并发性,只有涉及到共享变量的程序段才是需互斥执行的临界区。
  第二种错误是把观察者程序写成:

PROCESS Obsrver
      begin
        L1:obServe a lorry;
          P(S);
          count:=count+1;
          goto L1
          V(S)
      end;

把V(S)放在goto Ll语句之后,将造成系统瘫痪。因为当观察者第一次调用P(S)之后,S的值成为"0",在完成了count:=count+1又立即返回到标号L1处执行,由于没有执行过 V(S),于是在再次调用P(S)时观察者被处于等待信号量S的状态。
  不仅观察者不能继续观察和计数,报告者要定时打印时,在调用P(S)后也被置或等待信号量S的状态。这样,两个进程都无法继续执行,就没有调用V(S)的机会,谁也释放不了谁,处于停顿瘫痪状态。

七、硬件指令:

许多大型机(如IBM370等)和微型计算机(如Intel 8088,M68000等)中都提供了专门的硬件指令,这些指令都允许对一个字中的内容进行检测和修正,或交换两个字的内容。
  特别要指出的事,这些操作都在一个存储周期中完成,或者说是有一条指令来完成的。用这些指令就可以解决临界段问题了。因为临界段问题在多道环境中之所以存在,是由于多个进程共同访问、修改同一个共享变量。
  在单机系统中,由于中断的原因,使得一个进程在对一个公用变量先取来并检测其值,然后修改的这两个动作(通常需要2~3条指令完成)中,可以插入其他进程对此公用变量的访问和修改,从而破坏了此公用变量的数据完整性和正确性。
  在多机系统中,该公用变量数据的完整性和正确性的破坏,并不是受中断的影响,而是多个处理机共享主存,因而使得某处理机可以插入另一个处理机的两个存储访问周期之间,访问并修改此共享变量(要注意的是,中断的插入只能在两条指令之间,而不能在一条指令的执行过程中。
  因为在指令周期最后时刻CPU才扫描中断寄存器。而对于同一主存块的访问要求,即使两个处理机同时提出,存出控制逻辑也只能让其中之一访问,即两个存储周期不会同时进行,但在同一个处理机的两个存储周期间则可以插入另一处理机的存储周期)。
  现在我们用一条指令来完成检测和修改这两个功能,这样中断和插入另一处理机的存储周期均不可能,所以也就不会影响此公用变量数据的完整性。

  实现这种功能的硬件指令有两种:
  (1)TS(Test-and-Set)指令,称为检测和设置指令。
  (2)Swap指令,该指令的功能是交换两个字的内容,在Intel 8086或8088中,该指令称为XCHG指令。
  用这些指令可以简单而有效的实现互斥。其方法是为每个临界段或其他互斥资源设置一个布尔变量,例如lock,当其值为false,则临界段未被使用,反之则说明正有进程在临界段中执行。

八、进程同步和协作:

首先我们又一个例子:为了把原始的一批记录加工成当前需要的记录,创建丁两个进程,即进程A和进程B。进程A启动输入设备不断地读记录,每读出一个记录就交给进程B去加工,直至所有记录都处理结束。
  为此,系统设置了一个容量为能存放一个记录的缓冲器,进程A把读出的记录存入缓冲器,进程B从缓冲器中取出记录加工。
  进程A和进程B是两个并发进程,它们共享缓冲器,如果两个进程不相互制约的话就会造成错误。当进程A的执行速度超过进程B的执行速度时,可能进程A把一个记录存入缓冲器后,进程B还没有取走前进程A又把新读出的一个记录存入缓冲器,后一个记录把上一个尚未取走的记录覆盖了,造成记录的丢失。当进程B的执行速度超过进程A的执行速度时,可能进程B从缓冲器取出一个记录并加工后,进程A仍没有把下一个新记录存入缓冲器,而进程B却又从缓冲器中去取记录,造成重复地取同一个记录加工。

  用进程互斥的办法不能克服上述两种错误。

  以上表明:在计算机系统中,为了完成某一个任务,进程之间要协作。
  事实上,进程A和进程B虽然共享缓冲器,但它们都是在无进程使用缓冲器时才向缓冲器存记录或从缓冲器取记录的。也就是说,它们在互斥使用共享缓冲器的情况下仍发生错误。引起错误的根本原因是它们的速率,可以采用互通消息的办法来控制执行速度,使相互协作的进程正确工作。

由于每个进程都是在得到对方的消息后才去使用共享的缓冲器,所以不会出现记录的丢失和记录的重复处理。

九、进程的同步:

(一)同步机制:

要实现进程的同步就必须提供一种机制,该机制能把它进程需要的消息发送出去,也能测试自己需要的消息是否到达。
  把能实现进程同步的机制称为"同步机制",不同的同步机制实现同步的方法也不同,PV操作和管理是两种典型的同步机制。
  在这里,我们只介绍怎样用PV操作实现进程间的同步。
  我们已经知道怎样同PV操作来实现进程的互斥。事实上,PV操作不仅是实现进程互斥的有效工具,而且还是一个简单而方便的同步工具。
  用一个信号量与一个消息联系起来,当信号量的值为"0"时表示期望的消息尚未产生,当信号量的值为非"0"时表示期望的消息已经存在。我们假定用信号量S表示某个消息,现在来看看怎样用PV操作达进程同步。

1.调用P操作测试消息是否到达:

任何进程调用P操作可测试到自己所期望的消息是否已经到达。若消息尚未产生则S=0,调用P(S)后,P(S)一定让调用者成为等待信号量S的状态,即调用者此时必定等待直到消息到达;若消息已经存在则S≠0,调用P(S)后进程不会成为等待状态而可继续执行,即进程测试到自己期望的消息已经存在。

2.调用V操作发送消息:

任何进程要向它进程发送消息时可调用V操作。若调用V操作之前S=0,表示消息尚未产生且无等待消息的进程,这时调用V(S)后,V(S)执行S:=S+1使S≠0,即意味着消息已存在;若调用V操作之前S<0,表示消息未产生前已有进程在等待消息,这时调用 V(S)后将释放一个等待消息者,即表示该进程等待的消息已经到达可以继续执行。
  在用PV操作实现同步时,一定要根据具体的问题来定义信号量和调用P操作或V操作。一个信号量与一个消息联系在-起,当有多个消息时必须定义多个信号量;测试不同的消息是否到达或发送不同的消息时,应对不同的信号量调用P操作或V操作。

(二)生产者消费者问题:

生产者消费者问题是一个典型的同步例子,假定有一个生产者和一个消费者,它们公用一个缓冲器,生产者不断地生产物品,每生产一件物品就要存入缓冲器,但缓冲器中每次只能存入一件物品,只有当消费者把物品取走后,生产者才能把下一件物品存入缓冲器。同样地,消费者要不断地取出物品去消费,当缓冲器中有物品时他就可去取,每取走一件物品后必须等生产者再放入一件物品后才能再取。
  在这个问题中生产者要向消费者发送"缓冲器中有物品"的消息,而消费者要向生产者发送"可把物品存入缓冲器"的消息。用PV操作实现生产者消费者之间的同步,应该定义两个信号量,分别表示两个消息。我们把这两个信号量定义为SP和SG,它们的含义为:
  SP 表示是否可以把物品存入缓冲器,由于缓冲器中只能放一件物品,系统初始化时应允许放入物品,所以SP的初值应为"1"。
  SG 表示缓冲器中是否存有物品,显然,系统初始化时应该无物品在缓冲器中,所以 SG的初值应为"0"。
  对生产者来说,生产一件物品后应调用P(SP),当缓冲器中允许放物品时(这时SP=1),则在调用P(SP)后不会成为等待状态(但SP的值已经变为"0"),生产者可以继续执行,把物品存入缓冲器。生产者把一件物品存入缓冲器后,又可继续去生产物品,但若消费者尚未取走上一件物品(这时SP维持为"0"),而生产者欲把又生产的物品存入缓冲器时调用P(SP)后将成为等待状态,阻止它把物品存入缓冲器。生产者在缓冲器中每存入一件物品后,应调用V(SG)把缓冲器中有物品的消息告诉消费者(调用V(SG)后,SG的值从"0"变为"1")。
  对消费者来说,取物品前应查看缓冲器中是否有物品,即调用P(SG)。若缓冲器中尚无物品(这是SG仍为"0"),则调用P(SG)后消费者等待,不能去取物品,直到生产者存入一件物品后发送"有物品"的消息时才唤醒消费者。若缓冲器中已有物品(这时SG为"1"),则调用P(SG)后消费者可继续执行,从缓冲器中去取物品。消费者从缓冲器中每取走,一件物品后,应调用V(SP),通知生产者缓冲器中物品已取走,可以存入一件新的物品。

生产者和消费者并发执行时,用PV操作为同步机制可按如下方式管理:

begin
       Buffer:integer;
       SP,SG:semaphore;
       SP:=1;SG:=0;
     cobegin
       PROCESS Producer
       begin
         L1:produce a product;
           P(SP);
           Buffer:=product;
           V(SG);
         goto L1
       end;
       PROCESS Consumer
       begin
         L2:P(SG);
           take a product from Buffer;
           V(SP);
           Consume
         goto L2
       end;
     coend;
     end;

注意:生产者生产物品的操作和消费者消费物品的操作是各自独立的,只是在访问公用的缓冲器把物品存入或取出时才要互通消息。所以,测试消息是否到达和发送消息的P操作和V操作应该分别在访问共享缓冲器之前和之后。
  如果一个生产者和一个消费者共享的缓冲器容量为可以存放n件物品(n>1)那么只要把信号量SP的初值定为"n",SG的初值仍为"0"。当缓冲器中没有放满n件物品时,生产者调用P(SP)后都不会成为等待状态而可以把生产出来的物品存入缓冲器。但当缓冲器中已经有n件物品时(此时SP已经为"0"),生产者再想存入-件物品将被拒绝。生产者每存入一件物品后,由于调用V(SG)发送消息,故SG的值表示缓冲器中可供消费的物品数。只要SG≠0,消费者调用P(SG)后总可以去取物品,每取走-件物品后调用V(SP),便增加了一个可以用来存放物品的位置。

由于缓冲器可存n件物品,因此,必须指出缓冲器中什么位置已有物品可供消费,什么位置尚无物品可供生产者存放物品。用两个指针k和t分别指示生产者往缓冲器存物品和消费者从缓冲器取物品的相对位置,它们的初值为"0",生产者和消费者按顺序的位置去存物品和取物品。缓冲器被循环使用,即生产者在缓冲器顺序存放了n件物品后,则以后继续生产的物品仍从缓冲器的第一个位置开始存放。于是,一个生产者和一个消费者共享容量为n的缓冲器时,可如下同步工作:

begin
        B:array [0…n-1] of integer;
        k,t:integer;
        k:=0;t:=0;
        SP,SG:semaphore;
        SP:=n;SG:=0;
      cobegin
        PROCESS Producer
        begin
          L1:produce a product;
            P(SP);
            B[k]:=product;
            k:=(k+1) mod n;
            V(SG);
          goto L1
        end;
        PROCESS Consumer
        begin
          L2:P(SG);
            take a product from B[t];
            t:=(t+1) mod n;
            V(SP);
            Consume
          Goto L2
        end;
      coend;
      end;

生产者消费者问题是非常典型的问题,有许多问题可以归结为生产者消费者问题,根据实际情况灵活应用。

(三)同步与互斥混合问题:

进程的同步与进程的互斥都涉及到并发进程访问共享资源的问题,从前面的讨论中我们可以看到进程的互斥实际上是进程同步的一种特殊情况。若干进程互斥使用资源时,一个等待使用资源的进程在得到占用资源的进程发出"归还资源"的消息(调用了V操作)后,它就可去使用资源。
  因此,互斥使用资源的进程之间实际上也存在一个进程依赖另一个进程发出消息的制约关系。所以,有时也把进程的互斥与进程的同步统称为进程的同步。
  但是,值得注意的是这两种制约关系是有差别的。进程的互斥是进程间竞争共享资源的使用权,这种竞争是没有固定的必然关系,哪个进程竞争到使用权则就归哪个进程使用,直到不需使用时再归还使用权。若此时无进程使用共享资源,当有进程想使用共享资源则就允许其中一个进程去使用它,即使是刚刚才使用过共享资源的进程,仍可以再一次的抢先使用。
  而进程同步的情况就不同了,涉及共享资源的并发进程之间有一种必然的依赖关系,当进程必须同步时,即使无进程在使用共享资源时,那么尚未得到同步消息的进程也不能去使用这个资源。

  PV操作是实现进程互斥和进程同步的有效工具,但若使用不得当则不仅降低系统效率而且仍会产生错误。希望大家在弄清PV操作作用的基础上,体会在各个例子中调用不同信号量上的P操作和V操作的目的,从而正确掌握对各类问题的解决方法。

十、进程通信机制:

信息交换经常发生在并发进程之间,比如把PV操作可看作是进程间的一种方式,但这种通信只交换了少量的信息,比如缓冲器中是否可存物品、缓冲器中是否已有物品以及是否可以读文件等等,只交换少量信息的通信方式是一种低级通信方式。
  采用高级通信方式时,进程间用信件来交换信息。一个正在执行的进程可以在任何时刻向另一个正在执行的进程发送一封信,一个正在执行的进程也可以在任何时刻向另一个正在执行的进程请求一封信。

(一)信件:

一个进程要向其他进程发送信息时,先组织好一封信件,信件的内容应包括:
  发送者名;
  信息(或信息存放地址和长度)
  等不等回信;
  回信存放地址;.
  ……等。
  其中"发送者名"为发送信件进程的进程名;"信息"指要传送给某一进程的信息,若信息量很大则信息可以存在某个缓冲区,在信件中指出信息的存放地址和长度,这样,可缩短信件长度,减少传递信件的时间,则接收信件者直接葱指定地址中取信息;"等不等回信"表示信件发送者是否等信件接收者的回信,当需要回信时指出"回信存放地址"。

(二)通信原语:

企图发送或接收信件的进程必须指出信件发送到哪里或从哪里接收信件,信件的传递是由通信原语来完成的。
  最基本的通信原语有两条,它们是"send"原语和"receive"原语。
  进程欲发送信件时,必须先组织好信件,然后调用"send"原语,在调用"send"原语时应给出参数,即信件或信件存放地址以及信送到哪里。进程请求一封信时,调用"receive"原语接收信件,在调用"receive"原语时也要给出参数,即从哪里取信以及取出的信件存放到哪里。
  进程通信有两种方式:
1.直接通信
  这种通信是固定在一对进程之间。例如,进程A把信件只发送给进程B,而进程B也只接收进程A的信件。那么,"send''和"receive"两条原语的形式如下:
  send(B,M) 把信件M发送给进程B
  receive(A,X) 接收来自进程A的信件且存入X中进程A和进程B通过"send''和"receive''操作而自动建立了-种联结。

2.间接通信种联结
  这种通信是以信箱为媒体来实现通信的,只要接收信件的进程设立一个信箱,那么,若干个进程都可向同一个进程发送信件。利用信箱通信时,"send","receive"原语中应给出信箱名,即:
  send(N,M) 把信件M送入信箱N中
  receive(N,X) 从信箱N中取出一封信存入X

十一、间接通信:

间接通信是指进程之间利用信箱来交换信息,接收信件的进程设立一个信箱,信箱的大小决定了信箱中可容纳的信件,为了便于了解信箱中的情况,一个信箱可以"信箱说明"和"信箱体"两部分组成。

图1        信箱结构

"可存信件数"是在设立信箱时预先确定的,根据"可存信件数"和"已有信件数"能判别信箱是否满和信箱中是否有信件。若信箱不满则按"可存信件的指针"指示的位置存入当前的一封信,该指针的初始值为指向可存第一封信的位置,当存入一封信后便要修改"已有信件数"和"可存信件的指针"。若信箱中有信则每次可从中取出一封信,为简便起见,可约定每次总是取信箱中的第一封信,当第一封信被取走后便把其余的信件向上移动。

为避免信件丢失和错误地索取信件,通信时应有如下规则:
  (一)若发送信件时信箱已满,则发送进程应被置成"等信箱"状态,直到信箱有空时才被释放。
  (二)若取信件时信箱中无信,则接收进程应被置成"等信件"状态,直到有信件时才被释放。
 于是,"send"和"receive"的以及如下:

功能 实现要求
send(N,M) 把信件M送到指定的信箱N中。 查指定信箱N,若信箱未满则把信件M送入信箱且释放"等信件"者;若信箱已满则置发送信件进程为"等信箱"状态。
receive(N,X) 从指定信箱N中取出一封信,存放到指定的地址X中。 查指定信箱N,若信箱中有信则取出一封信存于X中且释放"等信箱"者;若信箱中无信件则置接收信件进程为"等信件"状态。

根据信箱的结构,我们可以定义信箱是如下类型的数据:

TYPE box=record
        Size:0‥n;
        Count:0‥n;
        Letter:array[1‥n] of message;
        S1,S2:semaphore
      end;

其中,size指出信箱大小,在设立信箱时对每一个信箱应固定某一个值n,n表示可容纳的信件数。count表示信箱中现有信件数。letter是存入信箱中的信件。S1和S2分别表示"等信箱"和"等信件"的两个等待事件。于是,"send"和"receive"的两个原语的过程如下:

procedure send(var B:box;M:message);
      var i:integer;
      begin
        if B.count=B.size then W(B.S1)
        else begin
        i:=B.count+1;
        B.letter[i]:=M;
        B.count:=i;
        R(B.S2)
      end;
     end;{send}
    procedure receive(var B:box;X:message);
      var i:integer;
      begin
        i:=1;
        if B.count=0 then W(B.S2)
        else begin
           B.count:=B.count-1;
           X:=B.letter[l];
           If B.count≠0 then
           for i=1 to B.count
           do B.letter[i]:=B.letter[i+1];
           R(B.S1)
        end;
      end;{receive}

其中,W(B.S1)为把调用send的进程置成"等信箱"状态,W(B.S2)为把调用receive的进程置成"等信件"状态,R(B.S1)为释放等信箱的进程,R(B.S2)为释放等信件的进程。

  现在举一个例子来说明进程间的通信关系M。
  假定某操作系统中启动磁盘的工作由一个称为"磁盘管理"的进程统一来做,那么任意一个要访问磁盘的进程就只要向"磁盘管理"进程发一封信。"磁盘管理"进程只要逐封处理信箱中的信件就能使各进程得到从磁盘上读出的信息或者把信息写到磁盘上。任一进程向磁盘管理进程发信时,先按自己的要求组织好信件,信的内容应包括:
  发送进程的名(或信箱名)name;
  访问要求(读盘还是写盘);
  读写的信息存放在主存中的起始地址;
  读写的信息长度;
  访问磁盘的柱面号、磁道号和扇区号。然后凋用send原语把信件送入磁盘管理进程设置的信箱中。
  磁盘管理进程调用receive原语请求从自己的信箱中取出--封信,然后按信件要求组织通道程序,用"启动I/O"指令启动磁盘工作。
  当磁盘启动成功后,磁盘管理进程等待磁盘与主存储器之间进行信息传输,传输结束后把传输正常结束还是传输出错的信息组织成一封回信,发送给请求访问磁盘者。当发出回信后,磁盘管理进程又可请求从自己信箱中取出一封信来处理,使所有要访问磁盘的进程都能按要求得到处理,完成访问磁盘的任务。如果磁盘管理进程设置的信箱为B,则进程间的通信关系如下:

欲访问磁盘的进程   "磁盘管理"进程
       begin        begin
       …           …
       {组织信件M}      L1:receive(B,X);
       send(B,M);     {按信件要求组织通道程序};
       …          {通道程序首址存入CAW};
       end;         {启动磁盘};
                  {等磁盘传输结束};
                  {组织回信m};
                  send(name,m);
                  goto L1
                  end;

用进程通信的方式实现对共享磁盘的管理能保证任何时刻最多只有一个访问者在使用磁且每个访问者的请求都能先后得到处理。

十二、用进程通信实现进程同步:

用进程通信的方式也能解决生产者消费者问题。生产者在生产了一件物品后,可发信给消费者,消费者接到信件后可取物品消费;消费者取出产品后可发一封回信给生产生产者接到回信后又可把有下一件物品的信息通过信件告诉消费者。生产者与消费者之过信件交换信息,达到同步的目的。
  所以,若-个进程在某一时刻的执行依赖于另一个进程的信件,或等待另一个进程回信,那么,通信机制可起到进程同步的作用。
  用通信机制实现进程同步时能发送更丰富的消息。
  例如,生产者不仅可告诉消费名供消费的物品,且可在信件中说明物品的性质、规格和使用要求等。同样,消费者也可把对物品的处理情况在信件中说明。

十三、管道通信:

对于消息缓冲通信,需要使用较多的内存,当没有空闲的内存空间用作缓冲区时,消息发送工作不得不暂停。另外,这种通信方式是以消息为单位进行的,只有发送进程完整地产生了一个消息后,才能把它送向接收进程,不能做到随时生产随时发送。
  为克服上述两点不足,UNIX首创了管道通信方式。

  基本思想:以文件系统为基础,以外存为通信媒体。所谓管道(pipe),就是专用于在进程之间通信的共享文件。
  发送进程可以源源不断地从pipe一端写入数据,在规定的pipe文件的最大长度内,每次写入的信息长度是可变的。
  接收进程在需要时可从pipe的另一端读出数据,读出的信息长度也是可变的。Pipe文件好像是设在两进程间的一个管道,一端流入信息,另一端流出信息。
  pipe通信属于间接通信方式,其实质是利用外存传递信息,优点是数据传输量大且有利于节省内存,缺点是速度较慢。

十四、线程的概念:

线程是进程中可独立执行的子任务,一个进程中可以有一个或多个线程,每个线程都有一个惟一的标识符。
  线程有如下属性:
  (1)每个线程有一个惟一的标识符和一张线程描述表,线程描述表记录了线程执行时的寄存器和栈等现场状态。
  (2)不同的线程可以执行相同的程序,即同一个服务程序被不同用户调用时操作系统为它们创建成不同的线程。
  (3)同一进程中的各个线程共享分配给进程的主存地址空间。
  (4)线程是处理器的独立调度单位,多个线程是可以并发执行的。在单处理器的计算机系统中,各线程可交替地占用处理器;在多处理器的计算机系统中,各线程可同时占用不同的处理器,若各个处理器同时为一个进程内的各线程服务则可缩短进程的处理时间。
  (5)一个线程被创建后便开始了它的生命周期,直至终止。线性在生命周期内会经历等待态、就绪态和运行态等各种状态变化。

  可见,线程与进程有许多相似之处,所以往往把线程又称为"轻型进程" (1ightweight process)。
  在采用线程技术的操作系统中,线程与进程的根本区别是把进程作为资源分配单位,而线程是调度和执行单位。每个进程都有自己的主存空间,同一进程中的各线程共享该进程的主存空间,进程中的所有线程对进程的整个主存空间都有存取权限。

十五、进程与线程:

 线程定义
  采用多线程技术后生产者线程和消费者线程是两个可独立执行的线程,它们仍具有并发性,但不再需要额外的公共缓冲器。因而,避免了用两个进程实现并发执行的缺点。
 

 操作系统为每个被创建的进程分配需要的资源,一个进程内的各个线程共享进程的资源。多线程技术有明显的优越性:
     (1)创建线程不需另行分配资源,因而创建线程的速度比创建进程的速度快,且系统的开销也小。
  (2)线程间的通信在同一地址空间中进行,故不需要额外的通信机制,使通信更简便,信息传送速度也快。

  线程协作完成一项任务时,线程间必须要同步以协调工作。线程的同步是指一个线程主动暂停执行,等待其他的线程执行某些操作。
  支持线程的操作系统都必须提供一种同步方式,不同的操作系统实现同步的方式可以是不同的。但必须使一个线程在需要时能等待其他线程完成某项工作,也应允许一个线程通知其他线程,它已完成了某项工作。

重点难点:

1.并发进程的特征:

  (1)并发进程的不确定性:

  同一个进程在同一个数据集上运行,其运行结果应该相同。从这个意义上说,并发执行应当是确定的。这里所说的不确定性主要指以下两个方面:一是进程运行周期,二是并发执行的先后顺序。
  运行周期是指一个进程从开始执行,中间经过若干次走走停停到运行结束所用的时间。在单道程序系统中,只要程序和数据没有改变,运行周期也不会改变。而并发执行方式则不然,在示例2.1中,P2从时刻t2开始到时刻t11结束。如果P1不是在时刻t9结束,而是在时刻t7结束,那么P2一定会提前结束。这就是说,P2的运行周期将会比原来缩短。这说明,在并发方式下,进程的运行周期是不确定的。
  并发进程在先后顺序上的不确定性是容易明白的。在上述示例中,如增加一个进程P4,其优先级介于P1和P2之间,那么并发进程执行的先后顺序一定是另外一种情形。

  (2)并发进程的执行结果与它们的相对速度有关:

  假定进程A和进程B互相独立地运行。A在运行过程中不断地将结果输出到文件F中,而B打印F中的内容,且它们的相对运行速度是不确定的。倘若在A运行过程当中,操作系统将控制转到B,此时打印出的是中间结果;但倘若在A运行结束后运行B,则打印的是A的最终结果。这里,B的执行结果与它和A的相对速度有关。

  (3)并发进程之间存在这相互依赖和彼此制约的关系:

  虽然各个并发进程活动具有相对的独立性,但它们之间又常常以直接或间接的方式发生相互依赖和彼此制约的关系。直接的依赖关系常由于进程活动之间的逻辑联系而引起。例如,正在运行的进程B需要另一进程A的计算结果。于是,只有当A已执行到某一时刻,送来了计算结果时,B才能继续运行下去。这里,B的运行依赖于A地运行,反过来,也可以说A的运行制约着B的运行。
  间接运行多表现为彼此之间的制约关系,其原因是若干并发进程竞争使用相同的资源。例如,在进程A读带期间,若进程B也要读带,而系统中刚好只有一台磁带机,那么,B只有先停下来,将CPU让给其他进程。这样,B的运行就因磁带机而间接地受到A的制约。一般说来,这种制约关系可能会在各个进程活动之间发生,与它们之间有无逻辑上的联系无关。

  (4)并发进程与其执行过程并非一一对应:

  例如,计算机系统中C编译程序只有一个,但它可以同时对两个以上的C源程序进行编译。这样,一个程序对应的执行过程就有多个。

2.错误的产生原因:

当多个进程一起争用同一资源时,由于资源有限,每个进程都想获得该资源,而对于并发进程而言,进程的执行是随机的,其中一个进程对其他进程的影响是不可预知的,所以在设计过程中有可能出现上面描述的错误发生。这种情况在操作系统中常见,问题的解决方法就在于一次只能容许一个进程对共享资源进行写操作,互斥的对它进行访问。

3.使用互斥区的原则:

  有空让进:当无进程在互斥区时,任何有权使用互斥区的进程可进入。
  无空等待:不允许两个以上的进程同时进入互斥区。
  有限等待:任何进入互斥区的要求应在有限的时间内得到满足。
  前提:任何进程无权停止其它进程的运行, 进程之间相对运行速度无硬性规定。

4.P.V操作的物理意义:

  当S>0时的信号量数值,表示该类资源的可用资源数。每执行一次P操作,就意味着请求分配一个单位的该类资源给执行P操作的进程,因此描述为S:=S-1。当S<0时,表示该类资源已经分配完,没有可以再使用的空闲资源,因此请求资源的进程将被阻塞在相应的信号量S的等待劣种。此时S的绝对值等于在该信号量上等待的尽成熟。而执行一次V操作意味着进程释放出一个单位的该类可用资源,故描述为S:=S+1。若S≤0表示信号量等待队列中有因请求该资源而被封锁的进程,因此就应把等待队列中的一个进程(往往是第一个)环形(即改变进程的阻塞状态),使之转到就绪队列中。

5.信号量实现进程的阻塞和唤醒:

  资源的分配和释放:进程所等待的资源被其他进程释放成为可用(互斥)。
  信号量:每类资源一个,初值=资源的数量(资源记数器)。
  P操作:资源分配机构。信号量非正,进程被阻塞。
  V操作:资源释放机构。信号量非正,重新调度以唤醒一阻塞进程。
  进程间相互协同工作:等待相关的协作进程完成某个操作(同步)。
  信号量:每个进程一个(同步进程),初值为0。
  P操作:等待时阻塞自己。P(Proc-sem(进程内部标识号id))
  V操作:被所等待的进程唤醒。V(Proc-sem(id))

概念辨析:

1.并发进程:

  若系统中存在一组可同时执行的进程,则就说该组进程具有并发性,并把可同时执行的进程称为"并发进程"。

2.与时间有关的错误:

  在并发进程执行过程中,由于几次你哼占用处理器的时间、执行的速度以及外界的影响(可能用户的操作,或其他不可预知的事件产生),都将引起程序执行的不可预知的错误,这些错误都与时间有关,所以我们称之为"与时间有关的错误"。

3.进程的互斥(间接作用)mutual exclusion:

  由于各进程要求共享资源,而有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥。

4.临界资源:critical resource:

  系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源或共享变量。

5.临界区(互斥区):critical section:

  一个程序片段的集合,这些程序片段分散在不同的进程中,对某个共享的数据结构(共享资源)进行操作。 在进程中涉及到临界资源的程序段叫临界区。

6.同步:

  协同工作的一组伙伴进程中的某一进程达到某一点时,要求其他进程已经完成某些操作,否则就不得不停下来等待这些操作的完成,这需要进程间的同步。把伙伴进程之间相对速度的必要调整,称为进程间的同步。

7.进程通信:

  进程间要交换大量的信息,这种大量信息的传递要有专门的通信机制来实现,这是一种高级的通信方式,我们把通过专门的通信机制实现进程间交换大量信息的通信方式称为"进程通信"。

8.线程:

  进程内的一个执行单元;进程内的一个可调度实体。线程是进程中可独立执行的子任务,一个进程中可以有一个或多个线程,每个线程都有一个惟一的标识符。

本章小结:

在顺序执行指令的处理器上,进程的执行是按序的,即进程具有顺序性。但是,在计算机系统中往往有若干个进程请求执行,当一个进程的执行没有结束前允许其他进程也开始执行,则说这些进程是可同时执行的。可同时执行的进程交替地占用处理器,若系统中存在一组可同时执行的进程,则说该组进程具有并发性,把这些进程称为"并发进程"。

  并发进程相互间可以是无关的,也可以是有交往的。有交往的并发进程一定共享某些资源,由于并发进程执行的相对速度受自身或外界的因素影响,也受进程调度策略的限制,因此并发进程在访问共享资源时可能会出现与时间有关的错误。并发进程在访问共享资源时可以有两种关系,一种是竞争关系,另一种是协作关系。当并发进程存在竞争关系时必须互斥地使用共享资源;当并发进程存在协作关系时必须互通消息。把这两种关系分别称为"进程的互斥"和"进程的同步",进程间正确的互斥和同步能避免出现与时间有关的错误。

  把并发进程中与共享变量有关的程序段称为"临界区"。与某共享变量有关的各进程都有各自的临界区,但这些临界区都涉及到共同的变量,故把它们称为是"相关临界区"。进程的互斥是指并发进程互斥地进入相关临界区,即每次只允许一个进程进入自己的临界区,当有一个进程在它的临界区执行时就不允许其他进程进入各自的与其相关的临界区,直到该进程退出临界区为止。进程的同步是指进程使用共享资源时必须互通消息,即只有接到了指定的消息后进程才能去使用共享资源,如果进程没有接到指定消息,虽然此时无进程在使用共享资源,则该进程仍不能去使用共享资源,直到消息到达为止。实际上,进程互斥是进程同步的特例,故经常把实现进程互斥和进程同步的机制统称为"同步机制"。

  PV操作是一种简便的同步机制,它包括两个不可中断的过程,分别称为"P操作原语"和"V操作原语"。PV操作是对信号量实施操作,若把信号量与共享资源对应起来,则用 PV操作可实现进程的同步和进程的互斥。从课文中的例子分析中可总结信号量的物理含义 (假定信号量用S表示)如下:

  S>0时 S表示可使用的资源数或表示可使用资源的进程数。
  S=0时 表示无资源可供使用或表示不允许进程再进入临界区。
  S<0时 ∣S∣表示等待使用资源的进程个数或表示等待进入临界区的进程个数。
  于是,根据PV操作的性质,任何进程在使用共享资源前应调用P操作。当有可以使用的资源或允许使用资源时(S>0),调用P(S)后不会成为等待,进程可以使用资源。当无资源可使用或不允许使用资源时(S≤0),调用P(S)后进程必然等待。任何进程可调用V操作来归还共享资源的使用权,当S>0时调用V(S)后使可用的资源数加1或使可用资源的进程数加1。当S≤0时调用V(S)后将释放一个等待使用资源者或释放一个等待进入临界区者。

  实现进程互斥时,用一个信号量与一组相关临界区对应,这些进程在同一个信号量上调用P操作和V操作来实现互斥。实现进程同步时,每一个消息与一个信号量对应,进程在不同信号量上调用P操作以测试自己需要的消息是否到达,在不同信号量上调用V操作可把不同的消息发送出去。

  除PV操作同步机制外,其他的同步机制还有"管程"(monitor)"忙式等待"等:有兴趣的话可参阅其他书籍。

  进程可用信件来传送大量信息,一个进程可以发送一封信,把信息告诉其他进程或请求其他进程协助工作。发送信件者必须在信件中指出信件送给谁(或哪个信箱)以及所要传送的信息(或信息存放地址),这样才能使收信者收到信件和取到信息。信件的传送要依赖专门的通信机制,通信机制由一些通信原语组成,其中send原语和receive原语是最基本的通信原语。

  多线程技术是操作系统的发展趋势,它能提高计算机系统的性能。

同步练习:

1.设有三个进程共享一个资源,如果每次只允许一个进程使用该资源,则用PV操作管理时信号量S的可能取值是 ( )。
 A.1,0,-1,-2
 B.2,0,-1,-2
 C.1,0,-1
 D.3,2,1,0

参考答案:A

2.任何两个并发进程之间(  )
 A.一定存在互斥关系  
 B.一定存在同步关系
 C.一定彼此独立无关  
 D.可能存在同步或互斥关系

参考答案:D

1.什么是进程的顺序性和并发性?

进程的顺序性是指进程在顺序的处理器上严格地按顺序执行。若系统中存在一组可同时执行的过程,则该组程序具有并发性。可同时执行的进程是指这些进程执行时在时间上是重叠的,即一个进程的工作没有全部完成之前,另一个进程就可以开始工作。

2.为什么并发进程执行时可能会产生与时间有关的错误?如何避免?

有交往的并发进程可能会同时使用共享资源,如果对这种情况不加控制,由于进程占用处理器的时间、执行的速度和外界的影响等,就会引起与时间有关的错误。只要使若干并发进程的相关临界区互斥执行,就可避免造成这类错误。

3.简述临界区的相关临界区的概念。

临界区是指并发进程中与共享变量有关的程序段。相关临界区是指并发进程中涉及到相同变量的那些程序段。

4.管理相关临界区有些什么要求?

管理相关临界区有三点要求:(1)一次最多让一个进程在临界区执行;(2)任何一个进入临界区执行的进程必须在有限的时间内退出临界区;(3)不能强迫一个进程无限地等待进入它的临界区。

5.用Pv操作实现进程间同步与互斥应注意些什么?

(1)对每一个共享资源(含变量)都要设立信号量,互斥时对一个共享资源设一个信号量,同步时对一个共享资源可能要设两个或多个信号量,视由几个进程来使用该共享变量而定。(2)互斥时信号量的初值可大于或等于1,同步时,至少有一个信号量的初值大于等于1。(3)Pv操作一定要成对调用,互斥时在临界区前后对同一信号量作Pv操作,同步时则对不同的信号量作Pv操作,Pv操作的位置一定要正确。(4)对互斥和同步混合问题.PV操作可能会嵌套,—般同步的Pv操作在外,互斥的Pv操作在内。

6.何谓进程通信?最基本的通信原语有哪些?

通过专门的通信机制实现进程间交换大量信息的通信方式称为进程通信。最基本的通信原语有send原语和receive原语,前者负责发送信件,后者负责接收信件。

7.直接通信与间接通信有何区别?

直接通信是固定在一对进程间进行的,而间接通信时以信箱为媒体实现通信。因此在send和receive原语中,第一个参数互不相同。直接通信时分别为接收者进程名和发送者进程名,而间接通情时均为信箱名。

8.线程与进程的根本区别是什么?

在采用线程技术的操作系统中,线程与进程的根本区别在于:进程是资源的分配单位,而线程是调度和执行单位。

操作系统学习(八)进程同步与通信相关推荐

  1. 操作系统学习-6. 信号量

    写在前面: 这一篇博客将讨论信号量(Semaphores)机制.将学习三种基本类型的信号量,然后将用信号量实现互斥与前趋两种进程关系. 该机制由荷兰学者 Dijkstra 提出,是一种卓有成效的进程同 ...

  2. 操作系统学习笔记:进程同步与通信

    目录: 一.进程间的相互作用: 进程之间的联系: 利用软件方法解决进程互斥问题: 利用硬件方法解决进程互斥问题: 信号量机制: 经典的进程同步问题: 管程的机制: 二.进程通信: 基本概念: 进程通信 ...

  3. 操作系统04进程同步与通信

    4.1 进程间的相互作用 4.1.1 进程间的联系 资源共享关系 相互合作关系 临界资源应互斥访问. 临界区:不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它们进行访问. 把在每个进程中访 ...

  4. 操作系统学习笔记-2.1.4进程通信

    操作系统学习笔记-2019 王道考研 操作系统-2.1.4进程通信 文章目录 4进程通信 4.1知识总览 4.2前置知识:什么是进程通信? 4.3共享存储 4.4 管道通信 4.5消息传递 4.6小结 ...

  5. ROS机器人操作系统学习笔记(三)ROS通信架构

    ROS机器人操作系统学习笔记(三)ROS通信架构 ROS的通信架构是ROS的灵魂,也是整个ROS正常运行的关键所在.ROS通信架构包括各种数据的处理,进程的运行,消息的传递等等.本章主要介绍了通信架构 ...

  6. 《操作系统第四版》(刘振鹏 王煜)(四)进程同步与通信

    操作系统(四) 四.进程同步与通信 4.1 进程间的相互作用 4.1.1进程间的联系 进程间的联系 资源共享关系 相互合作关系 临界资源 一种供多个进程互斥访问的资源 同一时刻只允许一个进程访问的资源 ...

  7. 分享--操作系统学习

    分享--操作系统学习 链接: https://mp.weixin.qq.com/s?__biz=MzI1OTY2MzMxOQ==&mid=2247487662&idx=1&sn ...

  8. 计算机操作系统学习笔记 第二章、进程与线程

    文章目录 1 进程和线程 1.1 进程的概念和特征 1.1.1 进程的概念 1.1.2 进程的特征 1.2 进程的状态与转换 1.3 进程的组织 1.4 进程控制 1.5 进程通信 1.5.1 共享存 ...

  9. 【操作系统学习笔记】—— 【二】进程、线程、死锁

    本文参考: JavaGuide 王道考研-操作系统 CS-Notes 文章目录 一.进程的概念.组成.特征 1. 概念 2. 进程的组成 PCB 程序段 数据段 3. 进程的特征 二.进程的状态 三. ...

最新文章

  1. CUDA error: device-side assert triggered Assertion t 」= 0 t n classes failed
  2. 读书笔记:《图解HTTP》第三章 HTTP报文
  3. STM32 进阶教程 18 – ADC间断模式
  4. c 语言 string库,C语言编程必备资料(包括库函数,string类,stl库模板).docx
  5. python_文件处理
  6. 初识Lock与AbstractQueuedSynchronizer(AQS)
  7. mysql 事务 myisam,InnoDB和MyISAM的差别(mysql事务处理)
  8. 疑似一加7渲染图曝光:弹出式自拍镜头+高颜值渐变配色
  9. python数据存储系列教程——xls文件的读写、追加(xlwt、xlwt、xlutils)
  10. [转]Oracle销售人员普遍腐败?
  11. 在 Mac 上的 Safari 浏览器中如何放大网页?
  12. iOS 开发 入门:使用Ad Hoc 进行用户测试
  13. 【mitmproxy手机端App抓包】
  14. 初识C语言——C语言基础知识
  15. 详解会议中控系统及其优点特点有哪些?
  16. 时空恋旅人 豆瓣影评
  17. 旧手机(小米4)装linux的一个记录
  18. 谈谈产品与运营之 - 什么是用户感知
  19. css中_box的属性包括,css box-sizing 属性
  20. 直播app开发搭建,纯css/html实现侧边导航栏

热门文章

  1. html的美图片加上2d动画,网站上面添加一个动漫小女孩的html代码 WordPress添加live2d看板娘...
  2. java免注册调用大漠插件
  3. 思科路由器ospf多区域配置
  4. My Heart Will Go On 中英文歌词
  5. python做雪花飘落_python实现雪花飘落效果实例讲解
  6. 如何用浏览器调试网页前端代码?
  7. ubuntu下搭建svn服务器
  8. windows下如何进行linux编程,生产者-消费者问题编程简单实现--windows和linux下
  9. 【沉浸式翻译】使用手册
  10. [初学笔记]matlab的具体类型图形命令函, bar条形图