Linux文件系统(操作系统的文件管理)

一.Linux系统的文件接口

我们先介绍下Linux系统俩种的文件接口,引出一些问题。

1.open()

我们看下说明:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

pathname: 要打开或创建的目标文件

flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags参数:

  • O_RDONLY: 只读打开
  • O_WRONLY: 只写打开
  • O_RDWR : 读,写打开 这三个常量,必须指定一个且只能指定一个
  • O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限 O_APPEND: 追加写data

mode:表示设置文件访问权限的初始值,和用户掩码umask有关。 

返回值: 成功:新打开的文件描述符 ,失败:-1

2.close
int close(int fd);

作用:关闭fd文件描述符所对应的文件。 

函数返回值:0成功,-1出错

二.内存级文件的管理

open函数的返回值为一个整型,那么我们是如何通过这个整型找到对应的文件执行操作的呢?

1.struct file

进程是计算机系统执行计算任务的基本单位,进程访问文件执行数据读写之前,操作系统会从外设获取相应的文件信息,在内存中建立struct file结构体对象来描述和管理文件,进程借助struct file结构体提供的文件信息执行文件操作。 

2.进程PCBstruct task_struct与文件struct file之间的关联

进程pcb中含有一个*files指针,指向一个file*的数组,file*指针再指向对应的struct file结构体,这样我们的进程只要有文件在数组中的下标,我们就可以访问到对应的文件。那么这个数组下标是什么呢,没错,file*的数组下标就是文件描述符fd。 

因此,open函数只要返回一个文件描述符fd,我们的进程就可以通过对应的数组位置找到 struct file,其他文件接口也是如此。

3.linux下一切皆文件的理解

当我们加载硬件到内存时,操作系统也会为对应的硬件用struct file来描述,将他当成文件看待

struct file 中封装了文件的基本信息,其中也封装了文件的方法集,方法集中含有的文件方法指针又指向了具体的方法(如文件提供的读写方法)。

这样我们操作文件时可以屏蔽不同文件(不同设备)的差异 。

三.文件缓冲区

在linux中还存在文件缓冲区,他是在内存中由struct file 来维护的一块区域,当文件缓冲区满足条件后才会输入到文件中。

文件缓存区的优点:聚集数据一次拷贝,提升整体效率。

需要注意的是我们谈的是内核级的缓存区,在各种语言中也有文件缓存区,例如c语言。这样可以监视系统调用的开销,我们会先将内容填充语言提供的缓存区,满足条件后刷新到内核级缓冲区,最后再写入到文件中去。

四.磁盘的物理构造

磁盘可以简单看成是由许多盘片和磁头构成的,每一面都对应有一个磁头来读取信息。

每个盘片上的一个特定的圆环就是磁道/柱面,其中的一段圆弧就是扇区,每一个磁道和扇区都有特定的编号。

当我们查找文件时就可以用CHS定位法

 

这就是为什么我们可以看到磁盘工作时要旋转(找扇区)和伸缩的(找磁道)的理由。 

五.磁盘级文件管理

1.磁盘的逻辑存储

物理上的磁盘是一个个环但是我们在逻辑上我们可以把它看成一个顺序存储的线:

我们可以把他看出无数扇区构成的线,这样我们只要有相应的扇区编号sector,就可以用下面的方法来找出盘片,磁道,扇区的对应位置。

需要注意的是操作系统认为一次操作一个扇区太小了(512字节),一次操作的是4kb,8个扇区,因此在操作系统的眼里磁盘是这样的

 

 2.具体构造

文件=文件属性+文件内容,管理文件就需要管理文件属性和文件内容

由于单纯管理一个磁盘太大了,我们把磁盘先分区后分组,来进行管理,当我们能管理一个分区,就可以用相同的方法管理其他的分区。

块组的组成部分:

  • SuperBlock(超级块):包含的是整个文件系统的全局信息,比如 inode 总个数、块总个数、每个块组的 inode 个数、每个块组的块个数等等。SuperBlock的存在意义是备份文件系统的重要全局信息,保证文件系统的安全性和稳定性(属于区级信息,部分组中有)
  • GroupDescriptorTable(块组描述符):包含文件系统中所有块组的属性信息,与SuperBlock的作用类似。(组间信息,每个组都有)
  • BlockBitmap(数据位图)和inodeBitmap (inode 位图): 用于标识对应的数据块或inode是空闲的,还是正在被使用中。
  • inodeTable(inode 列表):包含了块组中所有的inode,inode与磁盘文件是一一对应的关系,inode中存储磁盘文件的文件信息和文件的数据块引索
  • Data blocks(数据块):存储文件的有效数据
     

Data blocks 可以看成用来存储数据的数据块 :

 

