进程间同步方式笔记
线程的同步方式
- 互斥锁(mutex)
- 读写锁(rwlock)
- 自旋锁(spin_lock)
- 条件变量(condition)
上述方式对进程并不适用,因为进程间的资源是相互独立的,而线程间共享着同一个进程的资源
进程间通信的方法
管道
# 匿名管道
netstat -anlp | grep 8080
cat server.log | grep ERROR | grep Thread
man netstat | more
这里的"|“实际上就是管道的意思,”|“前面部分作为”|"后面的输入
# 命名管道,管道名为test_pipe
mkfifo test_pipe
echo "this is a pipe" > test_pipe
cat test_pipe
消息队列
可进行单机间进程通信,也可以进行跨机器间进程通信
对比于管道而言,管道本质上只能传输文本数据,是没有办法传输别的类型的数据的,而对于消息队列,则可对这个数据进行封装、序列化以及反序列化
业界上有很多很出色的消息中间件:kafka、rabbitMQ
共享内存
每个进程都有自己的进程空间,进程空间又是通过页表进行映射到物理内存的,虚拟进程空间和物理内存通过页表来管理他们的映射关系,而共享内存本质上就是在物理内存上申请一块共享内存,然后通过命令或系统调用的函数将共享内存链接到某个进程的页表,使得两个进程都可以访问到共享内存,这样两个进程就可同时对这个共享内存进行读或写操作
- 在某种程度上,多进程是共同使用物理内存的
- 由于操作系统的进程管理,进程间的内存空间是独立的
- 共享存储允许不相关的进程访问同一片物理内存
- 共享内存是两个进程之间共享和数据传递最快的方式,因为这种方式本质上和进程访问自己的内存空间是没有区别的
- 共享内存未提供同步机制,需要借助其他机制管理访问
信号
- 在操作系统中,不同信号使用不同的值来表示
- 接收信号的进程需要注册对应的信号处理函数
kill -l # 查看支持的信号列表
ctrl + z # 对应信号取值为1的信号
ctrl + c # 对应信号取值为2的信号
可以看到,信号仅仅起到通知的作用,他们之间是没有进行数据的交流的,只有一个信号取值,及收到信号后该做什么事情,所以信号机制并不能进行数据的交流
套接字
同消息队列,可以进行单机间进程通信,也可以进行跨机器进程间通信
-
网络层:提供主机之间的通信
传输层:提供主机不同进程之间的通信
应用层:提供不同应用之间的通信
单机间的进程通信可以使用域套接字
域套接字
- 套接字(socket)原是网络通信中使用的术语
- 域套接字是一种高级的进程间通信方法
- Unix域套接字可以用于同一机器进程间通信
- Unix系统提供的域套接字提供了网络套接字类似的功能
- Unix域套接字通信无需经过完整的网络协议栈