【操作系统】在阅读论文:OrcFS: Orchestrated file system for flash storage时需要补充的基础知

在阅读论文:OrcFS: Orchestrated file system for flash storage是需要补充的基础知识
这篇论文是为了解决软件层次之间的信息冗余问题

To minimize the disk traffic, the file system buffers the updates and then flushes them to the disk as a single unit, a segment (e.g.,2Mbyte), either when the buffer is full or when fsync() is called.

在这里插入图片描述The metadata area consists of the file system super block (FS-SB), checkpoint, segment information table (SIT), and node address table (NAT). The SIT manages the block
bitmap of each segment in the data area. The NAT manages the block address corresponding to
each node ID.

在这里插入图片描述

fsync

一、缓冲#
传统的UNIX实现的内核中都设置有缓冲区或者页面高速缓存,大多数磁盘IO都是通过缓冲写的。

当你想将数据write进文件时,内核通常会将该数据复制到其中一个缓冲区中,如果该缓冲没被写满的话,内核就不会把它放入到输出队列中。

当这个缓冲区被写满或者内核想重用这个缓冲区时,才会将其排到输出队列中。等它到达等待队列首部时才会进行实际的IO操作。
在这里插入图片描述
这里的输出方式就是大家耳熟能详的: 延迟写

这个缓冲区就是大家耳熟能详的:OS Cache

二、延迟写的优缺点#
很明显、延迟写降低了磁盘读写的次数,但同时也降低了文件的更新速度。

这样当OS Crash时由于这种延迟写的机制可能会造成文件更新内容的丢失。而为了保证磁盘上的实际文件和缓冲区中的内容保持一致,UNIX系统提供了三个系统调用:sync、fsync、fdatasyn

三、sync、fsync、fdatasync

#include<unistd.h>
int fsync(int filedes);
int fdatasync(int filedes);
int sync();

sync系统调用:将所有修改过的缓冲区排入写队列,然后就返回了,它并不等实际的写磁盘的操作结束。所以它的返回并不能保证数据的安全性。通常会有一个update系统守护进程每隔30s调用一次sync。

fsync系统调用:需要你在入参的位置上传递给他一个fd,然后系统调用就会对这个fd指向的文件起作用。fsync会确保一直到写磁盘操作结束才会返回。所以fsync适合数据库这种程序。

fdatasync系统调用:和fsync类似但是它只会影响文件的一部分,因为除了文件中的数据之外,fsync还会同步文件的属性。

缓存的意义:

系统调用是一件成本很高的事情,如果没有缓冲区,写一个数据就要传输一下,时间成本很高。缓冲区可以根据一定的策略进行数据的一次性传输,所以意义就是可以节省调用者的时间。

OrcFS的架构

在这里插入图片描述

基础知识补充

1.磁盘

磁盘是计算机上唯一一个机械设备,磁盘和我们现在电脑上的固态硬盘(SSD)不一样,固态硬盘是电子的,比起磁盘要快的多,但是价格比磁盘贵。磁盘现在只有一些公司存储大量数据的时候会用,因为成本低。

机械磁盘中主要的部件有:马达、磁盘、磁头等,磁盘有一摞,数据就记录在磁盘上面,一个磁盘有两面,就会有两个磁头,一个磁头负责一面的数据读写。磁头负责读写磁盘上的数据,马达负责转动磁盘。磁头和磁盘是不接触的,但是距离非常近,如果磁头接触了磁盘,就有可能把磁盘上的数据抹掉,造成数据丢失。所以磁盘是不能碰撞的,一旦磕碰就有可能会发生数据丢失,这也是被淘汰的原因

计算机是只能识别0和1的,那么在磁盘上怎么区分0和1呢?不同的设备区分0和1的方法不同,在磁盘上就是以南极北极区分0和1,磁盘的盘片上有无数的基本单元,每一个基本单元就是一个磁铁,磁铁就有南极和北极。所以写入数据的过程就是把N编程S,删除数据的本质就是S编程N。所以磁头读取数据就是读取南北极,写入数据就是更改南北极。

