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