操作系统——进程与通信(3)(管程和高级通信)

五、管程

进程必须直接处理共享问题来保证同步和互斥,导致必须同时考虑这两方面问题,管程则是希望将共享问题分离方便处理。

管程就是监视进程(线程)的同步和互斥的构造。

——————

1、管程的结构:

由三部分组成,①局部于管程的变量和数据结构的说明;②使用共享资源并在数据集上操作的过程;③对局部于管程的变量赋初值的语句。

——————

2、管程实现互斥

通过编译器来保证:编译器在每个管程的过程之前增加几条指令,当一进程调用管程的某个过程将先执行增加的语句来检查管程中是否有其他群活跃的进程,如果有,则该进程被挂起。

3、管程内实现同步

——————

管程内提供了一种同步机制——条件变量和两个操作条件变量的同步原语。

实现同步要在必要时阻塞一些进程,也要在必要时唤醒一些进程。条件变量就是判定这个必要的条件,条件变量必须在管程内才能被操作,因此条件变量的访问也是互斥的。条件变量的使用“先声明,后使用”原则。

两个原语的操作对于条件变量x:

wait(x):原子操作包含以下三个步骤:①调用者离开管程(开锁);②将调用者挂在条件变量x的等待队列;③调用者被挂起等待唤醒。

signal(x):把条件变量x等待队列上第一个等待者唤醒,如果为空则没有任何作用。

——————

4、生产者消费者问题:

使用管程解决生产者消费者问题能够保证系统数据的完整性,也能减轻用户的编程负担。

——————

5、管程的不足:

①管程对编译器具有依赖性②管程只能在单台计算机上发挥效果。

——————————————

六、进程的高级通信

低级通信:进程之间控制信息的交换。

高级通信:进程之间大批量的数据交换。

高级通信机制可归结为三大类:消息传递系统,共享存储器系统和共享文件系统。

——————

1、消息缓冲机制

是收到生产者—消费者的启发而创造的机制,

对于发送者在通信中存在两种行为:①发送完消息后不等接受者接收就继续前进;②发送完消息后阻塞直到收到接受者的回答才继续前进。

对于接收者两种行为:①若有消息,则接收消息继续前进,若无消息则等待消息到来;②有消息接受后继续前进,无消息则放弃接收继续前进。

根据其不同行为,进程间通信可分为单向通信和双向通信。双向通信用于进程间需要紧密同步的情况。

消息缓冲区是内存中暂存消息的缓冲区。以下是一次成功的通信过程:

①发送者发送消息前在自己的内存区设置一个发送区,把要发送的信息填入。

②发送者申请一个消息缓冲区,将准备好的消息从发送区送到缓冲区。

③接收者接收消息前在自己内存空间设置接收区。

④接收者摘下消息链上的第一条信息将消息从缓冲区复制到接收区。

但这只是成功的例子,在这个过程中必须考虑的问题:

①接受进程的消息链是临界资源就必须保证操作满足互斥性。

②上述第四部中摘下第一条消息,但缓冲区可能不存在消息。

③消息连上可能存在多条消息,如何管理消息也是存在的问题。

④可能有多个发送者同时申请缓冲区,即缓冲区是临界资源。

操作系统为了解决这些问题,将发送过程的第二步封装为发送原语,将第四步封装为了接收原语。

——————

2、邮箱机制

邮箱机制是一种消息传递系统,属于间接通信方式。引入了一种收发方共享的数据结构——邮箱。用邮箱地址作为消息的间接地址

邮箱作为收发双方共享的数据结构,一般有一定容量,对于发送者只需将消息放入邮箱,对于接收者,也可以随时读取。

邮箱由操作系统或用户进程创建,创建者即为拥有者。

只哟创建者才能读取的称为私有邮箱,有多个核准的共享进程都能读取的称为共享邮箱。私有和共享邮箱一般由用户进程申请创建,进程结束邮箱消失。还有一类公用邮箱由操作系统创建,提供给系统中的核准进程使用和读取,系统运行期间始终存在。

邮箱作为一种数据结构,逻辑上分为邮箱头和邮箱体两部分,邮箱体由若干空格子组成,每个格子可存放一信息,每个格子可设一标志位表示空还是满。邮箱头是邮箱的描述信息,包括邮箱名、大小、属性、已存消息数、空格子数等。

邮箱通信过程:①接收者创建自己的私用邮箱;②发送者产生一个消息;③发送者把消息投入接收者的私用邮箱;④接收者读取信件。

可能存在的问题:①发送者发送时邮箱满;②接收者读取时邮箱空。

————————————

3、共享存储区

就是两个或两个以上协作进程共同拥有同一片内存,而且其中任何一个进程都可以访问这片内存中的任何内容。

要使用共享内存进行通信需要一个进程首先创建一片内存空间专门用于通信,其他协作进程将该片内存映射到自己的虚拟地址空间。

一个进程可以附加多个共享内存区。

共享内存区为进程提供了直接通信的有效手段,可以以最快的速度进行方便的通信,是一种高效的进程通信方式。

共享存储区机制缺点:①机制管理复杂;②必须在同一台物理机上的协作进程才能使用这种方式通信;③安全性脆弱。

————————

4、管道

是指能够连接一个写进程和一个读进程专门用于进程之间的数据通信的共享文件。

管道的特性:①专门用于通信;②只能单向传递消息;③在对管道读写操作过程中,发送接收者需要的同步互斥都由系统自动进行。对用户透明。④管道分为无名管道和有名管道。

无名管道:

是利用系统调用pipe()建立的临时、无路径名的无名文件。临时文件被关闭后文件就不复存在了。无名管道建立之后就可以直接使用不需要像一般文件使用open系统调用打开。使用无名管道通信的进程之间必须是父子关系否则无法建立通信。

有名管道:

建立后在磁盘上有一个对应目录项和索引节点。是可以在文件系统中长期存在、具有路径名的真实文件,访问需要先用open打开。不仅能用于本地进程之间的通信,也能用于网络环境下不同计算机之间通信。缺点是通信双方只能单方向,进程之间不知道通信的交互进程是谁,也不能对数据有选择性的接收。

  • 18
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

D D D D C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值