免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234
最近访问板块 发新帖
楼主: chenzhanyiczy
打印 上一主题 下一主题

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

论坛徽章:
0
31 [报告]
发表于 2010-03-03 17:16 |只看该作者
现在的问题就在于 page cache和进程的关系。
如果page cache就是进程内核态缓存,那当进程退出的时候,操作 ...
chenzhanyiczy 发表于 2010-03-01 11:53


page cache如果你指的是linux中的话,它是内核态的东西,和用户态无关。
并且,page cahce并非和进程绑定,它是和文件绑定的。一个进程退出,它读写过的文件的page cache并不会立刻被释放,内核会选择在适当时机回收page cache占用的内存。在实践中你可以发现,Linux是尽可能使用内存的策略(比如scp一个巨大的文件)。
进程在读写一个文件时,在没使用direct I/O的情况下(即open时没指定O_DIRECT标志),都是先读/写到文件的page cache中,page cache是一个红黑树结构,动态增长的。
宏观的了解page cache最快的方法是阅读ULK第15章

论坛徽章:
0
32 [报告]
发表于 2010-03-04 09:41 |只看该作者
5. 读文件机制:
fread()->read()->读super block(当该文件inode不在内存中时)到磁盘缓冲hash->根据inode读取到磁盘上的块->返回给用户
大致如下:(献丑!)
 ---------------------------
|user prog                  |<-
 ---------------------------   |
       |req                    |
       v                       |data buffer
 --------------------------- --
|user lib                   |<-
 ---------------------------  |
       |req                   |
       v                      |
 ---------------------------  |data buffer
|system call/read()         |-
 --------------------------- <-
       |req                    |
       v                       |
 ---------------------------   |
|file system/iget()...      |  |
 ---------------------------   |
       |req                    |
       v                       |data buffer
 --------------------------- --
|logical driver/dev->read() |<-
 ---------------------------   |
       |req                    |
       v                       |data
 ---------------------------   |
|hardware/physic driver     |--
 ---------------------------

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
33 [报告]
发表于 2010-03-08 18:16 |只看该作者
不好意思,最近太忙了,哎,搞得没时间逛cu

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
34 [报告]
发表于 2010-03-08 18:19 |只看该作者
没有那个所谓的进程内核态缓存,read系统调用会直接把数据copy到库缓存(用户态缓存)中。
drowndog 发表于 2010-03-03 15:27



明白了

再问一下:
再aix下,内存分为非计算型和计算型,这个 非计算型 是不是就是这个page cache?

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
35 [报告]
发表于 2010-03-08 18:24 |只看该作者
page cache如果你指的是linux中的话,它是内核态的东西,和用户态无关。
并且,page cahce并非和进程绑 ...
zx_wing 发表于 2010-03-03 17:16



struct *page  结构是用来描述物理内存(即每个page frame)的,那么os是如何通过这个stauct *page去取得这个page frame里面的内容呢?

论坛徽章:
0
36 [报告]
发表于 2010-03-08 19:08 |只看该作者
struct *page  结构是用来描述物理内存(即每个page frame)的,那么os是如何通过这个stauct *page去取 ...
chenzhanyiczy 发表于 2010-03-08 18:24



    忍不住插一句,内核态你可以认为是不分进程空间的,所有进程共用一个内核地址空间,即使是像task_struct这样似有的东西,在内核态也可以随意被其他进程访问修改。因此即使这个进程结束了,page cache依然可以被os保留给其他进程使用。

    page里面不是有个virtual成员么,对于非高端内存来说那就是它对应的虚拟地址。对于高端内存则必须先调用kmap将其映射到高端内存才能访问。
    如果想获得page的物理地址,可以用宏page_to_phys,这个不分高端内存。

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
37 [报告]
发表于 2010-03-08 23:16 |只看该作者
忍不住插一句,内核态你可以认为是不分进程空间的,所有进程共用一个内核地址空间,即使是像task ...
peimichael 发表于 2010-03-08 19:08



谢谢!

对于转换成物理地址,用户态的虚拟地址和内核态的虚拟地址转换方式是不一样的吗?

论坛徽章:
0
38 [报告]
发表于 2010-03-09 08:33 |只看该作者
没有那个所谓的进程内核态缓存,read系统调用会直接把数据copy到库缓存(用户态缓存)中。
drowndog 发表于 2010-03-03 15:27



   
O_DIRECT方式打开文件时候是这样。
其余不是。

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
39 [报告]
发表于 2010-03-09 11:09 |只看该作者
O_DIRECT方式打开文件时候是这样。
其余不是。
思一克 发表于 2010-03-09 08:33


不对吧
O_DIRECT方式的话,read是绕过page cahce 层的
其余的应该都是经过page cache层的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP