面试中常被问到的(16)进程间通信方式
Linux下进程间通信方式主要包括:信号,管道,信号量,消息队列,共享内存,socket
信号:
是一种事件通知机制,或者说是一种事件中断机制,通过信号通知当前进程发生了什么事件,中断进程当前操作去执行另外一个事件触发的操作
信号生命周期:产生,注册,注销,处理
(1)产生:硬件产生(按键eg:ctrl+c,ctrl+z)软件产生(执行命令:kill -信号索引 进程id)
(2)注册:让进程知道自己收到了哪些信号(节点:添加信号信息节点 位图:标记哪些信号待处理)
可靠信号:无论是否注册过均需要重新注册一次
非可靠信号:如果已经注册则不再操作,没有注册则注册
(3)注销:删除信号节点+位图
可靠信号:删除节点后判断是否有相同节点,确定没有再重置位图
非可靠信号:删除节点后直接重置位图
(4)处理:打断进程的当前操作,去执行信号处理函数,执行完毕后再返回主控流程继续运行
处理方式:
- 默认处理函数SIG_DFL:执行默认处理函数
- 忽略处理函数SIG_IGN:信号依然会注册,只是执行空操作
- 自定义处理函数void(*sighandler_t)(int):自己定义处理函数,修改信号处理函数指针指向
管道
本质是内核空间上开辟的一块缓冲区,多个进程访问同一块缓冲区实现数据通信
(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)进程间通信方式相关推荐
- Python培训常识:Python面试中常被问到的几种设计模式要知道
学习Python技术大家都是为了日后能够找到适合自己的工作岗位,那么除了要学习好Python技术外,对于面试环节的问题也要有所了解,本期小编为大家介绍的Python培训教程就算关于Python面试中常 ...
- 面试中常被问到(11)虚函数/纯虚函数
虚函数 如何定义一个虚函数?在基类成员函数前加入virtual关键字,但并不代表此函数不被实现,只是说明允许基类指针调用派生类重写的此函数 一个类只要声明有虚函数或者从基类继承了虚函数,在编译过程中就 ...
- e - 数据结构实验之查找五:平方之哈希表_面试中常被问到的Hash表,你了解吗
#新人扶持计划# Hash表在面试中经常被问到,今天我们来了解下. Hash表也称散列表,也有直接译作哈希表,Hash表是一种特殊的数据结构,它同数组.链表以及二叉排序树等相比较有很明显的区别,它能够 ...
- 面试中常被问到(五)C++析构函数,虚析构函数
C++析构函数 (1)对于析构函数:析构函数与构造函数相呼应,从调用构造函数开始到自动执行析构函数二者调用期间即为所创建对象实例的生命周期. (2)析构函数与类名相同,仅前面加一个~,一般析构函数无参 ...
- php面试中常被问到的问题--欢迎留言补充
2019独角兽企业重金招聘Python工程师标准>>> 整理自己的项目 -- 问到的概率大 问项目的具体内容,遇到的挑战,具体解决办法. 为什么使用独立文件服务器?1,从服务器本身来 ...
- Linux运维面试中常被问到的两个shell脚本
脚本一: 在公司里有一个网段是 192.168.3.0的网段,现在想判断一下哪些主机在线,哪些主机不在线. shell脚本解决方案: 方法一: 思路 首先要循环目标主机的IP地址,IP地址分为两部分: ...
- 面试:整理面试中常被问到的8种数据结构
数据结构是一种特殊的组织和存储数据的方式,可以使我们可以更高效地对存储的数据执行操作.数据结构在计算机科学和软件工程领域具有广泛而多样的用途. 几乎所有已开发的程序或软件系统都使用数据结构.此外,数据 ...
- 面试中常被问到的(21)TCP/UDP如何保持可靠性
Tcp保持可靠性从以下三个方面描述: 1,可靠传输:面向连接,包序管理,确认应答,超时重传,校验和 2,避免丢包:滑动窗口流量控制,拥塞机制(慢启动快增长) 3,提高性能:确认序号快速重传,延迟应答, ...
- 面试中常被问到(26)菱形继承及解决方法
菱形继承 菱形继承属于多继承中一种具有代表性的继承关系,产生数据冗余和数据二义性问题 class A { public:int a; };class B : public A { public:int ...
最新文章
- SAP实施项目中采购员在非生产性采购申请审批流中的角色安排
- Linux C编程之二:Linux基础
- 开发完成的springboot项目扩展 swagger
- 使用字节缓冲流在文件中写内容
- 【转】java项目应该知道的核心重点部分
- 从技术演变的角度看互联网后台架构
- 二、计算机视觉与卷积神经网络
- Pycharm结合Anaconda结合使用下的能够产生作用的Anaconda命令
- Spring MVC JSR-303验证框架之Hibernate-Validator
- 站长吧asp工具设置_网站更换域名需要怎么办?网站更换域名如何设置?
- Resources$NotFoundException
- Python之面向对象 私有属性和私有方法
- 统计挖掘那些事(八)—— 分层抽样与交叉验证
- ARM64体系结构与编程之cache必修课(上)
- 计算机word求差函数,表格里怎么自动求差/怎样在word2010表格中求差
- 通过手机实现外网远程唤醒内网下的群辉Nas等设备
- sudo: /etc/sudoers is owned by uid xxx, should be 0
- 3DMAX和MAYA的区别
- Java学习决心计划书
- PS学习笔记------运用脚本及自动化批量处理