操作系統(tǒng)內(nèi)核中文件相關(guān)的數(shù)據(jù)結(jié)構(gòu)

Unix系統(tǒng)中懦胞,一切(磁盤文件侍芝、網(wǎng)絡(luò)I/O、硬件設(shè)備...)都是文件比勉,所以文件非常重要劳较。
這篇博客講述內(nèi)核中表示一個打開文件的3種數(shù)據(jù)結(jié)構(gòu),然后簡單分析了兩個獨立進程
同時打開一個文件的情況

一 線程文件表(process table)

進程文件表是內(nèi)核表示打開文件的第一個數(shù)據(jù)結(jié)構(gòu)浩聋,每個線程都有一個自動的線程文件表观蜗,
結(jié)構(gòu)如下:

      +------------------------+
fd 0: |fd flags | file pointer |
fd 1: |fd flags | file pointer |
...   | ....                   |
      +------------------------+

線程內(nèi)每個打開的文件都對應(yīng)上表的一條記錄,一條記錄包含兩個字段

  • fd flags 文件描述符的flag衣洁,目前只有一種文件描述符flag墓捻,即FD_CLOEXE(如果FD_CLOEXE
    被設(shè)置了,那么一次成功的execve后自動關(guān)閉)
  • file pointer 指向全局文件表的一條記錄坊夫,全局文件表是內(nèi)核表示打開文件的第二個數(shù)
    據(jù)結(jié)構(gòu)砖第。

二 全局文件表(file table)

內(nèi)核有一個全局文件表,它包含了系統(tǒng)打開的所有文件环凿,每個文件對應(yīng)全局文件表內(nèi)的一條
記錄梧兼,結(jié)構(gòu)如下:

+--------------------------------------------------------+
|file status flag | current file offset | v-node pointer |
| ...             | ....                | ...            |
+--------------------------------------------------------+
  • file status flag:文件狀態(tài)falg,比如read智听、write羽杰、append、sync等
  • current file offset:當(dāng)前讀取文件的偏移量
  • v-node pointera:指向v-node的指針,見后文

三 v-node表

+-----------------------------------------+
| v-node information | v_data             |
| ...                | ...                |
+-----------------------------------------+

系統(tǒng)內(nèi)每個打開的文件都對應(yīng)的v-node表的一條記錄到推,v-node存儲的信息跟文件物理信息
有關(guān)考赛,比如文件的類型和操作這個文件的函數(shù)。對大多數(shù)的文件來說莉测,v-node表中還存儲了
文件的i-node信息颜骤,i-node信息直接從磁盤中得到,比如文件的大小悔雹,文件在磁盤上的
真正位置信息等

兩個進程打開同一個文件

兩個進程同時打開一個文件時:

  1. 每個線程都有獨立的線程文件表复哆,每個線程文件表里都有一條記錄
  2. 全局文件表里有兩條記錄,分別對應(yīng)兩個進程的文件
  3. 因為兩個線程打開的是同一個物理文件腌零,全局文件表里的兩條記錄指向同一個v-node
    簡化圖形如下:
Process 1
      +---+
fd 0: |   |              全局文件表
fd 1: |   |            +---------+                  v-node表
fd 2: |   |            |         |                  +--------+
fd 3: |   |----------->|         | ----             |        |
...   |...|            |         |     \            |        |
      +----+           |         |      \           |        |
                       |         |       \--------->|        |
                       |         |       |          |        |
Process 2              |         |       |          |        |
      +---+            |         |       |          |        |
fd 0: |   |            |         |       |          |        |
fd 1: |   |            |         |      /           |        |
fd 2: |   |            |         |     /            |        |
fd 3: |   |            |         |    /             +--------+
fd 4: |   |----------->|         |----
...   |...|            |         |
      +---+            +---------+

  1. 全局進程表中每個進程都獨立的記錄梯找,這樣每個進程可以有獨立的文件狀態(tài)flag和當(dāng)前文
    件讀取位移
  2. 因為是同一個文件,所以共用了同一個v-node益涧,當(dāng)兩個進程同時寫入這個文件時锈锤,就會
    發(fā)生寫入沖突,無法預(yù)料最終的寫入效果
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市久免,隨后出現(xiàn)的幾起案子浅辙,更是在濱河造成了極大的恐慌,老刑警劉巖阎姥,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件记舆,死亡現(xiàn)場離奇詭異,居然都是意外死亡呼巴,警方通過查閱死者的電腦和手機泽腮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衣赶,“玉大人诊赊,你說我怎么就攤上這事「椋” “怎么了碧磅?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長遵馆。 經(jīng)常有香客問我鲸郊,道長,這世上最難降的妖魔是什么团搞? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任严望,我火速辦了婚禮多艇,結(jié)果婚禮上逻恐,老公的妹妹穿的比我還像新娘。我一直安慰自己峻黍,他們只是感情好复隆,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著姆涩,像睡著了一般挽拂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上骨饿,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天亏栈,我揣著相機與錄音,去河邊找鬼宏赘。 笑死绒北,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的察署。 我是一名探鬼主播闷游,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了脐往?” 一聲冷哼從身側(cè)響起休吠,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎业簿,沒想到半個月后瘤礁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡梅尤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年蔚携,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片克饶。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡酝蜒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出矾湃,到底是詐尸還是另有隱情亡脑,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布邀跃,位于F島的核電站霉咨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏拍屑。R本人自食惡果不足惜途戒,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望僵驰。 院中可真熱鬧喷斋,春花似錦、人聲如沸蒜茴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粉私。三九已至顽腾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诺核,已是汗流浹背抄肖。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留窖杀,地道東北人漓摩。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像陈瘦,于是被迫代替她去往敵國和親幌甘。 傳聞我的和親對象是個殘疾皇子潮售,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348