文件系统基础(一)

目录

  • 一 . 文件的基本概念
    • 文件的结构
    • 文件的属性
    • 文件的分类
  • 二. 文件控制块和索引节点
    • 文件控制块(FCB)
    • 索引节点
      • 磁盘索引节点
      • 内存索引节点
  • 三. 文件的操作
    • 文件的基本操作
    • 文件的打开与关闭
      • 文件打开
      • 文件关闭
      • 文件名与文件描述符的应用
  • 四. 文件的保护
    • 访问类型
    • 访问控制
      • 精简的访问控制列表
      • 口令和密码
  • 五. 文件的逻辑结构
    • 无结构文件
    • 有结构文件
      • 顺序文件
      • 索引文件
      • 索引顺序文件
      • 直接文件或散列文件(Hash File)

一 . 文件的基本概念

  • 文件(File):以硬盘为载体的存储在计算机上的信息集合。可以是文本文档、图片、程序等。
    • 用户输入输出的基本单位。
  • 文件系统(File System):用于实现用户对文件的访问,修改和保存和维护管理等。

文件的结构

实际上关于文件并没有严格的结构化定义。

  • 数据项。文件系统中最低级的数据组织形式。分为以下两种类型:
    • 基本数据项。用于描述一个对象的某种属性的一个值,数据中最小的逻辑单位。
    • 组合数据项。由多个数据项组成。
  • 记录:一组相关数据项的集合,用于描述一个对象在某方面的属性。
  • 文件:由创建者定义的、具有文件名的一组相关元素的集合,可以分为有结构文件和无结构文件。
    • 有结构文件中,文件由若干个相似的记录组成。
    • 无结构文件被视为一个字符流,比如一个二进制文件或字符文件。

文件的属性

除文件数据外的附加信息,称为文件的属性或文件元数据。

  • 名称。同一路径下文件名唯一,以容易读取的形式保存。
  • 类型。被支持不同类型的文件系统所使用。
  • 创建者。文件创建者的 ID。
  • 所有者。文件当前所有者的 ID。
  • 位置。文件的存放路径(用户使用),在外存的地址(OS 使用,用户不可见)。
  • 大小。当前文件大小(用字节、字或块表示),也可以包含文件允许的最大值。
  • 保护。对文件进行保护的访问控制信息。
  • 创建时间、最后依次修改时间和最后一次存取时间。文件创建、上次修改和上次访问的相关信息,用于保护和跟踪文件的使用。

OS 通过文件控制块(FCB)来维护文件的元数据。

文件的分类

常见的文件分类方法:

  • 按性质和用途分类
    • 系统文件
    • 用户文件
    • 库文件
  • 按文件中数据的形式分类
    • 源文件
    • 目标文件
    • 可执行文件
  • 按存取控制属性分类
    • 可执行文件
    • 只读文件
    • 读/写文件
  • 按组织形式和处理方式分类
    • 普通文件
    • 目录文件
    • 特殊文件

二. 文件控制块和索引节点

文件控制块(FCB)

文件控制块(File Control Block,FCB)用来存放控制文件需要的各种信息的数据结构,以实现按名存取。
文件目录:FCB 的有序集合。一个 FCB 就是一个文件目录项。

通常,一个文件目录也被视为一个文件,称为目录文件。

典型 FCB 如下图:

文件名
类型
文件权限(读,写)
文件大小
文件数据块指针

FCB 主要包含信息:

  • 基本信息
    • 文件名
    • 文件的物理位置
    • 文件的逻辑结构
    • 文件的物理结构等
  • 存取控制信息
    • 文件主存取权限
    • 核准用户存取权限
    • 一般用户存取权限
  • 使用信息
    • 文件建立时间
    • 上次修改时间等

索引节点

文件目录通常存放在磁盘上,文件很多时,文件名目录就会大量占用磁盘块。
查找目录过程需要将存放目录的盘块依次调入内存,然后逐一匹配文件名。而文件的其他描述信息不会用到,也不需要调入内存。

因此,有的操作系统(如 UNIX)采用文件名和文件描述信息分离的方法,使得文件描述信息单独形成一个称为索引节点的数据结构,简称 i 节点(innode)。
在文件目录的每一个目录项仅有文件名和相应的索引节点号(或索引结点指针)构成。

索引节点的使用可以减少文件目录项的大小,节省存储空间和查找的系统开销。

磁盘索引节点

  • 是指存放在磁盘上的索引节点

每个文件只有一个唯一的磁盘索引节点,主要 包括以下内容:

  • 文件主标识符。拥有该文件的个人或小组标识符。
  • 文件类型。普通文件,目录文件,特别文件。
  • 文件存取权限。各类用户对文件的存取权限。
  • 文件物理地址
    • 每个索引节点包含 13 个地址项,即 iaddr(0)~iaddr(12),它们以直接或间接方式给出数据文件所在盘块的编号(见 文件的物理结构 部分)
  • 文件长度。以字节为单位的文件长度。
  • 文件链接计数。本文件系统中所有指向该文件的文件名的指针计数。
  • 文件存取时间。本文件最近被进程存取、修改的时间及索引节点最近被修改时间。

