linux 缓存机制之块缓存,Linux缓存机制之页缓存

Linux运用一个功能广泛的缓冲和缓存框架来提高系统的速度。缓冲和缓存利用一部分系统物理内存,确保最重要、最常使用的块设备数据在操作时可直接从主内存获取,而无需从低速设备读取。物理内存还用于存储从快设备读取的数据,使得随后对该数据的访问可直接在物理内存进行,而无需从外部设备再次取用。考虑系统中多种因素然后延迟写回在总体上改进了系统的性能。前面分析的部分,例如内存管理的slab缓存是一个内存到内存的缓存,其目地不是加速对低速设备的操作,而是对现有资源进行更简单、更高效的使用。文件系统的Dentry缓存也用于减少对低速块设备的访问,但他无法推广到通用场合,因为他是专门用于处理单一数据类型的。

内核为块设备提供了两种通用的缓存方案:

1) 页缓存,针对以页为单位的所有操作,并考虑了特定体系结构上的页长度。一个主要的例子是内存映射技术。因为其他类型的文件访问也是基于内核中的这一技术实现的。所以页缓存实际上负责了块设备的大部分缓存工作。

2) 块缓存,以块为操作单位。在进行I/O操作时,存取的单位是设备的各个块,而不是整个内存页。尽管页长度对所有文件系统都是相同的,但块长度取决于特定的文件系统或其设置。因而,块缓存必须能够处理不同长度的块。

目前用于块传输的标准数据结构已经演变为struct bio。用这种方式进行块传输更为高效,因为他可以合并同一请求中后续的块,加速处理的进行。在许多场合下,页缓存和块缓存是联合使用的。例如,一个缓存的页在写操作期间可以划分为不同的缓冲区,这样可以在更细的力度下,识别出页被修改的部分。好处在于,在将数据写回时,只需要回写被修改的部分,无需将这个页面传输回底层的块设备。

页面缓存结构

[cpp]

/*高速缓存的核心数据结构,对块设备的读写操作都放在该结构体里*/

structaddress_space {

/*与地址空间所管理的区域之间的关联数据结构之一

inode结构指定了后备存储器*/

structinode        *host;      /* owner: inode, block_device */

/*与地址空间所管理的区域之间的关联之二

,page_tree列出了地址空间中所有的物理内存页*/

structradix_tree_root  page_tree;  /* radix tree of all pages */

spinlock_t      tree_lock;  /* and lock protecting it */

/*所有用VM_SHARED属性创建的映射*/

unsigned inti_mmap_writable;/* count VM_SHARED mappings */

/*基数根节点,该树包含了与该inode相关的所有

普通内存映射。该树的任务在于,支持查找包含了

给定区间中至少一页的所有内存区域*/

structprio_tree_root   i_mmap;     /* tree of private and shared mappings */

/*包含所有在非线性映射中的页*/

structlist_head    i_mmap_nonlinear;/*list VM_NONLINEAR mappings */

spinlock_t      i_mmap_lock;    /* protect tree, count, list */

unsigned inttruncate_count; /* Cover race condition with truncate */

/*缓存页的总数*/

unsigned longnrpages;    /* number of total pages */

pgoff_t         writeback_index;/* writeback starts here */

conststructaddress_space_operations *a_ops;   /* methods */

/*集主要用于保存映射页所来自的GFP内存区

的有关信息*/

unsigned longflags;      /* error bits/gfp mask */

/*指向后备存储器结构,该结构包含了与地址空间相关的

后备存储器的有关信息,后备存储器是指与地址空间相关

的外部设备,用做地址空间中信息的来源。他通常是块设备

*/

structbacking_dev_info *backing_dev_info; /* device readahead, etc */

spinlock_t      private_lock;   /* for use by the address_space */

/*用于将包含文件系统元数据(通常是间接块)的buffer_head

实例彼此连接起来*/

structlist_head    private_list;   /* ditto */

/*指向相关的地址空间的指针*/

structaddress_space    *assoc_mapping; /* ditto */

} __attribute__((aligned(sizeof(long))));

后备存储信息

[cpp]

structbacking_dev_info {

structlist_head bdi_list;

structrcu_head rcu_head;

/*最大预读数量,单位为PAGE_CACHE_SIZE*/

unsigned longra_pages; /* max readahead in PAGE_CACHE_SIZE units */

/*对该成员,总是使用原子操作,指定了后备存储器的状态*/

unsigned longstate;    /* Always use atomic bitops on this */

/*设备能力*/

unsigned intcapabilities; /* Device capabilities */

congested_fn *congested_fn; /* Function pointer if device is md/dm */

void*congested_data;   /* Pointer to aux data for congested func */

void(*unplug_io_fn)(structbacking_dev_info *, structpage *);

void*unplug_io_data;

char*name;

structpercpu_counter bdi_stat[NR_BDI_STAT_ITEMS];

structprop_local_percpu completions;

intdirty_exceeded;

unsigned intmin_ratio;

unsigned intmax_ratio, max_prop_frac;

structbdi_writeback wb;  /* default writeback info for this bdi */

spinlock_t wb_lock;   /* protects update side of wb_list */

structlist_head wb_list; /* the flusher threads hanging off this bdi */

unsigned longwb_mask;    /* bitmask of registered tasks */

unsigned intwb_cnt;      /* number of registered tasks */

structlist_head work_list;

structdevice *dev;

#ifdef CONFIG_DEBUG_FS

structdentry *debug_dir;

structdentry *debug_stats;

#endif

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux 缓存机制是指Linux操作系统对文件系统和磁盘I/O进行缓存的一种机制。它通过将磁盘上的数据缓存在内存中,加快访问速度,提高系统性能。 Linux缓存机制主要有以下几个方面: 1. 缓存(Page Cache):Linux使用缓存来加速对文件的读取和写入。当应用程序读取文件时,文件的内容会被缓存缓存中,下次再读取相同的文件时,可以直接从缓存中获取数据,避免了频繁的磁盘访问。对于写入操作,缓存会将数据暂时保存在内存中,延迟写入磁盘,提高写入效率。 2. 直接IO(Direct IO):直接IO是一种绕过缓存直接进行磁盘读写的方式。当应用程序使用直接IO进行数据读写时,数据不会被缓存缓存中,而是直接读写磁盘。直接IO适用于对大文件进行随机访问或者需要避免缓存带来的性能开销的场景。 3. 写回(Write-back)和写入(Write-through):Linux缓存采用写回和写入两种方式来处理数据的写入。写回方式表示数据先被写入缓存,然后再由操作系统决定何时将数据写入磁盘;写入方式表示数据同时被写入缓存和磁盘。写回方式可以提高写入性能,但也增加了数据丢失的风险。 4. 文件同步(File Sync):Linux提供了sync命令和fsync系统调用来进行文件同步操作。文件同步会强制将缓存中的数据立即写入磁盘,确保数据的持久化存储。文件同步可以用于保证数据的一致性,但也会带来性能上的开销。 总之,Linux缓存机制通过使用缓存、直接IO和写回等方式,提高了文件系统和磁盘I/O的性能,并在性能和数据一致性方面做出了权衡。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值