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