在这里插入图片描述

2.具体存储:

数据在盘面上存储的,而盘面是一个同心圆,那么根据什么规则来找到数据所在的区域呢?

把盘面分为多个扇面,每个扇面都有磁道划分扇区,数据就是存储在无数个扇区里面,每个扇区大小不同,但是存储的bit位是相同的,都是512字节,那么怎么找到对应的扇区呢? 一个磁盘有多个盘面,一个盘面对应一个磁头,所以可以给磁头定一个编号,根据磁头能找到盘面,而盘面相对位置都是一样的,所以就会有一个柱面,这个柱面就是磁道,然后根据扇面的编号就可以确定一个扇区。磁头(head)、柱面(cylinder)、扇区(sector)这种就是一种CHS定位法。根据这种方法可以定位任意一个扇区,把文件写入磁盘的本质就是给一个或者多个扇区写入二进制,或者读取多个扇区的二进制。
在这里插入图片描述

对磁盘物理结构的逻辑抽象

​ 一个磁盘通过CHS地址能够访问到任何一个扇区,那么OS内不能是不是通过CHS地址访问磁盘中的数据呢?并不是。一旦磁盘物理结构发生改变,OS就不能访问数据了,这样是为了OS和磁盘之间解耦。

一个扇区也就是512字节,但是OS读取数据的时候基本单位是4kb,哪怕OS只修改一个bit位OS也会把这一个bit位所在4kb全部读取,然后修改完成后再把4kb整体放回到原来的地方。所以操作系统需要有一套新的地址进行IO操作。
那么操作系统想要一次读取4kb(也就是8个扇区),怎么读取的呢?
把一个盘面抽象成一个数组。LBA方式读取数据

​ 磁盘的数据存储再盘面上,而盘面是一个同心圆,从最外圈到最内圈有无数个磁道,一圈磁道有许多扇区,如果把磁道拉伸成一个线性的,就像磁带一样,最开始读取数据是在最外圈,最后读取的数据是在最内圈。一个磁道拉伸出来就像一个长条,然后这个长条内有无数个扇区就像数组的空间,这样一圈磁道就被拉伸成了一个数组,内侧磁道拉伸成数组头部跟在外侧磁道尾部的后面,这样就可以把一个同心圆抽象成一个数组。
​ 计算机要读取一个内置类型或者自定义类型时,通常是起始地址+偏移量(数据类型)。OS读取4kb也就是8个扇区就是读取8个扇区空间的首地址。这4kb大小的类型,被称为块。把这个数据块看做一种数据类型。块的地址就是一个下标。这种读取数据的方式被称为LBA。

LBA转换成CHS方法,简单的转换,实际的转换方法一定要复杂得多。

//假设一个盘面有10圈磁道,一圈有500个扇区,一个盘面有5000个扇区。读取6500号数组下标
C:1500/500 = 3
H:6500/5000 = 1
S: 1500%500 = 0
到现在操作系统对磁盘的管理就变成了对数组的管理。

文件系统

​ OS对磁盘抽象为数组管理,每个数组空间为4kb,但是磁盘有着很大的空间,是以GB甚至是TB为单位的。用一个简单数组直接管理难度太大。所以会对磁盘进行分区,类似分C盘D盘,而每个区还是很大,所以每个区会分组(group)管理。
在这里插入图片描述
每个组内又分了各种区域存储不同的信息,把一个组管理模式可以复刻到每一个分组,这样就能管理好整个分区。

super block

这个分区内存放的是:
1.文件系统的类型
2.整个分组的情况
super block在每个分组里都存在,而且都存了文件系统的类型,是同时更新的同样的数据。主要是为了做多个备份,如果super block这个区域的数据没有备份而且损坏,直接导致整个分区的数据不能被使用。

Group Descriptor Table

简称GDT:组描述符,主要是记录组内详细统计等信息。例如每个区域的大小等等

