进程间通信以及线程的同步互斥机制

1.进程间通信机制

常用的六种通信机制: 管道、消息队列、共享内存、信号灯集、信号、Socket

管道(Pipe)和无名管道(匿名管道):



管道是一种半双工的通信方式,数据只能单向流动,通常用于具有亲缘关系的进程间通信(例如,父子进程)。
无名管道是在内存中开辟的一段缓冲区,一端进程写入数据,另一端进程读取数据。

无名管道的特点:

1.只能用于亲缘间进程的通信

2.无名管道数据半双工的通信的方式

3.无名管道的大小是64K

4.无名管道不能够使用lseek函数(调用会出错 返回 -1)

5.读写的特点

如果读端存在写管道:有多少写多少,直到写满为止(64k)写阻塞,直到管道中腾出新的4K空间,写操作解除阻塞

如果读端不存写管道,管道破裂(SIGPIPE)

如果写端存在读管道:有多少读多少,没有数据的时候阻塞等待

如果写端不存在读管道:有多少读多少,没有数据的时候立即返回(非阻塞)


命名管道(FIFO):

可以用于非亲缘进程间通信,也可以用于亲缘进程间通信有名管道会创建一个管道文件,只需要打开这个文件,进行读写操作即可管道文件本质是在内存上的,在硬盘上的只是一个标识。

有名管道的特点:

1.可以用于任意进程间的通信,不仅限亲缘进程

2.有名管道数据是半双工的通信方式

3.有名管道的大小是64K

4.有名管道不能够使用lseek函数(调用会失败 返回 -1)

5.读写的特点

如果读端存在写管道:有多少写多少,直到写满为止(64k)写阻塞

如果读端不存在写管道

1.读端没有打开,写端在open的位置阻塞

2.读端打开后关闭,管道破裂(SIGPIPE)

如果写端存在读管道:有多少读多少,没有数据的时候阻塞等待

如果写端不存在读管道

1.写端没有打开,读端在open的位置阻塞

2.写端打开后关闭,有多少读多少,没有数据的时候立即返回

信号(Signal):

信号是一种进程间的异步通信方式,用于通知接收进程发生了某种事件,如进程终止、用户输入等。信号处理通常是预定义的。
消息队列(Message Queue):

消息队列也是基于内核实现的,A进程将消息写入消息队列

消息队列中的消息有类型和正文。

B进程可以根据消息的类型从消息队列中将对应类型的消息取走。

消息队列的大小,默认是 16K,

如果消息队列满了,A进程还想向消息队列中写入消息,此时A进程将会阻塞。


共享内存(Shared Memory):

最直接的通信方式之一,允许两个或多个进程直接访问同一块内存区域。速度快,但需要考虑同步问题,如使用互斥锁或信号量。


信号灯集:

信号灯集:又叫做信号量数组,他是实现进程间同步的机制

在一个信号灯集中可以有很多个信号灯,这些信号灯之间工作相互互不干扰。

一般使用时使用的都是二值信号灯


套接字(Socket):

虽然最初用于网络通信,但也可以用于同一台机器上的进程间通信,支持TCP(面向连接、可靠)和UDP(无连接、不可靠)两种通信方式。

2.线程的同步互斥机制:

互斥锁(Mutex):
互斥锁是最基本的同步原则,用于保护临界区(Critical Section),确保同一时间只有一个线程可以访问共享资源。其他试图获取锁的线程会被阻塞,直到持有锁的线程释放锁。


信号量(Semaphore):
信号量可以视为一个计数器,用于控制对公共资源的访问数量。它允许一个或多个线程等待特定条件满足(计数非零)。线程通过wait(P操作)减少计数,通过post(V操作)增加计数。当计数为零时,wait操作会使线程等待。


条件变量(Condition Variable):
条件变量用于线程间的同步,允许线程等待某个条件成立。线程在条件满足前调用wait()函数挂起自身,直到其他线程通过notify()或notify_all()函数通知条件已变成就绪。


