Linux0.11笔记——进程间通信之管道机制

    Linux0.11设计了两套机制来实现进程间通信的合理要求。一套是管道机制,另一套是信号机制。今天主要讲的是管道机制,在管道机制中,每个管道允许两进程交互数据,一个进程向管道输入数据,另一个进程从管道中输出数据,如下图所示:

Linux0.11笔记——进程间通信之管道机制_第1张图片

    操作系统在内存中为每个管道开辟一页内存,给这页内存赋予了文件的属性。这一页由两个进程共享,但不会分配给任何进程,只由内核掌控。本质上,管道是一页内存。但进程要以操作文件的方式操作管道,这要求管道具备一些文件属性减少页属性。

    文件属性:创建管道相当于创建文件,管道文件是为了两个进程使用而创建的,因此需要将两进程的*filp[20]与file_table[64](在上一篇博客介绍文件系统中有提到)的两项挂接,进程想要具备操作管道文件的能力,还要建立管道文件i节点与file_table[64]的关系。系统申请一个空闲内存页面,并将该页面地址载入i节点,并将i节点引用计数设为2,一个是读进程,一个数写进程。将file_table[64]的两个空闲项都指向这个管道文件,并将第一个空闲项的文件模式设为读,第二个设为写。最后返回管道文件的两个句柄给用户进程。

    减少页属性:页内存毕竟要当个文件使用,那么要求进程不能像访问自己数据一样访问它,因此不能映射到进程的线性地址空间。再如,两个进程操作这个页,也不能产生写时复制,否则无法共享管道。

    管道文件操作:读管道执行时,若管道中有未读数据,就读取数据,若无未读数据,则读管道操作挂起,这样就不会读取垃圾数据。写管道执行时,若有剩余空间,就写入数据,没有剩余空间则挂起,这样就不会覆盖尚未读取的数据。另外,管道大小只有一个页面,所以写或读到页面尾端后,读写指针要能回滚到页面首端以便继续操作。


你可能感兴趣的:(Linux0.11笔记——进程间通信之管道机制)