内存索引节点

  • 是指存放在内存的索引节点。

文件被打开时,需要将磁盘索引节点复制到内存索引节点中,以便后续使用。内存索引节点新增了以下内容:

  • 索引节点号。用于标识内存索引节点。
  • 状态。指示 i 节点是否上锁或被修改。
  • 访问计数。每当有一个进程访问此 i 节点,计数加 1;访问结束减 1。
  • 逻辑设备号。文件所属文件系统的逻辑索引号。
  • 链接指针。设置分别指向空闲链表和散列队列的指针。

FCB 或索引节点相当于图书馆的图书索引号,根据索书号查找相要的图书。

三. 文件的操作

文件的基本操作

文件属于抽象数据类型。为了正确定义文件,需要考虑对文件执行的操作

OS 提供一系列系统调用,实现对文件的创建,删除,读,写,打开和关闭等操作。

  • 创建文件
    • (create 系统调用)
    • 为新文件分配外存空间
    • 在目录中为新文件创建一个目录项,记录新文件名、文件在外存中的地址信息。
  • 删除文件
    • (delete 系统调用)
    • 根据文件名查找目录,删除指定文件对应的目录项和 PCB (文件控制块)。
    • 回收该文件占用的存储空间。(磁盘空间和内存缓存区)
  • 读文件
    • (read 系统调用)
    • 根据文件名查找目录,找到文件对应的目录项,得到被读文件在外存的地址。
    • 在目录项中,有一个指针用于对文件进行读操作。
  • 写文件
    • (write 系统调用)
    • 根据文件名查找目录,找到指定目录的目录项,利用目录项的写指针对文件进行写操作。
    • 每当发生写操作时,更新写指针

文件的打开与关闭

文件打开

当用户对一个文件实施多次读/写等操作时,每次都要从检索目录开始。

为了避免多次重复地 检索目录,大多数操作系统要求,当用户首次对某文件发出操作请求时,须先利用系统调用open 将该文件打开。

系统维护一个包含所有打开文件信息的表,称为打开文件表

所谓“打开”,是 指系统检索到指定文件的目录项后,将该目录项从外存复制到内存中的打开文件表的一个表目 中,并将该表目的索引号(也称文件描述符)返回给用户。
当用户再次对该文件发出操作请求时, 可通过文件描述符在打开文件表中查找到文件信息,从而节省了大量的检索开销。

当文件不再使 用时,可利用系统调用close关闭它,则系统将会从打开文件表中删除这一表目。

文件关闭

在多个进程可以同时打开文件的操作系统中,通常采用两级表:整个系统表每个进程表

通常,系统打开文件表为每个文件关联一个打开计数器(Open Count),以记录多少进程打 开了该文件。
当文件不再使用时,利用系统调用close关闭它,会删除单个进程的打开文件表中 的相应条目,系统表中的相应打开计数器也会递减。当打开计数器为0时,表示该文件不再被使 用,并且可从系统表中删除相应条目。图4.3展示了这种结构。
在这里插入图片描述

文件名与文件描述符的应用

  • 文件名不必是打开文件表的一部分,因为一旦完成对 FCB 在磁盘上的定位,OS 就不再需要文件名。
  • 对于访问打开文件表的索引号。
    • UNIX 称之为文件描述符
    • Windows 称为文件句柄。

因此,只要文件未被关闭,所有文件操作都是通过文件描述符(而不是文件名)来进行的。

Tips:因此,只要完成了文件打开 open()系统调用,后面再使用 read(),write(),Lseek(),close() 等文件操作的系统调用。都不再使用文件名,而是文件描述符。

四. 文件的保护

文件系统中,建立文件保护机制用于解决对文件的读,写,执行的许可问题。

实现方式

  • 口令保护。防止用户文件被他人存取或窃取。
  • 加密保护。
  • 访问控制。控制用户对文件的访问方式。

访问类型

可以加以控制的访问类型由以下几种:

  • 。从文件读出数据。
  • 。向文件写入数据。
  • 执行。将文件装入内存并执行。
  • 添加。将新信息添加到文件结尾部分。
  • 删除。删除文件,释放空间。
  • 列表清单。列出文件名和文件属性。

此外,还可以对文件的重命名,复制,编辑等加以控制。这些高层的功能可以通过调用底层系统调用来实现。
保护只可以在底层提供
例如:复制文件使用一系列读请求来完成。
这样,具有读访问权限的用户同时也就具有了复制和打印权限。

