Soft Updates:一项消除大多数同步写操作的技术(二)

第3节 跟踪并确保更新依赖关系

本节描述BSD Soft Updates数据结构,以及它在保证第二节中描述的更新依赖关系中发挥的作用。这里描述的数据结构和算法能在除文件截断和fsync系统调用以外的所有情况中完全消除BSD FFS的同步写入操作。

SoftUpdates的关键特性是在缓存块中追踪每个更改之间的更新依赖关系。于是,对包括64个i-节点的块,系统可能会为缓冲区中的这些i-节点维护最多64个依赖关系结构。类似地,对包含50个名字的目录块,系统也会为这些名字维护最多50个依赖关系结构。

拥有如此详细的依赖关系信息,块之间的循环依赖将不再是问题。无论何时系统希望在缓冲区中写i-节点,它们都能安全地写入,并最终进入磁盘。一时不能安全写入的i-节点将在缓冲区同步时被暂时回滚到过去的某个安全的值,待写盘完成后再恢复当前值。缓冲区在回滚的这段时间被锁定,待内容恢复后再解锁。请求写缓冲区的进程将被阻塞,直到缓冲区恢复原状。

3.1 依赖关系数据结构

我们的实现使用了多种数据结构在文件系统结构中追踪未决的更新依赖关系。表1列了使用的依赖关系结构、主要功能,以及与它们关联的块。这些依赖依赖关系数据结构在文件操作完成时被分配并关联到块上。在内核内存中的副本中它们使用指针关联到对应块的头。所有列出的依赖关系结构的两种一般的样式是工作表(worklist)结构和保存追踪依赖关系状态的结构。

表1 BSD SoftUpdates实现中使用的依赖关系结构

worklist结构作为所有依赖关系结构首项的公共头。它包含了一系列连接指针,以及一个表示它被嵌入的结构类型的字段。worklist结构使得将不同类型的依赖关系结构连到同一链表中成为可能。SoftUpdates代码能够遍历这种异质链表,使用类型字段判别它遇到的依赖关系结构,并据此进行相应的操作。

对worklist的典型应用是将一系列依赖关系关联到缓冲区上。整个系统中的每个缓冲区都附加了一个worklist头指针。任何与缓冲区关联的更新依赖关系都被接到这个链表中。缓冲区锁定后,在写开始前,I/O系统把缓冲区送给相关代码,SoftUpdates从而得知将开始一次写操作并遍历关联到缓冲区上的依赖关系,以便进行适当的数据回滚。磁盘写入完成后,在解除对缓冲区的锁定之前,I/O子系统会再次调用SoftUpdates代码,告知写操作完成。这些代码将进行适当的前滚操作,释放已完成写入的那些依赖关系结构。

另一个SoftUpdates代码维护的表是tasklist,它指明了工作守护进程需要进行的后台任务。已经可以安全地写入,但由于某种原因(如锁或I/O)而被阻塞的那些依赖关系由写盘子程序追加到tasklist中来描述。每秒syncer守护进程都会被唤醒(这一进程也是SoftUpdates的工作进程),它调用SoftUpdates代码以处理tasklist中的项目。在表中进行的操作与项目类型有关。例如,freeblks结构列出的块将在块位映射表中被标记为空闲;对dirrem结构,相关i-节点的引用计数将被减少,并可能触发文件删除操作。

依赖关系的状态。绝大多数依赖关系结构拥有一系列标志来描述相关关系的完成状态。被改动过的缓存块可能在任何时刻写入磁盘。I/O系统将缓冲区交给SoftUpdates程序(在磁盘写入之前和之后)时,与之关联的状态将确定将进行的操作。尽管不同的结构有不同意义的状态,但三个主要的、普适的状态是:

附着(ATTACHED)

此标志表示包含此依赖关系结构的缓冲区尚未被写盘。当包括必须回滚的依赖关系的缓冲区写盘之前,这一标志将被清零,以体现在缓冲区中的回滚。当写盘完成时,此标志被清零的那些依赖关系结构对应的缓冲区将恢复原状。所以,如果此标志复位,则绝不能释放对应的依赖关系,因为它包括需要进行恢复操作,此时释放将造成这些信息丢失。

时间: 2025-01-21 02:48:34

Soft Updates:一项消除大多数同步写操作的技术(二)的相关文章

Soft Updates:一项消除大多数同步写操作的技术(一)

