1 / 21

第九讲 进程同步与通讯

第九讲 进程同步与通讯. 目的与要求 : 掌握信号量解决进程同步互斥问题的方法;掌握进程通信的基本实现方法。 重点与难点 :信号量的典型应用,通讯实现。 作业 : 13 , 14 , 15. 4.2.5 进程同步与互斥举例 一、有限缓冲区问题 问题描述: 设有 N 个缓冲区,一组生产者进程往缓冲区写数据,一组消费者进程从缓冲区取数据,写取以一个缓冲区为单位。 说明: 将缓冲池看作是共享数据,对缓冲区的 操作必须是互斥操作。 如果 N 个缓冲区全满,生产者进程必须 等待。 如果缓冲区全空,消费者进程必须等待。.

bandele
Download Presentation

第九讲 进程同步与通讯

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第九讲 进程同步与通讯 • 目的与要求:掌握信号量解决进程同步互斥问题的方法;掌握进程通信的基本实现方法。 • 重点与难点:信号量的典型应用,通讯实现。 • 作业:13,14,15

  2. 4.2.5 进程同步与互斥举例 • 一、有限缓冲区问题 • 问题描述:设有N个缓冲区,一组生产者进程往缓冲区写数据,一组消费者进程从缓冲区取数据,写取以一个缓冲区为单位。 • 说明: • 将缓冲池看作是共享数据,对缓冲区的 • 操作必须是互斥操作。 • 如果N个缓冲区全满,生产者进程必须 • 等待。 • 如果缓冲区全空,消费者进程必须等待。

  3. 有限缓冲区的生产者/消费者问题(生产者和消费者共享一个产品缓冲池)有限缓冲区的生产者/消费者问题(生产者和消费者共享一个产品缓冲池) 生产者 消费者 缓冲池 P1 P2 … Pm C1 C2 …Cn 共享N个缓冲区

  4. 解:设置以下信号量 • mutex,初值为1,控制互斥访问缓冲池。 • full,初值为0,表示当前缓冲池中满缓冲区数。 • empty,初值为N,表示当前缓冲池中空缓冲区数。 • 有限缓冲区生产者/消费者进程描述如下: • item表示消息数据类型; • semaphor full,empty,mutex; • item nextp,nextc; • 置初值 • full=0; empty=N; mutex=1;

  5. Producer(): do{ … produce an item in nextp; ... while(empty<=0) ; empty=empty-1; P(empty); P(mutex); get a empty bufferi; bufferi =nextp; add bufferito full buffer queue; V(full); V(mutex); }while(1) full=full+1

  6. consumer(): do{ P(full); P(mutex); get a buffer from full buffer queue; nextc=bufferi put bufferi back to empty queue; V(empty); V(mutex); while(full<=0) ; full=full-1; empty=empty+1 … consume the item in nextc; … }while(1) (两个P操作可以倒序吗?)

  7. 二、Readers/Writers问题 存在共享数据A,那些对它进行只读访问进程叫Reader;对它进行了写操作的进程叫Writer。 第一类Reader/ Writer问题(并发极大化): Reader和Writer争夺访问共享数据A时,如果已经有Reader访问A,后续Reader与后续Writer比有较高优先权。 第二类Reader/ Writer问题(数据时效): Reader和Writer争夺访问共享数据A时,Writer有较高优先权。

  8. 第一类Reader/ Writer问题描述: 1、如果当前无进程访问A,则Reader/ Writer欲访问即可访问。 2、如果已存在一个Reader正在访问数据,其它欲访问Reader可马上访问(这体现Reader有较高优先权);而欲访问的Writer必须等待。 3、若某个Writer正访问数据,则欲访问的Reader/ Writer都必须等待。 4、当最后一个结束访问数据的Reader发现有Writer正在等待时,则将其中一个唤醒。 5、当某个Writer结束访问时,若只有Writer在等待,则唤醒某个Writer,若既有Writer也有Reader;则按FIFO或其它原则唤醒一个Writer或所有Reader。

  9. 第一类Reader/ Writer问题编程 信号量:wrt=1;(用于A的互斥访问) 整型变量:readcount=0(用于reader计数) 信号量:mutex=1;(用于对readcount互斥访问) Reader: P(mutex); readcount=readcount+1; if (readcount==1) P(wrt); V(mutex); 读数据A P(mutex); readcount=readcount-1; if (readcount==0) V(wrt); V(mutex); Writer: P(wrt); 写数据A V(wrt);

  10. 三、哲学家就餐问题 • 问题描述:五个哲学家五只筷子,哲学家循环做着思考和吃饭的动作,吃饭程序是:先取左边筷子,再取右边筷子,再吃饭,再放筷子。

  11. 实现:为每个筷子设一把锁(信号量,初值为1)每个哲学家是一个进程。共享数据结构为实现:为每个筷子设一把锁(信号量,初值为1)每个哲学家是一个进程。共享数据结构为 semaphore chopstick[5]; 第i个进程描述为(i=0,… ,4) do{ P(chopstick[i]); // 取左边筷子; P(chopstick[(i+1)% 5]); // 取右边筷子; Eat; // 放左边筷子; V(chopstick[i]); // 放右边筷子; V(chopstick[(i+1) %5]); Think; }while(1); (这可能导致死锁)

  12. 4.3 消息传递原理 • 两种基本进程通讯方法: • 1、共享存储(Shared-memory):相互通讯的进程有共享存储区.进程间可以通过直接读写共享存储区的变量来交互数据,同步与互斥在并发程序设计时安排进入程序。操作系统提供这样的共享存储区及同步互斥工具。 • 2、消息传递(message-passing):通过操作系统的相应系统调用进行消息传递通讯。

  13. 4.3.1消息传递通讯原理 • 消息传递系统调用语句的一般形式: • 发送消息:Send(destination,&message); • 接收消息:Receive(source,&message)。 • 消息传递方法 • 1、直接通讯法 • 基本思想:进程在发送和接收消息时直接指明接收者或发送者进程ID。 • 缺点:必须指定接收进程ID。(UNIX的信号机制类似这种形式)

  14. 举例:(UNIX中两进程利用信号通讯)。 Process A ┆ kill(1040, SIGUSR1); #向1040号进程发送 一个SIGUSR1信号。 Process B ┆ Signal(SIGUSR1,func);#当收到SIGUSR1信 号时,就执行func(),如果SIGUSR1 信号未到,则系统登记func函数, 待其信号到时再调用执行。 ┆ ┆

  15. 2、间接通讯法(信箱命名法) • 基本思想:系统为每个信箱设一个消息队列,消息发送和接收都指向该消息队列。 • 特点: • 必须有一个通讯双方都知道的一个逻辑消息队列(UNIX的IPC消息传递机制属于这种形式),使用时消息发送者约定写方式打开信箱,消息接受者约定读方式打开信箱或同时读写打开。 • 很容易建立双向通讯链(只要对信箱说明为读写打开)。

  16. 4.3.2 进程消息传递通讯示例 直接通讯消息系统,两个基本操作为: send(&A):&A指向含接收者pid和消息正文的空间。 receive(&A):&A指向缓冲区用于接收消息,该系统调用函数返回值是消息发送者pid。 实现:系统有一空闲缓冲区池,每个进程有一个消息缓冲队列。缓冲区用于存放消息及消息发送者pid和消息链(用pid定位进程PCB表)。 Sender’s pid 下一消息链 消息正文 消息缓冲区

  17. 每个进程的消息队列存放发送给该进程的消息,队列头存于PCB中,同时在PCB中设一互斥信号量mutex(初值为1)和信号量Sm(初值为0),Sm用于记录消息队列中的消息数。每个进程的消息队列存放发送给该进程的消息,队列头存于PCB中,同时在PCB中设一互斥信号量mutex(初值为1)和信号量Sm(初值为0),Sm用于记录消息队列中的消息数。 Receiver’s PCB message message ... Hptr Sender’s pid Sender’s pid mutex Sm text text ...

  18. send(&A): { New(&p);#从空缓冲区队列得一个buffer ... 置sender’s pid; 将A中消息送buffer p; 获得A中Receiver’s pid; P(mutex); 将buffer p挂入相应的消息队列; V(Sm); V(mutex); };

  19. receive(&A): { P(Sm); P(mutex); 从本进程的消息队列取一个buffer f; V(mutex); 从buffer f中取得消息正文送A,并得到 sender’s pid作为Receive( )的返回值; ... dispose(f);#释放buffer f到空缓冲队列 … }; 注:new,dispose函数对空缓冲 区池的访问也需要互斥.

  20. 提高并发性:将一个共享资源分解为多个更小的共享资源提高并发性:将一个共享资源分解为多个更小的共享资源 • 将原来的生产者消费者问题的共享资源--缓冲池(含满、空缓冲区队列),变为n(n个进程满缓冲区队列)+1(空缓冲区队列)个共享资源。

  21. 4.3.3管道通信 • 通信双方按照字节流进行有序通信,如UNIX的PIPE机制。 EDCBA EDCBA

More Related