免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4432 | 回复: 16
打印 上一主题 下一主题

再问缓冲区问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-09 09:21 |只看该作者 |正序浏览
在另一个版面发过帖子但是回复的不多,有人建议到这里来问问。

最近遇到了缓冲区方面的问题,请各位帮忙解决一下。
以下几个说法对吗?
1、c库函数有一个内核缓冲区,一个用户缓冲区;系统调用只有一个内核缓冲区。
2、新建一个进程,系统会自动分配一个缓冲区给它。
3、进程中各个打开的文件,每个文件描述符具有自己的缓冲区(是这样吗?还是共用进程的内核缓冲区?还是以文件为单位创建内核缓冲?)
   fd读写方式打开一个文件,(用read,write)先写后读,写是写到内核缓冲,后读读的是不是也是内核缓冲区里面的内容?还是磁盘文件里面的(仿佛此时还没刷新缓冲到磁盘)。
   fd1、fd2分别打开两个不同的文件,写fd1,紧接着读fd2,会把刚写入内核缓冲的东西读出来吗?

晕晕的,仙人请指路!

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
17 [报告]
发表于 2007-10-11 21:41 |只看该作者

回复 #16 wkathy 的帖子

good.

BTW, 所谓的结贴,就是对你的帖子总结一下,尤其是那种求助贴。说下问题解决了没有,怎么解决的,原因是什么,等等,就可以了。

论坛徽章:
0
16 [报告]
发表于 2007-10-11 21:35 |只看该作者
感谢各位朋友对我的帮助,我理一下思路,哪里不对还请指正。另外不知道帖子是否需要结贴,没找到结贴方式。

(1)对于系统调用来说:磁盘--高速缓存--内核缓冲--进程
库函数在内核缓冲&进程之间有一个用户缓冲(也就是标准I/O缓冲)
(2)当进程涉及到IO操作时,才分配内核缓冲给它
(3)对文件操作系统调用来说,read、write是与内核缓冲打交道的,一般的read、write是阻塞方式进行的。

论坛徽章:
0
15 [报告]
发表于 2007-10-11 16:57 |只看该作者
是以文件为单位建的啊,谢谢

论坛徽章:
0
14 [报告]
发表于 2007-10-11 16:56 |只看该作者

回复 #12 fantry_t 的帖子

有点明白了,      谢谢

论坛徽章:
0
13 [报告]
发表于 2007-10-10 01:23 |只看该作者

回复 #1 wkathy 的帖子

3、进程中各个打开的文件,每个文件描述符具有自己的缓冲区(是这样吗?还是共用进程的内核缓冲区?还是以文件为单位创建内核缓冲?)

是以文件为单位创建内核缓冲。
在内核里面的文件缓冲实现可参考address_space这个核心数据结构。
内核的缓冲机制保证即使你写进去的内容没有及时(系统loading 高等原因)被刷新到磁盘相应文件,
它也会从相应的缓冲区中去读数据。
所以你就不必担心内核的缓冲数据何时进行写盘操作。

[ 本帖最后由 fantry_t 于 2007-10-10 01:26 编辑 ]

论坛徽章:
0
12 [报告]
发表于 2007-10-10 01:17 |只看该作者
原帖由 wkathy 于 2007-10-9 09:21 发表
在另一个版面发过帖子但是回复的不多,有人建议到这里来问问。

最近遇到了缓冲区方面的问题,请各位帮忙解决一下。
以下几个说法对吗?
1、c库函数有一个内核缓冲区,一个用户缓冲区;系统调用只有一个内核 ...


我感觉你可以屏蔽掉内核缓冲区这个缓冲区,也许对你理解起来更容易一些。

你现在用的都是系统调用,所以glibc层的缓冲已经被你过滤了,
你用两个fd0(1)打开同一个文件时,可以说是fd0和fd1关联同一个文件去了
(不管内核如何处理我们写进去的文件内容,你就当他已经保存了你写的内容,所以你后来用另外一个fdx读的时候会获取你先前写进去的东西)。

但是如果你用glic提供的fopen之类的函数进行操作,此时就要考虑glibc层的缓冲了。
你还是用两个变量打开同一个文件,利用第一个变量写内容到文件,此时glibc先放到自己的缓冲区,可以说内核根本就不知道你给这个文件写内容了,
然后你用另外一个变量来读该文件的内容,此时估计就不能读取你先前写进去的东西了(我估计glibc还没有聪明到会让你获取正确的文件内容),
原因是你写进去的东西还驻留在glibc缓冲层,要glibc显式flush缓冲区。

具体glibc何时flush你写的东西,这跟glibc的实现机制有关,我们能做的强制flush就是fflush之类的,或者flcose。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
11 [报告]
发表于 2007-10-09 22:24 |只看该作者
原帖由 wkathy 于 2007-10-9 21:24 发表


谢谢!我曾试过看一些稍微深一点的书,但是总是看不明白怎么回事,所以在平时一遇到稍微底层一点的就糊涂了。

所以才建议"安心".

论坛徽章:
0
10 [报告]
发表于 2007-10-09 21:26 |只看该作者
建议楼主看一下内核源码下的include/linux/fs.h里关于file结构的定义,它就是文件描述符,里面有个字段是文件偏移量


谢谢!看过这个结构,但我还是没明白缓冲方面的问题。

论坛徽章:
0
9 [报告]
发表于 2007-10-09 21:24 |只看该作者
建议先安心看点书, 例如 APUE2 和 Linux Kernel Development(2nd) 就不错.


谢谢!我曾试过看一些稍微深一点的书,但是总是看不明白怎么回事,所以在平时一遇到稍微底层一点的就糊涂了。
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP