首页 > 其他分享 >Lec15 Crash recovery

Lec15 Crash recovery

时间:2023-11-30 16:02:44浏览次数:22  
标签:Lec15 Crash recovery 写入 文件系统 操作 日志 block log

xv6文件系统实现分为七层,如图所示

Lec15 Crash recovery_文件系统

File system logging(文件系统日志)

日志驻留在超级块中指定的已知固定位置。

  • 它由一个头块(header block)和一系列更新块的副本(logged block)组成。头块包含一个扇区号数组(每个logged block对应一个扇区号)以及日志块的计数。磁盘上的头块中的计数或者为零,表示日志中没有事务;或者为非零,表示日志包含一个完整的已提交事务,并具有指定数量的logged block。在事务提交(commit)时Xv6才向头块写入数据,在此之前不会写入,并在将logged blocks复制到文件系统后将计数设置为零。
  • 在提交之前,块必须留在缓存中:在提交之前,缓存的副本是修改的唯一记录;只有在提交后才能将其写入磁盘上的位置;同一事务中的其他读取必须看到修改。

对于日志系统的使用一共分为四步:

Lec15 Crash recovery_文件系统_02

  • 任何一次写操作都是先写入到log,我们并不是直接写入到block所在的位置,而总是先将写操作写入到log中。
  • 当文件系统的操作结束了,比如说我们前一节看到的4-5个写block操作都结束,并且都存在于log中,我们会commit文件系统的操作。这意味着我们需要在log的某个位置记录属于同一个文件系统的操作的个数
  • 当我们在log中存储了所有写block的内容时,如果我们要真正执行这些操作,只需要将block从log分区移到文件系统分区。我们知道第一个操作该写入到block 45,我们会直接将数据从log写到block45,第二个操作该写入到block 33,我们会将它写入到block 33
  • 一旦完成了,就可以清除log。清除log实际上就是将属于同一个文件系统的操作的个数设置为0。

Log写磁盘流程

Lec15 Crash recovery_数据_03

  • 首先是前3行的bwrite 3,4,5。因为block 3是第一个log data block,所以前3行是在log中记录了3个写操作。这3个写操作都保存在log中,并且会写入到磁盘中的log部分。
  • 第4行的bwrite 2。因为block 2是log的起始位置,也就是log header,所以这条是commit记录。 第5,6,7行的bwrite 33,46,32。这里实际就是将前3行的log data写入到实际的文件系统的block位置,这里实际是install log。
  • 第8行的bwrite 2,是清除log(注,也就是将log header中的n设置为0)。到此为止,完成了实际上的写block 33,46,32这一系列的操作。第一部分是log write,第二部分是install log,每一部分后面还跟着一个更新commit记录(注,也就是commit log和clean log)。

标签:Lec15,Crash,recovery,写入,文件系统,操作,日志,block,log
From: https://blog.51cto.com/u_16397898/8632020

相关文章

  • VMware Site Recovery Manager 8.8.0.2 (for vSphere 8.0U2) - 数据中心灾难恢复 (DR)
    VMwareSiteRecoveryManager8.8.0.2(forvSphere8.0U2)-数据中心灾难恢复(DR)请访问原文链接:https://sysin.org/blog/vmware-srm-8/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org新增功能SiteRecoveryManager8.8.0.2|21NOV2023|Build22795449T......
  • mysql数据表 Table is marked as crashed and should be repaired 的解决办法
    问题查询时,报  Tableismarkedascrashedandshouldberepaired 错误错误原因网上查了一下,错误的产生原因,有网友说是频繁查询和更新XXX表造成的索引错误,还有说法是Mysql数据库因某种原因而受到了损坏。如:数据库服务器突发性断电,在数据表提供服务时对表的源文件进行某......
  • 怎么在window上自动获取crash dump
     保存如下内容到opendump.bat,已管理员权限打开文件@echooffecho正在启用Dump...regadd"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\WindowsErrorReporting\LocalDumps"regadd"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\WindowsErrorReporting\Loc......
  • crash —— 查看进程的内核栈的内容
    有时我们有这样的需求,想查看某个进程的内核栈里的全部内容,介绍下面的几种做法:方法1:得到进程的栈底地址以及栈大小,然后使用rd指令读取使用mach指令获取内核栈的大小crash>mach|grepSIZEMEMORYSIZE:64GBPAGESIZE:4096KERNELSTACKSI......
  • crash —— 根据dentry的地址输出文件路径
    比如dentry的地址是ffff888140f49710,输出文件路径的方法是:使用files命令crash>files-d0xffff888140f49710DENTRYINODESUPERBLKTYPEPATHffff888140f49710ffff888140fb2b88ffff8881c0daf000REG/var/log/journal/a93e80bc64d54c6187b......
  • 【UVA 536】Tree Recovery 题解(根据遍历序列还原二叉树)
    小瓦伦丁非常喜欢玩二叉树。她最喜欢的游戏是随机构建查找节点中带有大写字母的二叉树。这是她创作的一个例子:为了给后代记录她的树,她为每棵树写下了两个字符串:预订单遍历(根、左子树、右子树)和有序遍历(左子树、根、右子树。对于上面绘制的树,预序遍历是DBACEGF,有序遍历是ABCDEFG......
  • crash —— 如何获取结构体成员指向的结构的内容?
    有时我们得到了某个结构体的地址,这个结构体内部有一个指向另外一个数据结构的指针,那么如何快速输出另外一个数据的内容。这里有两种方法,还是以task_struct为例,我想输出mm成员的内容:方法1根据结构体的地址输出指针成员的值,然后再进行二次引用crash>*task_struct.mmffff893e38......
  • crash —— 如果知道结构体内部某个成员的地址,如何输出结构体内容?
    以下面的task_struct为例:crash>*task_struct-oxffff893e3846e000structtask_struct{[ffff893e3846e000]structthread_infothread_info;[ffff893e3846e010]volatilelongstate;[ffff893e3846e018]void*stack;[ffff893e3846e020]atomic_tusage;[ff......
  • crash —— 查看进程的mm_struct内容
    方法1使用ps获取进程的task_struct地址,然后得到mm_struct地址crash>ps|grepbash6666962538ffff88a07fd42000IN0.0242683048bash82885963614ffff88fdc4678000IN0.0275001972bash8581858025ffff88dda33a0000IN......
  • crash —— 查看进程的vma结构体
    crash提供了vm命令来输出进程的vma相关的信息。输出当前当进程的vma列表crash>vmPID:3319TASK:ffff889760358000CPU:6COMMAND:"kvm"MMPGDRSSTOTAL_VMffff893ada165000ffff893a8c4e200045772k9535832kVMA......