库有一个选项是PAGE_VERIFY,可以设置为TORN_PAGE_DETECTION。文档上说利用每个扇区上一个位的反转来实现页面IO的完整性。琢磨了半天,终于明白了实现原理。
页大小为8K,磁盘扇区大小为512字节,假设每个扇区去第一个字节的第一个位来反转,页头中有16个位记录扇区的反转位,另外16个位来记录位的反转是否为手动反转,即区分是否为页面实际修改。
举个例子来说吧。一个已经在内存中的页,其16个扇区对应的16个反转位为0000 0000 0000 0000 0000,这16个位保存在页头上。该页要写入磁盘时,重新检查扇区反转位,发现16个反转位为1000 0000 0000 0000。因为所有的位都要和磁盘上的对应位反转。所以我们要把磁盘扇区上的16个位反转为1111 1111 1111 1111,页头和这一致。但是因为第一个反转位已经为1,反转反映的是系统修改值。因此保存反转状态的16个位为:0111 1111 1111 1111。
当IO完成后,再次调入此页时,我们首先检查页面是否完整。检验方法是:页头的16个位是否和16个扇区反转位一致,一致表示完整,否则表示不完整。不管是页头这个扇区没写,还是其他扇区没写,都能判断出来。检验完成之后,要还原扇区中反转位,使其变成实际值,这时,第一个扇区的反转不用反转,因为其本身是位1的,其他15的扇区的反转位应该反转。
感觉微软的人还是很厉害,这种方法开销很小,灵巧的解决了简单的页面校验问题。 不知道讲清楚没~