Linux 进程线程间通信总结

news2024/12/23 22:28:00

线程

线程共享存储空间主要带来的问题是数据同步和互斥。由于线程在同一进程中运行,它们共享相同的内存空间,任何线程都可以访问共享数据。这样,多个线程并发执行时,可能会导致以下两种主要问题:

互斥问题(Mutual Exclusion)同步问题(Synchronization)

互斥问题指的是多个线程对共享资源的访问冲突,通常表现为多个线程试图同时读写同一份数据,导致数据不一致或者不可预测的行为。为了避免这种情况,需要通过互斥机制确保同一时刻只有一个线程能够访问共享资源。
同步问题指的是线程间的协作问题,例如一个线程需要等待另一个线程完成某个任务,或者需要确保线程按照特定顺序执行。同步通常涉及线程之间的协调,确保它们在正确的时机访问共享资源或按顺序执行。

互斥锁(Mutex):互斥锁是一种用于保证某段代码在任何时刻只能由一个线程执行的同步机制。当一个线程获得互斥锁后,其他线程必须等待直到该线程释放锁,才能获得访问权限。

自旋锁:自旋锁与互斥锁很相似,从本质上说也是一把锁,在访问共享资源之前对自旋锁进行上锁,在访问完成后释放自旋锁(解锁);事实上,从实现方式上来说,互斥锁是基于自旋锁来实现的,所以自旋锁相较于互斥锁更加底层。如果在获取自旋锁时,自旋锁处于未锁定状态,那么将立即获得锁(对自旋锁上锁);如果在获取自旋锁时,自旋锁已经处于锁定状态了,那么获取锁操作将会在原地“自旋”,直到该自旋锁的持有者释放了锁。由此介绍可知,自旋锁与互斥锁相似,但是互斥锁在无法获取到锁时会让线程陷入阻塞等待状态;而自旋锁在无法获取到锁时,将会在原地“自旋”等待。“自旋”其实就是调用者一直在循环查看该自旋锁的持有者是否已经释放了锁,“自旋”一词因此得名。
读写锁(Read-Write Lock):允许多个线程并发地读共享资源,但在写操作时要求独占访问。这对于读操作较多的场景非常有用。
信号量(Semaphore):信号量可以用于控制访问共享资源的线程数量,通常用于多个线程对有限资源的访问控制。
条件变量(Condition Variables):条件变量允许线程在某个条件不满足时进入阻塞状态,直到条件满足时被唤醒。常用于生产者-消费者模型,或其他需要线程等待某个条件成立的情况。

进程

进程间通信(IPC) 和 同步 是操作系统中两个密切相关的概念,它们都涉及到多进程或多线程环境下的协调与协作,但其关注点有所不同。简单来说,IPC 主要关注数据交换,而同步主要关注资源访问控制。IPC 侧重于消息传递、共享内存或信号传递等形式的通信,同步 侧重于通过锁、信号量等机制控制对共享资源的访问。

进程间通信:

在这里插入图片描述

UNIX IPC

UNIX 系统早期的进程间通信机制相对简单,主要包括以下几种:

管道(Pipe):

用于同一进程组中的进程之间的单向通信。
管道提供了一个数据流通道,一个进程写入数据到管道中,另一个进程从管道中读取数据。
管道仅支持单向通信,且只能用于具有亲缘关系的进程(如父子进程)。
FIFO(命名管道):

FIFO 是管道的扩展,它允许无亲缘关系的进程通过一个名称来进行通信。
与管道不同,FIFO 可以通过文件路径名在文件系统中创建,允许不同的进程通过这个命名管道进行通信。
它也支持双向通信,但是仍然是基于字节流的。
信号(Signal):

UNIX 中的信号是一种轻量级的进程间通信方式,用于通知进程某个事件的发生。
常见的信号包括 SIGINT(中断)、SIGTERM(终止)等。进程可以通过 kill() 函数发送信号,目标进程通过信号处理器接收信号。
信号适用于进程之间的通知与控制,但并不适合传递大量数据。

System V IPC

System V IPC 是 UNIX 系统在 1980s 后期引入的一套扩展机制,提供了更为强大和灵活的进程间通信功能。System V IPC 包括以下几种主要机制:

System V 信号量(Semaphore):

信号量是一种用于同步进程间访问共享资源的机制。它通过一个计数器来表示资源的可用数量,进程在访问共享资源时,通过对信号量的操作(如 P() 和 V() 操作)来控制对资源的访问。
支持计数信号量和二值信号量,可以用于实现互斥锁、资源计数等。
System V 消息队列(Message Queue):

消息队列允许进程通过一个消息队列进行通信。每条消息有一个类型,接收进程可以根据消息类型来接收特定的消息。
它是一个先进先出(FIFO)的队列,用于在进程间传递结构化的消息。
System V 共享内存(Shared Memory):

共享内存是 System V IPC 中最快的一种方式,允许多个进程直接访问相同的内存区域,实现高效的数据交换。
使用共享内存时,需要额外的同步机制(如信号量)来防止竞争条件。
缺点:

