管道通信,共享内存

news/2024/4/28 8:15:53/文章来源:https://blog.csdn.net/weixin_45626953/article/details/130710879

什么是有名管道

有名管道(Named Pipe)是一种特殊的文件类型,也称为 FIFO。它提供了一种进程间通信的机制,允许不相关的进程通过读写共享的文件来交换数据。

与普通文件不同的是,有名管道在文件系统中存在一个路径名,并且可以被多个进程同时打开和使用。它通常用于解决在异步场景下进程间通信的问题,例如一个进程在产生数据,另一个进程需要从该数据中获取信息,但这两个进程的执行速度不同步,无法通过传统的函数调用或消息队列来进行数据交换。

有名管道具有以下特点:

  1. 有名管道是一种文件类型,因此它可以在文件系统中被访问、创建、删除等操作。
  2. 有名管道是基于磁盘上实际的文件进行操作的,因此即使进程退出,管道依然存在。
  3. 多个进程可以同时向管道写入数据或从管道读取数据,这种特性使得有名管道成为进程间通信的重要手段之一。
  4. 有名管道是阻塞的,如果没有数据可读,则读取进程会被阻塞;如果管道已满,则写入进程会被阻塞。
    总之,有名管道提供了一种简单而有效的进程间通信机制,使得多个进程可以通过共享的文件来交换数据,从而实现异步操作和解耦合的目的。

什么是匿名管道

匿名管道(Anonymous Pipe)是一种特殊的文件类型,也称为无名管道。它提供了一种进程间通信的机制,允许在同一个进程的不同线程之间或者父子进程之间进行数据传递。

与有名管道不同的是,匿名管道没有磁盘上对应的文件,它只存在于内核中,并且只能用于进程间或线程间通信。另外,匿名管道是单向的,即只能在一个方向上传递数据,例如从父进程到子进程,或从一个线程到另一个线程。

匿名管道具有以下特点:

  1. 匿名管道是基于内存进行操作的,因此读写速度非常快。
  2. 匿名管道仅能在亲缘关系的进程间使用,例如父进程和子进程之间,因为它们共享相同的资源信息。
  3. 匿名管道是阻塞的,如果没有数据可读,则读取进程会被阻塞;如果管道已满,则写入进程会被阻塞。
    总之,匿名管道提供了一种简单而高效的进程间通信机制,使得同一个进程的不同线程之间或者父子进程之间可以通过共享的内存来交换数据,从而实现异步操作和解耦合的目的。

无名管道和命名管道都是用于进程间通信的一种方式,它们的主要区别在于以下几个方面:

  1. 命名管道可以在文件系统中创建一个特殊的文件来充当管道,而无名管道则没有对应的文件。因此,使用命名管道可以方便地在多个进程之间共享数据。

  2. 无名管道只能在父子进程或者兄弟进程之间使用,而命名管道可以在任意两个进程之间使用,只要它们都知道管道的名称。

  3. 命名管道可以通过文件系统中的路径名进行访问,因此可以通过常规的文件操作函数(如open()、read()、write()等)来读写数据。而无名管道只能通过专门的系统调用(如pipe()、read()、write()等)来进行操作。

  4. 命名管道可以有多个读写进程,并且可以持续存在于文件系统中,直到被显式地删除。而无名管道只能由创建它的进程及其子进程使用,并且在关闭它们的所有文件描述符后自动销毁。

综上所述,命名管道比无名管道更灵活,可以实现更广泛的进程间通信方式。但是,由于需要在文件系统中创建特殊文件,可能会增加一些额外的复杂度和开销。

管道和共享内存通信时谁的速度更快?为什么?

一般情况下,共享内存相比于管道在速度上更快。因为管道是通过内核进行数据传输的,需要进行多次的用户态和内核态之间的切换,而且管道的数据传输必须要经过内核的缓冲区,这些额外的步骤都会带来一定的开销。

相对来说,共享内存在进程间通信时直接映射到各进程的地址空间中,无需进行内核态与用户态的频繁切换,而且也不需要经过内核缓冲区,因此在数据传输的效率上更高。

当然,这并不是说在所有情况下共享内存都比管道更快,具体的性能表现还要考虑应用程序的场景、硬件平台的差异等多个方面的因素。在实际应用中,需要根据具体情况进行选择,综合考虑速度、可靠性、安全性等方面的因素,选取最合适的进程间通信方式。

进程之间的通信

虚拟CPU和虚拟内存的引入保证了进程的一个重要特性就是隔离,一个进程在执行过程中总是认为自己占用了所有的CPU和内存,但是实际在底层,操作系统和硬件完成了很多工作才实现了隔离的特性(比如内核和时钟设备配合实现进程调度)。在多个进程之间,如果需要进行通信的话,隔离特性会造成一些通信的障碍。