读写锁(Read-Write Lock):
读写锁允许多个读线程同时访问共享资源,但在有写线程时会排斥所有读写线程。适用于读多写少的场景,能提高并发效率。


自旋锁(Spin Lock):
自旋锁在获取锁失败时,并不立即放弃CPU,而是在原地循环(自旋)等待锁释放。适用于锁持有时间很短的情况,避免了线程上下文切换的开销。


原子操作(Atomic Operation):
原子操作是不可分割的操作,保证了操作的完整性。在多线程环境下,对变量进行原子操作可以避免数据竞争,如原子加、减、交换等。
 

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

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

相关文章

图神经网络入门(1)-networkx

简介 NetworkX是一个Python语言的图论建模工具,用于创建、操作复杂网络结构(如图、有向图等)。它提供了许多用于分析网络、生成随机网络、以及可视化网络的函数和工具。用户可以利用NetworkX来研究复杂网络的拓扑结构、节点间的关系以及路径查…

【ARMv8/ARMv9 硬件加速系列 2.4 -- ARM NEON Q寄存器与V寄存器的关系】

文章目录 Q 与 V 的关系向量寄存器 v 的使用赋值操作寄存器赋值总结Q 与 V 的关系 在ARMv8/v9架构中,v寄存器和q寄存器实际上是对相同的物理硬件资源的不同称呼,它们都是指向ARM的SIMD(单指令多数据)向量寄存器。这些寄存器用于高效执行向量和浮点运算,特别是在多媒体处理…

如何秒杀系统架构设计

原文路径:https://learn.lianglianglee.com/%e4%b8%93%e6%a0%8f/%e5%a6%82%e4%bd%95%e8%ae%be%e8%ae%a1%e4%b8%80%e4%b8%aa%e7%a7%92%e6%9d%80%e7%b3%bb%e7%bb%9f/00%20%e5%bc%80%e7%af%87%e8%af%8d%20%e7%a7%92%e6%9d%80%e7%b3%bb%e7%bb%9f%e6%9e%b6%e6%9e%84%e8%ae%be%e8%ae%…

四个步骤,帮你成为价值导向型项目经理

在企业数字化转型的浪潮下,项目管理的方向逐渐从任务导向转变为以价值交付为导向。在快速变化的市场环境中,仅仅关注项目任务的完成已不足以确保项目的成功,需要更加注重项目的最终成果和价值,确保项目能够为组织带来实际的价值和…

这个开源软件,送给爱读书的你!!【送源码】

对于喜欢阅读的人来说,一定经历过从一本厚厚的修仙书籍到MP3、MP4的阅读时代,再到现今的手机软件。 但是现在的阅读软件经常会遇见以下问题:比如广告弹窗太多,排版乱,甚至很多的APP都进入会员时代,再加上一…

数据安全未来之路,天空卫士荣誉领榜《中国数据安全50强(2024)》

《中国数据安全50强(2024)》 数世咨询首份《中国数据安全50强(2024)》报告发布。天空卫士凭借其卓越的技术创新、市场领导力、业务收入能力和企业发展能力,在众多竞争者中脱颖而出,荣登50强榜单&#xff0…

LogicFlow 学习笔记——8. LogicFlow 基础 事件 Event

