进程间通讯的五种方法:管道,信号量,共享内存,消息队列 套接字 Socket
【1】管道
管道的创建方法:无名管道的创建方法 pipe(int fd[2]) 有名管道的创建方法 int mkfifo(char * path , mode_t mode);
相关问题:
1.有名管道和无名管道的区别?搞到的默认大小是多大? 无名管道是父子间使用,有名管道是任意两个进程间使用
2.管道是全双工还是半双工? 半双工
3.管道写入的数据存放在哪了? 内存
管道的实现:管道有一个默认大小的内存 ,一个读指针,一个写指针,管道可一边读一边写,但是不能读的别写得快
【2】信号量
信号量是一种特殊的变量,用来控制进程的同步
p, v原子操作 p:占用资源(+1)v :释放资源(-1);
信号量主要有二值信号量和计数信号量
临界资源:共享的资源,用信号量拉实现进程之间的同步
临界区:访问临界资源的代码(即pv操作去控制的代码段)
【3】共享内存
1.原理:申请一块物理内存空间作为共享内存,然后将其映射到两个不同进程的地址空间中,两个进程将会有一部分物理空间是重合叠的。以此达到两个进程间的交换数据的目的。
2.接口:shmget() shmctl() shmat() shmdt()
3.应该映射到进程地址空间的那一部分呢?
【4】消息队列
原理:数据结构的集合
应用场景:
1):将消息队列应用在日志处理当中,比如Kafka的应用,解决大量日志传输的问题。
2):秒杀活动一般会因流量过大,导致流量暴增,应用挂掉。为了解决这个问题,一般需要早应用前端加入消息队列;可以控制活动的人数;可以缓解短时间内高流量压垮应用。
3):异步处理,用户注册后,需要发注册邮件和注册短信。传统的做法有两种,串行和并行的方式。
4):消息通讯是指,消息队列一般都内置了高效的通信机制,因此可以用在纯粹的消息通信,应用中,比如实现点对点信息交互,或者聊天室等
接口:
msgget() msgsnd() msgrcv() msgctl()