inode table

linux系统中,内容和属性是分开存储的,一个文件的所有属性集合就是一个inode(128kb)节点,一个分组内也有大量的文件也就有大量的inode节点,这些inode节点都存储在inode
table表中,每一个inode节点都有自己的indoe编号,也属于对应文件的属性id。

Linux中查看inode编号ls -il

Date block

主要存储文件的内容数据,所有的文件的内容都被存储在Date block这个区域内。Linux查找一个文件必须先找到这个文件对应的inode节点的编号,通过indoe节点映射关系找到文件的内容。

inode bitmap

这个区域内的一个bit位表示一个inode的使用情况,0表示空可以使用,1表示被占用。

Linux系统只认识inode编号,并不存在文件名,文件名是给用户看的。

ref: https://blog.csdn.net/weixin_48344647/article/details/129925872

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/620761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[脚本]油猴脚本简单入门

安装 科学上网后直接在谷歌商店安装 官方文档地址 文档地址 编写脚本 油猴自带的编译器非常不好用&#xff0c;不想麻烦配置编译器建议直接把内容拷贝到VSCode中进行编辑。 // UserScript // name New Userscript // namespace http://tampermonkey.net/ // v…

python爬虫02-requests库使用01

目录 1、requests库简介 2、requests库-安装 3、requests库-使用 3.1 导入模块 3.2 发送请求 3.3 requests库常用方法 3.4 访问控制参数kwargs 4、请求返回对象 Response 5、requests访问时的可能异常 1、requests库简介 requests是一个http的第三方请求库&#xff0…

Seata TC端协调全局事务

1、Seata server注册器 //来自RM分支事务注册 super.registerProcessor(MessageType.TYPE_BRANCH_REGISTER, onRequestProcessor, messageExecutor); //开启全局事务 super.registerProcessor(MessageType.TYPE_GLOBAL_BEGIN, onRequestProcessor, messageExecutor); //提交全…

QEMU源码全解析 —— PCI设备模拟(9)

接前一篇文章&#xff1a; 上一回介绍了虚拟机如何通过北桥的MMIO来读写PCI设备的配置空间。PCI设备的配置空间中有MMIO的地址&#xff0c;也就是BAR信息&#xff0c;里面存放有BAR的基址&#xff0c;虚拟机可以通过读写这些BAR来与设备通信。然而&#xff0c;QEMU在设备初始化…

crackmapexec工具详解

下载地址&#xff1a;https://github.com/Porchetta-Industries/CrackMapExec wiki&#xff1a;https://www.crackmapexec.wiki/ 1.安装&#xff08;MAC&#xff09; 1.1.python3.9 pipx 安装&#xff08;运行软件有警告&#xff0c;推荐 python3.11 pipx 安装&#xff09; …

记录下载安装rabbitmq(Linux) 并整合springboot--详细版(全)

下载rabbitmq&#xff08;Linux&#xff09;&#xff1a; erlang压缩包&#xff1a; https://share.weiyun.com/TGhfV8eZ rabbitMq-server压缩包&#xff1a; https://share.weiyun.com/ZXbUwWHD &#xff08;因为RabbitMQ采用 Erlang 实现的工业级的消息队列(MQ)服务器&#…

五、带登录窗体的demo

做了一个简单的带登录窗体的demo&#xff0c;有用户名和密码不能为空的验证&#xff0c;原理是在main.cpp的主函数入口处&#xff1a; 1、将默认的MainWindow主窗体注释。 2、新建一个formlogin登录窗体&#xff0c;在主函数中先运行登录窗体。 3、在登录窗体中引用MainWind…

Redis学习指南(7)-Redis的字符串类型介绍

字符串类型特点 Redis的字符串类型是一种简单而灵活的数据结构&#xff0c;其特点如下&#xff1a; 任意数据类型: 字符串类型可以存储任意数据&#xff0c;包括文本、二进制数据等。直接访问和修改: 可以直接通过键名访问和修改整个字符串&#xff0c;而不需要像其他数据结构…

