进程通信
定义:
进程通信就是指进程之间的信息交换
进程是分配系统资源的单位,包括内存地址空间。因此各进程拥有的内存地址空间相互独立,所谓相互独立表示进程只能直接访问属于自己这个进程的地址空间,但是不能直接访问其他进程的地址空间,否则一个进程都可以任意地对其他进程的数据进行修改,这是很危险的,所以为了保住安全,一个进程不能直接访问另一个进程的地址空间,但是进程之间的信息交换是有必要的,所以为了保证进程之间的安全通信,操作系统提供了一些方法
提供的进程通信方法
- 共享存储
- 消息传递
- 管道通信
共享存储
内存中分配一个共享空间,两个进程都能对他进行访问,以达到通信的效果。但是需要注意的是,两个进程对共享空间的访问必须是互斥的,即一个进程在访问共享空间时,另一个进程不能对共享空间进行访问。这个互斥访问通过操作系统提供的工具实现
共享存储分为
- 基于数据结构的共享:限定共享空间存放的数据的结构,限制多,速度慢,是一种低级通信方式
- 基于存储区的共享:在内存中划一块共享存储区,数据形式、存放位置均由进程来控制而非操作系统,相比之下,这种共享方式速度更快,是一种高级通信方式
管道通信
“管道”是指用于连接读写进程的一个共享文件,又名pipe文件。其实就是在内存中开辟一个大小固定的缓冲区。所以这么看来,和共享空间的方式相比只是共享的介质不同了
- 管道只能采用半双工通信,某一时间段只能实现单向传输,如果要实现双工通信,则需要设置两个管道
- 各进程对管道的访问必须是互斥的
- 数据以字符流的形式写入管道,当管道写满时,写进程的write()系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取走后,管道变空,此时读进程的read()系统调用将被阻塞
- 如果没写满管道,就不允许读取。如果没有将管道内数据读取空,就不允许写
- 数据一旦被读出,就从管道中被抛弃,就意味着读进程最多只能有一个,否则可能会有读错数据的情况
消息传递
进程间的数据交换以格式化的信息Message为单位。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换
格式化的消息分为消息头消息尾
消息传递分为直接通信和间接通信两种方式
- 直接通信:发送进程通过发送原语将消息直接挂到接受进程的消息缓冲队列上,接收进程则通过接收原语来将消息缓冲队列上的消息取走。每个进程都有一个消息缓冲队列
- 间接通信:消息要先发送到一个中间实体(信箱)中,因此也称为“信箱通信方式”。间接通信方式和前面两种通信方式比较接近,都是采用一个共享的空间,只不过共享的介质不同