进程间同步方式

进程间同步方式笔记

线程的同步方式

  • 互斥锁(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

消息队列

​ 可进行单机间进程通信,也可以进行跨机器间进程通信

进程间同步方式_第1张图片

进程间同步方式_第2张图片

对比于管道而言,管道本质上只能传输文本数据,是没有办法传输别的类型的数据的,而对于消息队列,则可对这个数据进行封装、序列化以及反序列化

业界上有很多很出色的消息中间件:kafka、rabbitMQ

共享内存

​ 每个进程都有自己的进程空间,进程空间又是通过页表进行映射到物理内存的,虚拟进程空间和物理内存通过页表来管理他们的映射关系,而共享内存本质上就是在物理内存上申请一块共享内存,然后通过命令或系统调用的函数将共享内存链接到某个进程的页表,使得两个进程都可以访问到共享内存,这样两个进程就可同时对这个共享内存进行读或写操作

进程间同步方式_第3张图片

  • 在某种程度上,多进程是共同使用物理内存的
  • 由于操作系统的进程管理,进程间的内存空间是独立的
  • 共享存储允许不相关的进程访问同一片物理内存
  • 共享内存是两个进程之间共享和数据传递最快的方式,因为这种方式本质上和进程访问自己的内存空间是没有区别的
  • 共享内存未提供同步机制,需要借助其他机制管理访问

信号

进程间同步方式_第4张图片

  • 在操作系统中,不同信号使用不同的值来表示
  • 接收信号的进程需要注册对应的信号处理函数
kill -l    # 查看支持的信号列表

进程间同步方式_第5张图片

ctrl + z    # 对应信号取值为1的信号
ctrl + c    # 对应信号取值为2的信号

可以看到,信号仅仅起到通知的作用,他们之间是没有进行数据的交流的,只有一个信号取值,及收到信号后该做什么事情,所以信号机制并不能进行数据的交流

套接字

​ 同消息队列,可以进行单机间进程通信,也可以进行跨机器进程间通信

  • 网络层:提供主机之间的通信

    传输层:提供主机不同进程之间的通信

    应用层:提供不同应用之间的通信

    在这里插入图片描述

单机间的进程通信可以使用域套接字

域套接字

  • 套接字(socket)原是网络通信中使用的术语
  • 域套接字是一种高级的进程间通信方法
  • Unix域套接字可以用于同一机器进程间通信
  • Unix系统提供的域套接字提供了网络套接字类似的功能
  • Unix域套接字通信无需经过完整的网络协议栈

进程间同步方式_第6张图片

你可能感兴趣的:(操作系统,多进程,操作系统)