事件 Event 当我们使用鼠标或其他方式与画布交互时,会触发对应的事件。通过监听这些事件,可以获取其在触发时所产生的数据,根据这些数据来实现需要的功能。详细可监听事件见事件API。 监听事件 lf实例上提供on方法支持监听事件。 lf.on(&…

在VS Code中快速生成Vue模板的技巧

配置vue.json: { "Print to console": {"prefix": "vue","body": ["<template>"," <div class\"\">\n"," </div>","</template>\n","<scri…

基于Java + Swing + MySQL的学生选课及成绩管理系统(Java课程设计)

目录 开发工具系统结构功能展示登录与注册界面&#xff08;通用&#xff09;主界面&#xff08;通用&#xff09;学生信息查询界面&#xff08;学生用户&#xff09;学生信息管理界面&#xff08;教师用户 管理员用户&#xff09;学生选课界面&#xff08;学生用户&#xff09;…

Element-ui中Table表格无法显示

Element-ui中Table表格无法显示 在使用过程中发现样式正常显示但是table就是不显示&#xff0c;研究了一段时间后&#xff0c;发现问题是项目结构的问题 当你创建vue和安装el的时候&#xff0c;一定要注意进入到正确的项目文件夹&#xff0c;如果在外面也出现一个package.jso…

Java | Leetcode Java题解之第148题排序链表

题目&#xff1a; 题解&#xff1a; class Solution {public ListNode sortList(ListNode head) {if (head null) {return head;}int length 0;ListNode node head;while (node ! null) {length;node node.next;}ListNode dummyHead new ListNode(0, head);for (int subL…

云原生化有什么特点?

云原生化&#xff0c;作为一种先进的构建和管理应用程序的方式&#xff0c;不仅代表着技术的革新&#xff0c;更是云计算时代下的必然产物。其核心目标在于充分发掘并发挥云计算平台的各项优势&#xff0c;使应用程序在性能、弹性、可靠性和安全性等方面达到前所未有的高度。 它…

【ARM-Linux篇】POSIX消息队列

System V消息队列POSIX 消息队列主 要 函 数#include <sys/msg.h> int msgget(key_t key, int oflag) int msgsnd(int msqid, const void * ptr, size_t length, int flag) ssize_t msgrcv (int msqid, void *ptr, size_t length, long type, int flag) int msgctl(int m…

springboot + Vue前后端项目(第十六记)

项目实战第十六记 写在前面1 第一个bug1.1 完整的Role.vue 2 第二个bug2.1 修改路由router下面的index.js 总结写在最后 写在前面 发现bug&#xff0c;修复bug 1 第一个bug 分配菜单时未加入父id&#xff0c;导致分配菜单失效 <!-- :check-strictly"true" 默…

【Linux】进程控制3——进程程序替换

一&#xff0c;前言 创建子进程的目的之一就是为了代劳父进程执行父进程的部分代码&#xff0c;也就是说本质上来说父子进程都是执行的同一个代码段的数据&#xff0c;在子进程修改数据的时候进行写时拷贝修改数据段的部分数据。 但是还有一个目的——将子进程在运行时指向一个…

SpringBoot的事务注解

SpringBoot的事务注解 在Spring Boot应用中&#xff0c;事务管理是一个关键的部分&#xff0c;尤其是当涉及到数据库操作时。Spring Boot提供了强大的事务管理支持&#xff0c;使得开发人员可以通过简单的注解来控制事务的边界和行为。本文将介绍如何在Spring Boot中使用事务注…

vue部署宝塔nginx配置(获取用户ip地址、反代理访问api接口、websocket转发)

以下配置为我自己的需求&#xff0c;因人而异&#xff0c;如果只是单纯的前端非交互页面&#xff0c;可以不用修改配置。 代码及注释&#xff0c;如下&#xff1a; #解决vue-router设置mode为history&#xff0c;去掉路由地址上的/#/后nginx显示404的问题location / {proxy_htt…

VS2019+QT5.15调用动态库dll带有命名空间

VS2019QT5.15调用动态库dll带有命名空间 vs创建动态库 参考&#xff1a; QT调用vs2019生成的c动态库-CSDN博客 demo的dll头文件&#xff1a; // 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 DLL3_EXPORTS // 符号…

如何快速搭建满足用户需求的运营体系?Xinstall来支招!

随着互联网的飞速发展&#xff0c;App的推广和运营面临着越来越多的挑战。传统的营销手段逐渐失效&#xff0c;如何在这个多变的互联网环境下&#xff0c;迅速搭建起能满足用户需求的运营体系&#xff0c;成为了众多企业关注的焦点。而Xinstall&#xff0c;作为一款专业的App推…

Spring Cloud Alibaba Nacos作为服务配置中心实践

Nacos官网文档&#xff1a;Nacos 融合 Spring Cloud&#xff0c;成为注册配置中心 【1】服务实例 ① pom依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </de…