-
典型
进程间通信方式
:管道,共享内存,消息队列,信号量,网络通信,文件等多种方式 -
进程A读取B进程中的某个变量(非共享内存),可行的方式有()[多选]
A.B进程向消息队列写入一个包含变量内容的消息,A进程从队列中读出
B.通过本地网络通信
C.如果A、B 非亲属,那么A通过命名管道把这个变量的地址发给B进程
D.如果 B是A 进程的子进程,那么B直接读取变量内容即可
A正确: 消息队列实现数据传输
B正确: 本地网络通信实现数据传输
C错误
: 命名管道实现数据传输,但是传递地址错误,因为每个进程有自 己独立的虚拟地址空间(A的地址B经过自己的页表映射就不知道映射到哪了)
D错误
: 父子进程数据独有,各自有自己的虚拟地址空间和数据,因此无法直接读取
-
管道
的通信本质
是通过内核中一块缓冲区(内存)
时间数据传输,而命名管道
的管道文件
只是一个标识符
,用于让多个进程能够访问同一块缓冲区 -
管道的生命周期随进程
,本质是内核中的缓冲区,命名管道文件只是标识,用于让多个进程找到同一块缓冲区,删除后,之前已经打开管道的进程依然可以通信
-
共享内存
是将同一块物理内存映射到各个进程虚拟地址空间,可以直接通过虚拟地址访问
,相较于其它方式少了两步内核态与用户态之间的数据拷贝因此速度最快
(并且共享内存可以提供较大空间)
管道是通过read,write系统调用进行通信的,存在用户态和内核态的转变,但是共享内存是不需要系统调用,直接使用链接上的共享内存就行
- 以下描述正确的有
A.共享内存实现通信的原理是因为所有进程操作映射同一块物理内存
B.共享内存的操作是进程安全的
C.共享内存被删除后,则其它进程直接无法实现通信
D.所有进程与共享内存断开映射后,则共享内存自动被释放
A正确,共享内存的本质就是开辟一块物理内存,让多个进程映射同一块物理内存到自己的地址空间进行访问,实现数据共享的。
B错误,共享内存的操作是非进程安全的,多个进程同时对共享内存读写是有可能会造成数据的交叉写入或读取,造成数据混乱
C错误
,共享内存的删除操作并非直接删除,而是拒绝后续映射,只有在当前映射链接数为0时,表示没有进程访问了,才会真正被删除
D错误
,共享内存生命周期随内核,只要不删除,就一直存在于内核中,除非重启系统(当然这里指的是非手动操作,可以手动删除)
- ipcs 查看进程间通信资源/ipcrm 删除进程间通信资源
选项 | 操作 |
---|---|
-m | 共享内存 |
-q | 消息队列 |
-s | 信号量 |
-a | 所有资源 |
同步机制
没有提供同步机制——共享内存
提供同步机制——匿名,命名管道,消息队列
管道
的同步机制
体现在open
的时候,只有两端都打开
的时候才能往后运行代码,否则就会卡住