操作系统教程OS 孙忠秀

10、同步互斥机制3(进程通信)(操作系统笔记)

2017-01-03  本文已影响183人  yjaal

一、管程

一种新的同步机制

1.1 为什么会出现管程

1.2 定义

1.3 管程要保证什么

作为一种同步机制,管程要解决两个问题:

1.4 应用管程时遇到的问题

设问:是否会出现这样一种场景,与多个进程同时在管程中出现?
场景:当一个进入管程的进程执行等待操作时,它应当释放管程的互斥权。当后面进入管程的进程执行唤醒操作时(例如P唤醒Q,即将前面的进程唤醒了),管程中便存在两个同时处于活动状态的进程。
如何解决:有三种处理方法

1.4.1 Hoare管程

1
说明:上图中的资源为共享资源,而对资源的操作我们使用多个过程表示。有些进程在进入管程时可能条件不成熟,需要等待,这里为不同的等待进程设置了不同的条件变量,这通过wait操作完成,当然,在后面可能条件成熟了,需要唤醒,这里使用signal操作完成。在这种管程中,前面的进程进入等待,后面被唤醒的进程执行,此时前面的进程是管程内的进程,于是进入的是紧急等待队列。

条件变量的实现

二、管程的应用

2.1 管程的实现

管程的实现有两种途径:

2.2 用管程解决生产者消费者问题

2
说明:左边的代码是管程的代码,右边是生产者消费者代码。生产者生产一个进程或线程后只需要调用管程,将其添加进去即可。而消费者只需要从管程中取即可。因为管程每次只允许一个进程或线程执行,所以可以保证同步问题。在Java中有类似的机制,但是C/C++中没有。

三、MESA管程

3.1 生产者/消费者问题

3
说明:从上图可以看到只是判断有所区别,其他的和之前的都差不多。

3.2 改进notify

3.3 Hoare管程与MESA管程的比较

四、PTHREAD中的同步机制

这种同步机制其实就是POSIX Threads同步机制,是一个线程函数库。

4
说明:在这种机制中对于互斥的保证是使用一个互斥量mutex。我们可以可能可以创建init和销毁destroy。可以加锁lock和解锁unlock,还有尝试加锁trylock。在解决同步问题的时候使用的是条件变量。同时是可以进行创建和销毁等操作。

4.1 讨论PTHREAD_COND_WAIT

这个函数执行可以分解为三个主要动作:

五、进程间通信IPC

5.1 为什么需要通信机制

5.2 基本通信方式

5.3 消息传递

5
说明:当发送进程将相关的消息准备好之后,由于其不能直接操作接收进程,所有相关的发送工作需要操作系统来完成,发送进程将消息发送给操作系统之后就不需要管理了。这里执行了陷入内核和复制消息两部操作。而操作系统在接收到消息之后,是将消息队列的指针挂到接收进程的PCB末尾,当接收进程被调度上cpu之后,此进程才会去内核中复制相关的消息。

5.3.1 用PV操作实现send原语

6
说明:对于receive的原语实现这里就多说了。

5.4 共享内存

7
说明:这里有两个问题需要解决

5.5 管道通信方式PIPE

8

利用一个缓冲传输介质(内存或文件)连接两个相互通信的进程

六、典型操作系统中的IPC机制

6.1 进程同步/通信实例

9

6.2 Linux的进程通信机制

10
说明:从图中可以看到Linux继承了多个操作系统的IPC机制。同时也是基于POSIX机制。

6.2.1 Linux内核同步机制

11

原子操作

屏障

上一篇 下一篇

猜你喜欢

热点阅读