进程间的通信方式与同步方式有哪些?进程间的通信方式与同步方式区别是什么?线程之间的通信方式与同步方式有哪些?线程间的通信方式与同步方式区别是什么?一文全部搞懂

本文探讨了进程间的通信方式与同步、线程间的通信与同步的区别。同步是为了按照规则共享资源,而通信涉及消息传递与资源竞争。进程间的通信包括消息传递、共享存储等,同步可通过信号量、互斥量等实现。线程间通信因共享地址空间而相对简单,同步机制包括互斥量、读写锁等。不同的书籍可能根据重点进行不同的分类讲解,但高级进程通信通常包含内置的同步机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进程间的通信方式与同步方式有哪些?
进程间的通信方式与同步方式区别是什么?
线程之间的通信方式与同步方式有哪些?
线程间的通信方式与同步方式区别是什么?
本文会详细解释这几个问题。

一开始在学习操作系统的时候经常糊涂,感觉比较混乱,进程间的通信方式与同步方式似乎是一样的,线程之间的通信方式与同步方式好像也挺像的。相信不少人也有和我一样的困惑,看网上的博客也很少有人讨论这个问题,讲的也很混乱。遇到这种问题当然要看一下书了,发现不同的书讲的还不太一样。这也就是为什么网络上的资料比较混乱的原因。

以我读过的三本书为例:

  • 有的书籍只讲进程的通信,没有进程的同步(现代操作系统 Andrew S. Tanenbaun 4th edition);
  • 有的书只讲进程的同步和进程的通信,其他的涉及到线程的也不讲(计算机操作系统 汤小丹 4th edition);
  • 有的书只讲进程的通信与线程的同步,对于进程的同步与线程的通信不讲(apue/UNIX环境高级编程 W. Richard Stevens 3rd edtion);

为什么不同版本的图书描述会不一致?我谈一下我的理解,也希望大家能够提出意见。

首先,同步的目的是啥?既然线程和进程都是为了能够实现并发,因此一定都要解决同步的问题。要明确同步的目的是为了能够按照一定的规则或时序共享系统资源,以更好地合作。(see: 计算机操作系统 汤小丹 4th edition P48)

第二,通信要解决哪些问题?主要有三个(see:现代操作系统 Andrew S. Tanenbaun 4th edition P67):

  • 如何传递消息?这个很好理解,不解释
  • 争夺关键资源的时候不能出现交叉,如两个进程都在争夺同一个打印机,同一时刻只能有一个进程占有这个打印机,或者两个进程都在想要写同一个文件,同一时刻只能有一个进程写这个文件。
  • 需要保证正确的顺序,如进程A产生数据,进程B接收进程A产生的数据并打印,B在打印之前必须等待A产生了一些数据

对于不同的进程而言,想要实现同步一定需要相互通信,因为不同的进程占用的是不同的虚拟内存,所以进程的同步可以涵盖在进程的通信里面;另一方面针对线程而言,线程之间的通信是比较容易的,因为同一进程的不同线程共享同一地址空间,可以很方便的通信,当然,这里如果涉及到不同进程的线程之间的通信,那和进程之间的通信是一样的。这也是为什么现代操作系统 Andrew S. Tanaenbaun 4th edition里面之间了进程的通信的原因,而对于线程,只需要注意后两个问题,其实这两个问题就是同步关心的两个问题

事实上这最后的两个问题就对应着同步问题中的间接制约关系和直接制约关系,(see: 计算机操作系统 汤小丹 4th edition P48),因此可以说现代操作系统 Andrew S. Tanenbaun 4th edition是把进程的通信与同步放在一起讲了,他认为进程的同步就是通信要解决的一个问题,线程的通信(这里是狭义的通信,就仅仅指消息传递)只要解决同步的问题就可以了,和进程的同步类似,所以只说进程的通信。

那为什么会有进程的通信和进程的同步两种不同的分法呢?计算机操作系统 汤小丹 4th edition里面认为进程的同步和互斥是属于低级进程通信,以信号量为例,低级进程通信有两个缺点:

  • 效率较低,一次只能传送一个消息,
  • 进程之间共享的数据结构,同步方式都必须由用户设置,非常不便,

在进程间传递大量数据的时候应当采用高级进程通信,高级进程通信有两个优点:

  • OS隐藏了高级通信的细节,因此使用起来较为方便
  • 能够高效传输大量数据

进程之间的这种高级通信也要满足同步和互斥的要求,如管道必须保证一个进程在读/写数据的时候,另一进程必须等待,以linux的管道(pipe)为例,这是由管道的半双工特性保证的,也就是系统已经实现好了,因此我认为可以理解为对于高级进程通信,同步和互斥是OS实现好了,或者只需要用户操作一小部分。

APUE在讨论线程同步的时候限定是同一进程的线程之间的同步操作,包括:

  • 互斥量,
  • 读写锁,
  • 条件变量,
  • 自旋锁,
  • 屏障。

进程间的通信包括:
在这里插入图片描述
在apue/UNIX环境高级编程 W. Richard Stevens 3rd edtion P459提到,如果多个进程在共享资源那么可以用信号量、记录锁或者互斥量,事实上和线程的同步是类似的。

计算机操作系统 汤小丹 4th edition里讨论的低级进程通信(即进程同步)包括:

  • 硬件同步
  • 信号量
  • 管程:如条件变量

高级进程通信包括:

  • 共享存储
  • 管道
  • 消息传递:如计算机网络中的报文
  • 客户机-服务器:如socket

综上,现代操作系统 Andrew S. Tanenbaun 4th edition和计算机操作系统 汤小丹 4th edition实际上都是把进程的通信和同步看成一个问题,都可以视为广义的进程的通信的概念,前者不做具体的区分,后者把一些进程之间的同步认为是属于进程间的低级通信,高级通信机制能够在内部实现解决同步的问题。

需要指出的是,由于现代操作系统 Andrew S. Tanenbaun 4th edition和计算机操作系统 汤小丹 4th edition都是属于偏向教材类的书籍,有些通信和同步机制可能在实际操作系统上难以实现,我个人推荐在面试的时候按照apue的思路去回答问题,也就是线程的同步机制有哪些?进程之间的通信方式有哪些?就记住这两个问题就行,当然进程的通信也要有同步,按照apue的思路同步机制有信号量、记录锁或者互斥量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值