日期:2014-05-16  浏览次数:20585 次

内核,标准I/O库,缓冲,他们是什么关系?
apue英文版第二版p135,第五章第四节Buffering 这一节:

Whenever input is requested through the standard I/O library from either (a)
 an unbuffered stream or (b) a line-buffered stream (that requires data to b
e requested from the kernel), all line-buffered output streams are flushed.
The reason for the qualifier on (b) is that the requested data may already b
e in the buffer, which doesn't require data to be read from the kernel. Obvi
ously, any input from an unbuffered stream, item (a), requires data to be ob
tained from the kernel.

1.什么叫从内核中请求数据(require data to be read from the kernel)?
2.在带缓冲的流中,标准输入函数将数据放到缓冲区中,等到一定条件后,用read()把缓冲区中的数据读到哪里去?内核中还是程序中?
3.一个带缓冲的输入流,数据输入到缓冲区,缓冲区满后,要调用read()真正地把缓冲区的数据写到程序中去,是这样吗?
是不是这个过程:标准输入函数->从标准输入流读数据到buffer-->buffer满了,系统调用read()?

不好意思,这些真的是看不明白,老大帮忙

------解决方案--------------------
1.什么叫从内核中请求数据(require data to be read from the kernel)? 
当一个磁盘的块被调入内存时(读入后或等待写出时),它要存储一个缓存区,每个缓冲对应一个块,即块在内存中表示。

2.在带缓冲的流中,标准输入函数将数据放到缓冲区中,等到一定条件后,用read()把缓冲区中的数据读到哪里去?内核中还是程序中? 
内存中(linux/buffer_head.h的struct buffer_head结构中),应该是程序栈中(也是内存)

3.一个带缓冲的输入流,数据输入到缓冲区,缓冲区满后,要调用read()真正地把缓冲区的数据写到程序中去,是这样吗?
是不是这个过程:标准输入函数- >从标准输入流读数据到buffer-- >buffer满了,系统调用read()? 
2.6内核中一般用 aio/0 aio/1 两个内核进程处理这些事情。
如果buffer满了,还有就是写到磁盘中去
------解决方案--------------------
1. 真正实现输入/输出的系统调用是在kernel space, 用read/write调用实现与缓冲区的交互, 而真正的缓冲区是在kernel space中的.
2. 这里的缓冲应该指的就是kernel space中的缓冲, 同时它也是内存中的, 由kernel管理.
3. read只是从缓存的数组中取数据, 真正到kernel space的缓冲中取数据的由内核系统调用实现.
------解决方案--------------------
流缓冲区是有内核管理的,是在内核空间,一般是用户程序和设备驱动程序的中转站,只为了提高效率而设置的.