Linux——进程间的通信方式

概述

进程间通信:因为每一个进程都有一个独立的虚拟地址空间,在保证了进程独立性的同时,却使得进程间无法直接通信,所以操作系统为用户提供了进程间的通信方式,并且因为通信场景的不同,提供的方式也有多种。

通信方式

System V标准下进程间通信方式的种类有:管道,共享内存,消息队列,信号量。

管道

用于进程间的数据传输,通过半双工通信方式实现数据传输(半双工:可以选择方向的单向通信)。

  1. 本质:操作系统在内核为进程创建的一块缓冲区。
  2. 原理:通过让多个进程都能访问到同一块缓冲区,来实现进程间的通信。
  3. 管道分类
    (1)匿名管道:操作系统在内核中创建的一块没有标识符(标识符:一个可见于文件系统的管道文件)的缓冲区,仅用于具有亲缘关系的进程间通信,并且只有是在创建子进程之前创建了匿名管道,才可以使用匿名管道进行进程间通信。创建子进程之前,先创建匿名管道,操作系统会提供两个操作句柄(文件描述符),其中一个用于从管道中读取数据,另一个用于向管道中写入数据;儿子进程通过复制父进程的方式,获取到管道的操作句柄,进而实现访问同一个管道进行通信。
    (2) 命名管道:操作系统在内核中创建的一块具有标识符(标识符:一个可见于文件系统管道文件),其他的进程可以通过这个标识符,打开同一个管道文件,进而访问同一块缓冲区,实现进程间通信。
  4. 管道特性
    (1)打开特性
    a. 若管道文件以只读的方式打开,则会阻塞,直到这个管道文件以写的方式打开。
    b. 若管道文件以只写的方式打开,则会阻塞,直到这个管道文件以读的方式打开。
    c. 若管道文件以读写的方式打开,则不会阻塞。
    (2)管道特性
    a. 管道自带同步与互斥:
    同步:通过条件判断,判断当进程是否能够访问,不能访问则等待,等到能访问时在唤醒该进程,从而实现对临界资源访问的合理性。
    互斥:通过保证同一时间只有一个进程能够访问临界资源,来保证临界资源的安全性。

    管道同步:若管道中没有数据,则read会阻塞;若管道写满了,则write会阻塞。
    管道互斥:当写入数据不超过PIPE_BUF时,会保证写入操作的原子性。
    b. 若管道所有的写端被关闭,表示当前没有进程继续写入数据了,read读完管道中的数据后,就不会再阻塞,而是返回0。
    c. 若管道所有的读端被关闭,表示当前没有进程继续读入数据了,继续write会触发异常,会造成管道破裂,当前写进程会收到SIGPIPE信号,导致进程退出。
    d. 管道的生命周期随进程,当进程退出时,管道将被释放。
    e. 管道提供有序、连接、可靠的字节流传输服务,传输比较灵活。

共享内存

用于进程间的数据共享;又因为共享内存直接通过虚拟地址映射访问物理内存,而其它方式都是内核中的缓冲区,因此通信时都会涉及用户态与内核态之间的两次数据拷贝,少了这两次数据拷贝,所以共享内存是最快的进程间通信方式。

  1. 原理:在物理内存上开辟一块内存空间,将这块物理内存映射到进程的虚拟地址空间,进程就可以通过自己的虚拟地址空间直接访问这块物理内存;当多个进程映射到同一块物理内存,就可以通过这块物理内存实现数据共享。
  2. 共享内存示意图:
    在这里插入图片描述
  3. 操作流程
    (1)创建共享内存(开辟物理内存空间)。
    (2)将共享内存映射到各个进程的虚拟地址空间中的共享区。
    (3)各个进程直接通过修改虚拟地址空间中的共享区实现通信。
    (4)通信结束,解除映射内存。
    (5)释放共享内存。
  4. 共享内存的特性
    (1)最快的进程间通信方式。
    (2)生命周期随内核。
  5. 注意事项:由于共享内存并不具备自动同步与互斥,需要操作用户进行控制,所以共享内存的操作不是绝对安全的。

消息队列

用于进程间的数据传输。

  1. 原理:其本质上就是内核中的一个优先级队列,多个进程通过向同一个队列中添加节点和获取节点来实现进程间的通信,传输的是一个有类型(优先级)的数据块。
  2. 消息队列的特性
    (1)自带同步与互斥。
    (2)生命周期随内核。
    (3)数据传输自带优先级。
    (4)消息队列可以双向通信。
    (5)消息队列克服了管道的无格式字节流的缺点。

信号量

用于实现进程间的控制(同步与互斥)。

  1. 本质:内核中的一个计数器(对临界资源进行计数),可以通过技术判断是否能够获取一个资源进行处理。
  2. 互斥的实现:通过只有0/1的计数器,实现对临界资源访问状态的标记;在访问临界资源之前先获取信号量,并且计数-1;若计数<=0,则使进程等待(将进程PCB加入等待队列中),反之可以对临界资源进行访问,并且在访问期间,已经将临界资源的状态置为不可访问状态,因此可以保证其他进程不会在同一时间访问到临界资源,进而实现互斥。
  3. 同步的实现:若计数<=0,则表示不能获取,并且对计数进行-1,将进程PCB加入等待队列,这时候若是其他进程释放/生产一个临界资源,则会对计数+1,并且唤醒一个进程。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值