探索文件系統:高效、可靠的文件管理與訪問機制

来源:https://www.cnblogs.com/guoxiaoyu/archive/2023/09/04/17668443.html
-Advertisement-
Play Games

本篇文章探索了文件系統的功能規劃,著重討論了文件存儲、索引節點和目錄項的管理、緩存策略以及文件數據的存儲等方面。文件系統作為電腦系統中重要的組成部分,對於實現高效、可靠的文件管理與訪問機制至關重要。通過深入瞭解文件系統的基本單位、元信息記錄和目錄結構,我們可以更好地理解文件系統的工作原理,本文旨在... ...


文件系統的功能規劃

記憶體就像是一個書包,容量有限,只能帶著一部分東西。而圖書館則是一個專門存儲和管理文件的地方,擁有更大的容量,並且可以永久保存文件。為了能夠快速找到需要的文件,我們需要有一個書單來記錄每本書放在哪裡,這個書單就相當於文件系統的索引區,記錄著文件的位置和相關信息。同時,為了提高訪問效率,熱門借閱的書會放在最前面供大家選擇,避免每次都要去遠處找書。通過良好的文件系統規劃,我們可以提高數據管理的效率和安全性,本文將通過類似於圖書館的組織和管理方式再一步一步的講解文件是如何放入磁碟的、索引節點等這些知識點。

我們最常用的外部存儲就是硬碟,數據是以文件的形式保存在硬碟上的。為了有效地管理硬碟上保存的文件,在需要對文件系統進行優化規劃前,以下是一些需要考慮的重要因素:

image

第一點,文件系統應具備嚴格的組織形式,以便將文件以塊的形式進行存儲。可以將其類比為圖書館中的書架排列,將書架劃分為小格子,以便存放不同項目的資料。另外,可以將其類比為MySQL資料庫,其中的記錄也是逐條存儲的。

第二點,文件系統中也要有索引區,用來方便查找一個文件分成的多個塊都存放在了什麼位置。這可以類比為圖書館中設置的一排書架,上面清楚地標註了整個檔案庫中的資料以及它們在哪個書架的哪個格子上。這樣,在查找資料時就不需要遍歷整個檔案庫,只需找到對應的書架,然後直接定位到目標書架即可。類似地,在MySQL資料庫中,當表的數據量較大時,需要使用索引來快速查找數據記錄。

第三點,如果文件系統中存在熱點文件,經常被讀取和寫入,應該設置緩存層。這類似於圖書館的熱門圖書區,裡面存放的是暢銷書或經常被借還的圖書。由於借還次數較多,不需要每次還書都放回遠處的書架上,可以專門設置一個區域,用於存放這些借還頻率高的圖書。這樣可以提高借還效率。類比到我們的Redis,它也是用來緩存熱點數據,以免每次都需要查找資料庫。

第四點,為了方便管理和查詢,文件應該以文件夾的形式進行組織。這類似於圖書館中的資料分類,例如按電腦類、文學類、歷史類等進行分類。這樣可以更容易進行管理,項目組在借閱時只需在相應的分類中查找即可。類比到我們的MySQL資料庫,一個業務的數據應該放在一個表中,每個表不應存儲其他業務數據。如果你提到目錄中可以再包含目錄,那在資料庫中實現方式是使用關聯表。

在文件系統中,每個文件都有一個名字,我們可以通過這個名字來訪問文件。文件名是一個普通的文本,但是由於不同用戶可能取相同的名字,所以文件名衝突是常見的情況。

為了有序地組織大量的文件,我們可以將它們分組成目錄或文件夾的形式。這樣,一個文件夾可以包含其他文件夾和文件,形成了一種樹形結構。通過將不同用戶放在不同的用戶目錄下,可以在一定程度上避免命名衝突的問題。

image

第五點是,Linux內核需要在記憶體中維護一個數據結構,用於記錄哪些文件被哪些進程打開和使用。這可以類比於圖書館的圖書管理系統,記錄了哪些書被借閱、由誰借閱、借閱時長以及何時歸還。

文件系統的基本組成

一切皆文件

文件系統是操作系統的一個子系統,負責管理和存儲用戶的文件數據到磁碟硬體中。它的主要作用是使得即使在電腦斷電的情況下,磁碟中的數據仍然可以被保留下來,實現了文件的持久化保存。簡單來說,文件系統確保了用戶的文件數據的長期存儲和可靠性。