访问控制

解决访问控制常用方法是根据用户身份进行控制。
实现基于身份访问的最普通方法:为每个文件和目录增加 访问控制列表(Access-Control List,ACL),以规定每个用户名以及所允许的访问类型。

  • 优点:可以使用复杂的访问方法
  • 缺点:长度无法预计并且可能导致复杂的空间管理。可以使用精简访问列表解决

精简的访问控制列表

可以采用拥有者、组和其他三种用户类型。

  • 拥有者。创建文件的用户。
  • 组。一组需要共享文件且具有类似访问的用户。
  • 其他。系统内所有其他用户。

访问控制列表实例如下图:
联想截图_20240727181506.png

口令和密码

  • 口令
    • 建立一个文件时,系统为其建立 FCB 时候附上相应口令,同时告诉允许共享该文件的其他用户。用户请求访问时候要提供口令。
    • 优点:时间空间开销不大。
    • 缺点:口令直接存储在系统内部,不够安全。
  • 密码
    • 是指用户对文件进行加密,被访问时需要使用密钥。
    • 优点:保密性强,节省了存储空间。
    • 缺点:编码译码需要花费时间。

口令和密码都是防止用户被他人存取或窃取,没有控制用户对文件的访问类型。
对于多级目录结构而言,还需要保护目录子文件【即提供目录保护机制】。目录的操作与文件不同,保护机制也不一样。

五. 文件的逻辑结构

联想截图_20240727181817.png

无结构文件

联想截图_20240727181919.png

有结构文件

联想截图_20240727182012.png

  • 定长记录
    • 文件中所有记录长度相同,各数据项在记录中的相同位置,具有相同长度。
    • 检索记录的速度快,方便用户对文件进行处理。
    • 广泛用于数据处理中。
  • 变长记录
    • 文件中各个记录长度不一定相同。原因可能是记录中包含的数据项数目不同,也可能是数据项本身长度不固定。
    • 只能顺序查找,速度慢。

有结构文件又可以按记录的组织形式分为顺序文件,索引文件,索引顺序文件。

顺序文件

联想截图_20240727182824.png联想截图_20240727183042.png联想截图_20240727183052.png

索引文件

联想截图_20240727183147.png

索引顺序文件

联想截图_20240727183321.png联想截图_20240727183343.png
联想截图_20240727183500.png

直接文件或散列文件(Hash File)

给定记录的键值或通过散列函数转换的键值直接决定记录的物理地址。散列文件具有很高的存取速度,但是会引起冲突,即不同关键字的散列函数值可能相同。

可以类比数据结构的哈希查找,会有这样的感觉:有结构文件逻辑上的组织,是为在文件中查找数据服务的(顺序查找、索引查找、索引顺序查找、哈希查找)。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

用PyTorch从零开始编写DeepSeek-V2

DeepSeek-V2是一个强大的开源混合专家(MoE)语言模型,通过创新的Transformer架构实现了经济高效的训练和推理。该模型总共拥有2360亿参数,其中每个令牌激活21亿参数,支持最大128K令牌的上下文长度。 在开源模型中&…

Godot入门 02玩家1.0版

添加Node2D节点,重命名Game 创建玩家场景,添加CharacterBody2D节点 添加AnimatedSprite2D节点 从精灵表中添加帧 选择文件 设置成8*8 图片边缘模糊改为清晰 设置加载后自动播放,动画循环 。动画速度10FPS,修改动画名称idle。 拖动…

数据结构之探索“堆”的奥秘

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏:数据结构(Java版) 目录 堆的概念 堆的创建 时间复杂度分析: 堆的插入与删除 优先级队列 PriorityQ…

学习大数据DAY23 Linux基本指令4与ngnix安装以及Shell,python编写环境配置

目录 其他扩展类 echo 输出字符串 date 显示当前日期 (用于日期转字符串) date -d 日期解析(用于字符串转日期) date 设置日期 linux 网络对时 cal 查看日历 wget 命令 seq 命令 Linux 定时执行计划 特殊符号说明 linux 添加硬盘分区挂载 上…

【QT】QT 系统相关(事件、文件、多线程、网络、音视频)

一、Qt 事件 1、事件介绍 事件是应用程序内部或者外部产生的事情或者动作的统称。在 Qt 中使用一个对象来表示一个事件。所有的 Qt 事件均继承于抽象类 QEvent。事件是由系统或者 Qt 平台本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制…

初阶数据结构完结 图解所有初阶数据结构 顺序表

1数据结构 1.线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中⼴泛使 ⽤的 数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构,也就说是连…

Centos7_Minimal安装Cannot find a valid baseurl for repo: base/7/x86_6

