面试中常被问到的(16)进程间通信方式

Posted AllenSquirrel

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试中常被问到的(16)进程间通信方式相关的知识,希望对你有一定的参考价值。

Linux下进程间通信方式主要包括:信号,管道,信号量,消息队列,共享内存,socket

  • 信号:

是一种事件通知机制,或者说是一种事件中断机制,通过信号通知当前进程发生了什么事件,中断进程当前操作去执行另外一个事件触发的操作

信号生命周期:产生,注册,注销,处理

(1)产生:硬件产生(按键eg:ctrl+c,ctrl+z)软件产生(执行命令:kill -信号索引  进程id)

(2)注册:让进程知道自己收到了哪些信号(节点:添加信号信息节点   位图:标记哪些信号待处理)

可靠信号:无论是否注册过均需要重新注册一次

非可靠信号:如果已经注册则不再操作,没有注册则注册

(3)注销:删除信号节点+位图

可靠信号:删除节点后判断是否有相同节点,确定没有再重置

非可靠信号:删除节点后直接重置位图

(4)处理:打断进程的当前操作,去执行信号处理函数,执行完毕后再返回主控流程继续运行

处理方式:

  1. 默认处理函数:执行默认处理函数
  2. 忽略处理函数:信号依然会注册,只是执行空操作
  3. 自定义处理函数:自己定义处理函数,修改信号处理函数指针指向
  • 管道

本质是内核空间上开辟的一块缓冲区,多个进程访问同一块缓冲区实现数据通信

(1)匿名管道:没有标识符,只能用于亲缘关系的进程间通信,子进程通过fork父进程来获取操作句柄,访问同一块缓冲区   PIPE

(2)命名管道:通过创建的管道文件句柄作为标识符,操作同一管道文件句柄访问同一块缓冲区 FIFO

管道操作类似于文件操作

管道读写特性:

  1. 管道中没有数据,read会阻塞等待数据写入
  2. 管道中数据满了,write会阻塞不在写入
  3. 管道所有读端关闭,会导致write触发异常,进程退出
  4. 管道所有写端关闭,会导致read读取完剩余所有数据结束返回0  不阻塞
  • 信号量

本质就是一个pv操作计数器和一个pcb等待队列,实习进程间同步与互斥

pv操作就是对可用资源进行计数,在进程获取资源前进行p操作,计数-1(可用资源数-1),先判断是否有可用空闲资源,如果没有则认为不合理,则阻塞等待,直至有空闲可用资源出现,进行v操作,计数+1(可用资源数+1),同时从pcb等待队列中唤醒阻塞的线程

同步:访问资源前进行p操作,合理则获取资源,不合理则阻塞等待,直至条件满足进行v操作,产生一个空闲可用资源

互斥:计数限制最大为1,表示最多只有一个可用空闲资源,某一时刻只允许被一个进程所获取(计数-1),此时计数为0,其他进程不可再获取,只有当前进程访问结束,计数+1,出现空闲可用资源才可被另外进程访问,即同一时刻只有一个进程能够获取到该资源

  • 消息队列

在内核中创建一个优先级队列,多个进程通过对同一个队列添加或获取节点实现数据通信

  • 共享内存

内存上开辟一块空间,各个进程将这块物理内存映射到各自的虚拟内存空间上,通过虚拟空间地址来访问,实现数据共享

流程:

  1. 创建或打开共享内存  int shmget
  2. 与进程建立映射关系  void* shmat
  3. 对共享内存进行内存操作
  4. 与进程间解除映射关系 int shmdt
  5. 删除共享内存  int shmctl
  • socket

  • udp

  • tcp

以上是关于面试中常被问到的(16)进程间通信方式的主要内容,如果未能解决你的问题,请参考以下文章

面试中常被问到的(15)死锁发生及解决

面试中常被问到的(17)多线程及多进程优缺点

Linux 进程间通信(IPC)

面试中常被问到的(14)虚存管理和虚拟地址空间

一个程序员面试神器!

程序员面试的硬伤