免费注册 查看新帖 |

Chinaunix

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

[内核入门] 每次看到这都晕! [复制链接]

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-06-20 13:44 |只看该作者 |倒序浏览
本帖最后由 _nosay 于 2016-06-20 14:14 编辑

1. page->mapping为NULL时,The page was only in the buffer cache,怎么理解
2. page->buffers不为NULL时,为什么会被page_launder()函数释放掉?即为什么对于page->buffers不也是转移到交换分区,而是释放(转移表示内容还在,释放就没了呀)
3. page->buffers指向一个buffer_head结构的循环链表,是指当前page存储着链表里面的每个buffer_head结构吗

Linux 2.4.0 page结构定义:
typedef struct page {
        struct list_head list;
        struct address_space *mapping;
        unsigned long index;               // mm/swapfile.c: swap_info[type]->swap_map[offset]
        struct page *next_hash;
        atomic_t count;
        unsigned long flags;        /* atomic flags, some possibly updated asynchronously */
        struct list_head lru;
        unsigned long age;
        wait_queue_head_t wait;
        struct page **pprev_hash;
        struct buffer_head * buffers;
        void *virtual; /* non-NULL if kmapped */
        struct zone_struct *zone;
} mem_map_t;   // mem_map[]

// 清洗不活跃脏页面的函数
int page_launder(int gfp_mask, int sync)
{
        ...

        if (page->buffers) {
                clearedbuf = try_to_free_buffers(page, wait);
                if (!clearedbuf) {
                        add_page_to_inactive_dirty_list(page);
                } else if (!page->mapping) {    /* The page was only in the buffer cache. */
                        atomic_dec(&buffermem_pages);
                        freed_page = 1;
                        cleaned_pages++;
                } else if (page_count(page) > 2) {    /* The page has more users besides the cache and us. */
                        add_page_to_active_list(page);
                } else /* page->mapping && page_count(page) == 2 */ {    /* OK, we "created" a freeable page. */
                        add_page_to_inactive_clean_list(page);
                        cleaned_pages++;
                }
        }

        ...
}

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
2 [报告]
发表于 2016-06-21 11:41 |只看该作者
本帖最后由 _nosay 于 2016-06-21 14:01 编辑

回复 1# _nosay

明白了

http://bbs.chinaunix.net/thread-4241209-1-1.html
如果从映射表时解除的,到这个时候,mapping肯定是有值的,否则就只用于buffer cache了。

buffers是一组buffer_head结构的指向,当前page存的是这些buffer_head对应的数据块,而buffer_head结构本身是游离当前page之外的,所以释放page的时候,buffer_head结构也要随着释放,如果脏了,相应数据块就会写进磁盘(非交换区),再读磁盘这块区域时,重新建缓存(因为即使是交换区换入时,也需要从磁盘重新读)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP