【自用】王道文件管理强化笔记

文章目录

      • 操作系统引导:
      • 磁盘初始化
        • 文件打开过程角度1
        • 文件的打开过程角度2
      • 内存映射的文件访问

操作系统引导:

①CPU从一个特定主存地址开始,取指令,执行ROM中的引导程序(先进行硬件自检,再开机)
②)将磁盘的第一块–主引导记录读入内存,执行磁盘引导程序,扫描分区表
③从活动分区(又称主分区,即安装了操作系统的分区)读入分区引导记录,执行其中的程序
④从根目录下找到完整的操作系统初始化程序(即启动管理器)并执行,完成“开机”的一系列动作

在这里插入图片描述

磁盘初始化

在这里插入图片描述
磁盘初始化:
step1:进行低级格式化(物理格式化),将盘的各个磁道划分为扇区。一个扇区通常可分为头、数据区域(如512B大小)、尾三个部分组成。管理扇区所需要的各种数据结构一般存放在头、尾两个部分,包括扇区校验码(如奇偶校验、CRC循环冗余校验码等,校验码用于校验扇区中的数据是否发生错误)
Step2:将磁盘分区,每个分区由若干柱面组成(即分为我们熟悉的C盘、D盘、E盘)
Step3:进行逻辑格式化,创建文件系统。包括创建文件系统的根目录、初始化存储空间管理所用的数据结构(如位示图、空闲分区表)

在这里插入图片描述
ROM:
ROM中只存放很小的“自举装入程序”
开机时计算机先运行“自举装入程序”,通过执行该程序就可找到引导块。并将完整的“自举程序”读入内存,完成初始化。

FCB和inode指针之间的关系
在这里插入图片描述
inode->对应的是struct结构体=>inode a[V],连续存储

引导块:引导操作系统初始化的一系列操作
超级块:包含一些重要的文件系统管理信息,如:魔数(是用来告诉操作系统这个文件的类型的,魔数magic number是计算机(或者说是BIOS)用来判断此设备是否包含引导程序的),磁盘转速,磁道数,扇区数。
位示图
注1:位示图中,每个bit对应一个磁盘块,因此,若磁盘块共有n个则位示图也至少要有 nbit。
注2:这里只用了一个磁盘块存储位示图一个磁盘块大小为4KB,即 32K bit,因此这个位示图能支持的磁盘大小上限为 32K 个块。如果需要支持更多磁盘块,则需要扩充位示图的大小
inode区
注:“inode结点"就是“索引节点”。在Unix文件系统中,所有的索引结点集中存放。用于表示“文件物理结构"的“混合索引表"被包含在inode结点中,通过“混合索引表”,即可找到一个文件中每个块存储的物理位置

注1:在Unix文件系统中,每个文件必须对应一个inode结点,而inode结点的总数量是有上限的。如:该示意图中,仅用两个磁盘块,即8KB作为inode区,假设每个inode大小为64B,则该文件系统最多只能存储8KB/64B=128个inode结点,相应地,该系统最多只能支持128个文件。
注2:当一个进程通过open系统调用打开某个文件时,操作系统需要将该文件对应的inode结点读入主存。

根目录:存储在磁盘的固定位置
注1: 根目录的信息存储在磁盘的固定位置,这样可以保证开机时,能够找到根目录,再从根目录出发找到其他信息
注2: 开机时,根目录的内容通常会被加载到内存,并一直常驻内存
注3: 由于Unix文件系统采用了“索引节点”,因此每个目录项只需包会“文件名、inode号”、文件的具体属性包含在 inode 中
挂4: 每个目录文件中默认包含两个目录项,分别是“…“和"…“。”.“表示当前目录,”…“表示上一级目录。根目录比较特殊,没有所谓的“上一级目录”,因此它的目录项”."指向自身。

问题1:为什么根目录要存放在磁盘的固定位置?
回答1:因为开机的时候,需要从根目录出发,找到操作系统初始化相关的各种文件。因此,将根目录存放在固定位置,那么开机时候取这个固定位置读入根目录的数据即可