管道

管道一种常见的应用场景就创建一个连接到另一个进程管道,然后向管道中写入数据或者从管道中读取

在这里插入图片描述

管道
从一端发送到另一端接受_______________________________________________
/                                               \
\_______________________________________________/

共享内存

共享内存是一种进程间通信(IPC)的方式,它允许多个进程共享同一块内存区域,从而避免了复制数据的开销,并且能够提高进程间通信的效率。

具体来说,使用共享内存可以带来以下优点

  • 高效:共享内存允许多个进程可以同时访问同一块内存区域,避免了拷贝数据的时间和空间开销,因此能够提高进程间通信的效率。

  • 方便:由于多个进程都可以访问同一块内存区域,因此无需传递大量的数据参数,简化了进程间通信的代码实现。

  • 灵活:共享内存可以方便地在多个进程之间共享信息,使得每个进程可以通过读取或修改共享内存中的内容来获取其他进程的信息,从而实现协同工作。

  • 可扩展性:共享内存可以很容易地扩展到多核系统或分布式系统中,使得多个进程可以共享更多的资源。
    然而,也需要注意以下几个缺点

  • 同步问题:由于多个进程可以同时访问同一块内存区域,因此需要采取措施来保证共享内存的访问顺序,避免不同进程之间的数据竞争等问题。

  • 安全问题:需要采取措施保证共享内存的安全性,避免恶意进程对共享内存中的数据进行非法操作或者篡改数据。

  • 内存泄漏:如果共享内存没有得到正确释放,会导致内存泄漏的问题,因此需要在使用完共享内存之后及时释放。
    综上所述,共享内存是一种高效、方便、灵活的进程间通信方式,但也需要注意它的安全性和同步问题

共享内存的创建和获取

在Linux中,可以使用System V共享内存或POSIX共享内存来创建和获取共享内存。
对于System V共享内存:

创建共享内存:

#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>int main()
{int shmid;key_t key = 1234;// 创建共享内存shmid = shmget(key, sizeof(int), IPC_CREAT | 0666);if (shmid < 0){perror("shmget");return -1;}printf("Created shared memory with id: %d\n", shmid);return 0;
}当然也可以根据ftok函数,ftok 需要根据一个已存在的文件和一个项目ID(0255的整数)来生成一个键

获取共享内存:

#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>int main()
{int shmid;key_t key = 1234;// 获取共享内存shmid = shmget(key, sizeof(int), 0666);if (shmid < 0){perror("shmget");return -1;}printf("Attached to shared memory with id: %d\n", shmid);return 0;
}

对于posix共享内存

创建共享你内存

#include <fcntl.h>
#include <sys/mman.h>
#include <stdio.h>int main()
{int fd;const char *name = "/my_shm";const int size = sizeof(int);// 创建共享内存fd = shm_open(name, O_CREAT | O_RDWR, 0666);if (fd < 0){perror("shm_open");return -1;}ftruncate(fd, size);printf("Created shared memory with name: %s\n", name);return 0;
}

获取共享内存

#include <fcntl.h>
#include <sys/mman.h>
#include <stdio.h>int main()
{int fd;const char *name = "/my_shm";const int size = sizeof(int);// 获取共享内存fd = shm_open(name, O_RDWR, 0666);if (fd < 0){perror("shm_open");return -1;}printf("Attached to shared memory with name: %s\n", name);return 0;
}

当然上述是极其简单的内容,未考虑的因素很多

信号量

信号量(Semaphore)是一种在多进程或多线程环境下,用于控制对共享资源的访问的机制。它通常是一个整型变量,在进程间共享。当一个进程想要访问共享资源时,必须先尝试获取信号量。如果信号量的值大于零,则该进程可以访问共享资源,并将信号量的值减一。如果信号量的值为零,则该进程会被阻塞,直到有其他进程释放了资源并增加了信号量的值。

通过使用信号量,可以避免多个进程或线程同时对共享资源进行读写操作,从而避免竞争条件和数据不一致等问题。

消息队列

消息队列(Message Queue)是一种用于进程间通信的机制,它可以使得一个进程向另一个进程发送消息,并且这些消息会被放入到一个消息队列中。另一个进程可以从该消息队列中读取这些消息。

