熟悉完操作系统的第十一篇章,开始学习第十二篇章,关于操作系统的进程间通信。

0猜你喜欢

操作系统系列文章

操作系统学习笔记 1概述

操作系统学习笔记 2操作系统介绍

操作系统学习笔记 3内存管理

操作系统学习笔记 4非连续内存分配

操作系统学习笔记 5虚拟内存

操作系统学习笔记 6页面置换算法

操作系统学习笔记 7进程管理

操作系统学习笔记 8CPU调度

操作系统学习笔记 9同步&互斥

操作系统学习笔记 10信号量&管程

操作系统学习笔记 11死锁

操作系统学习笔记 12进程间通信

操作系统学习笔记 13文件系统

12进程间通信

  1. 概述

    通信模型

    直接及间接通信

    阻塞与非阻塞

    通信链路缓冲

  2. 信号

  3. 管道

  4. 消息队列

  5. 共享内存

12.1概述

12.1.1通信模型

进程通信的机制及同步

  • 不使用共享变量的进程通信

  • IPC facility提供2个操作

    send(message)-消息大小固定或可变

    receive(message)

  • 如果P和Q想通信

    需要在它们之间建立链路

    通过send/receive交换消息

  • 通信链路的实现

    物理(例如共享内存,硬件总线)

    逻辑(例如逻辑属性)

如下图12-1所示,显示了两种不同的IPC。左边的是进程A和进程B通过内核来完成进程间的间接通信。右边的是进程A和进程B通过共享区域来完成进程间的直接通信。

图12-1 间接通信和直接通信图 图12-1 间接通信和直接通信图

12.1.2直接间接通信

直接通信

  • 进程必须正确的命名对方
  • send(P,message)-发送消息到进程P
  • receive(Q,message)-从进程Q收到消息

通信链路的属性

  • 自动建立链路
  • 一条链路恰好对应一对通信进程
  • 每对进程之间只有一个链路存在
  • 链路可以是单向的,但通常为双向的

间接通信

  • 创建一个新的消息队列
  • 通过消息队列发送和接收消息
  • 销毁消息队列

原语的定义如下

  • send(A,message)-发送消息到队列A
  • receive(A,message)-从队列A接收消息

12.1.3消息传递可以是阻塞或非阻塞

阻塞被认为是同步的

  • Blocking send has the sender block until the message is received
  • Blocking receive has the receiver block until a message is available

非阻塞是认为异步的

  • Non-blocking send has the sender send the message and continue
  • Non-blocking receive has the receiver receive a valid message or null

12.1.4通信链路缓冲

队列的消息被附加到链路,可以是以下3种方式之一

  1. 0容量-0message

    发送方必须等待接收方

  2. 有限容量-n message的优先长度

    发送方必须等待,如果队列满

  3. 无限容量-无限长度

    发送方不需要等待

12.2信号

signal

  • 软件中断通知事件处理
  • Example:SIGFPESIGKILLSIGUSR1SIGSTOPSIGCONT

接收到信号时会发生什么

  • Catch:指定信号处理函数被调用
  • Ignore:依靠操作系统的默认操作,比如Abort,memory dump,suspend or resume process
  • Mask:闭塞信号因此不会传送,可能是暂时的(当初里同样类型的信号)

不足

  • 不能传输要交换的任何数据

如何实现信号

  1. 程序运行的时候需要对某个信号做单独处理的话,在程序开始的时候需要注册一个Signal handlers,把这个作为系统调用发给操作系统
  2. 当产生某一个信号的时候,操作系统把系统调用返回用户空间的堆栈进行修改,使得本来应该返回系统调用的后一条语句执行,变成信号函数处理入口,同时把信号函数处理之后的地址作为栈帧的地址。
  3. 应用程序处理产生信号

12.3管道

管道

子进程从父进程继承文件描述符(父子关系进程,字节流)

file descriptor 0 stdin,1 stdout,2stderr

进程不知道(或不关心)从键盘,文件,程序读取或写入到终端,文件,程序

shell

  • 创建管道
  • ls创建一个进程,设置stdout为管道写端
  • more创建一个进程,设置stdin为管道读端

12.4消息队列

消息队列是按FIFO的来管理消息

  • message作为一个字节序列存储
  • message queues,消息数组
  • FIFO&FILO configuration

12.5共享内存

直接通信方式

  • 进程

    每个进程都有私有地址空间

    在每个地址空间内,明确地设置了共享内存段

  • 优点

    快速、方便地共享数据

  • 不足

    必须同步数据访问

同一块物理内存映射到不同进程相同或者不同的地址空间去。映射完成之后,访问不同进程的虚拟地址的时候,实际上访问的是同一块物理内存空间。