文件系統以文件為基本數據單位,其目的是對磁碟上的文件進行組織和管理。不同的組織方式會形成不同的文件系統。舉一些常見的文件系統例子:

  1. FAT32(File Allocation Table 32):FAT32是一種簡單的文件系統,主要用於Windows操作系統。它使用文件分配表(File Allocation Table)來跟蹤文件的存儲位置。FAT32對文件名的長度有限制,文件名不能超過8個字元,並且不支持文件的安全性和許可權控制。它在許多可移動存儲設備(如快閃記憶體驅動器)上使用廣泛。
  2. NTFS(New Technology File System):NTFS是Windows操作系統中較新的文件系統。它支持更大的文件和分區大小,並提供了更高級的安全性和許可權控制。NTFS還支持文件的壓縮、加密和日誌記錄,以提高數據的完整性和可靠性。
  3. ext4(Fourth Extended File System):ext4是Linux操作系統中常用的文件系統。它是ext文件系統家族的最新版本,支持更大的文件和分區大小,具有更好的性能和可靠性。ext4使用B樹數據結構來組織文件和目錄,提供了較快的文件查找和訪問速度。

當你將一個文件從Windows系統傳輸到Linux系統時,文件的原始格式和文件系統可能會有所不同。例如,文件可能是在Windows系統上使用NTFS文件系統創建的,但在傳輸過程中,它以位元組流的形式進行傳輸,併在Linux系統上重新寫入。在這種情況下,Linux系統會根據所使用的文件系統(如ext4)來重新組織和管理文件。

在Linux中,有一句經典的話是“一切皆文件”,這意味著不僅普通的文件和目錄,而且塊設備、管道、socket等都統一由文件系統進行管理。

Linux文件系統為每個文件分配了兩個數據結構:索引節點(inode)和目錄項(directory entry)。索引節點記錄了文件的元信息,如許可權、所有者、大小等,而目錄項則記錄了文件在目錄層次結構中的位置和名稱。這兩個數據結構並不是與文件內容一起保存的,而是由操作系統自行管理的一個區域。
image

索引節點(inode)用來記錄文件的元信息,包括inode編號、文件大小、訪問許可權、創建時間、修改時間以及數據在磁碟上的位置等。每個文件都有唯一的索引節點,它們與文件一一對應,並且被存儲在硬碟上,因此索引節點也會占用磁碟空間。

目錄項(directory entry)用來記錄文件的名稱、索引節點指針以及與其他目錄項的層級關係。多個目錄項的關聯形成了目錄結構。與索引節點不同的是,目錄項是由內核維護的數據結構,不存放於磁碟上,而是緩存在記憶體中。

由於索引節點是文件的唯一標識,而目錄項記錄著文件的名稱,因此目錄項和索引節點之間是多對一的關係。換句話說,一個文件可以有多個不同的目錄項指向相同的索引節點。例如,硬鏈接的實現就是多個目錄項中的索引節點指向同一個文件。

請註意,目錄文件也是通過索引節點來唯一標識的,與普通文件有所不同之處在於,普通文件在磁碟上存儲了實際的文件數據,而目錄文件在磁碟上存儲了子目錄或文件的相關信息。

目錄項和目錄是一個東西嗎?

首先肯定的是他倆不是一個東西,我們剛纔說了,目錄項是操作系統維護的一個數據結構,存儲在緩存中,它通過索引節點指針來定位和訪問目錄或文件。而目錄則是一個存儲在磁碟上的文件,目錄項通過自己保存的索引節點指針可以進一步找到目錄或者是文件,

而且需要註意的是,由於磁碟上的文件數量龐大,而記憶體空間有限,因此需要使用目錄項來進行緩存,以提高對目錄的訪問效率。目錄項會根據緩存策略進行管理,不會一次性緩存所有的目錄項。

那文件數據是如何存儲在磁碟的呢?

磁碟讀寫的最小單位是扇區,扇區的大小隻有 512B 大小,很明顯,如果每次讀寫都以這麼小為單位,那這讀寫的效率會非常低。

所以,文件數據在磁碟上以邏輯塊為單位進行存儲,每個邏輯塊由多個扇區組成,每次讀寫的最小單位就是邏輯塊(數據塊),在Linux中,邏輯塊的大小通常為4KB,相當於8個扇區。這將大大提高了磁碟的讀寫的效率。

