亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Linux中的緩沖區(qū)和文件系統(tǒng)詳解

 更新時間:2025年03月20日 14:29:04   作者:s_little_monster_  
這篇文章主要介紹了Linux中的緩沖區(qū)和文件系統(tǒng)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

一、FILE結構

1、fd

FILE是在C中封裝起來的一個結構體,那我們訪問文件的時候都是通過fd訪問的,自然在FILE中是封裝了fd的,F(xiàn)ILE結構體中,int _file存放的就是fd,其他的成員基本都是與緩沖區(qū)有關的

2、緩沖區(qū)

(一)有換行有return全部打印

看下面一段代碼:

(二)無換行無return的C接口打印

很顯然的,我們打印出了所有我們需要的內(nèi)容,我們再看下一段

理想狀態(tài)下我們應該是打印出結果后然后進行while一直循環(huán),實際上是一只不會打印,這是為什么呢?是的,待在緩沖區(qū)里

首先我們要知道,緩沖區(qū)的大概位置,我們上面貼了一張FILE結構體的結構圖,我們可以很清楚地看到緩沖區(qū)是FILE的成員指針指向的一塊位置,也就是說緩沖區(qū)一定在用戶空間而不是內(nèi)核空間

(三)無換行無return的系統(tǒng)調用接口打印

我們在調用上面三個函數(shù)的時候,都是調用的C接口,自然都待在緩沖區(qū)里了,我們再看下一個程序

在這個程序中我們直接調用系統(tǒng)調用接口write,所以它不會經(jīng)過C語言的緩沖區(qū),而是直接打印

(四)有換行無return的C接口打印

我們再來看一組程序

這個程序和(二)程序的區(qū)別就只有換行,這告訴我們,C語言緩沖區(qū)對于顯式器是行緩沖的,C語言標準庫的文件流有三種緩沖模式,分別是全緩沖、行緩沖和無緩沖

  • 全緩沖 _IOFBF :通常用于對磁盤文件的操作,數(shù)據(jù)會先被存儲在緩沖區(qū)中,直到緩沖區(qū)被填滿或者調用 fflush 函數(shù)、關閉文件(fclose)時,才會將緩沖區(qū)中的數(shù)據(jù)寫入實際的文件,在全緩沖模式下,不會因為遇到換行符而自動刷新緩沖區(qū)
  • 行緩沖 _IOLBF :常見于標準輸入、標準輸出等終端設備相關的流,當遇到換行符(\n)時,會自動刷新緩沖區(qū),將緩沖區(qū)中的數(shù)據(jù)寫入對應的設備或文件,某些情況下即使沒有換行符,緩沖區(qū)滿時也會刷新
  • 無緩沖 _IONBF :標準錯誤輸出通常默認是無緩沖的,確保錯誤信息能夠立即顯示,在無緩沖模式下,數(shù)據(jù)會立即寫入對應的設備或文件,不會進行緩沖,因此不存在行刷新的概念

(五)無換行有return的C接口打印

進程退出return的時候,也會對緩沖區(qū)進行刷新

(六)深入理解緩沖區(qū)在用戶空間

我們打印在顯示器上的內(nèi)容和打印在文件中的內(nèi)容不一致,只有write打印了一遍,其他是按照順序打印了兩遍,我們當然能看出來這是fork的鍋,接下來我們就深入理解談一談緩沖區(qū)

首先我們分析第一張結果圖,因為顯示器是行緩沖的,所以我們C接口的打印放到緩沖區(qū)中一行就會被打印到屏幕上一行,三條語句執(zhí)行完之后緩沖區(qū)是空的,然后write再往上寫,所以整個打印出來的順序也是按照代碼中來的

