到目前为止socket编程的总结就告一段落了,接下来会继续学习Linux网络编程的其他知识,涉及进程、线程等。今天从进程通信的相关知识开始学习,主要内容包括进程同步与进程互斥,进程通信的目的等等…
1.进程同步与进程互斥
(1)学习进程同步和互斥之前,先来了解一下顺序程序与并发程序特征:
- 顺序程序特征
- 顺序性:后一条指令的执行,要在前一条指令的基础上
- 封闭性:(运行环境的封闭性)
- 确定性:给程序一定的输入,有特定的输出
- 可再现性
- 并发程序特征
- 共享性
- 并发性
- 随机性
(2)进程互斥
1)由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程竞争使用这些资源,进程的这种关系为进程的互斥。
2)系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源。
3)在进程中涉及到互斥资源的程序段叫临界区。
4)互斥示例:
- A或B进程在访问上述同一块资源的时候,需要加锁。
- 程序中x资源称为临界资源;访问共享资源的代码,称为临界区。
(3)进程同步
1)进程同步指的是多个进程需要相互配合共同完成一项任务。
2)同步示例
2.进程间通信目的
(1)数据传输:一个进程需要将它的数据发送给另一个进程。
(2)资源共享:多个进程之间共享同样的资源。
(3)通知事件:一个进程需要向另一个或一组进程发送消息,通知它们发送了某种时间(如进程终止时要通知父进程)。
(4)进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。
3.进程间通信发展
(1)管道
管道是最古来的进程间通信机制,如果是匿名管道,只能用于父子进程间进行通信;如果是有名管道可以用于不相关的进程间通信。
(2)System V进程间通信
随着系统的发展,出现了System V,对进程间通信做了些拓展。
(3)POSIX进程间通信
POSIX是一个标准,由于各种UNIX版本的出现,所以迫切的需要一种标准来对各种版本的编程接口进行统一,就出现了POSIX标准。
其中POSIX标准中,也规定了一些进程间通信的机制。
4.进程间通信分类
- 文件:
- 文件锁
- 管道(pipe)和有名管道(FIFO)
- 信号(signal)
- 消息队列
- 共享内存
- 信号量
- 互斥量
- 条件变量
- 读写锁
- 套接字(socket)
其中消息队列、共享内存和信号量在System V和POSIX中都有定义;而互斥量、条件变量和读写锁是在POSIX标准中定义的通信手段。如下是两种IPC,各自有自己的编程接口:
(1)System V IPC:
- System V消息队列
- System V共享内存
- System V信号量
(2)POSIX IPC
- 消息队列
- 共享内存
- 信号量
- 互斥量
- 条件变量
- 读写锁
5.进程间共享信息的三种方式
(1)第一种方式,两个进程要共享信息,它们共享的是同一个文件系统;
(2)第二种方式,它们共享的是内核中的共享信息;
(3)第三种方式,两个进程共享的是同一块共享内存区。(效率较高)
6.IPC对象的持续性
针对上述的三种共享方式,出现了三种IPC对象的持续性:
(1)随进程持续:一直存在直到打开的最后一个进程结束(如pipe和FIFO);
(2)随内核持续:一直存在直到内核自举或显式删除(如System V消息队列、共享内存、信号量);
(3)随文件系统持续:一直存在直到显式删除,即使内核自举还存在。(POSIX消息队列、共享内存、信号量如果是使用映射文件来实现)