免费注册 查看新帖 |

Chinaunix

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

[内存管理] page cache问题 [复制链接]

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
11 [报告]
发表于 2012-05-25 22:46 |只看该作者
回复 10# 塑料袋

page至少会在两个地方出现:
1) 查找时用的结构,或者是2.6里的基数树,或者是以前的hash表,总之其目的为了查找
2) 页轮换时用的结构,或者是早期代码里全局的lru链,或者是较新代码里分布于每个zone的lru链


难道匿名页也用page cache?好像不用这个吧,只在每个zone的lru链表吧,那么怎么加快搜索呢?


   

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
12 [报告]
发表于 2012-05-25 22:50 |只看该作者
回复 11# embeddedlwp

我是说通常情况。  

匿名页迟早也会在swap的基数树中呀。

   

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
13 [报告]
发表于 2012-05-25 22:57 |只看该作者
回复 12# 塑料袋


也就是说在anon不swap out的时候只在lru上?
如果像file mapping那样,通过一个address_space和index就可以定位page在哪里
那a匿名页是不用page cache是因为一般不许要进行查找操作还是...
如果进行查找操作,那么顺序遍历lru? 看到最近的zone中anon已经有单独的链表了

enum lru_list {
        LRU_INACTIVE_ANON = LRU_BASE,
        LRU_ACTIVE_ANON = LRU_BASE + LRU_ACTIVE,
        LRU_INACTIVE_FILE = LRU_BASE + LRU_FILE,
        LRU_ACTIVE_FILE = LRU_BASE + LRU_FILE + LRU_ACTIVE,
        LRU_UNEVICTABLE,
        NR_LRU_LISTS
};


   

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
14 [报告]
发表于 2012-05-25 23:10 |只看该作者
embeddedlwp 发表于 2012-05-25 22:57
回复 12# 塑料袋


anon不仅在lru,而且在swap的基数树,当然最开始只在lru中,是后来才加入的swap的基数树,而且必须要加入基数树。

比如说,两进程共享一anon page,其中一个pte映射了本页,另一个的pte却是一个swap entry。 那么第二个缺进程页异常时,势必要查找swap的基数树,找到这个page;而不能随便就分配个新page,然后从swap读入,这样一个swap entry,就对应上两个page了,这是严重错误。


另外,zone内是分有名和匿名的lru链,但是其目的是为了一些没有swap分区的系统,以及页交换的优先顺序。

论坛徽章:
0
15 [报告]
发表于 2012-05-26 08:32 |只看该作者
回复 14# 塑料袋


   
比如说,两进程共享一anon page,其中一个pte映射了本页,另一个的pte却是一个swap entry。
________________________________________________________________________________


什么时候才能发生这种情况呢?一个anon被swap出去之后,映射的pte都会修改指向swap entry吧?

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
16 [报告]
发表于 2012-05-26 08:54 |只看该作者
本帖最后由 embeddedlwp 于 2012-05-26 09:02 编辑

回复 14# 塑料袋


比如说,两进程共享一anon page,其中一个pte映射了本页,另一个的pte却是一个swap entry。


是不是COW的时候?

   

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
17 [报告]
发表于 2012-05-26 12:34 |只看该作者
blake326 发表于 2012-05-26 08:32
回复 14# 塑料袋


如页被两个进程映射,页换出去后,两个进程先后发生了缺页异常。

肯定先异常的会把这个匿名页加入swap的基数树,后异常的首先要查找这个基数树,然后才能判断是否需要启动IO从swap读。

论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
18 [报告]
发表于 2012-05-26 16:37 |只看该作者
swap area 描述符里就有个叫swap_map的counter数组用来描述被换出的page被多少个进程share。

论坛徽章:
0
19 [报告]
发表于 2012-05-27 20:04 |只看该作者
内核中有类似的代码和注释,多谢指点

void generic_sync_sb_inodes(struct super_block *sb,
                                struct writeback_control *wbc)
{
        const unsigned long start = jiffies;        /* livelock avoidance */
        int sync = wbc->sync_mode == WB_SYNC_ALL;

        spin_lock(&inode_lock);
        if (!wbc->for_kupdate || list_empty(&sb->s_io))
                queue_io(sb, wbc->older_than_this);

        while (!list_empty(&sb->s_io)) {
                struct inode *inode = list_entry(sb->s_io.prev,
                                                struct inode, i_list);
                struct address_space *mapping = inode->i_mapping;
                struct backing_dev_info *bdi = mapping->backing_dev_info;
                long pages_skipped;

                if (!bdi_cap_writeback_dirty(bdi)) {
                        redirty_tail(inode);
                        if (sb_is_blkdev_sb(sb)) {
                                /*
                                 * Dirty memory-backed blockdev: the ramdisk
                                 * driver does this.  Skip just this inode
                                 */
                                continue;
                        }
                        /*
                         * Dirty memory-backed inode against a filesystem other
                         * than the kernel-internal bdev filesystem.  Skip the
                         * entire superblock.
                         */
                        break;
                }

                if (inode->i_state & I_NEW) {
                        requeue_io(inode);
                        continue;
                }

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
20 [报告]
发表于 2012-05-27 20:32 |只看该作者
回复 19# 25641463

#ifdef CONFIG_BLOCK
extern struct super_block *blockdev_superblock;
extern void __init bdev_cache_init(void);

static inline int sb_is_blkdev_sb(struct super_block *sb)
{
        return sb == blockdev_superblock;
}

#else
static inline void bdev_cache_init(void)
{
}

static inline int sb_is_blkdev_sb(struct super_block *sb)
{
        return 0;
}
#endif

怎么从这个sb_is_blkdev_sb函数看出是ram disk的?
还有你列出的这个是sync inode的,那么怎么确定“会判断脏页如果所属于ramdisk是不会刷写的”


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP