管道的实现机制
来源:互联网 发布:淘宝卖家如何看购物车 编辑:程序博客网 时间:2024/05/18 00:13
在Linux中,管道是一种使用非常频繁的通信机制。从本质上说,管道也是一种文件,但它又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题,具体表现为:
<!--[if !supportLists]-->· <!--[endif]-->读取进程也可能工作得比写进程快。当所有当前进程数据已被读取时,管道变空。当这种情况发生时,一个随后的read()调用将默认地被阻塞,等待某些数据被写入,这解决了read()调用返回文件结束的问题。
1. 管道的结构
图7.1中有两个 file 数据结构,但它们定义文件操作例程地址是不同的,其中一个是向管道中写入数据的例程地址,而另一个是从管道中读出数据的例程地址。这样,用户程序的系统调用仍然是通常的文件操作,而内核却利用这种抽象机制实现了管道这一特殊操作。
管道实现的源代码在fs/pipe.c中,在pipe.c中有很多函数,其中有两个函数比较重要,即管道读函数pipe_read()和管道写函数pipe_wrtie()。管道写函数通过将字节复制到 VFS 索引节点指向的物理内存而写入数据,而管道读函数则通过复制物理内存中的字节而读出数据。当然,内核必须利用一定的机制同步对管道的访问,为此,内核使用了锁、等待队列和信号。
·内存没有被读程序锁定。
如果同时满足上述条件,写入函数首先锁定内存,然后从写进程的地址空间中复制数据到内存。否则,写入进程就休眠在 VFS 索引节点的等待队列中,接下来,内核将调用调度程序,而调度程序会选择其他进程运行。写入进程实际处于可中断的等待状态,当内存中有足够的空间可以容纳写入数据,或内存被解锁时,读取进程会唤醒写入进程,这时,写入进程将接收到信号。当数据写入内存之后,内存被解锁,而所有休眠在索引节点的读取进程会被唤醒。
因为管道的实现涉及很多文件的操作,因此,当读者学完有关文件系统的内容后来读pipe.c中的代码,你会觉得并不难理解。
- 管道的实现机制
- 管道的实现机制
- Linux管道的实现机制
- Linux管道的实现机制
- Linux管道的实现机制
- Linux管道的实现机制
- Linux管道的实现机制
- Linux管道的实现机制
- Linux下的管道pipe----管道容量和实现机制
- 7.1.1 Linux管道的实现机制
- Linux下管道的实现机制
- Linux管道实现机制
- 深入分析Linux内核源码-Linux管道的实现机制
- linux下管道的容量以及实现机制
- linux下管道的容量以及实现机制
- Linux下的管道容量及其实现机制
- Linux下的管道容量及其实现机制
- 进程间通信-创建管道实现机制
- 金山开放日小记
- 五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)
- table行列拖动代码
- mysql 简单备份
- Eclipse启动时在Android SDK Content Loader卡住的解决方案
- 管道的实现机制
- 快排c++实现
- 单链表的环的入口点一个小证明
- vim、gvim在windows下中文乱码的终极解决方案
- 程序员能力矩阵
- 手工释放linux内存——/proc/sys/vm/drop_caches
- Win7下Eclipse中文字体太小
- 1047. Super Snooker (计算)
- Java类成员的四种访问权限