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

概述

(a)是一种间接通信。A把消息发到内核,内核再转到B

(b)直接通信。

直接通信:

进程必须正确的命名对方:
    send(P,message) - 发送信息到进程P
    receive(Q,MESSAGE) - 从进程Q接收消息
通信链路的属性
    自动建立链路
    一条链路恰好对应一对通信进程
    每对进程之间只有一个链接存在
    链接可以是单向的,但通常为双向的

间接通信

定向从消息队列接收消息
    每个消息队列都有一个唯一的ID
    只有它们共享了一个消息队列,进程才能够通信
通信链路的属性
    只有进程共享一个共同的消息队列,才建立链路
    链接可以与许多进程相关联
    每对进程可以共享多个通信链路
    链接可以是单向或双向

操作

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

原语定义如下

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

 

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

阻塞被认为是同步的。发送一个消息,如果没发送完成,要阻塞在那儿,只有发送完成后,才能正常返回干下面的事情。

非阻塞被认为是异步的。

 

通信链路缓冲。

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

1. 0 容量
    发送方必须等待接收方
2. 有限容量 - n messages的有限长度
    如果队列满,发送方必须等待
3. 无限容量 - 无限长度
    发送方不需要等待。只管发就行了

 

信号Signal:

软件中断通知事件

Examples:SIGFPE, SIGKILL, SIGUSR1, SIGSTOP, SIGCONT

接收到信号时会发生什么:

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

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

实现:

便捷,快速

管道

子进程从父进程继承文件描述符

一头输入,一头输出

ls,more有个共同的父进程shell

shell:

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

管道里的数据是字节流

消息队列:

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

    Message:作为一个字节序列存储

    Message Queues:消息数组

    FIFO & FILO configuration

 

消息队列的数据不是字节流,是一块一块有意义的数据结构

当buffer满或空的时候,send,receive也会有sleep出现

 

共享内存:

进程

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

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

优点:快速、方便地共享数据

不足:必须同步数据访问

最快的方法

一个进程写另外一个进程立即可见

没有系统调用干预

没有数据复制

不提供同步,由程序员提供同步

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值