1. 程式人生 > >檔案開啟的過程——呼叫fd=open()時作業系統所做的工作

檔案開啟的過程——呼叫fd=open()時作業系統所做的工作

fd=fopen()是一個系統呼叫,用於根據檔名開啟一個檔案,返回該檔案的檔案描述符,檔案開啟後進程便可以根據檔案描述符fd進行其他操作,比如讀,寫,關閉等操作。

各個作業系統開啟檔案的過程是類似的,本文以Unix為例,介紹開啟一個檔案作業系統所做的工作,正式介紹這個過程之前先簡要介紹幾個概念。

PCB(process control block)程序控制塊,它是一個核心資料結構,相當於一個檔案,是作業系統感知程序存在的唯一標識。包括程序狀態,程序id,PC,暫存器,記憶體資訊,檔案開啟資訊等,如下圖所示


FCB(file control block)檔案控制塊,是檔案系統的一部分,在磁碟上一般會建立一個檔案系統,檔案系統中包含目錄資訊,以及檔案的FCB資訊。FCB一半包含檔案的讀寫模式,所有者,時間戳,資料塊指標等資訊,unix的FCB稱為inode,其結構如下圖所示

本圖片來自http://codex.cs.yale.edu/avi/os-book/OS9/slide-dir/os-figures.zip

檔案開啟的過程如下圖所示(從右往左看)


首先,作業系統根據檔名a,在系統檔案開啟表中查詢

第一種情況:

如果檔案a已經開啟,則在程序檔案開啟表中為檔案a分配一個表項,然後將該表項的指標指向系統檔案開啟表中和檔案a對應的一項;

然後再PCB中為檔案分配一個檔案描述符fd,作為程序檔案開啟表項的指標,檔案開啟完成。

第二種情況:

如果檔案a沒有開啟,檢視含有檔案a資訊的目錄項是否在記憶體中,如果不在,將目錄表裝入到記憶體中,作為cache;

根據目錄表中檔案a對應項找到FCB在磁碟中的位置;

將檔案a的FCB裝入到記憶體中的Active inode中;

然後在系統檔案開啟表中為檔案a增加新的一個表項,將表項的指標指向Active Inode中檔案a的FCB;

然後在程序的檔案開啟表中分配新的一項,將該表項的指標指向系統檔案開啟表中檔案a對應的表項;

然後在PCB中,為檔案a分配一個檔案描述符fd,作為程序檔案開啟表項的指標,檔案開啟完成。