首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

xv6(11) 文件系统:日志

通常文件系统调用就是读写磁盘上的数据,所以同样的先调用 $bread$ 读取数据,然后修改,但是同步写到磁盘上不是直接调用 $bwrite$ 而是使用 $log_write$ 来替代。...log_write void log_write(struct buf *b) { int i; if (log.lh.n >= LOGSIZE || log.lh.n >= log.size...而 $log_write$ 只是设置缓存块的脏位并未立即进行磁盘请求,而是后面提交的时候统一同步写到磁盘。...如果调用了 $log_write$ 之后调用 $brelse$ 释放缓存块,这时候日志还没有提交,则可能会出现缓存块引用为 0,但数据脏的情况,具体例子可参考 $fs.c/writei$ 函数。...这里 log_write 就是写文件的第三层函数,回顾一下,第一层:使用磁盘的物理接口读写数据,第二层:读写磁盘的缓存块,第三层:写日志块,没有对应的读操作。

19110

xv6(12) 文件系统:Inode&Directory&Path

标记该块使用 log_write(bp); brelse(bp); //释放锁 bzero(dev, b + bi);...& m) == 0) //如果该块本来就是空闲的 panic("freeing free block"); //panic bp->data[bi/8] &= ~m; //置0 log_write...在 $Linux$ 里面使用 $major\ number$ 和 $minor\ number$ 来区分设备,同一类设备有着相同的 $major\ number$,$minor\ number$ 又表示该类设备中具体的某设备...; short nlink; uint size; uint addrs[NDIRECT+1]; }; 内存中的 $inode$ 比磁盘上的 $inode$ 多了几个属性,首先是设备号,$Linux...分配了该 $dinode$ 需要在磁盘上也将其标记为已分配,因为目前是在内存中操作的,得同步到磁盘上去,所以直接调用 $log_write()$ 将该 $dinode$ 所在的缓存块同步到磁盘。

20310

Linux - Linux内存管理

为了解决内存紧缺的问题,Linux引入了虚拟内存的概念。为了解决快速存取,引入了缓存机制、交换机制等。...要深入了解Linux内存运行机制,需要知道下面提到的几个方面。 首先,Linux系统会不时地进行页面交换操作,以保持尽可能多的空闲物理内存。...其次,Linux进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存中,Linux内核根据“最近最经常使用”算法,仅仅将一些不经常使用的页面文件交换到虚拟内存中。...Linux虽然可以在一段时间内自行恢复,但是恢复后的系统已经基本不可用了。...Linux下可以使用文件系统中的一个常规文件或者一个独立分区作为交换空间。同时Linux允许使用多个交换分区或者交换文件。

52.1K41
领券