加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

writeback机制源码分析

发布时间:2016-05-25 00:58:33 所属栏目:Linux 来源:网络整理
导读:writeback相关数据结构 与writeback相关的数据结构主要有: 1,backing_dev_info,该数据结构描述了backing_dev的所有信息,通常块设备的request queue中会包含

writeback

writeback对象封装了内核线程task以及需要处理的inode队列。当page cache/buffer cache需要刷新radix tree上的inode时,可以将该inode挂载到writeback对象的b_dirty队列上,然后唤醒writeback线程。在处理过程中,inode会被移到b_io队列上进行处理。多条链表的方式可以降低多线程之间的资源共享。writeback数据结构具体定义如下:

 

struct bdi_writeback {  
    struct backing_dev_info *bdi;   /* our parent bdi */
    unsigned int nr;  
     
    unsigned long last_old_flush;   /* last old data flush */
    unsigned long last_active;  /* last time bdi thread was active */
     
    struct task_struct *task;   /* writeback thread */
    struct timer_list wakeup_timer; /* used for delayed bdi thread wakeup */
    struct list_head b_dirty;   /* dirty inodes */
    struct list_head b_io;      /* parked for writeback */
    struct list_head b_more_io; /* parked for more writeback */
    spinlock_t list_lock;       /* protects the b_* lists */
};

 

writeback work

wb_writeback_work数据结构是对writeback任务的封装,不同的任务可以采用不同的刷新策略。writeback线程的处理对象就是writeback_work。如果writeback_work队列为空,那么内核线程就可以睡眠了。Writeback_work的数据结构定义如下:

 

struct wb_writeback_work {  
    long nr_pages;  
    struct super_block *sb; /* superblock对象 */
    unsigned long *older_than_this;  
    enum writeback_sync_modes sync_mode;  
    unsigned int tagged_writepages:1;  
    unsigned int for_kupdate:1;  
    unsigned int range_cyclic:1;  
    unsigned int for_background:1;  
    enum wb_reason reason;      /* why was writeback initiated? */
          
    struct list_head list;      /* pending work list,链入bdi-> work_list队列 */
    struct completion *done;    /* set if the caller waits,work完成时通知调用者 */
};

 

writeback主要函数分析

writeback机制的主要函数包括如下两个方面:

1,管理bdi对象并且fork相应的writeback内核线程处理cache数据的刷新工作。

2,writeback内核线程处理函数,实现dirty page的刷新操作

writeback线程管理

Linux中有一个内核守护线程,该线程用来管理系统bdi队列,并且负责为block device创建writeback thread。当bdi中有dirty page并且还没有为bdi分配内核线程的时候,bdi_forker_thread程序会为其分配线程资源;当一个writeback线程长时间处于空闲状态时,bdi_forker_thread程序会释放该线程资源。

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读