1. 什么是进程间通信
进程间通信就是在不同进程之间传播或交换信息
单机通信方式:半双工管道(无名管道,命名管道),全双工管道(命名全国双工管道),消息队列,信号量,共享内存
多级通信方式:套接字(基于网络),STREAMS
2. 什么是半双工,什么是全双工
半双工:
一方在发数据,另一方只能收数据;一方收数据,另一方只能发数据,双方不能同时发或收数据。就像赛尔号,烈焰猩猩和妙蛙种子对打,烈焰猩猩出招,妙蛙种子只能坐等挨打,反之亦然
全双工:
双方可以同时收发数据。就像王者荣耀,貂蝉打吕布时,吕布也可以打貂蝉
3. 半双工管道
1) 无名管道
特点:
它是半双工的,具有固定的读端和写端
它只能用于具有亲缘关系的进程之间的通信(父子进程或兄弟进程)
它可以看成是一种特殊的文件,对于它的读写也可以使用read,write等函数。但是它不属于其他任何文件系统,并且只存在于内存中
管道中的数据读走就没了
2) 命名管道(FIFO)
特点:
也是半双工的
它可以在无关的进程之间交换数据,于无名管道不同
FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中
4. 消息队列(全双工)什么是消息队列
消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识
特点
消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级
消息队列独立于发送和接收进程。进程终止时,消息队列及其内容并不会被删除
消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取
5. 共享内存
详细讲解请参考博文:
https://blog.csdn.net/ypt523/article/details/79958188
1) 什么是共享内存
共享内存,顾名思义就是允许两个或多个不相关的进程访问同一个逻辑内存,共享内存是两个或多个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常为同一段物理内存。进程可以将同一段物理内存连接到他们自己的地址空间中,所有的进程都可以访问共享内存中的地址。如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。
2) 共享内存的特点
共享内存是做快的一种IPC,因为进程是直接对内存进行存取
因为多个进程可以同时操作,所以需要进行同步
信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问
3) 共享内存的通信原理
当两个进程通过页表将虚拟地址映射到物理地址时,在物理地址中有一块共同的内存区,即共享内存,这块内存可以被两个进程同时看到。这样当一个进程进行写操作,另一个进程读操作就可以实现进程间通信。但是,我们要确保一个进程在写的时候,另一个进程不能也去写,因此我们使用信号量来实现同步与互斥。
4) 为什么共享内存速度快
借助上图说明:Proc A进程给内存中写数据,Proc B进程从内存中读数据,再次期间一共发生了两次复制:
① Proc A到共享内存 ② 共享内存到Proc B
因为直接在内存上操作,所以共享内存的速度也就提高了
6. Linux信号
1) 信号概述
对于Linux来说,实际信号是软中断,许多重要的程序都需要处理信号。信号,为Linux提供了一种处理异步事件的方法。比如,终端用户输入ctrl+c来中断程序,会通过信号机制停止一个程序
2) 什么是硬中断,什么是软中断
中断详解请参考博文:
https://blog.csdn.net/dela_/article/details/52751388
硬中断:
硬件中断是由与系统相连的外设(比如网卡 硬盘 键盘等)自动产生的. 通过中断请求,去执行相应的中断函数
软中断:
软中断的处理类似于硬中断. 是通过软件方式实现的
3) 信号处理的方式
忽略、捕捉、默认动作
7. 信号量
例子:有一个房子,房子门口有一把锁,一个人进房子,要拿走这把锁。这是另一个人也要进房子,只能等第一个人出来,把锁放回原来位置,第二个人才能去拿锁,然后进入房子,否则排队。
1) 什么是信号量
信号量与已经介绍过的IPC结构不同,它是一个计数器。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据
什么是信号量?信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的值仅能由PV操作来改变。
一般来说,信号量S>=0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个单位资源,因此S的值减1;当S<0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。而执行一个V操作意味着释放一个单位资源,因此S的值加1;若S£0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。
2) 什么是信号量集
管控多个临界资源(有多个钥匙)
3) 特点
信号量用于进程间同步,若要在进程间传递数据需要结合共享内存
信号量基于操作系统的PV操作,程序对信号量的操作都是原子操作
每次对信号量的PV操作不仅限于对信号量的加1或减1,而是可以加减任意正整数
支持信号量组
4) PV操作
PV操作,消费者生产者详解请参考博文
https://blog.csdn.net/guoduhua/article/details/78305060
https://www.jianshu.com/p/6674400a98b2
PV操作的含义:PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:
P(S)(消费者)(拿锁):将信号量S的值减1,即S = S - 1;
判断值是否小于0,如果值小于0,那么调用P操作的进程的状态就变成阻塞状态,并且把进程送到相应的等待队列的末尾,cpu重新调度
如果值不小于0,那么实施P操作的进程继续执行
V(S)(生产者)(放锁):将信号量S的值加1,即S=S+1
如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程
PV操作的意义:我们用信号量及PV操作来实现进程的同步和互斥。PV操作属于进程的低级通信
5) 原子操作
在多进程(线程)访问共享资源时,能够确保所有其他的进程(线程)都不在同一时间内访问相同的资源。"原子操作(atomic operation)是不需要synchronized",这是多线程编程的老生常谈了。所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切 [1] 换到另一个线程)
自行百度之,我也是一知半解0.0
6) 临界资源
多道程序系统中存在许多进程,它们共享各种资源,然而有很多资源一次只能供一个进程使用。一次仅允许一个进程使用的资源称为临界资源。许多物理设备都属于临界资源,如输入机、打印机、磁带机等
各进程采取互斥的方式,实现共享的资源称作临界资源。
比如打印机:A进程在使用打印机时,B进程不可以使用打印机,不能两个打印机同时使用打印机,它有一个排队的过程。
7) 同步通信和异步通信的区别
同步就是你叫我去吃饭,我听到了就和你去吃饭;
如果没有听到,你就不停的叫,直到我告诉你听到了,才一起去吃饭。
异步就是你叫我,然后自己去吃饭,我得到消息后可能立即走,也可能等到下班才去吃饭。
所以,要我请你吃饭就用同步的方法,要请我吃饭就用异步的方法,这样你可以省钱。
同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。
异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。
同步是阻塞模式,异步是非阻塞模式。
其中SPI IIC为同步通信 UART为异步通信