索引節點是存儲在磁碟上的數據,為了加速文件的訪問,通常會將索引節點載入到記憶體中。磁碟在格式化時被分為三個存儲區域:超級塊、索引節點區和數據塊區。

  • 超級塊:用於存儲文件系統的詳細信息,如塊個數、塊大小和空閑塊數量等。超級塊在文件系統掛載時會被載入到記憶體中。
  • 索引節點區:用於存儲索引節點。當文件被訪問時,相應的索引節點會被載入到記憶體中,以便快速訪問文件的元數據。
  • 數據塊區:用於存儲文件或目錄的實際數據。

由於無法將整個超級塊和索引節點區載入到記憶體中,只有在需要使用時才會將其載入進記憶體,它們載入進記憶體的時機是不同的:超級塊在文件系統掛載時載入,而索引節點在文件被訪問時載入進記憶體。這樣的載入策略可以有效利用記憶體資源,並提高文件系統的性能。

總結

在文件系統的功能規劃中,塊是文件以及文件系統中數據存儲的基本單位。索引節點記錄了文件的元信息,包括文件的許可權、大小、創建時間等。目錄項則記錄了文件在目錄層次結構中的位置和名稱。

可以有多個不同的目錄項指向相同的索引節點,這樣可以在不同的目錄中通過不同的名稱訪問同一個文件。這種多對一的關係使得文件系統更加靈活和高效。為了提高文件訪問效率,文件系統還採用了緩存策略。熱點文件會被緩存在記憶體中,以減少磁碟IO的次數。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我們在使用一些需要購買版權的軟體產品時,或者我們做的商業軟體需要進行售賣,為了收取費用,一般需要一個軟體使用許可證,然後輸入這個許可到軟體里就能夠使用軟體。簡單的是一串序列碼或者一個許可證文件,複雜的是一個定製化插件包。於是有的小伙伴就開始好奇這個許可是怎麼實現的,特別是在離線情況下它是怎麼給軟體授... ...
  • # EF Core併發控制 # 併發控制概念 1. 併發控制:避免多個用戶同時操作資源造成的併發衝突問題。 2. 最好的解決方案:非資料庫解決方案 3. 資料庫層面的兩種策略:悲觀、樂觀 # 悲觀鎖 悲觀併發控制一般採用行鎖 ,表鎖等排他鎖對資源進行鎖定,確保同時只有一個使用者操作被鎖定的資源。 E ...
  • # Unity UGUI的Scrollbar(滾動條)組件的介紹及使用 ## 一、什麼是Scrollbar組件? Scrollbar組件是Unity中UGUI系統提供的一種UI組件,主要用於在UI界面中提供滾動條功能,使用戶可以通過滾動條來查看超出屏幕範圍的內容。 ## 二、Scrollbar組件是 ...
  • 在我寫[在.NET Framework中使用RocketMQ(阿裡雲版)]這篇博客的時候,因為封裝了很多代碼在單獨的DLL中,包括生產者、消費者以及官方SDK等等,然後都在博客中體現出來導致博客大量代碼,然後有位讀者就建議打包成NuGet包,大家也可以直接安裝調用,我也覺得很不錯,於是就有了這篇文章... ...
  • # Redis 文章內容主要參考b站 運維實戰課程 的redis視頻:[redis的課程介紹_嗶哩嗶哩_bilibili](https://www.bilibili.com/video/BV1cP4y1D7yh?p=1) ## 簡介 1.Redis是一個緩存資料庫,主要是做緩存。什麼是緩存?也就是緩 ...
  • [toc] # Linux運維工程師面試題(6) > 祝各位小伙伴們早日找到自己心儀的工作。 > 持續學習才不會被淘汰。 > 地球不爆炸,我們不放假。 > 機會總是留給有有準備的人的。 > 加油,打工人! ## 1 資料庫事務的四個特性及含義 資料庫事務的4個特性:原⼦性、持久性、⼀致性、隔離性 - ...
  • 哈嘍大家好,我是鹹魚 我們知道字典是 Python 中最重要且最有用的內置數據結構之一,它們無處不在,是語言本身的基本組成部分 我們可以使用字典來解決許多編程問題,那麼今天我們就來看看**如何在 Python 中遍歷字典** 全文內容:https://realpython.com/iterate-t ...
  • 寶塔Linux面板是提升運維效率的伺服器管理軟體,目前使用免費的版本功能齊全,已經足夠使用了。 [西瓜程式猿]使用阿裡雲伺服器網以CentOS操作系統為例,安裝寶塔Linux面板,先遠程連接到雲伺服器,然後執行寶塔面板安裝命令,系統會自動安裝寶塔面板,安裝完成後會返回面板地址、賬號和密碼 。 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...