以前经常搞混,所以记录下来。
进程间通信主要是指多个进程间的数据交互。
而线程间同步主要指维护多个线程之间数据准确、一致性。

一、进程间通信主要有以下几种方式:

管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

有名管道(named pipe):有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

消息队列(message queue):消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

信号量(semophore):信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

信号(sinal):信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

共享内存(shared memory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。

套接字(socket) : 套接口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器的进程通信

二、linux下线程间同步主要有以下几种方式:

互斥量(mutex):互斥量本质上说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量。对互斥量进行枷锁以后,其他视图再次对互斥量加锁的线程都会被阻塞直到当前线程释放该互斥锁。如果释放互斥量时有一个以上的线程阻塞,那么所有该锁上的阻塞线程都会变成可运行状态,第一个变成运行状态的线程可以对互斥量加锁,其他线程就会看到互斥量依然是锁着,只能再次阻塞等待它重新变成可用,这样,一次只有一个线程可以向前执行。

读写锁(rwlock):读写锁与互斥量类似,不过读写锁拥有更高的并行性。互斥量要么是锁住状态,要么是不加锁状态,而且一次只有一个线程可以对其加锁。读写锁有3种状态:读模式下加锁状态,写模式下加锁状态,不加锁状态。一次只有一个线程可以占有写模式的读写锁,但是多个线程可以同时占有读模式的读写锁。
当读写锁是写加锁状态时,在这个锁被解锁之前,所有视图对这个锁加锁的线程都会被阻塞。当读写锁在读加锁状态时,所有试图以读模式对它进行加锁的线程都可以得到访问权,但是任何希望以写模式对此锁进行加锁的线程都会阻塞,直到所有的线程释放它们的读锁为止。

条件变量(cond):条件变量是线程可用的另一种同步机制。互斥量用于上锁,条件变量则用于等待,并且条件变量总是需要与互斥量一起使用,运行线程以无竞争的方式等待特定的条件发生。
条件变量本身是由互斥量保护的,线程在改变条件变量之前必须首先锁住互斥量。其他线程在获得互斥量之前不会察觉到这种变化,因为互斥量必须在锁定之后才能计算条件。

信号量(semophore):它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目 .信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。

自旋锁(spinlock):自旋锁与互斥量类似,但它不是通过休眠使进程阻塞,而是在获取锁之前一直处于忙等(自旋)阻塞状态。自旋锁可以用于以下情况:锁被持有的时间短,而且线程并不希望在重新调度上花费太多的成本。

进程间通信 和 线程间同步相关推荐

  1. 操作系统:进程间通信与线程间同步

    进程线程通信方式之间的差异 每个进程有自己的地址空间.两个进程中的地址即使值相同,实际指向的位置也不同.进程间通信一般通过操作系统的公共区进行.   同一进程中的线程因属同一地址空间,可直接通信. 不 ...

  2. linux线程间通信优点,进程间通信与线程间通信【转】

    一个进程写管道:写入字节数小于PIPE_BUF是原子操作,写操作在管道缓冲区没有及时读走时发生阻塞. 一个进程读管道:读操作在管道缓冲区没有数据时发生阻塞. 以前一直想找个机会总结一下进程和线程的通信 ...

  3. LinuxC高级编程——线程间同步

    LinuxC高级编程--线程间同步 宗旨:技术的学习是有限的,分享的精神是无限的. 1. 互斥锁mutex 多个线程同时访问共享数据时可能会冲突.对于多线程的程序,访问冲突的问题是很普遍的,解决的办法 ...

  4. IOT-OS之RT-Thread(六)--- 线程间同步与线程间通信

    文章目录 一.IPC对象管理 1.1 IPC对象控制块 1.2 IPC对象接口函数 二.线程间同步对象管理 2.1 信号量对象管理 2.2 互斥量对象管理 2.3 事件集对象管理 三.线程间通信对象管 ...

  5. 线程间同步和通信,event semaphore mailbox

    线程间同步和通信,event semaphore mailbox 1. 概述 2. 事件event 3. wait_order() 4. 旗语(semaphore) 5. semaphore::get ...

  6. Linux多线程编程---线程间同步(互斥锁、条件变量、信号量和读写锁)

    本篇博文转自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了 ...

  7. Java 多线程(六)——进程间通信与线程间通信

    以前一直想找个机会总结一下进程和线程的通信机制,但由于技术和平台的局限性,一直没有找准切入点.由于马上要毕业了,对自己技术的总结和梳理的前提下写了本篇文章,如有错误之处,敬请拍砖和指教. 操作系统的主 ...

  8. 进程间通信和线程间通信

    进程间通信 转自  https://www.cnblogs.com/LUO77/p/5816326.html 线程间通信  https://www.cnblogs.com/jobs1/p/107840 ...

  9. 进程间通信和线程间通信的几种方式

    进程和线程的区别: 对于进程来说,子进程是父进程的复制品,从父进程那里获得父进程的数据空间,堆和栈的复制品. 而线程,相对于进程而言,是一个更加接近于执行体的概念,可以和同进程的其他线程之间直接共享数 ...

最新文章

  1. UNIX/LINUX程序设计教程(1)-- 获取系统信息
  2. php 登录 linux服务器,如何实现linux系统远程登录到linux服务器
  3. 零基础如何学习SAP BI模块
  4. (3)nginx的虚拟主机配置
  5. 什么是SAP Graph
  6. 做小程序的流程总结(基本篇)
  7. python之import子目录文件
  8. python def函数报错详解_JSer 快速入门 Python 之函数详解
  9. python工具箱_python 工具箱
  10. 图解:如何修改CSDN账号昵称?
  11. storm的核心组件,编程模型,一般机构图
  12. dubbo comsumer指定服务
  13. 响铃:AWE2018只是“草船”,三星已成大屏电视“东风”
  14. Micro:Bit手柄试用之一MagicPad (解决蓝牙与gamePad包共存)
  15. CPU缓存体系对Go程序的影响
  16. 打开PDF文件时,出现“打开本文档时发生错误。无法找到本文件。”解决办法,亲自尝试成功
  17. 针对list集合的操作,按照某一字段,对另一个字段进行归类
  18. 计算机如何取消左缩进,Word中怎么去掉表格的缩进
  19. 会话空闲时间已超过限度
  20. Web-网上在线支付

热门文章

  1. 12 个 Pandas Numpy 函数:数据分析提速 50% 不是问题!
  2. 在万网注册的域名如何设置腾讯企业邮箱
  3. 高通modem和linux区别,qualcomm qmi(modem-linux通信)
  4. 多层感知机与深度学习算法概述
  5. 基于javafx的模拟磁盘文件系统
  6. java输出各种三角形(*表示)
  7. ElasticSearch7.6.x最新完整教程
  8. 易语言api hook CreateProcessA 创建进程
  9. 国民技术对比STM移植参考------N32G45X系列对比STM32F10X
  10. 2023最新稳定的礼品单号代发网系统源码,一键自动发货、api、无线分站、数据统计、自建仓、云仓全部包含