最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、FILE結(jié)構(gòu)

1、fd

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

2、緩沖區(qū)

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

看下面一段代碼:

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

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

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

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

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

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

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

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

我們再來看一組程序

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

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

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

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

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

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

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

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

二、文件系統(tǒng)

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

1、固態(tài)硬盤

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

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

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

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

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

2、邏輯地址LBA

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

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

在n個Block Group之前有一個叫做Boot Block(引導(dǎo)塊)的區(qū)域,在計算機(jī)啟動過程中起著至關(guān)重要的作用,它是計算機(jī)啟動過程的起點,沒有引導(dǎo)塊中的引導(dǎo)代碼,計算機(jī)就無法知道如何加載操作系統(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ù)結(jié)構(gòu),用于存儲單個文件的全部屬性,一般來說每個文件都有一個inode

struct inode
{
	//inode編號
	//文件類型
	//權(quán)限
	//引用計數(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)容比較?。?code>12*4KB = 48KB以內(nèi)),那么直接塊指針可以直接訪問這些數(shù)據(jù)

(2)一次間接塊指針

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

(3)二次間接塊指針

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

(4)三次間接塊指針

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

(三)inode位圖 inode Bitmap

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

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

(四)塊位圖 Block Bitmap

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

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

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

(六)超級塊 Super Block

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

總結(jié)

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

相關(guān)文章

  • Centos搭建圖形化界面VNC的方法

    Centos搭建圖形化界面VNC的方法

    在使用騰訊云的centos云服務(wù)器時如果你需要使用圖形化界面,比如圖形界面安裝oracle,應(yīng)該怎么做?今天就和大家分享下圖形界面的安裝和vnc的搭建,來解決剛才提到的問題
    2015-10-10
  • 在Linux上安裝和使用Docker的方法

    在Linux上安裝和使用Docker的方法

    這篇文章主要介紹了在Linux上安裝和使用Docker的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • Linux系統(tǒng)中的firewall-offline-cmd詳解(收藏版)

    Linux系統(tǒng)中的firewall-offline-cmd詳解(收藏版)

    firewall-offline-cmd 是 firewalld 的一個命令行工具,專門設(shè)計用于在沒有運(yùn)行 firewalld 服務(wù)的環(huán)境中配置防火墻規(guī)則,這篇文章主要介紹了Linux系統(tǒng)之firewall-offline-cmd詳解,需要的朋友可以參考下
    2025-06-06
  • CentOS6.5平臺上rsync服務(wù)器安裝配置方法簡述

    CentOS6.5平臺上rsync服務(wù)器安裝配置方法簡述

    這篇文章主要介紹了CentOS6.5平臺上rsync服務(wù)器安裝配置方法,結(jié)合實例形式分析了CentOS上安裝與配置rsync服務(wù)器的具體步驟、相關(guān)命令與使用方法,需要的朋友可以參考下
    2018-04-04
  • 關(guān)閉linux終端還讓程序繼續(xù)執(zhí)行的實現(xiàn)方式

    關(guān)閉linux終端還讓程序繼續(xù)執(zhí)行的實現(xiàn)方式

    這篇文章主要介紹了關(guān)閉linux終端還讓程序繼續(xù)執(zhí)行的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Linux之nfs與autofs的使用方式

    Linux之nfs與autofs的使用方式

    這篇文章主要介紹了Linux之nfs與autofs的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-08-08
  • Linux內(nèi)存泄漏檢測shell腳本

    Linux內(nèi)存泄漏檢測shell腳本

    這篇文章主要為大家詳細(xì)介紹了Linux內(nèi)存泄漏檢測shell腳本,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Linux服務(wù)器部署項目后臺運(yùn)行過程

    Linux服務(wù)器部署項目后臺運(yùn)行過程

    本文介紹了運(yùn)行jar包的基本步驟,包括在服務(wù)器中測試運(yùn)行情況、處理運(yùn)行失敗的問題(如防火墻端口設(shè)置、jar包本身問題等),并對jar包后臺運(yùn)行中遇到的問題的解決方案做了總結(jié)
    2026-05-05
  • 谷歌云Google Cloud 啟用Ubuntu的SSH服務(wù)

    谷歌云Google Cloud 啟用Ubuntu的SSH服務(wù)

    默認(rèn)情況下,當(dāng) Ubuntu 最初被安裝的時候,通過 SSH 進(jìn)行遠(yuǎn)程訪問是不被允許的,在 Ubuntu 上啟用 SSH 非常的簡單直接,需要的朋友可以參考下
    2023-12-12
  • Linux搭建python環(huán)境詳解

    Linux搭建python環(huán)境詳解

    本篇文章主要介紹了Linux搭建python環(huán)境詳解,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2016-12-12

最新評論

胶南市| 韶山市| 南昌市| 同德县| 龙口市| 郑州市| 博湖县| 托克逊县| 衡阳市| 南城县| 怀化市| 迭部县| 宁化县| 白水县| 静海县| 竹溪县| 珠海市| 汨罗市| 贺兰县| 东港市| 华阴市| 潢川县| 宁都县| 会理县| 蚌埠市| 收藏| 万宁市| 邮箱| 陇南市| 平江县| 杭锦旗| 兴业县| 北海市| 叶城县| 澄江县| 浦城县| 乌兰察布市| 宝鸡市| 揭东县| 兰西县| 安塞县|