索引表和inode 的关系:索引表是inode的一部分,红色框出来的部分是inode
在这里插入图片描述

在这里插入图片描述

思考1:如何确定目录文件A需要占多少个块?
回答1:(目录项的数量*每个目录项的大小)/块大小

文件打开过程角度1

思考2:如果从根目录开始查找,要将文件“/A/Dm”读入内存,描述背后发生了什么?
回答2:根目录文件常驻内存,首先查内存中的根目录,找到目录项A–根据目录项A可知,文件A对应 1号inode结点,因此要将1号inode结点从磁盘读入内存–根据刚读入的1号inode结点,可知文件A的索引信息,也就是知道了文件A的每一个块存储在什么位置,接下来可读入目录文件A的第一块(6号物理块)–尝试查找目录项Dm,如果没找到,那么还需要读入目录文件A的第二块(7号物理块)–找到目录项Dm之后,根据目录项记录的inode号,将Dm的inode结点从磁盘读入内存(前面属于open系统调用的内容)|–根据Dm的inode结点,读入Dm的第一块(m号物理块)、第二块(k号物理块)

每个进程一个用户打开文件表(PCB中,通过PCB,操作系统可以访问和管理进程的打开文件表。),用于记录该进程已经打开的文件。表中每一项都对应一个已打开的文件,并通过一个文件描述符(fd)来标识。文件描述符是一个整数,用于在用户进程的打开文件表中唯一标识一个已打开的文件。当进程通过系统调用(如open)打开文件时,系统会为该文件分配一个文件描述符,并返回给进程。

系统打开文件表独一份,用于记录所有已打开的文件。表中每一项都包含了文件的各种信息,如文件的inode节点指针(指向内存中已读入的inode信息)、打开该文件的进程数等。

文件的打开过程角度2

当一个进程通过open系统调用打开文件时,系统会首先查找文件的inode节点(如果尚未在内存中,则先从磁盘读取,以块为单位进行检索),并将其信息存储在系统级的打开文件表中。
然后,在用户进程的打开文件表中创建一个新的表项,指向系统级打开文件表中的相应项,并分配一个文件描述符。
最后,将文件描述符返回给进程,以便后续的文件读写操作。

TIPS:
如果多个进程同时打开同一个文件,每个进程都会在自己的打开文件表中创建一个表象,但这些表象都指向系统级打开文件表中的同一个项。
系统级打开文件表中的“打开该文件的进程数”字段会相应增加,以记录有多少个进程正在使用该文件。

在这里插入图片描述

内存映射的文件访问

解决读写文件效率低下的中心思想是:把磁盘访问变成内存访问。实现这种访问转变的手段就是内存映射的文件访问

内存映射的文件访问原理:把需要访问的文件映射到一个进程的虚拟地址内,这样访问该虚拟地址就相当于访问文件。

内存映射的文件访问目的:是为了文件的共享,即可以将同一个文件映射到两个或多个进程的虚拟地址空间。

文件的访问类型:顺序访问和随机访问

  • 文件的实现要解决如下问题:
    • 给文件分配磁盘空间

    • 记录这些磁盘空间的位置

    • 将文件内容存放在这些空间

      非连续存放方式通过链表方式实现,在每个数据块里面留出一个指针的空间,用来存放下一个数据块所在的地址。
      把所有指针从单个数据块抽取出来,全部放在一起,形成一张表。称为文件分配表(File Allocation Table)


FAT数据结构是静态链表
问题1:FAT表中,每个表项的大小对文件系统有什么影响?
回答1:①对文件系统支持的最大磁盘块数有影响,如:每个FAT表项16bit,则最多只能表示2^16个块号;②)对FAT表的总大小有影响,每个表项的大小*表项的数量=FAT表的大小

