首页 > 系统相关 >Linux中的管道是什么?管道与共享内存的区别有哪些?

Linux中的管道是什么?管道与共享内存的区别有哪些?

时间:2023-01-05 12:05:28浏览次数:45  
标签:文件 用户 管道 内存 Linux 共享内存 内核

  管道是什么?简单来说就是,一个命令的结果作为另外一个命令(结果)的输入,管道是linux提供的一种常见的进程通信工具,也是很多shell命令能够灵活组合产生强大用途的一个重要工具。

  管道是Linux由Unix那里继承过来的进程间的通信机制,它是Unix早期的一个重要通信机制。其思想是,在内存中创建一个共享文件,从而使通信双方利用这个共享文件来传递信息。由于这种方式具有单向传递数据的特点,所以这个作为传递消息的共享文件就叫做“管道”。

  在管道的具体实现中,根据通信所使用的的文件是否具有名称,有“匿名管道”和“命名管道”。

  管道与共享内存的区别

  乍一看,感觉管道和共享内存并不是区别很大,这里介绍一下两者之间的区别:

  管道需要在内核和用户空间进行四次的数据拷贝:由用户空间的buf中将数据拷贝到内核中 -> 内核将数据拷贝到内存中 -> 内存到内核 -> 内核到用户空间的buf。而共享内存则只拷贝两次数据:用户空间到内存 -> 内存到用户空间。

  管道用循环队列实现,连续传送数据可以不限大小。共享内存每次传递数据大小是固定的;

  共享内存可以随机访问被映射文件的任意位置,管道只能顺序读写;

  管道可以独立完成数据的传递和通知机制,共享内存需要借助其他通讯方式进行消息传递。

  也就是说,两者之间最大的区别就是:

  管道是Linux由Unix那里继承过来的进程间的通信机制,它是Unix早期的一个重要通信机制。其思想是,在内存中创建一个共享文件,从而使通信双方利用这个共享文件来传递信息。由于这种方式具有单向传递数据的特点,所以这个作为传递消息的共享文件就叫做“管道”。

  在管道的具体实现中,根据通信所使用的的文件是否具有名称,有“匿名管道”和“命名管道”。

  管道与共享内存的区别

  乍一看,感觉管道和共享内存并不是区别很大,这里介绍一下两者之间的区别:

  管道需要在内核和用户空间进行四次的数据拷贝:由用户空间的buf中将数据拷贝到内核中 -> 内核将数据拷贝到内存中 -> 内存到内核 -> 内核到用户空间的buf。而共享内存则只拷贝两次数据:用户空间到内存 -> 内存到用户空间。

  管道用循环队列实现,连续传送数据可以不限大小。共享内存每次传递数据大小是固定的;

  共享内存可以随机访问被映射文件的任意位置,管道只能顺序读写;

  管道可以独立完成数据的传递和通知机制,共享内存需要借助其他通讯方式进行消息传递。

  也就是说,两者之间最大的区别就是: 共享内存区是最快的可用IPC形式,一旦这样的内存区映射到共享它的进程的地址空间,这些进程间数据的传递,就不再通过执行任何进入内核的系统调用来传递彼此的数据,节省了时间。

标签:文件,用户,管道,内存,Linux,共享内存,内核
From: https://blog.51cto.com/u_14661964/5990033

相关文章

  • 在Linux下adb连接不上android手机的终极解决方案
    1、做android开发的过程,碰到了Linux下adb识别不了android设备的问题,刚开始在网上google下,发现都是针对ubuntu下的一些说明:如google提供的方法:​​http://developer.android.......
  • linux —— shell 编程(文本处理)
    1、基本文本处理sort :用于排序,常用参数-t指定一行的分隔符-k指定具体排序的规则-d按字典序排列 -f忽略大小写 -u(unique)丢弃相同指定字段的记录unique......
  • Linuxshell字符
    Shell字符串字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。单引号str='thisisast......
  • 《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第三章 Linux C编程入门​
    LinuxC编程入门​在Windows下我们可以使用各种各样的IDE进行编程,比如强大的VisualStudio。但是在Ubuntu下如何进行编程呢?Ubuntu下也有一些可以进行编程的工具,但是大多都只......
  • 自学Linux,你需要get哪些点?
    近些年来,Linux操作系统越来越受欢迎,它的开源、免费是亮点也是优点,并且稳定性和安全性也得到认可,还有Linux有很多版本供大家选择,可以定制化。据我所知,现在很多公司的开发项目......
  • Linux LVM 磁盘扩容
    LVM的基本概念物理卷physicalVolume(PV):可以在上面建立组卷的媒介,可以是硬盘分区,也可以是硬盘本身或者回环文件(loopbackfile)。物理卷包括一个特殊的header,其余部分被切割为......
  • Linux 安装seata
    目的:seata是搭配nacos使用nacos配置了seata的命名空间:490f2023-5fvf-30cc-b1cd-e0f0363f0aa61、下载seata包地址:https://github.com/search?q=seata&type=本次安装版本......
  • Linux目录结构、查看目录命令
    ###一、Linux目录结构​      设计哲学:​            一切皆文件!!!!!```​      /   根目录​            /root​......
  • linux 中sed命令将指定列替换为特定的内容
     001、[root@pc1test]#lsa.txt[root@pc1test]#cata.txtdiy5fersd34d83fdgdgxej7[root@pc1test]......
  • c_header: system()(linux; <stdlib.h>)
    c_header: system()(linux;<stdlib.h>)    一、源码 1[root@rockyc]#catstdlib_header.c2#include<stdio.h>3#include<stdlib.h>4#include......