Linux管道的实现机制
之前学习管道的时候,遇到一个问题,就是linux下的管道到底是如何实现的。
在 Linux 中,管道的实现并没有使用专门的数据结构,而是借助了文件系统的file结构和VFS的索引节点inode。通过将两个 file 结构指向同一个临时的 VFS 索引节点,而这个 VFS 索引节点又指向一个物理页面而实现的。
当然 这和网上大部分解释一样,并不能令人满意。
深入理解linux内核 P786 中有很好的解释
一下是我自己的理解,不清楚的 请查看上面的书籍。
管道创建 撤销
1.get_pipe_inode() 为pipefs中的管道 分配索引节点,并初始化
2.为 读/写通道 分配一个文件对象和文件描述符 并设置对应的读写权限
3.把两个文件对象和索引节点连在一起
4.两个文件 描述符返回给用户态进程
撤销
1.用户态进程对和管道相关的一个文件描述符调用close()系统调用,引用计数-1
2.当计数为0 ,调用release()方法 ,释放 管道缓冲页框
2.管道的读写
pipe_read()
1.获取索引节点的i_sem信号量 //我要读了
2.判断缓冲区 是否 空 ,或阻塞 //空不空啊?
阻塞: a .调用prepare_wait() 把当前进程(cur)加到等待队列
b.释放索引节信号量
c.调用 schedule()
d.cur一旦被唤醒,从等待队列中删除 。拷贝所有请求字节 //读
3.释放索引节点的i_sem信号量 //我读完了
4.唤醒管道中所有的写者进程 //你来写吧
5.返回 已经拷贝的字节数目 //读了这么多
pipe_write()
1.获取索引节点的i_sem信号量 //我要写了
2.检查是否至少有一个读进程, //有没有人正在读啊
如果不是,向当前进程发送 SIGPIPE信号,释放i_sem信号量 ,并返回-EPIPE
3.判断是否有足够的写空间, //满不满啊?
是,则向缓冲区 拷贝数据。如果不是非阻塞,释放索引节点并返回—EAGAIN; 如果不是且阻塞, 将当前写操作放入等待队列,释放信号量 ,调用schedule(),一旦被唤醒,返回 3 操作。
4.写入 所有请求的字节 //不满就写
5.释放索引节点信号量 //我写完了
6.唤醒所有等待队列的读进程 //快来读吧
7.返回写入的字节数目(如果没有写入 则返回错误码) //写了这么多
Linux管道的实现机制相关推荐
- linux 管道--转
linux 管道 管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别. ...
- Linux管道初步了解
inux 管道 管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别. 有 ...
- linux中管道的概念,浅谈Linux管道
管道(pipe)是一个我们在学习Linux命令行的时候就会引入的一个很重要的概念.管道是UNIX环境中历史最悠久的进程间通信方式,从本质上说,管道也是一种文件,也是遵循UNIX的"一切皆文件 ...
- linux——管道详解
管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别.有名管道叫named ...
- Linux入门-7 Linux管道、重定向以及文本处理
Linux管道.重定向以及文本处理 1 Linux多命令协作:管道及重定向 管道和重定向 2 Linux命令行文本处理工具 文件浏览 基于关键字搜索-grep 基于列处理文本-cut 文本统计-wc ...
- 2017-2018-1 20155222 《信息安全系统设计基础》第10周 Linux下的IPC机制
2017-2018-1 20155222 <信息安全系统设计基础>第10周 Linux下的IPC机制 IPC机制 在linux下的多个进程间的通信机制叫做IPC(Inter-Process ...
- linux 信号没有被处理方法,[计算机]Linux 信号signal处理机制.doc
[计算机]Linux 信号signal处理机制 Linux 信号signal处理机制 信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使 ...
- Linux管道到底能有多快?
[CSDN 编者按]本文作者通过一个示例程序,演示了通过Linux管道读写数据的性能优化过程,使吞吐量从最初的 3.5GiB/s,提高到最终的 65GiB/s.即便只是一个小例子,可它涉及的知识点却不 ...
- linux 进程通信机制,LINUX内核进程高效通信机制研究
摘要:进程间的通信是多任务.多用户操作系统必须考虑的重大问题,Linux继承了Unix的基本设计思想,其安全性和稳定性得到了人们的认可,但随着其应用领域的不断拓展,其通信机制已经不能满足用户的需求.本 ...
最新文章
- 2021年大数据Kafka(一):❤️消息队列和Kafka的基本介绍❤️
- libusb中的热插拔使用举例
- mongodb 安装包_MongoDB快速入门,掌握这些刚刚好!
- linux 查找文件_LINUX常用命令全集
- Sklearn 与 TensorFlow 机器学习实用指南(补档)
- 百度08年网页搜索份额73.2% 创历史新高
- AC+AP组网和MESH组网介绍和区别
- 最大生成树算法matlab,基于最大生成树的社团划分算法
- 漫威电影宇宙观影指南,口碑票房最佳都是谁
- 2021-07-30-DJ-005 Django模型的数据批量加载
- 未能联接game center服务器,game center连接不成功怎么办 有哪些修复步骤 - 驱动管家...
- Openstack rocky 部署四: neutron 部署与验证(控制节点)
- 读懂trace file (tkprof格式化) 6
- 漏洞复现 - - - Springboot未授权访问
- Frameworks Brightness
- European Journal of Operational Research 2023年第307卷第1期论文目录
- mysql5.7改登录密码_MYSQL 5.7 修改密码、登录问题
- python做k线图_python做k线图(15分钟k线的意义)
- 反色(顺序)C C++
- CUHK-SYSU数据集介绍