消息队列的优点包括:解耦合、异步性、可靠性等。使用消息队列进行通信时,各进程之间不需要直接交换数据,这样就降低了它们之间的耦合度。由于消息队列是异步的,因此发送方和接收方可以在任何时间进行消息的发送和接收,这也增加了应用程序的并发性。此外,消息队列还可以提供可靠的通信,即使在消息处理过程中出现故障,也可以通过消息队列来保证消息能够被成功地传递。

消息队列通常包括一个发送者和一个或多个接收者,发送者将消息放入消息队列中,而接收者则从消息队列中读取消息并进行处理。在实现消息队列时,需要考虑消息的格式、消息的生命周期、消息队列的容量以及错误处理等问题。

在Linux系统中,/proc目录是一个虚拟文件系统,它提供了一种方便的方式来访问内核和进程信息。/proc目录下的文件和目录都是内核或进程相关的信息的软链接,其中包含了当前运行的进程以及内核信息等多种信息。

在/proc目录下,每个进程都有一个以其PID(进程标识符)命名的子目录。进程的信息可以通过该子目录中的各个文件来查看和修改,例如:

  • cmdline文件:该文件包含了启动进程时的完整命令行参数。
  • environ文件:该文件包含了进程的环境变量列表。
  • status文件:该文件包含了进程的状态信息,如进程ID、进程-组ID、父进程ID、进程状态等等。
  • fd目录:该目录包含了进程打开的所有文件描述符信息。
    此外,/proc目录还包含了许多其他的文件和目录,这些文件和目录的作用是为了提供关于系统硬件、网络、内存、CPU使用情况等信息。/proc目录对于系统管理员和开发人员来说,是进行系统监控和调试的重要工具。

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

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

相关文章

redis单机版本Java代码实践

pom依赖 引入redis的starter以及commons-pool2的依赖&#xff0c;commons-pool2是配置连接池需要使用的&#xff0c;不引入&#xff0c;只有连接池配置是不会创建连接池的 <!-- redis --><dependency><groupId>org.springframework.boot</groupId><…

基于协同过滤的推荐算法

基于协同过滤的推荐算法 基于协同过滤&#xff08;CF&#xff09;的推荐基于近邻的协同过滤基于用户的协同过滤&#xff08;User-CF&#xff09;基于物品的协同过滤&#xff08;Item-CF&#xff09;User-CF 和 Item-CF 的比较基于协同过滤的推荐优缺点基于模型的协同过滤隐语义…

python类的高级函数

类的高级函数 __str__ 如果定义了该函数&#xff0c;当print当前实例化对象的时候&#xff0c;会返回该函数的return信息 用法&#xff1a; def __str__(self): return str_type 参数&#xff1a;无 返回值&#xff1a;一般返回对于该类的描述信息 __getattr__ 当调用的…

JavaWeb-RequestResponse的使用

Request&Response 今日目标 掌握Request对象的概念与使用掌握Response对象的概念与使用能够完成用户登录注册案例的实现能够完成SqlSessionFactory工具类的抽取 1&#xff0c;Request和Response的概述 Request是请求对象&#xff0c;Response是响应对象。这两个对象在我们…

深入理解Java虚拟机:JVM高级特性与最佳实践-总结-7

深入理解Java虚拟机&#xff1a;JVM高级特性与最佳实践-总结-7 类文件结构概述无关性的基石 虚拟机类加载机制概述类加载的时机 类文件结构 代码编译的结果从本地机器码转变为字节码&#xff0c;是存储格式发展的一小步&#xff0c;却是编程语言发展的一大步 概述 我们写的程…

在阿里做了6年软件测试,4月无情被辞,想给划水的兄弟提个醒

先简单交代一下背景吧&#xff0c;某不知名 985 的本硕&#xff0c;17 年毕业加入阿里&#xff0c;以“人员优化”的名义无情被裁员&#xff0c;之后跳槽到了有赞&#xff0c;一直从事软件测试的工作。之前没有实习经历&#xff0c;算是6年的工作经验吧。 这6年之间完成了一次…

060:cesium设置网格Grid材质

第060个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置网格材质,请参考源代码,了解GridMaterialProperty的应用。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共93行)相关API参考:专栏目标示例效…

chatgpt赋能Python-python3_9_6怎么用

Python 3.9.6简介 Python 3.9.6是2021年6月28日发布的Python编程语言的最新版本&#xff0c;它提供了一些有用的新功能和改进&#xff0c;包括优化的解释器性能和可变构造体。它是一种功能强大的编程语言&#xff0c;既易于学习又易于使用&#xff0c;非常适用于开发Web应用程…

SaaS 产品如何选择设计协作工具?

