IPC相关 (进程间通信)
首先我们来介绍下什么是进程间通信。进程间通信,简称IPC,功能是一个进程给另一个进程传递数据。那为什么要有IPC呢?这就要从进程对内存空间的占用讲起了。
因为,在操作系统上,进程的运行会占据一块内存空间。该空间是这个进程自己独占的、不允许其他进程访问的(PS:同一进程内的线程,是公用进程的内存空间的,且允许相互传递、查看、访问数据)。那么,如果两个进程之间需要传递一些数据时该如何处理呢?这就需要IPC的帮助了。
IPC一般来讲常用的有以下五种方式:
1、管道
管道即 | ,它前后有两个命令,即两个进程,可实现前进程的运行结果,传递给后进程使用。即可视为实现的是进程运行结果的传递。
管道工作原理:在内存中开辟一块第三方的管道空间,前进程把结果存入该空间,后进程从该空间读取数据。该块空间,采用先进先出(FIFO)的方式,即先进入的数据先被读去除,若存入时按顺序进入多个数据,读出时也按该顺序陆续读出。再者,被后进程读出的数据,将从管道的内存空间中删除,不可再读
2、共享内存
共享内存能实现的功能是:传递进程运行过程中产生的数据。
工作原理:在内存中开辟一块第三方的空间,称为共享空间,前进程运行过程中可以随时向里面存入数据,后进程也可以随时从该空间中读取数据,且可以挑选读取,读取后也不会删除,支持重复读取。
前进程在运行时,若有数据要给其他进程,则会主动开辟共享内存空间,所以共享内存空间是由前进程开辟的。
开辟空间时,其实是前进程调用了操作系统对外提供的一个函数,实现内存空间开辟。类函数被称为API 接口函数
3、信号 sign
信号的功能就是:通过对进程增加一个信号标记,让CPU根据该信号,对进程作出相应的处理,以实现进程运行状态的控制。如:关闭、挂起等
kill -l ---查看CPU支持的所有信号
常用信号: kill -9 PID ---杀死
kill -19 PID ---停止挂起,相当于 ctrl+z
kill -18 PID ---继续运行,相当于 fg、bg
一般进程的信号会由人为输入命令来设定,即手动操作;另外,Linux系统也会根据需要给进程增加信号
4、消息队列
消息队列的功能是:进程之间相互通知运行、访问状态的队列
它的应用需求是:当多个进程同时访问同一个文件、设备时,尤其都要进行写操作时,就产生了写冲突或访问冲突。如:使用打印机同时打印多个文件时,一定是一个文件完全打印完毕,后一个文件才会开始打印,则说明在一个打印进程执行时,其他打印进程是处于等待状态的。
所以可以认为,后访问的进程只能等前进程运行完毕后才可访问文件或设备。而前进程会把自己对文件、设备的访问状态记录到消息队列中。后进程可通过消息队列获取前进程的访问状态,已确定其是否访问完毕。
5、小结
以上四种IPC的方式,可总结到主要都是实现本机内进程间通信使用的,而且通过这四种方式,基本可以满足进程间数据传递的各种需求。但是,若是跨主机间的进程通信呢?则需要使用下面的socket方式实现了。
6、socket套接字
socket的功能:实现主机之间进程的通信,即通过网络实现两台主机上进程的连接、访问
实现形式: 使用ip+port的方式 ,识别、寻址主机及主机内的进程
原理介绍:socket套接字,相当于一个守护进程,监控主机的某个端口,当端口被客户端访问时,socket会启动起系统内的服务进程。