作者及顾问:Marshall Kirk McKusick:卡内基梅隆大学 Gregory R. Ganger中文翻译:北京工业大学计算机学院 李鑫 <delphij@cnfug.org> -------------------------------------------------------------------------- 这篇论文最初发表于1999年6月6日至11日举行的USENIX年度技术会议中,Freenix会议录的第1-17页.其版权归Marshall Kirk McKus

socket-求助:SSDB的主从数据同步时,即使没有任何写操作主从节点也会频繁地进行数据交互

问题描述 求助:SSDB的主从数据同步时,即使没有任何写操作主从节点也会频繁地进行数据交互 我安装了SSDB后,分别启动了master和slave, 然后通过Debug日志,发现在刚启动copy完成后,就开始不停地重复进行sync, 就对已有的数据进行循环sync, SSDB理念不是只有在write的时候,才会进行sync同步吗? 经过测试,在write的时候,也会进行sync同步,但是我是很奇怪为什么不执行write的时候,主从socket还一直在进行同步, 求大神解答. 不甚感激 解决方案

node基础-文件系统-文件写操作

文件操作频率最高的就是读跟写.nodejs的文件的读取API在<node基础-文件系统-读取文件>里已经简单介绍过,本文就简单介绍下nodejs的文件写API. nodejs的文件操作均提供了同步.异步两种方式,写操作也是同样的,常用的两个接口为fs.writeFile(异步).fs.writeFileSync(同步),下面就来看看他们的使用以及区别. fs.writeFile(filename, data, [options], callback) 先来看下API说明 /** * 往文件里异

linux中在文件夹下新建文档属于写操作(w)还是执行(x)操作

问题描述 linux中在文件夹下新建文档属于写操作(w)还是执行(x)操作 众所周知,linux下文档和文件夹都有rwx操作,读鸟哥的私房菜中说不能在没有x权限的文件夹下执行一些命令,比如man,ll等,那在文件夹中新建文档是属于写操作还是执行操作? 解决方案 这要看你是怎样新建的这个文件,比如用 touch 来创建的文件,正常情况下就不会有x权限. 但如果你有执行gcc的权限,那么你用gcc编译一个自己写的c文件得到一个可执行执行程序时通常就有x权限了. 还有一些脚本文件,一般新建时用vi或e

关于如何使用JdbcTemplate实现在WebLogic812,Oracle9i上的CLOB数据的写操作

oracle|web|数据 进行写操作的方法 import java.sql.*;import org.springframework.jdbc.core.*;import org.springframework.jdbc.core.support. AbstractLobCreatingPreparedStatementCallback;import org.springframework.jdbc.support.lob.LobCreator;import org.springframewo

ASP.NET技巧:同时对多个文件进行大量写操作对性能优化

asp.net|技巧|性能|优化 我自己的一个项目,需要同时对65536个文件进行多次写操作. 如果先全部打开所有的文件,然后重复写,最后关闭所有的文件.那么第一次写操作全部完成需要16分钟左右,而第二次就需要40分钟了.没有继续测试了.             for (int i = 0; i < 65536; i++)            {                fileStream[i] = new FileStream(buffDir+"\\"+ i.ToS

用VB对磁盘的物理扇区数据读/写操作

数据 Option Explicit '/////////////////////////////////////////'// 对磁盘的物理扇区数据读/写操作'// last update: 2004-8-7'// Kwanhong Young'///////////////////////////////////////// '//file systemPrivate Declare Function CreateFile Lib "kernel32" Alias "Cr

电脑中如何通过iTunes使iPhone完成同步照片操作

  电脑中如何通过iTunes使iPhone完成同步照片操作         1.首先要在电脑中下载安装iTunes; 2.将手机通过数据线连接电脑的USB接口,然后点击打开iTunes; 3.点击iTunes界面左上角的手机图标; 4.点击设置里面的"照片",右侧显示出"同步照片"; 5.把"同步照片"左侧的小方框勾选上,下面选"所有文件夹"或者"包括视频". 按照以上方法在电脑中进行操作后,就可以在iT

update-C# 对Excel进行写操作,但只能在每列的第一行进行更新填写,到底是哪里出错了?

问题描述 C# 对Excel进行写操作,但只能在每列的第一行进行更新填写,到底是哪里出错了? try { this.conOleDB.Open(); command = new OleDbCommand(string.Format(""UPDATE [{0}${1}:{2}] Set F1=""{3}"""" new object[] { sheetName cellName cellName value2Write }) t