inode Table可以看成存了许多的struct inode结构体的表格, struct inode里面存储了文件的属性(注意没有存储文件名),如大小,类型,权限等等,因此struct inode的大小是固定的。除了文件信息,inode结构体中还存了两个重要的属性:inode 编号和int block[15],前者是用来表示不同的inode,后者是用来表明该文件用了哪些数据块。

 当操作系统要操作文件时,需要的只是inode 编号,通过inode编号,我们就可以找到文件的stuct inode,再通过int block[15],就可以找到对应的数据块执行操作。

那么我们是怎么获得inode编号的呢,首先任何一个文件都存在于一个目录中,目录也是一个文件,他也有文件内容,那么他的文件内容是什么呢? 目录下其他文件的文件名和inode的映射关系 

因此,我们通过文件名及映射关系就可以找到inode编号,需要注意的是目录也是文件,要访问目录的内容,也需要目录的inode编号,而要目录的inode编号,我们就要访问上级目录的文件内容,这样就会一直递归,直到根目录,根目录的inode编号是确定的。比如我们要访问/temp/file1/ha.txt下的文件内容,用根目录的inode编号访问到temp的文件名和inode编号的映射关系,从而得到temp的inode编号,再这样逐层访问,找到ha.txt的inode编号。

需要注意的是我们上述的讨论都是在一个分区内,对于不同的分区inode编号都是从零开始的,这时我们要怎么通过inode编号来找呢?

这里我们就要明白,一个具有文件系统的分区,要被Linux使用,就要将这个分区进行挂载到对应的目录下 这样我们通过路径的前缀就可以知道对应的分区。

六.总结

 我们从内存级文件讲到了磁盘级文件,明白了文件描述符的意义,也明白了PCB如何与struct file产生关系,也讲了文件缓存区的存在及理由,同时讲解了磁盘的物理构造及操作系统的对他的管理。相信一定会加深你对Linux操作系统文件的理解。

 

 

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

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

相关文章

《大道平渊》· 拾 —— 身心的“肥胖”与我们不知饥渴的病:追求中的丰盈与节制

《平渊》 拾 "水满则溢&#xff0c;月盈则亏。" 《道德经》有言&#xff1a;"水满则溢&#xff0c;月盈则亏"。 意思是&#xff1a;水满了就会溢出&#xff0c;月亮最圆的时候就会走向亏的状态。 这揭示了自然界和人类社会中一切事物的内在规律 —— 任…

Proxmox VE虚拟机与容器管理平台安装指南

上篇文章说了ESXI和Proxmox VE&#xff08;简称pve&#xff09;区别&#xff0c;由于需要从esxi5.迁移到PVE8.2&#xff0c;所以开始简单的在一个测试机上的部署个说明指南&#xff0c;以备无患。 一、引言 Proxmox VE是一款基于Debian Linux的完全开源平台&#xff0c;专为虚…

6-Maven的使用

6-Maven的使用 常用maven命令 //常用maven命令 mvn -v //查看版本 mvn archetype:create //创建 Maven 项目 mvn compile //编译源代码 mvn test-compile //编译测试代码 mvn test //运行应用程序中的单元测试 mvn site //生成项目相关信息的网站 mvn package //依据项目生成 …

【代码随想录】【算法训练营】【第30天】 [322]重新安排行程 [51]N皇后 [37]解数独

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 30&#xff0c;周四&#xff0c;好难&#xff0c;会不了一点~ 题目详情 [322] 重新安排行程 题目描述 322 重新安排行程 解题思路 前提&#xff1a;…… 思路&#xff1a;回溯。 重点&…

RabbitMQ--Hello World(基础详解)

文章目录 先决条件RabbitMQ 初识RabbitMQ--Hello World发送接收 更多相关内容可查看 先决条件 本教程假定 RabbitMQ 已安装并在标准端口 &#xff08;5672&#xff09; 上运行。如果你 使用不同的主机、端口或凭据&#xff0c;连接设置将需要 调整。如未安装可查看Windows下载…

Nvidia/算能 +FPGA+AI大算力边缘计算盒子:桥梁结构安全监测

中国铁路设计集团有限公司&#xff08;简称中国铁设&#xff09;&#xff0c;原铁道第三勘察设计院集团有限公司&#xff08;铁三院&#xff09;&#xff0c;是中国国家铁路集团有限公司所属的唯一设计企业&#xff0c;成立于1953年&#xff0c;总部位于天津市&#xff0c;是以…

f4pga环境搭建教程

f4pga环境搭建教程 背景介绍 FOSS Flows For FPGA (F4PGA) project&#xff0c;是一套开源的FPGA工具链&#xff0c;号称the GCC of FPGAs&#xff0c;作用是将写的硬件描述语言&#xff08;verilog或VHDL&#xff09;转化为可以在FPGA上运行的可执行文件&#xff08;bit文件…

滨江区代理记账——专业、便捷的服务,让您的企业更加规范、高效