System V IPC 的使用较为复杂,API 不够直观。
资源管理不够灵活,创建和销毁 IPC 资源可能会产生问题。
资源控制和错误处理机制较弱,容易发生资源泄漏。

POSIX IPC

POSIX IPC 是在 System V IPC 基础上进行改进的一组标准,目的是提供更清晰、更灵活、更易用的进程间通信机制。POSIX IPC 采用了与 System V IPC 相同的基本概念,但做了一些优化。

POSIX 信号量(POSIX Semaphore):

POSIX 信号量提供了更易于使用的 API,并改进了对信号量的控制。与 System V 信号量相比,POSIX 信号量在实现上更加一致和简洁。
POSIX 消息队列(POSIX Message Queue):

与 System V 消息队列类似,POSIX 消息队列允许进程通过消息队列进行通信。POSIX 消息队列支持更高效的消息管理和更简单的错误处理。
POSIX 消息队列可以提供持久化支持,并且支持异步操作,适合于需要高吞吐量的场景。
POSIX 共享内存(POSIX Shared Memory):

POSIX 共享内存同样允许多个进程访问同一块内存区域,具有较高的效率。POSIX 的实现相比 System V 共享内存提供了更简洁的 API 和资源管理。
POSIX 共享内存还支持映射到进程地址空间,方便访问和管理。
POSIX IPC 的优势:

API 简单直观,易于使用和理解。
更好的资源管理和错误处理。
在 POSIX 标准中,IPC 机制是跨平台的(例如,Linux、macOS 等支持 POSIX 标准)。

Socket IPC

Socket IPC 是基于 套接字 的进程间通信机制,支持在同一台主机内的进程间通信,也可以实现跨网络的进程通信。

套接字是计算机网络通信的基本单元,可以用于 TCP/IP 协议栈之上进行通信。
套接字通常用于网络通信,但也可以用于同一主机内的进程间通信(Unix 域套接字)。
Socket 的特点:

跨平台支持:适用于同一主机内和分布式系统中的进程间通信。
灵活性强:支持流式通信(TCP)和数据报式通信(UDP),可以满足各种通信需求。
可靠性:TCP 套接字提供了可靠的连接和数据传输保障。

进程同步

常见的进程间同步机制
互斥锁(Mutex):

确保同一时刻只有一个进程能够访问共享资源。其他进程必须等待锁释放才能继续访问该资源。
互斥锁用于防止竞态条件,保证共享资源在临界区内只有一个进程操作。
信号量(Semaphore):

信号量是一种用来控制多个进程对共享资源访问的计数器。它可以用于实现互斥、同步以及进程间的通信。
信号量有两种类型:二值信号量(只允许两个状态:0和1,类似于互斥锁)和计数信号量(允许多个进程并发访问共享资源)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2239648.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是RAG? LangChain的RAG实践!