问题2:简述操作系统是如何使用FAT表的?
回答2:开机时,就会把整个FAT表读入内存,系统运行过程中,该表会一直常驻内存,也就是说,查FAT表不需要读磁盘,内存里本来就有这个表。系统运行过程中,如果要访问某个文件,则首先要找到这个文件对应的目录项,从目录项中找到文件的起始块号,再根据起始块号查FAT表,从而确认文件的后序那些块存放在哪里。

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

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

相关文章

【Ubuntu】git

文章目录 1.配置SSH key2. 基础知识操作命令1分支branch 如果对git命令使用不熟悉,推荐一个非常棒的git在线练习工具 Learn Git Branching。 https://m.runoob.com/git/git-basic-operations.html 1.配置SSH key ssh-keygen -t rsa -C "YOUR EMAIL"完成…

markdown 中启用音频支持

markdown 中启用音频支持 markdown 默认不支持音频文件&#xff0c;我们通过 html 标签渲染 flask项目 其中音频文件放在 /static/audios/vad_example.wav markdown 内容如下&#xff1a; ## 音频播放器示例 <audio controls ><source src"vad_example.wav…

Flink源码剖析

写在前面 最近一段时间都没有更新博客了&#xff0c;原因有点离谱&#xff0c;在实现flink的两阶段提交的时候&#xff0c;每次执行自定义的notifyCheckpointComplete时候&#xff0c;好像就会停止消费数据&#xff0c;完成notifyComplete后再消费数据&#xff1b;基于上述原因…

go-zero学习

go-zero官网&#xff1a; https://go-zero.dev/docs/tasks 好文&#xff1a; https://blog.csdn.net/m0_63629756/article/details/136599547 视频&#xff1a; https://www.bilibili.com/video/BV18JxUeyECg 微服务基础 根目录下&#xff0c;一个文件夹就是一个微服务。如果微…

力扣16~20题

题16&#xff08;中等&#xff09;&#xff1a; 思路&#xff1a; 双指针法&#xff0c;和15题差不多&#xff0c;就是要排除了&#xff0c;如果total<target则排除了更小的&#xff08;left右移&#xff09;&#xff0c;如果total>target则排除了更大的&#xff08;rig…

kafka的成神秘籍(java)

kafka的成神秘籍 kafka的简介 ​ Kafka 最初是由Linkedin 即领英公司基于Scala和 Java语言开发的分布式消息发布-订阅系统&#xff0c;现已捐献给Apache软件基金会。Kafka 最被广为人知的是作为一个 消息队列(mq)系统存在&#xff0c;而事实上kafka已然成为一个流行的分布式流…

【mmengine】配置器(config)(进阶)继承与导出,命令行修改配置

