IPC - 进程间通信,常用于多进程编程中用以共享数据, 系统学习,概念性的东西,过往的操作中经常使用 socket进行IPC,但是其他也要做些了解,本篇简单总结
cat xx.txt|grep a
敲过linux命令的都能看懂这个命令,这就是一种匿名管道的使用,匿名管道只能在通过 fork 的方式创建的进程下面进行通信,所以信息流是单向的
内核空间无格式的字节流数据,
依赖文件系统,进程结束自动销毁
单向通信,上下游进程默认同步
fork的进程会继承父进程打开的fd所以,适用于父子进程或者亲缘关系进程
匿名管道,它的通信范围只能是存在父子/亲缘关系的进程
双向信息流
内核空间无格式的字节流数据
设备文件
事先创建管道文件,使用 mkfifo fifo
创建命名管道
可用于任意进程间通信
不管匿名管道还是命名管道,在实际场景中都较少使用,但是一些特定场景可能使用他比其他方式来的效率更高,比如本机大文件的传输
内核空间消息链表
消息体由用户自定义格式,每个消息体固定大小存储
内核态用户态切换和数据拷贝
必须显示释放,否则不会随着进程结束而释放掉内存,除非操作系统重启
虚拟内存映射相同的物理地址,避免内核态用户态切换和数据拷贝
并发问题,非并发安全的,当多个进程向同一个共享内存中写入数据时可能产生覆盖,如何解决?加锁呗,即信号量机制
用于进程间互斥和同步
内核直接管理,是一个整数型计数器,实现进程间的互斥和同步,非用于缓存进程间的通信数据,有两类:二值信号量
, 计数信号量
, 二值信号量即1/0 用来实现互斥/同步, 计数信号量用作程序计数用
两种原子操作
实例
互斥信号量
: 信号量初始值为1, 此机制保证内存在任何时刻只有一个进程访问。
可以看到互斥需两个因素, ①信号量=1 ②同一个进程执行PV操作
同步信号量
:信号量初始值为0, 此机制除了保证互斥外,亦可保证同步
顺序
上图展示了两个进程,其中进程1在进程2之前执行可以看到同步需两个因素, ①信号量=0 ②PV操作不在同一进程
上面两图提到了临界区
对应的有一个临界资源
,怎么理解?
临界资源: 同一时刻,只允许一个进程或线程访问的资源
临界区:访问临界资源的代码段,这段代码中进程/线程将访问共享资源,当另外一个进程/线程已经在这段代码中运行时.这个进程/线程就不能在这段代码中执行,控制对临界资源的访问就是控制程序进入临界区来完成的
异步通信, 一个数字, 信号是进程间通信机制中唯一的异步通信机制
kill -9 xx
:SIGKILL信号,立即结束进程ctrl+c
: SIGINT信号,强制中断程序的执行,杀死程序的进程ctrl+z
: SIGTSTP信号,中断任务,挂起进程, fg重新执行,bg直接杀掉, vim一个文件可以测试下跨网络和不同主机需要使用socket进行通信了,以上的5种全部是同台主机的机制
一般这类的是通过TCP/UDP
协议