Linux 线程间通信方式+进程通信方式 总结

1. linux下进程间通信的几种主要手段简介:

  1. 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;

  2. 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);

  3. 报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

  4. 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

  5. 信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。

  6. 套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。

一般来说,linux下的进程包含以下几个关键要素:

  • 有一段可执行程序;

  • 有专用的系统堆栈空间;

  • 内核中有它的控制块(进程控制块),描述进程所占用的资源,这样,进程才能接受内核的调度;

  • 具有独立的存储空间

另外附上一个很好的博文——进程间的五种通信方式介绍 - wh_sjc的博客 - CSDN博客 https://blog.csdn.net/wh_sjc/article/details/70283843

线程间的通信、同步方式与进程间通信方式 - 星仔的“韵” - CSDN博客
https://blog.csdn.net/liu5320102/article/details/50764645

线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。

2. Linux系统中的线程间通信方式主要以下几种:

*  锁机制:包括互斥锁、条件变量、读写锁和自旋锁。

   互斥锁确保同一时间只能有一个线程访问共享资源。当锁被占用时试图对其加锁的线程都进入阻塞状态(释放CPU资源使其由运行状态进入等待状态)。当锁释放时哪个等待线程能获得该锁取决于内核的调度。

  读写锁当以写模式加锁而处于写状态时任何试图加锁的线程(不论是读或写)都阻塞,当以读状态模式加锁而处于读状态时“读”线程不阻塞,“写”线程阻塞。读模式共享,写模式互斥。

   条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。

   自旋锁上锁受阻时线程不阻塞而是在循环中轮询查看能否获得该锁,没有线程的切换因而没有切换开销,不过对CPU的霸占会导致CPU资源的浪费。 所以自旋锁适用于并行结构(多个处理器)或者适用于锁被持有时间短而不希望在线程切换产生开销的情况。

*  信号量机制(Semaphore):包括无名线程信号量和命名线程信号量

*  信号机制(Signal):类似进程间的信号处理

linux基础——linux线程间通信及同步机制总结 - 千里之行,始于足下 - CSDN博客 https://blog.csdn.net/a987073381/article/details/52029070

  • 13
    点赞
  • 135
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux线程间通信方式有以下几种: 1. 信号量:通过信号量来实现线程的同步和互斥,可以保证多个线程的执行顺序和资源的访问顺序。 2. 互斥锁:通过互斥锁来实现线程的互斥,可以保证同一时只有一个线程访问共享资源。 3. 条件变量:通过条件变量来实现线程的同步,可以让线程在满足特定条件时才进行操作。 4. 管道:通过管道来实现进程的通信,可以让不同的线程传递数据。 5. 共享内存:通过共享内存来实现线程的数据共享,可以让多个线程同时访问同一块内存区域。 6. 消息队列:通过消息队列来实现线程的通信,可以让不同的线程传递消息。 ### 回答2: Linux 是一种高性能操作系统,提供了多种线程间通信方式,可以使线程实现信息传递和数据同步。下面介绍几种常用的线程间通信方式。 管道(Pipe) 管道是一种低级IPC机制,可以实现在进程交换数据。管道分为有名管道(named pipe)和无名管道(unnamed pipe)两种。有名管道可以用在单独的进程通信,而无名管道只能在相关进程通信,一般使用内部实现,不会显示在文件系统中。 共享内存 共享内存是一种高速IPC机制,可以使多个进程共享同一块物理内存区域。进程可以直接读写共享内存,不需要使用复制或其他操作来传输数据。由于共享内存是在进程共享同一段物理内存,因此可以实现高效的通信。 消息队列(Message Queue) 消息队列是一种更高级别的IPC机制,可以通过管道、共享内存等方式实现进程通讯。消息队列通过一个消息缓冲区来实现不同进程的通信。发送进程将消息放到消息队列中,接收进程从中读取消息。 信号(Signal) 信号是一种异步的通信方式进程可以通过向另一个进程发送一个信号,向另一个进程发送数据或通知。信号的应用场景非常广泛,例如:进程退出、进程中断、定时器、调用另一个进程等。 Socket Socket是一种网络编程中非常常见的通信机制,可以通过网络传输数据。Socket实现了两个进程的双向通讯,需要建立连接才能进行通信。 总的来说,Linux 提供了多种线程间通信方式,可以根据不同的应用场景选择合适的方式进行通信。综合比较容易使用的方式包括:管道、共享内存、消息队列。同时,还需要根据不同应用程序的实际需求,并且综合考虑网络带宽、文件操作效率等因素,选择最合适的线程间通信方式。 ### 回答3: 在Linux中,线程是轻量级的进程,它们可以共享同一进程的地址空和系统资源。因此,在Linux中,线程间通信方式进程通信的方式基本相同,可以按照以下几种方式进行通信: 1. 共享内存:在同一进程中的不同线程可以通过共享同一块内存来进行通信。例如,一个线程可以将数据放入共享内存区域中,另一个线程可以从中读取数据。 2. 信号量:信号量可以用来控制进程线程对共享资源的访问。一个线程可以使用信号量来通知另一个线程资源的可用性,并且可以等待对方的响应。 3. 管道:管道是一种半双工的通信方式,可以用于在两个线程传递数据,其中一个线程的输出是另一个线程的输入。管道可以在内存中创建,也可以使用文件系统中的文件作为基础。 4. 套接字:套接字是一种标准的网络通信方式,但在Linux中,它也可以用于线程间通信。套接字可以用于在同一进程中的不同线程或在不同进程传递数据。 总的来说,在Linux中,线程间通信方式进程通信的方式基本相同。因此,开发者可以根据需求选择合适的通信方式,来实现线程的数据传输和共享。这些通信方式各有特点,例如共享内存可以实现高效的数据共享,而信号量则可以控制线程的并发访问。开发者需要根据自己的需求选择合适的方式,来满足程序的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值