一、配置文件的继承 1.1 继承机制概述 新建optimizer_cfg.py: optimizer dict(typeSGD, lr0.02, momentum0.9, weight_decay0.0001)新建runtime_cfg.py: device "cuda" gpu_ids [0, 1] batch_size 64 epochs 100 num_workers 8新建resnet50.py: _base_ […

PostgreSQL 小课专栏大纲

PostgreSQL 介绍及发展历史 介绍 发展历史 克隆 PostgreSQL 的源代码 找到其第一次提交记录 看下第一次提交的信息 发布策略、版本号及生命周期 探索 PostgreSQL 中的术语 总结 PostgreSQL 安装 编译方式安装 yum 方式安装 apt 方式安装 Docker 方式运行 Mac/Win…

Observer(观察者模式)

1. 意图 定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。 在观察者模式中&#xff0c;有两类对象&#xff1a;被观察者&#xff08;Subject&#xff09;和观察者&#xff08;Observer&#xf…

单片机原理与技术

文章目录 一、单片机概述二、单片机的基本原理1. **硬件结构**2. **指令系统** 三、单片机的关键技术1. **编程技术**2. **接口技术**3. **嵌入式系统技术** 四、单片机在现代科技中的应用 一、单片机概述 单片机&#xff0c;全称为单片微型计算机&#xff08;Single-Chip Mic…

Vue 路由设置

为了防止遗忘&#xff0c;记录一下用Vue写前端配置路由时的过程&#xff0c;方便后续再需要用到时回忆。 一、举个例子 假如需要实现这样的界面逻辑&#xff1a; 在HomePage中有一组选项卡按钮用于导航到子页面&#xff0c;而子页面Page1中有一个按钮&#xff0c;其响应事件是…

笔记-stm32移植ucos

文章目录 一、UCOS的基础知识1.1 前后台系统:1.2 RTOS系统可剥夺型内核:前后台系统和RTOS系统 1.3 UCOS系统简介学习方法 二、ucossii移植Step1&#xff1a;在工程中建立存放UCOSS代码的文件夹UCOSIIStep2:向CORE文件夹添加文件Step3:向Config文件夹添加文件Step4:向port文件夹…

LLM4Rec最新工作: 字节发布用于序列推荐的分层大模型HLLM

前几个月 Meta HSTU 点燃各大厂商对 LLM4Rec 的热情&#xff0c;一时间&#xff0c;探索推荐领域的 Scaling Law、实现推荐的 ChatGPT 时刻、取代传统推荐模型等一系列话题让人兴奋&#xff0c;然而理想有多丰满&#xff0c;现实就有多骨感&#xff0c;尚未有业界公开真正复刻 …

后端复习资料

后端面试资料 语雀-图灵面试题 语雀-javaGuide 小林coding&#xff1a;https://www.xiaolincoding.com/ 面试鸭&#xff1a; https://www.mianshiya.com/ codehot香菜哥&#xff1a;https://codehot.cn/markdown/welfare 面试题&#xff1a; vizard自行整理 牛客Golang社招面…

vscode中配置python虚拟环境

python虚拟环境作用 Python虚拟环境允许你为每个独立的项目创建一个隔离的环境&#xff0c;这样每个项目都可以拥有自己的一套Python安装包和依赖&#xff0c;不会互相影响。实际使用中&#xff0c;可以在vscode或pycharm中使用虚拟环境。 1.创建虚拟环境的方法&#xff1a; …

【NLP自然语言处理】01-基础学习路径简介

目的&#xff1a;让大家能够在 AI-NLP 领域由基础到入门具体安排&#xff1a; NLP介绍 文本预处理RNN 及其变体&#xff08;涉及案例&#xff09;Transformer 原理详解迁移学习 和 Bert 模型详解 &#xff08;涉及案例&#xff09;特点&#xff1a; 原理 实践每个文章会有练习…

04-SpringBootWeb案例(中)

3. 员工管理 完成了部门管理的功能开发之后&#xff0c;我们进入到下一环节员工管理功能的开发。 基于以上原型&#xff0c;我们可以把员工管理功能分为&#xff1a; 分页查询&#xff08;今天完成&#xff09;带条件的分页查询&#xff08;今天完成&#xff09;删除员工&am…

算法题总结(十)——二叉树上

#二叉树的递归遍历 // 前序遍历递归LC144_二叉树的前序遍历 class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> result new ArrayList<Integer>(); //也可以把result 作为全局变量&#xff0c;只需要一个函数即可。…

Linus Torvalds 要求内核开发人员编写更好的 Git 合并提交信息

昨天在宣布 Linux 6.12-rc2 内核时&#xff0c;Linus Torvalds 要求内核维护者在提交信息方面做得更好。Torvalds 尤其希望内核维护者在描述拉取请求中的变更时&#xff0c;能更好地使用积极、命令式的语气。 Linux创建者在6.12-rc2 公告中解释道&#xff1a; 总之&#xff0c…

论文阅读笔记-XLNet: Generalized Autoregressive Pretraining for Language Understanding

前言 Google发布的XLNet在问答、文本分类、自然语言理解等任务上都大幅超越BERT,XLNet提出一个框架来连接语言建模方法和预训练方法。我们所熟悉的BERT是denoising autoencoding模型,最大的亮点就是能够获取上下文相关的双向特征表示,所以相对于标准语言模型(自回归)的预…