东北大学秦皇岛分校计工学院。
linux的内核分析。
课程设计题目:linux的管道实现机制的分析。
设计任务:管道是linux的一种重要的进程间通信机制,通过对linux的内核分析,说明linux用于实现管道的主要数据结构,以及管道的创建、撤销、读写操作的过程和实现方法。
一、linux管道的实现机制。
在linux中,管道是一种使用非常频繁的通信机制。从本质上说,管道也是一种文件,但它又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题,具体表现为:
1、限制管道的大小。实际上,管道是一个固定大小的缓冲区。在linux中,该缓冲区的大小为1页,即4k字节,使得它的大小不象文件那样不加检验地增长。
使用单个固定缓冲区也会带来问题,比如在写管道时可能变满,当这种情况发生时,随后对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写。
2、读取进程也可能工作得比写进程快。当所有当前进程数据已被读取时,管道变空。当这种情况发生时,一个随后的read()调用将默认地被阻塞,等待某些数据被写入,这解决了read()调用返回文件结束的问题。
注意:从管道读数据是一次性操作,数据一旦被读,它就从管道中被抛弃,释放空间以便写更多的数据。
二、管道的主要数据结构。
在linux中,管道的实现并没有使用专门的数据结构,而是借助了文件系统的file结构和vfs的索引节点inode。通过将两个file结构指向同一个临时的vfs索引节点,而这个vfs索引节点又指向一个物理页面而实现的。如图所示。
图中有两个file数据结构,但它们定义文件操作例程地址是不同的,其中一个是向管道中写入数据的例程地址,而另一个是从管道中读出数据的例程地址。这样,用户程序的系统调用仍然是通常的文件操作,而内核却利用这种抽象机制实现了管道这一特殊操作。
数据结构**:
/inode结点信息结构。
structinode ;
char * arg2
//父进程。
pipe(pipefds); 开始创建管道的2段。
if(!(child_b = fork())
close(pipefds[0]);close read*/
if(!(child_c = fork())
close(pipefds[1]);
wait4(child_b, null, 0, null);
return 0;
四、管道的撤销。
一旦进程结束,与管道有关的资源将被自动释放。尽管如此,为了养成一种良好的编程习惯,最好利用close调用来关闭管道的描述符,如下所示:
ret=pipe(mypipe);
close(mypipe[0]);
close(mypipe[1]);
如果管道的写入端关闭,但是还有进程尝试从管道读取的话,将被返回0,用来指出管道已不可用,并且应当关闭它。如果管道的读出端关闭,但是还有进程尝试向管道写入的话,试图写入的进程将收到一个sigpipe信号,至于信号的具体处理则要视其信号处理程序而定了。
五、管道的读写操作。
管道的读操作。
管道两端可分别用描述字fd[0]以及fd[1]来描述,需要注意的是,管道的两端是固定了任务的。即一端只能用于读,由描述字fd[0]表示,称其为管道读端;另一端则只能用于写,由描述字fd[1]来表示,称其为管道写端。如果试图从管道写端读取数据,或者向管道读端写入数据都将导致错误发生。
一般文件的i/o函数都可以用于管道,如close、read、write等等。
从管道中读取数据:如果管道的写端不存在,则认为已经读到了数据的末尾,读函数返回的读出字节数为0;当管道的写端存在时,如果请求的字节数目大于pipe_buf,则返回管道中现有的数据字节数,如果请求的字节数目不大于pipe_buf,则返回管道中现有数据字节数(此时,管道中数据量小于请求的数据量);或者返回请求的字节数(此时,管道中数据量不小于请求的数据量)。管道写端关闭后,写入的数据将一直存在,直到读出为止。
管道的写操作。
向管道中写入数据:向管道中写入数据时,linux将不保证写入的原子性,管道缓冲区一有空闲区域,写进程就会试图向管道写入数据。如果读进程不读走管道缓冲区中的数据,那么写操作将一直阻塞。
只有在管道的读端存在时,向管道中写入数据才有意义。否则,向管道中写入数据的进程将收到内核传来的sifpipe信号,应用程序可以处理该信号,也可以忽略(默认动作则是应用程序终止)。对管道的写规则的验证1:
写端对读端存在的依赖性。
在向管道写入数据时,至少应该存在某一个进程,其中管道读端没有被关闭,否则就会出现错误(管道断裂,进程收到了sigpipe信号,默认动作是进程终止)对管道的写规则的验证。
六、课程设计体会与感受。
操作系统课程设计
课程设计 河北大学工商学院。装。订。线。操作系统课程设计。题目 操作系统课程设计 学院工商学院 学部信息科学与工程 专 操作系统课程设计。题目 操作系统课程设计 学院工商学院 学部信息科学与工程 专业计算机类 学号 姓名。指导教师。年 6 月 24 日。设备管理 2 2.1设计任务2 2.2设计要求...
操作系统课程设计
银行家算法模拟。系别 班级 组员 银行家算法模拟。1.课程设计目的。通过本次课程设计,加深对最经典的避免死锁的银行家算法的理解,掌握死锁形成必要条件 安全状态等概念的理解,通过用c语言编程模拟该算法,并在windows平台上实现,更好地掌握操作系统的原理及实现方法。2.任务及要求。设n为系统进程的个...
操作系统课程设计
学生实习实训报告。实习类型 操作系统课程设计 学号 0901110005 学生姓名 田兴杰 指导教师 曹春梅 专业班级 信息安全技术0901班 院 部 电子信息系 2011年 1 月 7日。实习实训成绩评定表。目录。目录3 摘要4关键字4 1.1虚拟机简介5 1.1.1 一般意义的虚拟机5 1.1....