免费注册 查看新帖 |

Chinaunix

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

缓存,缓存!!! [复制链接]

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-26 17:25 |只看该作者 |倒序浏览
20可用积分
本帖最后由 chenzhanyiczy 于 2010-02-26 17:28 编辑

我的理解:

fread() -> 库缓存 -> read() -> 文件缓存 -> ... -> 设备

问题:

有几个观念一直糊涂,查了很多资料,晕了

1. fread()读到的缓存是用户态地址空间的缓存吗?
2.read()为什么需要把内核态地址空间缓存 拷贝到用户态地址空间?
3.page cache指的是内核态地址空间缓存?
4.读一个文件,除了需要内核态地址空间缓存和用户态地址空间缓存外,好像还有其他地方缓存文件数据。这些缓存放在哪里?由谁维护?
5.谁能解析一下读文件整个机制?

论坛徽章:
0
2 [报告]
发表于 2010-02-26 18:07 |只看该作者
1. fread()读到的缓存是用户态地址空间的缓存吗?

   是。共享库共享代码,数据段是各程序自己的。
2.read()为什么需要把内核态地址空间缓存 拷贝到用户态地址空间?
   减少系统调用(内核态/用户态切换)次数

3.page cache指的是内核态地址空间缓存?
     应该是。
4.读一个文件,除了需要内核态地址空间缓存和用户态地址空间缓存外,好像还有其他地方缓存文件数据。这些缓存放在哪里?由谁维护?
    设备级缓存,如硬盘中的缓存
5.谁能解析一下读文件整个机制?
   不好说。


仅供参考,欢迎指正

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
3 [报告]
发表于 2010-02-27 00:37 |只看该作者
本帖最后由 chenzhanyiczy 于 2010-02-27 00:42 编辑
1. fread()读到的缓存是用户态地址空间的缓存吗?

   是。共享库共享代码,数据段是各程序自己的。
2.r ...
jackin0627 发表于 2010-02-26 18:07



    跟我想的差不多

但找了很久没有找到权威的证明

另外:
4.读一个文件,除了需要内核态地址空间缓存和用户态地址空间缓存外,好像还有其他地方缓存文件数据。这些缓存放在哪里?由谁维护?
  设备级缓存,如硬盘中的缓存

  我认为是内存中的文件缓存,但这级缓存跟地址空间缓存怎么交互数据的?

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
4 [报告]
发表于 2010-02-28 00:35 |只看该作者
本帖最后由 chenzhanyiczy 于 2010-02-28 00:36 编辑

期待高手。。。

论坛徽章:
0
5 [报告]
发表于 2010-02-28 00:45 |只看该作者
1. fread()读到的缓存是用户态地址空间的缓存吗?


2.read()为什么需要把内核态地址空间缓存 拷贝到用户态地址空间?
因为app只能访问用户态的空间

3.page cache指的是内核态地址空间缓存?
恩,一般来说,是的。

4.读一个文件,除了需要内核态地址空间缓存和用户态地址空间缓存外,好像还有其他地方缓存文件数据。这些缓存放在哪里?由谁维护?
哪儿?谁说的?文件描述符,打开,输入/输出描述符。注意这些基本概念。

5.谁能解析一下读文件整个机制?
fread() -> 用户态缓存 -> read() -> 内核态缓存 -> ... -> 设备

论坛徽章:
0
6 [报告]
发表于 2010-02-28 08:23 |只看该作者
设备内部也有缓存。光驱、硬盘都有。

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
7 [报告]
发表于 2010-02-28 15:49 |只看该作者
多谢各位

请问一下p阿姨:

如果page cache指的是内核态地址空间缓存,那么是不是说 当一个进程退出的时候,这个page cache也就没有了?

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
8 [报告]
发表于 2010-02-28 21:37 |只看该作者

论坛徽章:
0
9 [报告]
发表于 2010-02-28 22:50 |只看该作者
多谢各位

请问一下p阿姨:

如果page cache指的是内核态地址空间缓存,那么是不是说 当一个进程退出的 ...
chenzhanyiczy 发表于 2010-02-28 15:49


多个事,请P阿姨见谅。

以AIX为例(其他的系统我不是很熟悉),如果使用fread,那么可能会涉及到的缓存有:
1. fread共享库的自己缓存的数据,在用户态。每个进程都有自己的内存段用于保存共享库的数据,这部分缓存在进程退出后即释放。
2. 文件系统缓存。由于文件系统工作在内核态,这部分缓存是在内核里面的。进程退出后,这部分缓存并不释放,而是由文件系统自己根据一定的策略进行管理。顺便说一句,在写数据时,一般来说也只是写到文件系统的缓存就返回了,然后由系统在后台把数据写到设备上。当然,使用了direct IO等选项的除外。
3. 如果使用的外部存储(磁阵),那么存储的控制器上可能有缓存。这个缓存跟进程就更加没有关系了
4. 磁盘上的缓存。这个不说了,作用不大……

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
10 [报告]
发表于 2010-02-28 23:28 |只看该作者
多个事,请P阿姨见谅。

以AIX为例(其他的系统我不是很熟悉),如果使用fread,那么可能会涉及到的缓 ...
drowndog 发表于 2010-02-28 22:50



    于一个进程为例,当读一个文件的时候,发生下面的流程:

fread -> 用户态缓存 -> read() -> 内核态缓存 -> ... -> 设备

当该进程退出,怎么还会能保存内核态缓存呢?进程都没有了,怎么还会有内核态?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP