i- node的作用是連結檔案與實體磁碟的關係,他的核心就是data stream。我們之前就提過的,在作業系統眼裡,檔案就是一串的bytes,也就是data stream,對檔案的I/O動作,也就是對data stream的動作。
i- node的作用是連結檔案與實體磁碟的關係,他的核心就是data stream。我們之前就提過的,在作業系統眼裡,檔案就是一串的bytes,也就是data stream,對檔案的I/O動作,也就是對data stream的動作,以下是data stream的資料結構:
#define NUM_DIRECT_BLOCKS 12
typedef struct data_stream
{
block_run direct[NUM_DIRECT_BLOCKS];
off_t max_direct_range;
block_run indirect;
off_t max_indirect_range;
block_run double_indirect;
off_t max_double_indirect_range;
off_t size;
} data_stream;
我們可以看到在定義中,block_run分為direct、indirect以及double_indirect三種。
如果某個檔案只有2KB,而block有1KB的大小,則這個檔案只會占用2個block,也就是block_run=2。direct的 block_run長度為12,之前提過的,每個block_run可以記錄65536個block,所以如果每個block是1KB,則僅僅使用 direct就能夠表示768MB的檔案(12 * 65536 * 1KB)。當檔案大於這個數目時,連12個block_run也裝不下,這時indirect與double_indirect就能發揮作用了。像是4K 大小的indirect block對映512個block_run,而每個block_run可以記錄65536個1KB的block,這樣就足足可以表示32768MB的檔案 (512 * 65536 * 1KB = 32768MB),再加上direct block的768MB,這樣就足以表示將近34GB的檔案了。另外,double_indirect block映對512個indirect在映對512個4KB大小的block_run,也能夠再額外增加1G的容量(512 * 512 * 4KB = 1GB)。