C++ 并发编程 | 管理线程

一、管理线程 1、启动线程 线程是通过构造std::thread对象来开始的&#xff0c;该对象指定了线程上要运行的任务&#xff0c;std::thread可以与任何可调用类型一起工作&#xff0c;例如&#xff1a; #include <iostream> #include <thread> using namespace std;v…

LeetCode第152题 - 乘积最大子数组

题目 解答 public class Solution {public int maxProduct(int[] nums) {if (nums null || nums.length 0) {return 0;}if (nums.length 1) {return nums[0];}int max nums[0];int min nums[0];int res nums[0];for (int i 1; i < nums.length; i) {int tmp max;m…

【算法题】51. N 皇后

题目 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案。 …

ZZULIOJ 1126: 布尔矩阵的奇偶性

题目描述 一个布尔方阵具有奇偶均势特性&#xff0c;当且仅当 每行、每列总和为偶数&#xff0c;即包含偶数个1。如下面这个4*4的矩阵就具有奇偶均势特性&#xff1a; 1 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 编写程序&#xff0c;读入一个n阶方阵并检查它是否具有奇偶均势特性。如果…

杨中科 .NETCORE EFCORE 第一部分 基本使用

一 、什么是EF Core 什么是ORM 1、说明: 本课程需要你有数据库、SOL等基础知识。 2、ORM: ObjectRelational Mapping。让开发者用对象操作的形式操作关系数据库 比如插入: User user new User(Name"admin"Password"123”; orm.Save(user);比如查询: Book b…

mac上部署单体hbase

1. 简介 HBase 是一个开源的、分布式的、版本化的典型非关系型数据库。它是 Google BigTable 的开源实现&#xff0c;并且是 Apache 基金会的 Hadoop 项目的一部分1。HBase 在 Hadoop Distributed File System (HDFS) 上运行&#xff0c;作为一个列式存储非关系数据库管理系统…

yolov8在进行目标追踪时,model.track()中persist参数的含义

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

Unity 面试篇|(五)热更新与Lua语言篇 【全面总结 | 持续更新】

目录 1.什么是热更新&#xff1f;2.主流的代码热更方案有哪些&#xff1f;3.AssetBundle介绍4.AssetBundle的具体开发流程5.AssetBundle的压缩格式6.AssetBundle对象的加载方式7.ssetBundle资源卸载8.资源如何打包&#xff1f;依赖项列表如何生成&#xff1f;9.如何解析版本文件…

华为OD机试2024年最新题库(Python)

我是一名软件开发培训机构老师&#xff0c;我的学生已经有上百人通过了华为OD机试&#xff0c;学生们每次考完试&#xff0c;会把题目拿出来一起交流分享。 重要&#xff1a;2024年1月-5月&#xff0c;考的都是OD统一考试&#xff08;C卷&#xff09;&#xff0c;题库已经整理…

Flutter之运行错误:this and base files have different roots

运行时报错&#xff1a; this and base files have different roots: E:\Demolpro\waqu\build\flutter-plugin-_android_lifecycle and C:\Users\78535\AppData\Local\Pub\Cache\hosted\pub.dev\flutter_pulgin_android_lifecycle-2.0.17\android 如图&#xff1a; 这种情况…

【JavaSE】P33~P113 方法,重载,数组,对象,构造器,this关键字,数组和对象的内存图,JavaBean

练习 1 方法方法定义及调用JShell简单使用&#xff08;要求Java9以上&#xff09;方法语句流程控制及注意事项选择循环 方法的重载 2 数组三种初始化方式数组在内存中的存储内存图 3 对象对象内存图Getter/Setter快捷写法this 关键字构造方法JavaBean的四个标准对象数组 二、编…

微信小程序支付之V2支付

一、引入maven <dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-pay</artifactId><version>3.3.4.B</version><exclusions><exclusion><artifactId>qrcode-utils</artifactId&…