首页 百科知识 管道的实现

管道的实现

时间:2022-10-09 百科知识 版权反馈
【摘要】:在Linux中,管道通过指向同一个临时VFS inode的两个file数据结构来实现,此VFS inode指向内存中的一个物理页面。这样就隐藏了读写管道和读写普通的文件时系统调用的差别。Linux必须同步对管道的访问,保证读者和写者以确定的步骤执行,为此需要使用锁、等待队列和信号等同步机制。图3-1给出了两个进程用管道进行通信的实例。此时,读进程将返回管道中当前所有的数据。

3.2.3 管道的实现

在Linux中,管道通过指向同一个临时VFS inode的两个file数据结构来实现(有关的内容和数据结构参见第6章),此VFS inode指向内存中的一个物理页面。这样就隐藏了读写管道和读写普通的文件时系统调用的差别。当写入进程对管道写时,字节被拷贝到共享数据页面中,当读取进程从管道中读时,字节从共享数据页面中拷贝出来。Linux必须同步对管道的访问,保证读者和写者以确定的步骤执行,为此需要使用锁、等待队列和信号等同步机制。

图3-1给出了两个进程用管道进行通信的实例。每个file数据结构指向不同的文件操作向量,一个是实现对管道的写,另一个从管道中读。

img12

图 3.1 管道进行通信实例

进程向管道写数据时,可能有以下两种情况:

(1)管道中有足够的空间存放要写的数据,此时每写一数据块后,核心便自动增加地址项的大小。写操作完成后,核心修改索引节点中的写指针,并唤醒所有因该管道空而睡眠等待的读进程。

(2)管道中无足够的空间存放要写入的数据,此时核心对该索引节点作标记后让写进程睡眠,等待数据从管道中排出。上述情况的一个例外是,当进程写的数据量大于管道的容量时,核心将尽可能多的数据写到管道中,然后使进程睡眠,直到获得更多的空间。

当进程从管道读数据时,同样会有两种情况:

(1)管道中有足够的数据供进程读。此时,进程便从读指针所指位置开始读数据,每读出一个数据块后,便增加地址项的大小。读操作结束后,核心修改索引节点中的读指针,并唤醒所有睡眠的写进程。

(2)进程要读的数据比管道中的数据多。此时,读进程将返回管道中当前所有的数据。如果管道为空,进程一般将进入睡眠,直到一个写进程将数据写入管道,再将读进程唤醒。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