面试中常被问到的(16)进程间通信方式
Posted AllenSquirrel
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试中常被问到的(16)进程间通信方式相关的知识,希望对你有一定的参考价值。
Linux下进程间通信方式主要包括:信号,管道,信号量,消息队列,共享内存,socket
-
信号:
是一种事件通知机制,或者说是一种事件中断机制,通过信号通知当前进程发生了什么事件,中断进程当前操作去执行另外一个事件触发的操作
信号生命周期:产生,注册,注销,处理
(1)产生:硬件产生(按键eg:ctrl+c,ctrl+z)软件产生(执行命令:kill -信号索引 进程id)
(2)注册:让进程知道自己收到了哪些信号(节点:添加信号信息节点 位图:标记哪些信号待处理)
可靠信号:无论是否注册过均需要重新注册一次
非可靠信号:如果已经注册则不再操作,没有注册则注册
(3)注销:删除信号节点+位图
可靠信号:删除节点后判断是否有相同节点,确定没有再重置
非可靠信号:删除节点后直接重置位图
(4)处理:打断进程的当前操作,去执行信号处理函数,执行完毕后再返回主控流程继续运行
处理方式:
- 默认处理函数:执行默认处理函数
- 忽略处理函数:信号依然会注册,只是执行空操作
- 自定义处理函数:自己定义处理函数,修改信号处理函数指针指向
-
管道
本质是内核空间上开辟的一块缓冲区,多个进程访问同一块缓冲区实现数据通信
(1)匿名管道:没有标识符,只能用于亲缘关系的进程间通信,子进程通过fork父进程来获取操作句柄,访问同一块缓冲区 PIPE
(2)命名管道:通过创建的管道文件句柄作为标识符,操作同一管道文件句柄访问同一块缓冲区 FIFO
管道操作类似于文件操作
管道读写特性:
- 管道中没有数据,read会阻塞等待数据写入
- 管道中数据满了,write会阻塞不在写入
- 管道所有读端关闭,会导致write触发异常,进程退出
- 管道所有写端关闭,会导致read读取完剩余所有数据结束返回0 不阻塞
-
信号量
本质就是一个pv操作计数器和一个pcb等待队列,实习进程间同步与互斥
pv操作就是对可用资源进行计数,在进程获取资源前进行p操作,计数-1(可用资源数-1),先判断是否有可用空闲资源,如果没有则认为不合理,则阻塞等待,直至有空闲可用资源出现,进行v操作,计数+1(可用资源数+1),同时从pcb等待队列中唤醒阻塞的线程
同步:访问资源前进行p操作,合理则获取资源,不合理则阻塞等待,直至条件满足进行v操作,产生一个空闲可用资源
互斥:计数限制最大为1,表示最多只有一个可用空闲资源,某一时刻只允许被一个进程所获取(计数-1),此时计数为0,其他进程不可再获取,只有当前进程访问结束,计数+1,出现空闲可用资源才可被另外进程访问,即同一时刻只有一个进程能够获取到该资源
-
消息队列
在内核中创建一个优先级队列,多个进程通过对同一个队列添加或获取节点实现数据通信
-
共享内存
内存上开辟一块空间,各个进程将这块物理内存映射到各自的虚拟内存空间上,通过虚拟空间地址来访问,实现数据共享
流程:
- 创建或打开共享内存 int shmget
- 与进程建立映射关系 void* shmat
- 对共享内存进行内存操作
- 与进程间解除映射关系 int shmdt
- 删除共享内存 int shmctl
-
socket
- udp
- tcp
以上是关于面试中常被问到的(16)进程间通信方式的主要内容,如果未能解决你的问题,请参考以下文章