进程间通信-简介

进程间通信-简介

概述

Unix消息传递阶段:
- 管道
- System V消息队列
- Posix消息队列
- 远程过程调用
Unix各种同步形式的演变:
- 需要某种形式同步
- 记录上锁
- System V信号量
- Posix信号量和Posix共享内存区
- 互斥锁和条件变量。主要用于线程间同步,也可用于进程间同步。
- 读写锁

进程,线程与信息共享

Unix进程间共享信息的三种方式
- 共享存留于文件系统中某个文件上的某些信息。
为访问这些信息,每个进程需穿越内核。
文件更新时,需要某种形式的同步。
- 共享驻留于内核中的某些信息。
如管道和信号量。
访问共享信息的每次操作涉及对内核的一次系统调用。
- 多个进程都能访问的共享内存区。
共享内存区的进程需要某种形式的同步。

线程

同一进程内多个线程对全局数据的同步访问。
进程间IPC,线程间IPC

IPC对象的持续性

可把任意类型的IPC的持续性定义成该类型的一个对象一直存在多长时间。
- 随进程持续的IPC对象一直存在到打开者该对象的最后一个进程关闭该对象为止。
如管道和FIFO
- 随内核持续的IPC对象一直存在到内核重新自举或显式删除该对象为止。
如System V消息队列,信号量,共享内存区
Posix的消息队列,信号量,共享内存区必须至少是随内核持续的,但也可以随文件系统持续。
- 随文件系统持续的IPC对象一直存在到显式删除该对象为止。
Posix消息队列,信号量,共享内存区如果使用映射文件实现的,则就是随文件持续的。

名字空间

当两个或多个无亲缘关系的进程使用某种类型的IPC对象来彼此交换信息时,该IPC对象必须有一个某种形式的名字或标识符。
这样其中一个进程可创建该IPC对象,其余进程则可指定同一个IPC对象。

对于一种给定的IPC类型,
其可能的名字的集合称为它的名字空间。

进程间通信-简介_第1张图片
进程间通信-简介_第2张图片

fork,exec和exit对IPC对象的影响

进程间通信-简介_第3张图片

考虑到无名同步变量【互斥量,条件变量,读写锁,基于内存的信号量】,
从一个具有多个线程的进程调fork将变得混乱不堪。

如这些变量驻留在共享内存区,且创建时设置了进程间共享属性,则对于能访问该共享内存区的任意进程来说,
其任意线程能继续访问这些变量。

出错处理:包裹函数

	 void Sem_post(sem-t *sem)
	 {
		if (sern_post(sem) == -1)
			err-sys("sem_post e r r o r " ) ;
	 )
线程函数出错时,不设置标准的Unix errno变量,
线程函数返回线程关联的错误码。

Unix errno值

每当一个Unix函数发生错误时,
全局变量errno被设置为一个指示错误类型的整数,函数本身则返回-1
多线程环境中,每个线程须有自己的errno变量。

Unix标准

Posix

OpenGroup

Unix版本和移植性

书中IPC例子索引表

本书三种交互模式
- 文件服务器:客户-服务器应用程序
用于分析各种形式的消息传递
- 生产者-消费者:一个或多个线程或进程把数据放到一个共享缓冲区中,另有一个或多个线程或进程对该共享缓冲区的数据进行操作。
分析各种类型的同步和共享内存区
- 序列号持续增1:一个或多个线程或进程给一个共享的序列号持续增1.
分析各种类型的同步和共享内存区

进程间通信-简介_第4张图片
进程间通信-简介_第5张图片
进程间通信-简介_第6张图片

小结

- 消息传递【管道,FIFO,消息队列】
- 同步【互斥锁,条件变量,读写锁,信号量】
- 共享内存区【匿名共享内存区,有名共享内存区】
- 过程调用
主要考虑一个进程内多个线程,多个进程间的IPC。

你可能感兴趣的:(System--Linux,IPC-概述)