当前位置: 首页 > news >正文

线程间和进程间是如何进行通信

进程是由线程组成的,进程所拥有的功能线程全部具有,线程所拥有的功能进程不一定有,所有线程的通信方式,进程不一定有。

线程之间的通信主要有两种:共享内存信息传递  (端口,方法调用等等)

进程之间的通信方式有:

  1. 管道(Pipe)‌:包括匿名管道和命名管道。匿名管道主要用于父子进程间的单向通信,而命名管道允许无亲缘关系的进程间通信‌12。
  2. 信号量(Semaphore)‌:用于控制多个进程对共享资源的访问,防止资源冲突‌12。
  3. 消息队列(Message Queue)‌:进程可以通过消息队列异步地发送和接收消息,提供消息排序和优先级管理‌12。
  4. 共享内存(Shared Memory)‌:多个进程可以直接访问同一块内存区域,实现高效的数据交换,但需要额外的同步机制来避免竞争条件‌。
  5. 信号(Signal)‌:一种软中断机制,用于通知进程某个事件的发生,尽管用于进程通信较少,但在进程控制和异常处理方面非常有用‌。

Java中线程的通信

从抽象的角度来看,

JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优。

如图所示,本地内存A和本地内存B由主内存中共享变量x的副本。假设初始时,这3个内存中的x值都为0。线程A在执行时,把更新后的x值(假设值为1)临时存放在自己的本地内存A中。当线程A和线程B需要通信时,线程A首先会把自己本地内存中修改后的x值刷新到主内存中,此时主内存中的x值变为了1。随后,线程B到主内存中去读取线程A更新后的x值,此时线程B的本地内存的x值也变为了1。

从整体来看,这两个步骤实质上是线程A在向线程B发送消息,而且这个通信过程必须要经过主内存。JMM通过控制主内存与每个线程的本地内存之间的交互,来为Java程序员提供内存可见性保证。

http://www.lqws.cn/news/75979.html

相关文章:

  • day17 leetcode-hot100-34(链表13)
  • Oracle的Hint
  • 【笔记】Windows系统部署suna基于 MSYS2的Poetry 虚拟环境backedn后端包编译失败处理
  • (九)学生写作画像可视化
  • 【PhysUnits】15.9 引入P1后的右移运算(shr.rs)
  • Vue-4-前端框架Vue基础入门之Vue的常用操作
  • 二叉树的构建与逆构建/二叉查找树与替罪羊树
  • 安全态势感知中的告警误报思考
  • SDU棋界精灵——实现硬件程序ESP32的FreeRTOS任务
  • day44 python 训练CNN网络并使用Grad-CAM可视化
  • NTP库详解
  • React Hooks 与异步数据管理
  • react实现markdown文件预览
  • A. We Need the Zero
  • NX869NX874美光固态颗粒NX877NX883
  • Vortex GPGPU的github流程跑通与功能模块波形探索(四)
  • FFmpeg移植教程(linux平台)
  • RSCUcaller
  • 12.1 GUI 事件处理
  • 《 C++ 点滴漫谈: 四十 》文本的艺术:C++ 正则表达式的高效应用之道
  • 前端高频面试题2:JavaScript/TypeScript
  • 迈向分布式智能:解析MCP到A2A的通信范式迁移
  • 第十二节:第四部分:集合框架:List系列集合:LinkedList集合的底层原理、特有方法、栈、队列
  • 【华为云Astro Zero】组装设备管理页面开发(图形拖拽 + 脚本绑定)
  • Ubuntu上进行VS Code的配置
  • STM32G4 电机外设篇(四)DAC输出电流波形 + CAN通讯
  • 16QAM在瑞利信道下的性能仿真:从理论到实践的完整解析(附完整代码)
  • 审计- 3- 风险评估:内部控制
  • NVMe协议简介之AXI总线更新
  • MySQL锁机制