Linux下的管道组织管理与容量测试

2023-05-16

管道通信方式实现:

http://blog.csdn.net/double_happiness/article/details/71685414


在学习完管道的通信方式之后,我们知道管道是用来实现进程之间的相互通信的机制,接下来为了更深一步的学习管道的底层实现,我们需要知道Linux下管道是如何进行组织和管理的,同时管道容量也是必须知晓的一个重要参数,该参数可以在我们使用管道进行通信时,知道应该传送的数据量,下面就展开来探讨这两个问题。


Linux下的管道组织管理方式


管道的内部实现机制:


在Linux中,管道的实现主要是借助文件系统file_struct结构体和VFS的索引节点iNode。通过将两个file结构体指针指向同一个临时的VFS索引节点,而VFS直线一个物理的存储页。


图示:



如果在匿名管道的下,这两个结构体一般是一个父进程和一个子进程,父子进程通过指向同一个管道来实现彼此的数据通信,对于同名管道,两个结构体则没有任何的关系,彼此之间也是相互独立的,一个进程用于向管道中写数据,而另外一个进程用于从管道中读数据。


//管道信息结构
struct pipe_inode_info {
    wait_queue_head_t wait;	 //管道等待队列
    unsigned int nrbufs, curbuf; 
    //包含待读数据的缓冲区数和包含待读数据的第一个缓冲区的索引
    struct pipe_buffer bufs[PIPE_BUFFERS]; 	//管道缓冲区描述符数组
    struct page *tmp_page; 	//高速缓存区页框指针
    unsigned int start;  	//当前管道缓存区读的位置
    unsigned int readers; 	//读进程的标志,或编号
    unsigned int writers; 	//写进程的标志,或编号
    unsigned int waiting_writers; 	//在等待队列中睡眠的写进程的个数
    unsigned int r_counter; 	//与readers类似,但当等待写入FIFO的进程是使用
    unsigned int w_counter; 	//与writers类似,但当等待写入FIFO的进程时使用
    struct fasync_struct *fasync_readers; 	//用于通过信号进行的异步I/O通知
    struct fasync_struct *fasync_writers; 	//用于通过信号的异步I/O通知
};

如何查看当前系统下的管道容量


使用ulimit -a,可以查看到pipe size的大小




当我们不断的向管道中写数据,当管道被写满时写进程就会进入等待状态,此时就可以测试出当前机器下管道的容量


代码实现:




