基本通信方式
- 消息传递
- 共享内存
- 管道PIPE
- 套接字socket
- 远程过程调用
套接字和远程过程调用属于分布式系统采用的方式,这里只介绍前三种方式
消息传递
- 发送进程调用send原语send(destination, message)
- 陷入内核,操作系统复制消息到消息缓冲区
- 操作系统唤醒接收进程,将消息缓冲区内容挂到接收进程的消息队列指针
- 接收进程读取消息队列内容,调用receive(source, message)
- 陷入内核,操作系统将消息复制到message变量中
send和receive操作可以用PV操作实现
send(destination, message){
P(buf-empty);//申请空缓冲区
//取缓冲区,要求互斥
//把缓冲区挂到接收进程的消息队列,要求互斥
V(buf-full);//唤醒接受进程
}
共享内存
在物理内存中开辟一块共享内存区,将此映射到进程A和B中,AB进程对该区域的访问加读写锁解决互斥问题
这里有点类似于JAVA虚拟机线程间共享内存模型,每个线程有自己的虚拟内存空间,不断从主内存刷新、回写数据
管道通信方式PIPE
利用缓冲传输介质,例如一段内存空间、一个文件连接两个相互通信的进程,读写进程需要自行判断管道中是否数据满或是否数据空
linux内核同步机制
linux内核有以下同步机制:原子操作、自旋锁、读写自旋锁、信号量、读写信号量、互斥体、完成变量、顺序锁、屏障等
屏障也叫栅栏、关卡,对一组线程进行协调,例如需要一组线程协同完成一项任务,需要所有线程都到达一个汇合点后再往下运行