随着社会经济的发展和企业的规模扩大&#xff0c;依法纳税、做好财务工作变得越来越重要&#xff0c;而代理记账&#xff0c;就是这样一个专业的服务平台&#xff0c;为满足广大企业和个体户的会计需求&#xff0c;帮助他们规范财务管理&#xff0c;提高效率。 代理记账可以帮助…

基于R语言BIOMOD2 及机器学习方法的物种分布模拟与案例分析

原文链接&#xff1a;基于R语言BIOMOD2 及机器学习方法的物种分布模拟与案例分析https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247606139&idx4&snf94ec30bfb5fa7ac0320403d49db3b66&chksmfa821e9ccdf5978a44a9ba96f6e04a121c0bbf63beea0940b385011c0b…

MLU370-M8 chattts-ui快速出击

目录 一、paas平台环境选择二、代码环境准备1.代码下载2.环境安装modelsopetransformersaccelerate 3.常规pip安装4.代码修改4.代码修改 三.算法启动 一、paas平台环境选择 驱动选择&#xff1a;5.10.22及以上 镜像选择&#xff1a;pytorch2.1 二、代码环境准备 1.代码下载…

李廉洋:6.6黄金原油怎么看?今日行情分析及最新策略。

黄金消息面分析&#xff1a;美指走强未能抑制金价升势。黄金价格大幅上涨&#xff0c;在美国公布喜忧参半的经济数据后&#xff0c;金价与周二的走势发生180度大转弯&#xff0c;这些数据可能保证美联储设定的借贷成本降低。美国10年期基准国债收益率下跌3个基点&#xff0c;至…

Spring Cloud工程添加子模块打包后文件为war包而非jar包

Spring Cloud工程添加子模块打包后文件为war包而非jar包 Spring Cloud子模块打出的包通常是JAR包而非WAR包&#xff0c;这是因为Spring Cloud主要基于Spring Boot构建&#xff0c;而Spring Boot默认打包为可执行JAR包。然而&#xff0c;如果遇到了Spring Cloud子模块打成了WAR…

【论文阅读】SELF-RAG,让模型决策和反思检索

关于LLM何时使用RAG的问题&#xff0c;原本是阅读了关于ADAPT-LLM模型的那篇论文&#xff0c;被问到与SELF-RAG有何区别。所以&#xff0c;大概看了一下SELF-RAG这篇论文&#xff0c;确实很像&#xff0c;这些基于LLM针对下游任务的模型架构和方法&#xff0c;本来就很像。不过…

【Mybatis】源码分析-自定义框架

1、自定义持久层框架 1.1、分析JDBC操作问题 package blnp.net.cn.jvm.demos;import java.sql.*;/*** <p></p>** author lyb 2045165565qq.com* createDate 2024/5/24 14:24*/ public class JdbcTest {public static void main(String[] args) {Connection conne…

红酒保存中的软木塞与瓶身保护

云仓酒庄雷盛红酒&#xff0c;以其卓着的品质和精美的包装赢得了众多消费者的喜爱。在红酒的保存过程中&#xff0c;软木塞与瓶身保护是至关重要的环节。本文将深入探讨这两方面的问题&#xff0c;以帮助消费者更好地理解和欣赏云仓酒庄雷盛红酒。 首先&#xff0c;我们来谈谈软…

gitee上传整个项目文件夹

1.访问git官网并下载 Git 如下图&#xff1a; 点击download&#xff0c;然后选择合适的版本进行下载&#xff1a; 如下图&#xff0c;我下载的是2.32.0.2版本&#xff0c;64位windows版。 下载完之后&#xff0c;直接点击安装。 然后根据向导&#xff0c;一路默认到安装完成。…

SL3160 替换PN6008 耐压150V 降5V输出降压恒压芯片 脚位一样

在电子工程领域&#xff0c;芯片替换是一项常见且至关重要的任务。今天&#xff0c;我们将详细探讨SL3160芯片如何替换PN6008芯片&#xff0c;重点关注两者在耐压150V和降5V输出降压恒压方面的性能对比&#xff0c;以及它们脚位一致性的优势。 我们来了解一下SL3160和PN6008这两…

Java工程师的行业的生命周期

在现代商业环境中&#xff0c;理解行业的生命周期是每一个企业家、经理人以及市场分析师必须掌握的关键知识。行业的生命周期不仅决定了企业的战略方向&#xff0c;也影响着资源配置、产品开发、市场营销等各个方面。认识行业生命周期的重要性在于它能够帮助企业在不同的阶段采…

关于vue2 antd 碰到的问题总结下

1.关于vue2 antd 视图更新问题 1.一种强制更新 Vue2是通过用Object…defineProperty来设置数据的getter和setter实现对数据和以及视图改变的监听的。对于数组和对象这种引用类型来说&#xff0c;getter和setter无法检测到它们内部的变化。用这种 this.$set(this.form, "…

搜狗输入法的软键盘怎么关闭

我的搜狗输入法软件盘和typora中ctrlshiftk冲突了&#xff0c;关闭软键盘