Linux 进程线程间通信总结

线程

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

互斥问题(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.rhkb.cn/news/470507.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【再谈设计模式】抽象工厂模式~对象创建的统筹者

一、引言 在软件开发的世界里,高效、灵活且易于维护的代码结构是每个开发者追求的目标。设计模式就像是建筑蓝图中的经典方案,为我们提供了应对各种常见问题的有效策略。其中,抽象工厂模式在对象创建方面扮演着重要的角色,它如同一…

Web安全之SQL注入---基础

文章目录 SQL注入简介SQL注入基础SQL注入分类SQL注入流程 SQL注入简介 什么是SQL注入? SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理…

机器学习——贝叶斯

🌺历史文章列表🌺 机器学习——损失函数、代价函数、KL散度机器学习——特征工程、正则化、强化学习机器学习——常见算法汇总机器学习——感知机、MLP、SVM机器学习——KNN机器学习——贝叶斯机器学习——决策树机器学习——随机森林、Bagging、Boostin…

gdb编译教程(支持linux下X86和ARM架构)

1、下载源码 http://ftp.gnu.org/gnu/gdb/ 我下载的8.2版本。 2、下载完后拷贝到linux的x86系统。 3、解压,然后进入到目录下,打开当前目录的命令行窗口。 4、创建一个生成目录。 5、我们先开始x86版本,这个比较简单,不需要配置…

10款翻译工具实践体验感受与解析!!!!!

在现今的数字化时代,翻译工具如同语言的桥梁,为我们打开了通向世界的大门。今天咱们不聊别的,就聊聊那些让我又爱不释手的翻译工具们。因为我的职业因素,作为一个经常需要跟各种语言打交道的“文字搬运工”,这些工具可…

【日志】392.判断子序列

2024.11.8 【力扣刷题】 392. 判断子序列 - 力扣(LeetCode)https://leetcode.cn/problems/is-subsequence/?envTypestudy-plan-v2&envIdtop-interview-150 整个题从一开始就是打算从双指针的思想往下走的。但是,我设置了四个变量sLeft…

C++20 中最优雅的那个小特性 - Ranges

C20 中最优雅的那个小特性 - Ranges 大家好,今天我们来聊聊 C20 的一项非常重要的新特性——Ranges,可以让你的代码更优雅、更高效、更炫酷,如果你是一个对代码有所追求的小伙伴,那么这个特性你绝对值得拥有! 啥是 …

Python多进程间通讯(包含共享内存方式)

文章目录 1 通过非共享内存配合队列方式2 通过共享内存配合队列方式 注:本博文测试环境为Linux系统。 1 通过非共享内存配合队列方式 下面是一个常见的生产者与消费者的模式示例,这里分别启动了两个子进程,一个为生产者(producer…

深入理解接口测试:实用指南与最佳实践5.0(一)

✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…

2024.11.12_大数据的诞生以及解决的问题

大数据的诞生以及解决的问题 视频一:大数据诞生的背景原因:传统的数据处理架构无法满足海量的数据存储和计算需求 视频三:区分离线处理场景和实时处理场景视频五:传统的大数据与现代的大数据区别(离线场景)…

ML 系列: 第 24 节 — 离散概率分布(泊松分布)

目录 一、说明 二、固定时间间隔示例 三、固定间隔的示例 四、泊松分布的主要特征 五、示例 5.1 平均客户数的计算: 5.2 用于计算和绘制泊松分布的 Python 代码: 一、说明 泊松概率分布是一种离散概率分布,它表示在固定的时间或空间间隔内发生…

闯关leetcode——3174. Clear Digits

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/clear-digits/description/ 内容 You are given a string s. Your task is to remove all digits by doing this operation repeatedly: Delete the first digit and the closest non-digit cha…

机器情绪及抑郁症算法

🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年11月12日17点02分 点击开启你的论文编程之旅https://www.aspiringcode.com/content?id17230869054974 计算机来理解你的情绪&a…

【深圳大学】数据结构A+攻略(计软版)

1. 考试 1.1 形式 分为平时,笔试,机试三部分。其中: 平时占30%,包含平时OJ测验和课堂练习,注意这个可能会因老师的不同和课题组的新策略而改变。笔试占60%,是分值占比的主要部分。机试占10%。 1.2 题型…

Chrome使用IE内核

Chrome使用IE内核 1.下载扩展程序IE Tab 2.将下载好的IE Tab扩展程序拖拽到扩展程序界面,之后重启chrome浏览器即可

使用pytest+openpyxl做接口自动化遇到的问题

最近使用pytestopenpyxl做了个接口自动化的小项目,遇到了一些问题。 首先,使用pytest这个框架,主要是使用了pytest.fixture, pytest.mark.parametrize这两个fixture去做参数化,里面注入的数据是用openpyxl来实现的。 接口介绍&a…

IEC60870-5-104 协议源码架构详细分析

IEC60870-5-104 协议源码架构 前言一、资源三、目录层级一二、目录层级二config/lib60870_config.hdependencies/READMEexamplesCMakeLists.txtcs101_master_balancedcs104_client_asyncmulti_client_servertls_clienttls_server说明 make这些文件的作用是否需要导入这些文件&a…

TensorRT基础知识

github:https://github.com/NVIDIA/TensorRT 官网快速入门链接:Quick Start Guide :: NVIDIA Deep Learning TensorRT Documentation 引言: TensorRT 是 NVIDIA 推出的一个高性能深度学习推理库,专门用于优化和加速已经训练好的深度学习模型…

jenkins提交gitee后自动部署

jenkins中安装gitee插件 Gitee Plugin​​​​​​ 配置gitee WebHook 生成giteeHook密码 去gitee中配置webHook 输入jenkins中的url和生成的密码 当我们再提交后就可以自动部署 gitee官方配置

软件测试面试八股文(超详细整理)

请你说一说测试用例的边界 参考回答: 边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充,这种情况下,其测试用例来自等价类的边界。 常见的边界值 1)对16-bit 的整数而言 32…