操作系统学习:UNIX并发机制

Unix为进程间的通信和同步提供了各种机制。这里只介绍最重要的几种:

  • 管道
  • 消息
  • 共享内存
  • 信号量
  • 信号

管道、消息和共享内存提供了进程间传递数据的方法,而信号量和信号则用于触发其他进程的行为。

管道

UNIX对操作系统开发最重要的贡献之一就是管道。受协同程序概念的启发,管道是一个环形缓冲区,允许两个进程以生产者消费者的模型进行通信。因此,这是一种先进先出(FIFO)队列,有一个进程写,而由另一个进程读。
管道在创建时获得一个大小固定的字节数。当一个进程试图往管道中写时,如果有足够的空间,则写请求被立即执行;否则该进程被阻塞。类似地,如果一个读进程试图读取的字节数多余管道中的字节数时,它也被阻塞否则读请求被立即执行。操作系统强制实施互斥,即一次只能有一个进程可以访问管道。
有两类管道:命名管道和匿名管道。只有有血缘关系的进程才可以共享匿名管道,而不相关的进程只能共享命名管道。

消息

消息是有类型的一段文本,UNIX为参与消息传递的进程提供msgsnd和msgrcv系统调用。每个进程都有一个与之相关联的消息队列,其功能类似于信箱。
消息发送者指定每个消息发送的类型,类型可以被接受者用做选择的依据。接受者可以按先进先出的顺序接收消息,或者按类型接。当进程试图给一个满队列发送消息时,它会被阻塞;当进程试图从一个空队列读取消息时也会被阻塞;如果一个进程试图读取某一特定类型的消息时,但由于现在还没有这种类型的消息而失败时,则改进程不会被阻塞。

共享内存

共享内存是UNIX提供的进程间通信手段中速度最快的一种。这是虚存中由多个进程共享的一个公共内存块。进程读写共享内存所使用的机器指令与读写虚拟内存空间的其他部分所使用的指令相同。每个进程有一个只读或读写的权限,互斥约束不属于共享内存进制的一部分,但必须由使用共享内存的进程提供。

信号量

UNIX SystemV 中的信号量系统调用是对semWait 和semSignal原语的推广,在它们上面可以进行多个操作,并且增量和减量操作的值可以大于1。内核自动完成所有需要的操作,在所有操作完成前,任何进程都不能访问该信号量。

一个信号量包含以下元素:

  • 信号量的当前值。
  • 在信号量上操作的最后一个进程和进程ID。
  • 等待该信号量的值大于当前值得进程数。
  • 等待该信号量的值为零的进程数。

信号

信号是用于向一个进程通知发生异步事件的机制。信号类似于硬件中断,但没有优先级,即内核平等地对待所有的信号。对于同时发生的信号,一次只给进程一个信号,而没有特定的次序。
进程间可以互相发送信号,内核也可以在内部发送信号。信号的传递是通过修改信号要发送到的进程所对应得进程表的一个域来完成的。由于每个信号只保存为一位,因此不能对给定类型的信号进程排队。只有在进程被唤醒继续运行时,或者进程准备从系统调用中返回时,才处理信号。进程可以通过执行某些默认行为(如终止进程)、执行一个信号处理函数或者忽略该信号来对信号做出响应。

这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值