1. 什么是RAG RAG的概念最先在2020年由Facebook的研究人员在论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》中提出来。在这篇论文中他们提出了两种记忆类型: 基于预训练模型(当时LLM的概念不像现在这么如日中天&#xff0…

Python 进阶函数教程

Python 进阶函数教程 引言 在 Python 编程中,函数是组织代码、提高可重用性和可读性的关键组成部分。尽管许多初学者掌握了基本的函数定义和调用,但 Python 还提供了许多高级功能,使函数更加灵活和强大。本文将深入探讨 Python 中的高级函数…

ReactPress:深入解析技术方案设计与源码

ReactPress Github项目地址:https://github.com/fecommunity/reactpress 欢迎提出宝贵的建议,欢迎一起共建,感谢Star。 ReactPress是一个基于React框架开发的开源发布平台,它不仅仅是一个简单的博客系统,更是一个功能全…

c++实现B树(下)

书接上回小吉讲的是B树的搭建和新增方法的实现(blog传送门🚪:B树实现上)(如果有小可爱对B树还不是很了解的话,可以先看完上一篇blog,再来看小吉的这篇blog)。那这一篇主要讲的是B树中…

【漏洞分析】Fastjson最新版本RCE漏洞

01漏洞编号 CVE-2022-25845CNVD-2022-40233CNNVD-202206-1037二、Fastjson知多少 万恶之源AutoType Fastjson的主要功能是将Java Bean序列化为JSON字符串,这样得到的字符串就可以通过数据库等方式进行持久化了。 但是,Fastjson在序列化及反序列化的过…

PSRAM,Flash,SRAM,ROM有什么区别

PSRAM、Flash、SRAM 和 ROM 是四种不同类型的存储器,它们在计算机和嵌入式系统中的用途、特性和工作方式各不相同。下面是这四种存储器的区别和各自的特点: ### 1. **SRAM(静态随机存取存储器)** - **特性**: - **易…

大数据学习13之Scala基础语法(重点)

1. 简介 Scala 是 Scalable Language 的简写,是一门多范式的编程语言。创始人为 Martin Odersky 马丁奥德斯基。 Scala 这个名字来源于 Scalable Language(可伸缩的语言),它是一门基于 JVM 的多范式编程语言,通俗的说:…

django入门【05】模型介绍——字段选项(二)

文章目录 1、null 和 blank示例说明⭐ null 和 blank 结合使用的几种情况总结: 2、choices**choices 在 Django 中有以下几种形式:**(1) **简单的列表或元组形式**(2) **字典映射形式**(3&#…

微信小程序:vant组件库安装步骤

前言:在微信小程序中引用vant组件报错,提示路径不存在,这很有可能是因为没有安装构建vant组件库导致。下面是我整理的安装vant组件库的步骤: 第一步:安装node.js(执行完第一步请重启小程序) 具体步骤请看链接:node.js…

Python如何根据给定模型计算权值

目录 一、特征权重的重要性 二、线性回归中的特征权重计算 1. 导入必要的库 2. 创建示例数据集 3. 分割数据集 4. 训练线性回归模型并计算权重 三、特征选择方法 四、实际案例:金融科技数据集 五、总结 在机器学习中,特征权重的计算是理解模型如…

过去几年电子学习的趋势

近年来,在技术和不断变化的学习者期望的推动下,电子学习已经发展成为一种适应性强、沉浸式和社会化的教育形式。个性化已成为最具影响力的趋势之一,Coursera和LinkedIn Learning等平台为个人量身定制内容。这些平台使用人工智能来建议课程、跟…

面相小白的php反序列化漏洞原理剖析

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理反序列化漏洞的一些成因原理 建议学习反序列化之前 先对php基础语法与面向对象有个大体的了解 (我觉得我整理的比较细致,了解这俩是个啥就行) 漏洞实战情况 这个漏洞黑盒几乎不会被发现&am…

Flutter中的Material Theme完全指南:从入门到实战

Flutter作为一款热门的跨平台开发框架,其UI组件库Material Design深受开发者喜爱。本文将深入探讨Flutter Material Theme的使用,包括如何借助Material Theme Builder创建符合产品需求的主题风格。通过多个场景和代码实例,让你轻松掌握这一工…

IDC机房服务器托管的费用组成

IDC机房服务器托管的费用,并不是只有我们所想的电费而已,还有一些其它费用组成,详细来看: 1. 机位费用:   - 机位费用是根据服务器的尺寸和占用的空间来计算的。服务器通常按照U(Unit)的高度来…

032集——圆转多段线(Circle to Polyline)(CAD—C#二次开发入门)

CAD中圆可转为带有凸度的多段线以方便后期数据计算、处理&#xff0c;效果如下&#xff1a; 白色为圆&#xff0c;红色为转换后的多段线&#xff08;为区分&#xff0c;已手工偏移多段线&#xff09; public static void XX(){var curves Z.db.SelectEntities<Entity>…

Nginx更换ssl证书不生效

一.场景 在用的ssl证书要过期了&#xff0c;申请了新的ssl证书下来&#xff0c;在nginx配置上更换上去后&#xff0c;打开系统地址&#xff0c;一依然是使用原来的旧证书&#xff0c;以前有更换过别的域名证书&#xff0c;重启nginx服务后立马就生效了。 这次没生效&#xff…

华为eNSP:MSTP

一、什么是MSTP&#xff1f; 1、MSTP是IEEE 802.1S中定义的生成树协议&#xff0c;MSTP兼容STP和RSTP&#xff0c;既可以快速收敛&#xff0c;也提供了数据转发的多个冗余路径&#xff0c;在数据转发过程中实现VLAN数据的负载均衡。 2、MSTP可以将一个或多个VLAN映射到一个Inst…

Jmeter中的配置原件(二)

5--HTTP请求默认值 用途 设置默认值&#xff1a;为多个HTTP请求设置通用的默认值&#xff0c;如服务器地址、端口号、协议等。简化配置&#xff1a;避免在每个HTTP请求中重复配置相同的参数。 配置步骤 添加HTTP请求管理器 右键点击线程组&#xff08;Thread Group&#xff…

SpringBoot(二十一)SpringBoot自定义CURL请求类

在测试SpringAi的时候,发现springAI比较人性化的地方,他为开发者提供了多种请求方式,如下图所示: 上边的三种方式里边,我还是喜欢CURL,巧了,我还没在Springboot框架中使用过CURL呢。正好封装一个CURL工具类。 我这里使用httpclient来实现CURL请求。 一:添加依赖 不需要…

空空想色?李子柒 想念你们!——早读(逆天打工人爬取热门微信文章解读)

空空想色 引言Python 代码第一篇 李子柒 想念你们&#xff01;第二篇 什么叫个性命双休结尾 引言 又开始新的尝试 最近看了坛经 所以现在佛性满满 看到很多sese的图 现在基本不会有什么想法了 以前看不懂呀 现在是借着王德峰的讲解勉强看懂 后面也会越来越懂 总之就是 空空 …