文章目录
- 1 IPC
- 1.1通信操作
- 1.2通信链路的实现
- 1.3通信分类
- 1.3.1直接通信与间接通信
- 直接通信
- 间接通信
- 1.3.2消息传递的特征
- 1.4缓冲问题
- 1.4.1容量问题
- 2信号(signal)
- 2.1原理
- 2.2接收信号后处理方式
- 2.3不足
- 2.4实现
- 3管道
- 3.1
- 4消息队列
- 5共享内存
- 6socket机制
1 IPC
inter process comutation 进程间通信
进程地址空间不会被其他进程访问,当出现进程协作时,需要进程之间有效沟通。
1.1通信操作
IPC提供两个操作:
send
receive
如果两个进程之间想通信,需要建立通信链路,通过send和receive交换消息
1.2通信链路的实现
通信链路的实现:
物理:共享内存、硬件总线
逻辑:逻辑属性
1.3通信分类
1.3.1直接通信与间接通信
从发射路径来看(发送给谁):
- A:间接通信,通过内核(邮件)
- B:直接通信(打电话)
直接通信
1 .必须正确命名对方
- send(P,message)——发送信息到进程P receive(P,message)——从进程Q接受消息
2.通信链路的属性
- 1.自动建立链路
- 2.一条链路对应一个链接存在
- 3.链接可以是单向的,但通常为双向
间接通信
1.定向从信息队列接收消息
- 每个信息队列都有唯一一个ID,只有共享了一个消息队列,进程才能通信
- 创建消息队列,通过消息队列发送和接收消息,销毁消息队列
- send(A,message) 发送消息到队列A
- receive(B,message) 从队列A接收消息
2.通信链路属性:
- 1.进程共享一个共同的消息队列,才能建立链路
- 2.链接可以与多个进程相关联
- 3.每对进程可以共享多个通信链路
- 4.链接可以是双向或单向
1.3.2消息传递的特征
- 消息传递可以是阻塞和非阻塞的
- 阻塞:被认为是同步的,发送进程会阻塞直到接收进程接收,接收进程会阻塞知道资源可用。
- 非阻塞:被认为是异步的。发送进程发送资源后继续运行,接收进程接收消息或者接收空
1.4缓冲问题
将消息缓存起来,避免接收的不匹配。
1.4.1容量问题
1.容量为0,相当于同步。
2.有限容量,当数据满,发送等待,数据空,接收等待。
3.无限容量,发送方不需要等待,数据空,接受仍然需要等待
2信号(signal)
2.1原理
硬件中断interrupt,signal是软件中断通知事件处理。
2.2接收信号后处理方式
1.catch:指定信号处理函数被调用(c++ try…catch)
2.ignore:依靠操作系统的默认操作(进程终止或挂起)
3.mask:闭塞信号因此不会传送,禁止进程接收和处理信号(登录程序不能暂停,因为暂停程序被屏蔽掉了)
2.3不足
不能传输要交换的任何数据,传送信息量小,只有一种数据类型。
2.4实现
1.注册:注册信号处理函数给操作系统内核。
2.发送信号时,操作系统内核负责把信号送给指定进程,启动对应信号处理函数。
3.执行信号处理函数。
- 操作系统从内核返回进程时,返回信号处理函数的入口如不是调用系统语句的后条命令,需要将用户空间堆栈修改。先返回信号处理函数,再返回中断位置。(木马病毒会这么做)
3管道
3.1
组合程序,一个程序的输出是另一个程序的输入。子进程从父进程继承文件描述符。进程不知道从键盘、文件、程序读取还是写入到终端、文件、程序。
系统调用:读管道(read)、写管道(write)、创建管道(pipe)
shell:1.创建管道 2.为1s创建进程,设置stdout为管道写端 3.为more创建进程,设置stdin为管道读端
4消息队列
由操作系统维护的以字节序列为及本单位的间接通信机制。
管道:父进程帮子进程建立关系。数据是字节流。
消息队列:实现多个不想管进程通过消息队列通信,send和receive传递的是有意义字节结构。
系统调用:获取消息队列标识msgget,发送消息msgsnd,接收消息msgrcv,消息队列控制msgctl
5共享内存
把同一个物理内存区域同时映射到多个进程的内存地址空间的通信机制。
管道和消息队列是间接的。
共享内存直接通信方式。开辟了两个进程都能访问的共享内存空间。传输速度快,在最开始就开辟共享内存。直接通信方式需要加入同步互斥机制。
进程:每个进程有私有的内存地址空间,需要明确设置共享内存段
线程:共享共享相同的内存地址空间
系统调用:创建共享段shmget、把共享段映射到进程地址空间shmat、取消共享段到进程地址空间的映射shmdt、共享段控制shmctl