问题 运行yum报此问题 就是没网 解决方法 修改网络信息配置文件,打开配置文件,输入命令: vi /etc/sysconfig/network-scripts/ifcfg-网卡名字把ONBOOTno,改为ONBOOTyes 重启网卡 /etc/init.d/network restart 网路通了

SSRF中伪协议学习

SSRF常用的伪协议 file:// 从文件系统中获取文件内容,如file:///etc/passwd dict:// 字典服务协议,访问字典资源,如 dict:///ip:6739/info: ftp:// 可用于网络端口扫描 sftp:// SSH文件传输协议或安全文件传输协议 ldap://轻量级目录访问协议 tftp:// 简单文件传输协议 gopher…

Python | TypeError: ‘float’ object is not subscriptable

Python | TypeError: ‘float’ object is not subscriptable 在Python编程中,遇到“TypeError: ‘float’ object is not subscriptable”这一错误通常意味着你尝试对浮点数(float)使用了下标访问(如数组或列表那样的访问方式&a…

Typecho仿百度响应式主题Xaink源码

新闻类型博客主题,简洁好看,适合资讯类、快讯类、新闻类博客建站,响应式设计,支持明亮和黑暗模式 直接下载 zip 源码->解压后移动到 Typecho 主题目录->改名为xaink->启用。 源码下载:https://download.csdn…

【秋招笔试题】小Q的树

解析&#xff1a;分析易得走过的路中至多存在一个分叉&#xff0c;则维护每个结点接下来的路的最大值与次大值然后相加即可。 #include <iostream> #include <vector> #include <algorithm> using namespace std; #define int long long const int MAXN 1…

09 算术运算符

① 运算符除了用于算数加法以外&#xff0c;还可以用于列表、元组、字符串的连接&#xff0c;但不支持不同类型的对象之间的相加或连接。 print([1, 2, 3] [4, 5, 6]) # 连接两个列表 print((1, 2, 3) (4,)) # 连接两个元组 print(hello 123) # 连接字符串 print(Fa…

c语言第四天笔记

关于 混合操作&#xff0c;不同计算结果推理 第一种编译结果&#xff1a; int i 5; int sum (i) (i) 6 7 13 第二种编译结果&#xff1a; int i 5; int sum (i) (i) 6 7 7 7 前面的7是因为后面i的变化被影响后&#xff0c;重新赋值 14 第一种编译结果&#xff…

【Linux网络】应用层协议:HTTP 与 HTTPS

本篇博客整理了 TCP/IP 分层模型中应用层的 HTTP 协议和 HTTPS协议&#xff0c;旨在让读者更加深入理解网络协议栈的设计和网络编程。 目录 一、协议是什么 1&#xff09;结构化数据的传输 2&#xff09;序列化和反序列化 补&#xff09;网络版计算器 .1- 协议定制 .2- …

OpenAI推出SearchGPT:革新搜索体验的新工具

引言 原文链接 在信息爆炸的时代&#xff0c;搜索引擎已经成为人们日常生活中不可或缺的工具。然而&#xff0c;传统的搜索引擎在理解复杂查询和提供准确答案方面仍有许多不足。为了解决这一问题&#xff0c;OpenAI与20240725推出了SearchGPT原型&#xff0c;将生成式AI与传统…

【Golang 面试基础题】每日 5 题(九)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

【Android】Fragment与Activity间通信知识总结

文章目录 一、Activity向Fragment通信1.1 通过方法1.1.1 构造方法1.1.1 普通public方法 1.2 通过setArguments方法1.3 通过接口 二、Fragment向Activity通信2.1 通过getActivity2.2 通过接口 三、Fragment之间传递数据通过Activity中转 一、Activity向Fragment通信 1.1 通过方…

聊聊基于Alink库的主成分分析(PCA)

概述 主成分分析&#xff08;Principal Component Analysis&#xff0c;PCA&#xff09;是一种常用的数据降维和特征提取技术&#xff0c;用于将高维数据转换为低维的特征空间。其目标是通过线性变换将原始特征转化为一组新的互相无关的变量&#xff0c;这些新变量称为主成分&…

关于链表、顺序表、栈和队列的一些总结

关于链表、顺序表、栈和堆的一些总结 1.顺序表2.链表2.1 单向链表2.1 带哨兵位双向循环链表 3.栈4.队列 1.顺序表 2.链表 2.1 单向链表 2.1 带哨兵位双向循环链表 3.栈 4.队列

【Matlab】绘图时使用字母控制线型和颜色(内含多图对比示例)

概要 测试了英文字母a-z不同输入下线条的颜色和线型&#xff0c;供参考选择。 语法 plot(x, y, 颜色); 如 plot(x, y, b); 测试 以下测试设置线宽为1.5&#xff0c;代码 x 0: 0.01: 2*pi; y sin(x); plot(x, y, b, LineWidth, 1.5);修改时把 b 改成不同字母即可 ‘a’…