Soft Updates一项消除大多数同步写操作的技术(2)
http://tech.ddvip.com 2006年04月01日 社区交流
本文详细介绍Soft Updates一项消除大多数同步写操作的技术(2)
3.8 创建新目录时的依赖关系追踪
图8表现了另两个在创建新的目录时需要的依赖结构。对于普通文件,目录项可以在新引用的i-节点,以及相应的连接计数增加写盘之后立即写盘。而对于新目录,则还有另外两个附加的依赖关系:写入包含"."和".."项(MKDIR_BODY)的目录数据块,以及重写父i-节点的引用计数,以反映".."项(MKDIR_PARENT)。这些附加的依赖关系由连接到相关diradd上的两个mkdir结构来追踪。BSD SoftUpdates设计规定,任何给定的依赖关系需要在任何时刻都与一个单独的缓冲区相符。
因而使用了两个结构来追踪不同缓冲区的动作。每个缓冲区完成操作之后,它将清除与之关联的diradd的相关标志。MKDIR_PARENT将被连接到inodedep结构父目录的inodedep结构上。当那个目录的i-节点被写入之后,相应地写入连接计数。MKDIR_BODY则关联到包含了新目录内容的缓冲区上。当缓冲区被写入时,"."和"..."目录项将同时被写盘。最后的mkdir将设置diradd结构的DEPCOMPLETE标志,diradd得知额外的依赖关系已经做完。一旦完成,对目录的diradd结构的处理就和普通文件一样了。系统中所有的mkdir结构都被连到一个表中。需要这个表的原因在于它的存在可以让diradd找到与它相关的mkdir结构,如果它们被过早地释放(例如,mkdir系统调用之后马上对同一个对象作rmdir),则可以释放这些mkdir结构。释放diradd结构必须遍历这个表,以找出引用它的mkdir结构。假如不使用这个表,也可简单地让diradd包括两个到相关mkdir结构的指针,这也会加快删除,然而,额外的指针会使diradd结构增大一倍,而这一额外的付出只加速一种不会频繁发生的操作。
3.9 目录项删除依赖关系追踪
图9展示了与目录项删除相关的依赖关系结构。这张图引入了一个新的结构--dirrem和pagedep结构的新用法。独立的dirrem结构追踪目录块中每一个将被删除的项。除前述的pagedep用法外,它还能管理所有与目录块相关的dirrem结构。在目录块被写盘之后,dirrem请求将被加入工作守护进程的tasklist表中。对文件删除,工作守护进程将把i-节点的连接计数减1;对目录删除,工作守护进程将把i-节点的连接计数减2,并把父目录的连接计数减1。如果i-节点的连接计数下降到0,将开始3.11节描述的的资源回收。
3.10 文件截断
在未启用SoftUpdates的FFS中,当文件截断为0字节长时,i-节点中的块指针将被保存到一个临时的表中,i-节点中指向它们的指针被清零,随后i-节点被同步地写入磁盘。当i-节点写入完成时,它曾用过的块被加入空闲块位映射表中。启用SoftUpdates后,将被截断的i-节点的块指针被复制到一个freeblks结构中,随后这些指针被清零,同时i-节点被标记为"未写入"。freeblks结构随后被加入到"inode wait"表中,随后,当调用VOP_UPDATE时它将迁移到"buf wait"表中。最终,在保存i-节点块的缓冲区被写盘后,freeblks结构会加入到tasklist中。而处理tasklist时,freeblks结构中列出的块最终还给空闲块位映射表。
责编:豆豆技术应用