操作系统(进程通信)

一、进程间通信介绍

什么是进程间通信:

进程间通信(Interprocess communication 也叫IPC):指两个或多个进程之间进行数据交互的过程。

为什么进程之间需要通信:

由于进程采用的是虚拟空间+用户态/内核态机制,所以就导致进程与进程之间、进程与内核之间是互相独立的,如果想让多个进程协同工作解决复杂问题,就需要进程之间进行通信。

那类型的问题需要多进程协同工作:
进程的运行机制:

从人类的感知来讲,所有进程是并行执行,但实际情况是所以进程轮流使用CPU,只是轮转的速度比较快,人类感受不到,CPU的一个内核就是一个运算单位,可以供一个进行使用(这也是CPU厂商不断追求CPU内核的数量原因),CPU内核越多,同时执行的进程就越多。

CPU密集型问题:

主要特点是需要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力,负责运算的进程越多,竞争得到的执行时间就越长。但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,是一种损人不利已的做法。所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数。

IO密集型问题:

主要涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度,因为创建进程也需要相关的资源,比如代码段、栈、文件描述符表、环境变量表。

所以处理CPU密集型程序时可以选择多进程实现,有效的利用多核提升效率;而IO密集型的由于99%的时间都花在IO上,花在CPU上的时间很少,所以多线程也能提高很大效率。

二、简单的进程间通信

命令行参数:

情况1:在终端执行程序时,给子进程传递命令行参数。

情况2:使用vfork+exec创建进程时,给子进程传递命令行参数。

只能在父子进程之间,在父进行创建子进程时使用,只能由父进行传递给子进程,单向通信,并且只能传递一些简单的字符串数据。

环境变量表:

情况1:使用fork创建子进程时,子进程会拷贝一份父进程的环境变量表。

情况2:使用vfork+exec创建进程时,给子进程传递一份父进程的环境变量表,子进程拿到环境表后会进行拷贝。

只能在父子进程之间,父进行创建子进程时使用,只能由父进行传递给子进程,单向通信,并且只能传递一些简单的字符串数据。

信号:

情况1:使用kill向指定的进程发送信号进行通信。

情况2:使用sigqueue向指定的进程发送信号,也可以附带一些简单的数据。

可以在任意进程之间进行通信,但也只能是互相告知某某事件发生了,即使用能使用sigqueue带一些数据,但只有能传递一个int类型整数,只有通过fork创建的子进程才能传递内存地址。

文件:

情况1:使用文件+信号,让任意两个进程之间传递大量数据,但要各自控制好位置指针,协调好读写时间。

情况2:使用文件+文件锁,也可以让任意两个进程之间传递大量数据,但文件锁的操作比较麻烦,也有可能陷入死锁的情况。

单纯的使用文件进行通信,无法协调读取和写入的时间,空间造成文件内的数据混乱,所以必须配合使用信号或文件锁。

三、传统的进程间通信——管道通信

  • 管道是UNIX系统中最古老的进程间通信方式,是一种特殊文件读写机制

  • 当进程从管道文件中读取数据时,如果管道中没有数据则进程会进入阻塞状态,直到有数据读取出来才返回,因此不需要借助信号、文件锁来协调读写时间

  • 管道中的数据一旦读取完毕就会消失,因此也不需要管理文件的位置指针,所以使用管道文件比普通文件的进程间通信要方便很多

  • 古老的好处是所有系统都支持,早期的管道文件是半双工,现在有些系统支持管道文件的全双工,现在绝大多数情况已经不使用管道来通信了

有名管道:
  • 在文件系统中创建出一个实体的有文件名的管道文件,然后通过系统I/O的相关API来进行相关操作

使用函数创建:
#include <sys/types.h>
#include <sys/stat.h>
​
int mkfifo(const char *pathname, mode_t mode);
功能:创建一个有名管道文件
pathname:管道文件的名字
mode:管道文件的权限
返回值:成功返回0 失败-1
使用命令创建:
mkfifo <file>
管道单向通信的编程模型:
进程A      ->         进程B
创建有名管道      
打开管道              打开管道
写数据                读数据
关闭管道              关闭管道
删除管道                
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值