【Linux】总结进程间通信以及相关面试考点
一、相关知识点
1、进程地址空间分布图:
2、什么是临界资源?
临界资源同一时刻只允许一个进程访问的资源叫临界资源。
3、什么是临界区?
临界区访问临界资源的代码段叫临界区。
4、全双工和半双工通信有什么区别?
半双工数据可以从A到B发送,也可以从B到A发送,但同一时刻只能是一个方向的。
全双工数据在任意时刻都可以在两个方向同时进行。即A到B和B到A
二、管道
1、什么是有名管道?
有名管道FIFO:在内核中申请一块固定大小的缓冲区,程序拥有写入和读取的权利,没有血缘关系的进程也可以进程间通信。
2、什么是无名管道
无名管道pipe:在内核中申请一块固定大小的缓冲区,程序拥有写入和读取的权利,一般使用fork函数实现父子进程的通信。
3、管道的特点
(1)无论是有名还是无名,写入管道的数据都在内存中。
(2)管道是一种半双工通信方式。
(3)自带同步互斥机制。
(4)有名和无名的区别:有名可以在任意进程间使用;无名主要在父子进程间。
4、写入管道的数据会乱序吗?
管道是个流式的,依次写入,依次顺序读取,不会乱序。但多线程中,如果两个线程同时写入数据可能会交替在一起。
5、管道为什么是半双工的?
由于Linux的一个命令只完成一个功能,所以一个复杂点的任务需要好几个进程协同完成,第一个进程处理的结果需要交给第二个进程,然后依次交给第三个等等,像流水线完成某个商品的生产一样,这个过程只需要数据单向往下运输,所以设计的时候做成了半双工。当然也可以使用管道实现全双工通信,需要使用两个管道。不过比较麻烦,如果需要使用全双工通信,建议使用双向管道,也就是soakedpair。他虽然名字叫双向管道,可是并不是管道,而是两个打开的套接字。
6、父、子进程
三、消息队列
1、什么是消息队列
在内核中创建一队列,队列中每个元素是一个数据报,不同的进程可以通过句柄去访问这个队列。消息队列提供了⼀个从⼀个进程向另外⼀个进程发送⼀块数据的⽅法。
2、消息队列的特点
(1)消息队列是由消息的链表,链表结点存放着数据报的类型和内容,其存放在内核中并由消息队列标识符标识。
(2)消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
(3)消息队列允许一个或多个进程写入或者读取消息。
(4)消息队列的生命周期随内核。
(5)消息队列可实现双向通信。
四、信号量
1、描述信号量
信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步控制
2、操作系统中所说的pv操作是什么?
- P、V操作都是对信号量而言的。
P操作是对信号量的值进行-1,代表获取资源。当信号量的值为零时,P操作会阻塞,意味着资源不可用。
V操作是对信号量的值进行+1,代表释放资源。V操作从不阻塞。 - PV操作用于同一进程,实现互斥。
- PV操作用于不同进程,实现同步。
五、共享内存
1、简述共享内存
- 将同一块物理内存一块映射到不同的进程的虚拟地址空间中,实现不同进程间对同一资源的共享。
- 共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与信号量配合使用,来实现进程间的同步和通信。
2、特点
(1)不用从用户态到内核态的频繁切换和拷贝数据,直接通过指针访问共享内存的内容,从内存中读取就可以。
(2)共享内存是临界资源,所以需要操作时必须要保证原子性。使用信号量或者互斥锁都可以。