然后我們分析最后一張圖,第一個我們可以肯定的是,打印到文件一定不是行緩沖,那就更不是無緩沖,實際上,由于文件是在存儲硬件當中的,由于我們的效率問題,對于這種存儲類的緩沖條件都是全緩沖,把緩沖區(qū)塞滿再寫入存儲硬件中比塞一點寫一點效率高得多,所以前三句C接口調用的打印全部在緩沖區(qū)中,然后write將自己打印,然后我們就碰到了fork,創(chuàng)建子進程,父子進程此時共享代碼段和數(shù)據(jù)段,因為它們都沒有做修改,然后我們就碰到了return 0,前面我們提到:進程結束也是要清空緩沖區(qū)的,此時父或子進程某一個先結束(由調度器決定),其中一個進程清空緩沖區(qū)的行為會引起另一個進程的寫實拷貝,此時我們就有兩份緩沖區(qū),兩個進程都結束都要清空緩沖區(qū),自然在緩沖區(qū)中的內(nèi)容要打印兩份了(在這里要注意了,不只是子進程修改數(shù)據(jù)會引起子進程的寫時拷貝,父進程對數(shù)據(jù)做修改時父進程也要發(fā)生寫時拷貝,被寫時拷貝的數(shù)據(jù)再再發(fā)生修改就直接修改了,不發(fā)生寫實拷貝

二、文件系統(tǒng)

文件一般存儲在硬盤當中,我們已經(jīng)學習了動態(tài)的文件,也就是進程打開文件訪問文件的過程,現(xiàn)在我們來學習一下靜態(tài)的文件,我們來直接學習一下固態(tài)硬盤

1、固態(tài)硬盤

固態(tài)硬盤是一種基于NAND閃存的存儲單元,我們常用的筆記本上的固態(tài)硬盤存儲單元類型一般都是TLC的,三層單元,每個單元存儲3bits,壽命較短成本較低,它通過電荷存儲數(shù)據(jù),通過高低電平區(qū)分0/1

NAND閃存的寫入操作只能在已擦除的塊上進行,擦除的最小單位就是塊,通常為128KB-4MB,寫入的最小單位是頁,通常為4KB,所以它讀的速度特別快,可以到微秒級,因為需要先擦除塊,寫的速度較慢,只能到毫秒級,每個塊的擦寫次數(shù)有限,超過后就會失效,一般TLC的擦鞋上限在500-1500次

這樣的性質會帶來一些不太好的結果,比如我們要寫的內(nèi)容很小,假設為4KB,那么我們先要擦除高達4MB的塊才能進行寫入,所以我們通過算法,將寫入分散到所有塊,避免某些塊因為多次擦除而失效

固態(tài)硬盤控制器中的核心邏輯叫做FTL ( Flash Translation Layer ) Flash翻譯層,負責將文件系統(tǒng)的邏輯地址映射到物理地址,是不是有點像進程地址通過頁表映射到物理地址呢

接下來我們要學習文件系統(tǒng)的邏輯地址LBA,因為我們很清楚FTL映射到物理地址的過程是與頁表映射是相似的,而邏輯地址的組織方式與進程地址可是不同的,雖然是有相似之處的~

2、邏輯地址LBA

LBA 從 0 開始,按照連續(xù)的整數(shù)順序依次為存儲設備中的每個數(shù)據(jù)塊編號,存儲設備中的每個數(shù)據(jù)塊都對應一個唯一的 LBA 值,比如第一個數(shù)據(jù)塊的 LBA 是 0,第二個是 1,依此類推,我們對應的數(shù)據(jù)塊有Super Block、Group Descriptor Table、Block Bitmap、inode Bitmap、inode Table、Data blocks六個,最理想的情況下它們的LBA按照我上面寫的順序從0到5

我們把一塊固態(tài)硬盤,我們筆記本上有一些品牌比如說某L開頭的品牌,在我們購買的時候是默認給你帶1T固態(tài)的,一般的品牌就是512G,我們拿到筆記本之后會對電腦進行分區(qū),C盤作為系統(tǒng)盤分到最多的內(nèi)存,G盤作為游戲盤給到300多G,然后D盤用來學習寫代碼,留個200G,EF盤用來存一些其他的東西,這樣一套流程下來我們就分好盤了,我們說對硬盤做管理當然也是先描述后組織,Block Group就是組織和管理磁盤空間的一種重要結構

在n個Block Group之前有一個叫做Boot Block(引導塊)的區(qū)域,在計算機啟動過程中起著至關重要的作用,它是計算機啟動過程的起點,沒有引導塊中的引導代碼,計算機就無法知道如何加載操作系統(tǒng),也就無法正常啟動

我們按照知識理解易難順序倒著往前來說

(一)數(shù)據(jù)塊 Data Blocks

用來存儲數(shù)據(jù)的塊,NAND FLASH 內(nèi)部的數(shù)據(jù)塊由多個page組成,通常大小為4KB(現(xiàn)在也有8KB和16KB),這個page就是我們前面提到的最小寫入單位:頁

(二)inode表 inode Table

inode全稱為索引節(jié)點,是一種數(shù)據(jù)結構,用于存儲單個文件的全部屬性,一般來說每個文件都有一個inode

struct inode
{
	//inode編號
	//文件類型
	//權限
	//引用計數(shù)
	//擁有者
	//所屬組
	
    // 直接塊指針
    unsigned long i_block[NUM];
    // 一次間接塊指針
    unsigned long i_ind_block;
    // 二次間接塊指針
    unsigned long i_dind_block;
    // 三次間接塊指針
    unsigned long i_tind_block;
}

其中inode編號每個文件都是不同的,我們主要說說數(shù)據(jù)塊指針

(1)直接塊指針

直接塊指針的NUM一般是12,它指向的位置是我們可以直接用來存儲的位置,如果我們內(nèi)容比較小(12*4KB = 48KB以內(nèi)),那么直接塊指針可以直接訪問這些數(shù)據(jù)

(2)一次間接塊指針

如果內(nèi)容大于48KB,就需要一次間接塊指針,一次間接塊指針指向一個間接塊,這個間接塊存儲中存儲著多個指向數(shù)據(jù)塊的指針,如我們的內(nèi)容在(4KB/4b)*4KB = 4MB以內(nèi),通過一次間接塊指針和直接塊指針就可以訪問這些數(shù)據(jù)

(3)二次間接塊指針

二次間接塊指針指向一個二次間接塊,這個二次間接塊存儲中存儲著多個指向間接塊的指針,與一次間接塊指針類似,這樣我們存儲的范圍就達到了(4KB/4b)*(4KB/4b)*4KB = 4GB

(4)三次間接塊指針

同上,最終我們最大的存儲范圍達到了 (4KB/4b)*(4KB/4b)*(4KB/4b)*4KB = 4TB

(三)inode位圖 inode Bitmap

我們通過位圖來和inode一一對應,位圖上對應的比特位為0,那么該inode就沒有被使用,可以被分配,如果為1則被占用,當從1變?yōu)?時,該inode又可以被分配了,其實這個過程就是一個刪除的過程,一旦一個文件的inode無了,那么這文件是真的無了

