小写预读算法的预读触发条件如下:
①写数据块缓存缺失(Cache Miss Write-block)且未在预读中。由于S-RAID执行小写,无论是写部分块还是写全部块,都需要执行磁盘I/O加载该块(如果不是小写,写全块时不需要加载该块),预读程序在加载该块的同时进行初始预读,预读与之相邻的若干连续块。
②预读标记块(Readahead_Flag block),该标记块是在上一次预读中设置的。如果当前写数据块具有预读标记,表明下一次预读的时机已经到来,应立即调用预读例程进行异步预读。为避免重复触发,需要在触发预读的同时清除Readahead_Flag标记。
Linux的按需预读算法面向各种类型的应用,在发生页面缺失时,需要进行严格的顺序性匹配,只有上次与本次读操作是顺序读时才进行初始预读,需要记录最后一次读操作位置。
本章所提出的小写预读算法做了进一步优化,只要写数据块缓存缺失,且该块没有在预读中,就进行初始预读,原因如下:(www.daowen.com)
①根据小写特性,此时必须加载该块,对磁盘来讲,加载一个块与加载几个连续块的代价基本相同,因此可以执行初始预读;
②连续数据存储中的写操作,可很好地满足局部性原理,该缺失块的相邻块通常即将被写到,因此有必要执行预读。既然小写预读不检验顺序性,也就不需要记录最后一次写操作位置。
预读标记块能够保证一旦开始一个顺序写的预读,这个预读序列就不会被不相关的随机写或交织的顺序写打断。为了防止缓存命中而导致实际预读长度减小,在预读中如果出现缓存命中,则跳过命中块继续向前预读。小写预读算法中只对数据块作预读标记,根据标记数据块及S-RAID的数据布局,即可确定校验块所在磁盘及盘内偏移量,并对其进行预读。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。