文章内容转载腾讯 CoDesign 随着互联网及其衍生技术的发展&#xff0c;企业比以往更依赖内容去吸引、去培养自己的用户&#xff0c;寻求转化。小鹅通就是在微信生态中帮助企业通过知识服务去实现内容分发和流量聚合&#xff0c;帮助企业沉淀用户&#xff0c;提供深度私域运营服…

自定义颜色编辑选取对话框

一、简介 Qt中已经有一些封装好的对话框&#xff0c;比如QMessageBox、QColorDialog等&#xff0c;使用起来快捷方便&#xff0c;但缺点是我们无法为它们自定义样式&#xff0c;所以可能难以“融入”我们的项目。既然如此&#xff0c;那就自己做一个把。抱着这样的想法&#x…

如何成功申请计算机软件著作权【申请流程完整记录】

致谢 &#xff1a;此博文的编写包括软著的申请&#xff0c;均借鉴了大佬【万里守约】的博客 — 提示&#xff1a;此博文仅适合个人申请&#xff0c;因为我是自己一个人的项目&#xff0c;自己一个人申请软著 文章目录 前言&#xff1a;一、网站注册与实名认证二、材料准备软著申…

ChatGPT工作提效之初探路径独孤九剑遇强则强

ChatGPT工作提效之遇强则强 前言一、如何使用ChatGPT二、ChatGPT实战应用三、ChatGPT会叫的小孩有奶吃工具类的交互问答类的交互开发类的交互 前言 读《笑傲江湖》西湖比剑时&#xff0c;对于独孤九剑1的解读印象颇为深刻。令狐冲被任我行这个高手激发出许多精妙的剑招。这独孤…

nvm-windows安装和配置

1.下载nvm-windows https://github.com/coreybutler/nvm-windows/releases 进入后如下图 选择nvm-setup.exe下载 2.安装 2.1 运行安装包&#xff0c;同意协议&#xff0c;下一步 2.2 选择nvm的安装目录&#xff0c;安装路径名最好不要有空格 2.3 点击Next&#xff0c;设…

linux 串口改为固定

在/etc/udev/rules.d 目录下新建定义规则的文件 1. 文件名要按规范写否则改动无效2. 规则文件必须以.rules 结尾3. 规则文件名称必须遵循 xx-name.rules 格式&#xff08;xx 为数字或字母&#xff0c;name 为规则名称&#xff09;&#xff0c;例如 99-serial-ports.rules。4. 规…

chatgpt赋能Python-python3_8_5怎么保存

Python 3.8.5&#xff1a;什么是它&#xff0c;为什么它重要&#xff0c;以及如何安装和保存&#xff1f; Python是当今世界上最受欢迎的编程语言之一。Python 3.8.5是该语言的最新版本&#xff0c;它引入了一些重要的改进和新特性。这篇文章将介绍Python 3.8.5并向您展示如何…

windows搭建pyspark环境详细教程

一.安装jdk及配置环境变量: 下载地址&#xff1a; https://www.oracle.com/java/technologies/downloads/#java8-windows 安装步骤&#xff1a; 下载后点击安装&#xff0c;中途可以自定义安装路径&#xff0c;最后查看安装路径&#xff1a; 开始配置系统环境变量&#xff1a…

AJax和Axios的讲解

目录 Ajax Ajax基本介绍 同步异步 原生Ajax 原生的Ajax使用方式 Axios 基本介绍 Axios的基本使用 发送 get 请求 发送 post 请求 Axios快速入门 请求方法的别名 练习 Ajax Ajax基本介绍 Ajax: 全称Asynchronous JavaScript And XML&#xff0c;异步的JavaScript和XML…

Thematica: 炫彩主题与黑暗奇观的Vue3之旅

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录 一、介绍1.1 博客主题和目的1.2 Vue 3简介二、炫彩主题2.1 准备工作2.2 安装必要依赖2.3 创建Vue项目2.4 设置全局样式

计算机中存储器详解

文章目录 一、存储器的分类1. 按存储介质分类2. 按存取方式分类 二、存储器的层次结构三、CPU、缓存、主存、辅存之间的通信关系1. 缓存-主存层次2. 局部性原理3. 主存-辅存层次 一、存储器的分类 1. 按存储介质分类 2. 按存取方式分类 二、存储器的层次结构 在讲存储器的层次…

实验 2:树形数据结构的实现与应用

东莞理工学院的同学可以借鉴&#xff0c;请勿抄袭 1.实验目的 通过实验达到&#xff1a; 理解和掌握树及二叉树的基本概念&#xff1b; 理解和掌握二叉树的顺序存储结构、链式存储结构&#xff1b; 理解和掌握采用二叉链式存储结构下二叉树的各种遍历操作的思想及 其应用&a…