运行结果:



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux下的管道组织管理与容量测试 的相关文章

  • Apache LOG:子进程 pid xxxx 退出信号分段错误 (11)

    Apache PHP Mysql Linux 注意 子进程 pid 23145 退出信号分段错误 11 tmp 中可能存在 coredump 但 tmp下没有找到任何东西 我怎样才能找到错误 PHP 代码中函数的无限循环导致了此错误
  • 从哪里获取 iostream.h

    我正在尝试在 Linux 中做一些事情 但它抱怨找不到 iostream h 我需要安装什么才能获取此文件 这个标准头的正确名称是iostream没有扩展名 如果您的编译器仍然找不到它 请尝试以下操作 find usr include na
  • Java时区混乱

    我正在运行 Tomcat 应用程序 并且需要显示一些时间值 不幸的是 时间快到了 还有一个小时的休息时间 我调查了一下 发现我的默认时区被设置为 sun util calendar ZoneInfo id GMT 08 00 offset
  • 为什么无论 -rdynamic 如何,backtrace 都不包含 Objective-C 符号?

    Update 我正在 Linux 上使用 GNU 运行时 问题是not发生在带有 Apple 运行时的 MacOS 上 更新2 我在 MacOS 上编译了 GNU 运行时并用它构建了示例 该错误确实not发生在带有 GNU 运行时的 Mac
  • Linux下单个目录下文件过多会怎样?

    如果一个目录中有大约 1 000 000 个单独的文件 大部分大小为 100k 其中没有其他目录和文件 是否会以任何其他可能的方式降低效率或产生缺点 ARG MAX 会对此提出异议 例如 rm rf 在目录中时 会说 参数太多 想要执行某种
  • 当在 python linux 中执行命令 os.system() 时,在 python 中给出响应 yes/no

    考虑一个像这样的命令 yum install boto 当我在终端中执行时 要继续 会询问我是 否 我可以像这样用 python 回应它吗 os system yum install boto Next Yes 将通过相同的 python
  • 有没有办法提高linux管道的性能?

    我正在尝试使用 64 位将超高速数据从一个应用程序传输到另一个应用程序CentOS http en wikipedia org wiki CentOS6 我使用以下方法进行了基准测试dd发现阻碍我的是管道而不是程序中的算法 我的目标是达到
  • 通过名称获取进程ID

    我想在 Linux 下获得一个给定其名称的进程 ID 有没有一种简单的方法可以做到这一点 我还没有在 C 上找到任何可以轻松使用的东西 如果追求 易于使用 char buf 512 FILE cmd pipe popen pidof s p
  • GCC 详细模式输出解释

    我是 Linux 新手 谁能向我解释一下我的 hello world 程序的以下详细模式输出 另外 这些文件是做什么用的crt1 o crti o crtend o crtbegin o and crtn o and lc and lgcc
  • 使用 .htaccess 启用 PHP 短标签

    我在自己的 Centos 服务器上设置了 Apache 并具有多个虚拟 Web 服务器 并且我希望仅为位于以下位置的其中一个 Web 服务器启用 PHP 短标记 var www ostickets html 我可以通过添加成功启用短标签sh
  • 重新链接匿名(未链接但打开)文件

    在 Unix 中 可以创建匿名文件的句柄 例如 使用 creat 创建并打开它 然后使用 unlink 删除目录链接 留下一个带有 inode 和存储的文件 但没有可能的方法重新打开它 此类文件通常用作临时文件 通常这就是 tmpfile
  • sudo pip install python-Levenshtein 失败,错误代码 1

    我正在尝试在 Linux 上安装 python Levenshtein 库 但每当我尝试通过以下方式安装它时 sudo pip install python Levenshtein 我收到此错误 命令 usr bin python c 导入
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • php56 - CentOS - Remi 仓库

    我刚刚在测试盒上安装了 php 5 6 正常的 cli php 解释器似乎不存在 gt php v bash php command not found gt php56 v PHP 5 6 13 cli built Sep 3 2015
  • 路由是否会影响具有绑定源地址的套接字?

    假设我有两个网络接口 eth0有地址10 0 0 1 eth1有地址192 168 0 1 Using route or ip route add我已将其设置为路由 所有地址至eth0 1 2 3 4只为了eth1 所以数据包到1 2 3
  • 在Linux中将日期附加到文件名

    我想在文件名旁边添加日期 somefile txt 例如 somefile 25 11 2009 txt 或 somefile 25Nov2009 txt 或任何类似的内容 也许脚本或终端窗口中的某些命令可以执行 我正在使用Linux Ub
  • 为什么“script”命令会生成 ^[ 和 ^M 字符以及如何使用 vim 搜索和替换删除它们?

    在linux上 使用bash shell 当我使用script命令时 生成的文件称为typescript 当我用 vim 打开该文件时 每一行都包含 M字符 并且有几行 由于我的彩色命令提示符 包含一个字符 我想用任何东西替换这些字符 从而
  • bash "&" 不打印 "[1]+ Done "

    我在 bashrc 中调用一个脚本来打印打开终端时收到的新消息数 我希望该调用在访问网络时是非阻塞的 有时需要几秒钟 这意味着我无法使用终端直到完成 但是如果我输入 mailcheck 在我的 bashrc 中 它工作正常 但然后打印一个空
  • 如何获取 bash 中从 Ping 接收到的数据包的百分比?

    当 ping 主机时 我希望输出仅显示收到的数据包 已发送 5 个 的百分比 我想我需要使用grep不知怎的 但我不知道如何 我是 bash 编程的新手 这是我所在的地方 ping c 5 q host grep grep 中应该包含什么
  • 为什么 proc/ID/maps 有多个共享库条目

    我正在查看嵌入式Linux下的proc ID maps 我注意到一些共享库在进程的内存映射中出现了几次 为什么会这样呢 40094000 400d9000 r xp 00000000 b3 09 723 system lib libc so

随机推荐

  • atexit函数总结

    函数名 xff1a atexit 头文件 xff1a include lt stdlib h gt 函数原型 xff1a int atexit void func void 功能 xff1a 当程序终止执行时 xff0c 函数调用函数指针f
  • 递归问题的处理

    经典问题集锦 xff1a 1 猴子吃桃问题 2 小球落地问题 猴子吃桃问题描述 xff1a 从前有一群群猴从果园里采来了许多桃子 xff0c 第一天吃掉采来桃子的一半之后 xff0c 猴王又多吃了了一个 xff0c 第二天吃掉了剩下的一半之
  • 编程实现求一个整数的二进制中0和1的个数

    声明 xff1a 假定该数是在32位平台的机器上运行 xff0c 在更高或最低平台上的原理相同 核心最优算法 xff1a 求1的个数 xff1a num amp 61 num 43 1 求0的个数 xff1a num 61 num 43 1
  • C语言if语句中的零值比较

    目录 xff1a 布尔变量与零值比较 整型变量与零值比较 浮点变量与零值比较 指针变量与零值比较 布尔变量与零值比较 规则 xff1a 不可将布尔值直接与0 1或者true false比较 代码示例 xff1a span style fon
  • vs下的debug和release版本的区别

    vs下的版本分类 xff1a Debug版本 通常称为调试版本 xff0c 通过编译选项的配合 xff0c 编译的结果通常包含调试信息 xff0c 可以设置断点 单步调试 使用TRACE ASSERT等调试输出语句并且编译器不会对代码进行任
  • 二进制文件与文本文件的区别

    文本文件和二进制文件的定义 xff1a 计算机在物理内存上面存放的都是二进制 xff0c 所以文本文件和二进制文件的 主要 区别是在逻辑上 的而不是物理上的 而从文件的编码方式来看 xff0c 文件可以分为文本文件和二进制文件 文本文件是基
  • 浅析FILE和fd之间的关系

    背景知识 fd 文件描述符 FILE 文件指针 文件描述符fd fd只是一个整数 xff0c 在open时产生 起到一个索引的作用 xff0c 进程通过PCB中的文件描述符表找到该fd所指向的文件指针file 因此在Linux系统下面 xf
  • 面向过程与面向对象的区别与联系

    处理问题方面 面向过程 xff1a 分析解决问题所需要的步骤 xff0c 通过分别去实现对应的函数来完成每一个步骤 xff0c 使用的时候一次去调用对应的函数即可 xff1b 面向对象 xff1a 面向对象的是把所处理的问题先抽象起来 xf
  • fork与vfork创建进程的区别

    进程创建的方式 xff1a 1 fork函数 2 vfork函数 fork函数 头文件 xff1a include lt unistd h gt 函数原型 xff1a pid t fork void 返回值 xff1a 创建成功子进程返回0
  • Linux下的各种id

    分类 用户标识符 xff1a 几个典型进程的ID及其类型和功能 常见标识符的返回值 span style font size 18px include lt sys types h gt include lt unistd h gt pid
  • Ubuntu 18.04开启root账户登陆

    step 1 设置root账户密码 命令 xff1a sudo passwd root step2 修改相关配置 打开 root profile文件 xff0c 将最后一行mesg n true修改为tty s amp amp mesg n
  • 深入理解vector的拷贝构造

    腾讯面试题 xff1a 请问vector的拷贝构造干了些什么 xff1f 拿到这道题可能很多人都已经暗自里庆幸 xff0c 对于学习过过数据结构的人 xff0c 对于vector这个结构体一定不会陌生 xff0c 但是如果在面试的过程中面试
  • 深入理解C++强制类型转换

    C 43 43 四种强制转换类型 static cast reinterpret cast const cast dynamic cast static cast 静态转换 xff0c 用于非多态类型 xff0c 任何标准的转换都可以用它
  • Linux背景设置

    桌面背景设置 对于Linux的CentOs系统 刚进入时系统默认的生成的背景如下 显然对于一些比较有艺术欣赏的人来说 xff0c 这个背景显然是很让人感到很不好受 xff0c 所以下面就来看一下如何更换桌面背景 1 单击鼠标右键 2 双击鼠
  • Linux常用工具安装和vim设置的命令实现

    声明 xff1a 本文是针对centos6 0的版本进行安装和设置的 xff0c 在现在下载的Centos版本上基本上会自带一些基本的工具 xff0c 因此在安装之前需要先进行检查 xff0c 如果不存在 xff0c 在进行下载安装 gcc
  • C实现当前机器模式是大端还是小端

    声明 xff1a 本文是在32位机器 xff0c vs2013下运行无误 大小端背景 xff1a 大小端这一词最早是来自 格列夫游记 xff0c 书中记录有一个村子 xff0c 村子里的人有一个强烈的争议 xff0c 关于吃鸡蛋的时候应该从
  • C模拟实现点分十进制IP转换

    声明 xff1a 本文在32位机器上测试无误 点分十进制 点分十进制是计算机网络中的一个名词 xff0c 是一种网络地址的表示方法 xff0c 每一组数字都是在0 255之间 xff0c 每个组之间都是通过 34 34 来进行分割的 xff
  • C面试常考知识点详解

    小结清单 xff1a 指针与引用区别与联系 指针与数组的区别与联系 结构体内存对齐 指针与引用区别与联系 联系 xff1a 底层实现方式相同 xff0c 都是按照指针的方式实现 区别 xff1a 1 引用必须初始化 xff0c 指针可以不用
  • 【通信方式一】管道

    管道引入原因 xff1a 由于各个进程之间是相互独立的 xff0c 这样虽然有助于程序内部自己的处理 xff0c 同时也避免各个进程之间相互影响 xff0c 但是有时候程序之间就是需要进行一些信息传递 xff0c 这时就需要相办法来实现这些
  • Linux下的管道组织管理与容量测试

    管道通信方式实现 xff1a http blog csdn net double happiness article details 71685414 在学习完管道的通信方式之后 xff0c 我们知道管道是用来实现进程之间的相互通信的机制