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
信息直接從磁盤中得到,比如文件的大小悔雹,文件在磁盤上的
真正位置信息等
兩個進程打開同一個文件
兩個進程同時打開一個文件時:
- 每個線程都有獨立的線程文件表复哆,每個線程文件表里都有一條記錄
- 全局文件表里有兩條記錄,分別對應(yīng)兩個進程的文件
- 因為兩個線程打開的是同一個物理文件腌零,全局文件表里的兩條記錄指向同一個
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: | |----------->| |----
... |...| | |
+---+ +---------+
- 全局進程表中每個進程都獨立的記錄梯找,這樣每個進程可以有獨立的文件狀態(tài)flag和當(dāng)前文
件讀取位移 - 因為是同一個文件,所以共用了同一個
v-node
益涧,當(dāng)兩個進程同時寫入這個文件時锈锤,就會
發(fā)生寫入沖突,無法預(yù)料最終的寫入效果