03 进程通信
什么是进程通信
进程通信是指在进程间传输数据(交换信息)。进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立,而且为了保证安全,一个进程不能直接访问另外一个进程的地址空间。进程通信分为三种方式:共享内存模式、消息传递模式、共享文件模式。
共享内存
进程通信采用共享内存方式时,操作系统会在内存中开辟一块共享空间,允许通信进程对其互斥的访问(即 同一时间只允许一个进程访问该共享空间,互斥访问可以通过操作系统提供的工具实现)。
共享存储方式还分为了两种,分别是基于数据结构的共享、基于存储区的共享。
基于数据结构的共享
共享空间的数据格式有所限制,如 共享空间只能放一个长度为10的数组。这种共享方式速度慢、限制多、是一种低级通信方式。
基于存储区的共享
数据的形式、存放位置都由进程控制,而不是操作系统。相比之下,这种共享方式速度更快,是一种高级通信方式。
管道通信
管道是指用于连接读写进程的一个共享文件,又名pipe文件。进程通信采用管道通信方式时,操作系统会在内存中开辟的一个大小固定的缓冲区,进程需要按照"管道通信规则"进行通信。
管道通信规则
1 一条管道只能实现半双工通信,即 某一时间段内只能实现单向的数据传输。
2 各个进程只能互斥的访问管道,即 当一个进程在写的时候,另外一个进程不能读,反之亦然。
3 数据会以字符流的形式写入管道,当管道写满时,写进程的write()系统调用将会被阻塞,直到读进程将数据取走;当读进程将数据全部取走后,管道变空,此时读进程的read()系统调用将被阻塞。
4 如果没写满,就不允许读;如果没读空,就不允许写。
消息传递
进程通信采用消息传递方式时,进程间的数据交换会以格式化的信息 (Message) 为单位。进程通过操作系统提供的"发送消息/接受消息"两个原语进行数据交换。