在文件系統(tǒng)中,標識文件不是看它的名字,而是看它的inode,一旦inode和文件取消綁定了,那么操作系統(tǒng)就找不到這個文件了,再次寫入其他內(nèi)容的時候也就會被擦除覆蓋了,換而言之,刪除恒等于可以被覆蓋

(四)塊位圖 Block Bitmap

我們通過位圖來和數(shù)據(jù)塊page一一對應,位圖上對應的比特位為0,那么該頁page就沒有被使用,可以被分配,如果為1則被占用,當從1變?yōu)?時,該page又可以被分配了,如果我們要刪除一塊空間,只需要將它的對應的位置0,到再次被寫入的時候就會消失了,當然我們的NAND閃存是定期擦除的,過一段時間它自己就被擦除了

(五)塊組描述符表 Group Descriptor Table

記錄了該塊組的詳細信息,包括塊位圖的位置、inode 位圖的位置、inode 表的起始位置等,用于定位和管理塊組內(nèi)的各種數(shù)據(jù)結構

(六)超級塊 Super Block

超級塊是文件系統(tǒng)的核心,記錄了文件系統(tǒng)的全局信息,如塊大小、inode 數(shù)量、空閑塊數(shù)量等,為了防止超級塊損壞導致文件系統(tǒng)無法使用,每個塊組中可能會包含超級塊的副本,不過并非所有塊組都有

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Linux系統(tǒng)刪除文件夾和文件的命令

    Linux系統(tǒng)刪除文件夾和文件的命令

    筆者給大家介紹Linux系統(tǒng)刪除文件夾和文件的命令,很多朋友喜歡是rmdir命令來刪除文件,不過當遇到目錄非空,就會麻煩,下面閱讀本文學習下linux刪除文件夾和文件的命令吧
    2018-02-02
  • .htaccess rewrite 規(guī)則詳細說明

    .htaccess rewrite 規(guī)則詳細說明

    用Apache虛擬主機的朋友很多,apache提供的.htaccess模塊可以為每個虛擬主機設定rewrite規(guī)則,這對網(wǎng)站SEO優(yōu)化相當有用,同時也改善了用戶體驗
    2016-04-04
  • 解決因文件權限導致git fetch命令執(zhí)行失敗的問題

    解決因文件權限導致git fetch命令執(zhí)行失敗的問題

    最近在工作中遇到一個問題,就是在在一個基于 git 的發(fā)布系統(tǒng)中拉取代碼,發(fā)現(xiàn)無法拉取最新的提交記錄,查找相關資料發(fā)現(xiàn)是因為文件權限的問題,所以這篇文章主要介紹了關于解決因文件權限導致git fetch命令執(zhí)行失敗的問題,需要的朋友可以參考下。
    2017-04-04
  • Linux watch命令的使用

    Linux watch命令的使用

    這篇文章主要介紹了Linux watch命令的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • Linux系統(tǒng)重啟后MySQL數(shù)據(jù)丟失問題的解決步驟

    Linux系統(tǒng)重啟后MySQL數(shù)據(jù)丟失問題的解決步驟

    今天分享一個在Linux系統(tǒng)中經(jīng)常遇到的問題:系統(tǒng)重啟后發(fā)現(xiàn)MySQL無法啟動,而且數(shù)據(jù)似乎丟失了,這個問題可能會讓人驚慌失措,但別擔心,通常情況下這只是因為數(shù)據(jù)盤沒有正確掛載導致的,現(xiàn)在我們將深入探討這個問題的原因、解決方法以及如何預防它的再次發(fā)生
    2024-09-09
  • Linux修改pip和conda緩存路徑的幾種方法

    Linux修改pip和conda緩存路徑的幾種方法

    在 Python 生態(tài)中,pip 和 conda 是兩種常見的軟件包管理工具,它們在安裝、更新和卸載軟件包時都會使用緩存來提高效率,適當?shù)匦薷乃鼈兊木彺媛窂?不僅可以優(yōu)化存儲管理,還可以在存儲空間有限,本文將詳細介紹如何修改 pip 和 conda 的緩存路徑
    2025-03-03
  • Linux下查看IP地址不顯示解決辦法

    Linux下查看IP地址不顯示解決辦法

    大家好,本篇文章主要講的是Linux下查看IP地址不顯示解決辦法,感興趣的同學趕快來看看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 詳解CentOS7 安裝 MariaDB 10.2.4的方法

    詳解CentOS7 安裝 MariaDB 10.2.4的方法

    這篇文章主要介紹了CentOS7 安裝 MariaDB 10.2.4的方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11
  • ubuntu服務器上快速部署docker的方法

    ubuntu服務器上快速部署docker的方法

    本篇文章主要介紹了ubuntu服務器上快速部署docker的方法,非常具有實用價值,需要的朋友可以參考下
    2017-07-07
  • Linux基本網(wǎng)絡配置方法介紹

    Linux基本網(wǎng)絡配置方法介紹

    本篇文章主要介紹了Linux網(wǎng)絡基本網(wǎng)絡配置方法介紹,對于初學linux有一定的幫助,有需要的朋友可以了解一下。
    2016-12-12

最新評論