Windows XP Windows 7 Windows 2003 Windows Vista Windows教程綜合 Linux 系統教程
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟件教程
 Windows教程網 >> Linux系統教程 >> Linux教程 >> Linux下多個進程同時操作一個文件的實現過程

Linux下多個進程同時操作一個文件的實現過程

日期:2017/2/7 14:23:47      編輯:Linux教程
 

最近有客戶詢問到同時有不同的用戶對同一個文件進行操作的情況下,系統是如何對這種問題進行處理。
本文將對Linux下多個進程“同時”操作同一個文件的過程進行簡單的介紹。
假設有三個進程A、B、C對文件a.txt文件行操作。A進程要讀取文件的第1到100個字符,進程B要讀取文件中包含aa字符的行,C要往a.txt文件裡寫入”ABC”。
三個進程的啟動順序為A、B、C。

【正文】

一   假設條件

1.1  三個進程

1、 假設有三個進程A、B、C對文件a.txt文件行操作;
2、 A進程要讀取文件的第1到100個字符;
3、 進程B要讀取文件中包含aa字符的行;
4、 C要往a.txt文件裡寫入”ABC”;

1.2  進程啟動順序

1、 三個進程的啟動順序為A、B、C;

二   過程

2.1  A進程啟動

進程A的代碼執行步驟如下:
  1. 打開文件a.txt
  2. 讀取對應條件的文件內容
當進程A啟動後,在執行”打開文件a.txt”代碼時,文件管理表(file_table[64])將進程A的指針表與a.txt文件的i節點進行關聯,賦予進程A操作文件a.txt的權限和能力。
當執行”讀取對應條件的文件內容”代碼時,系統會將文件a.txt從硬盤上載入到緩沖區中。這個過程中,內核對應函數會申請一個”空閒”的緩沖空間,將文件a.txt從硬盤載入緩沖空間,因為載入需要時間,於是這個緩沖空間被加鎖。進程A必須等待載入完成後,才能讀取文件內容。此時,進程A被掛起,設置為”不可中斷等待狀態”,緩沖區進程等待隊列隊首為進程A。

2.2  B進程啟動

進程B的代碼執行步驟如下:
  1. 打開文件a.txt
  2. 讀取對應條件的文件內容
當B進程啟動後,執行”打開文件a.txt”。同樣的,文件管理表(file_table[64])將進程B的指針表與a.txt文件的i節點進行關聯,賦予進程B操作文件a.txt的權限和能力。特別要注意,由於不同的進程對文件的操作是不相同的,所以這個過程同樣要再進行一次。但是由於在A進程執行時,文件a.txt的i節點已經被找到了,進程B不需要再執行遍歷i節點以尋找a.txt的i節點。
當執行”讀取對應條件的文件內容”代碼時,系統通過哈希表管理結構發現需要載入的數據緩沖區已經存在了,於是不再將數據從硬盤載入緩沖區了。而是對緩沖區的引用次數加1,累計為2。(注意,由於三個進程是”同時”對一個文件進行操作,時間非常短,此時文件a.txt數據還在從硬盤載入緩沖區的過程中)
此時,進程B也必須等待載入完成後,才能讀取文件內容。於是,進程B也被掛起,設置為”不可中斷等待狀態”,緩沖區進程等待隊列隊首為進程B,緊隨其後的是進程A。

2.3  C進程啟動

進程C的代碼執行步驟如下:
  1. 打開文件a.txt
  2. 寫入對應條件的文件內容
當C啟動後,執行”打開文件a.txt”。同樣的,文件管理表(file_table[64])將進程C的指針表與a.txt文件的i節點進行關聯,賦予進程C操作文件a.txt的權限和能力。
與B進程一樣,C進程也經過同樣的過程隨之進入”不可中斷等待狀態”,並且在這個緩沖區的隊列中位於隊首,其後分別是進程B、A。

2.4  進程喚醒

此時,進程A、B、C都處於等待數據載入完成後緩沖區解鎖的狀態,即掛起的狀態。
數據載入完成後,硬盤產生”數據傳輸完成”中斷通知系統數據已經載入完成。系統收到中斷後,即對緩沖區進行解鎖,並且喚醒隊列中的進程。
此時,系統會將位於隊首的進程C喚醒,將C進程設置為就緒狀態。
接著開始執行”寫入數據”代碼,開始進行計時,並且將B進程設置為就緒狀態。
當計時結束時,C進程完成並且退出。
B進程開始執行”讀取數據”代碼,開始進行計時,並且將A進程設置為就緒狀態。
當計時結束時,B進程完成並且退出。
A進程開始執行”讀取代碼”,開始機型計時,並且將隊列設置為”NULL”。
當計時結束時,A進程完成並且退出。
至此,三個進程就全部完成。

三   小結

從以上的過程中,我們可以看出,當三個進程同時對一個文件進行操作時,雖然進程的啟動順序是A、B、C,但是最終當數據載入緩沖區完成後,執行順序是根據等待隊列的隊首到隊尾,即C、B、A。
當執行完ABC三個進程後,數據的修改其實還只是存在緩沖區中,並沒有立即寫入到硬盤中,而是通過後續的update進程將緩沖區的數據同步到硬盤中。由於篇幅有限,這裡就不一一介紹了,讀者有興趣可以自行研究。
Copyright © Windows教程網 All Rights Reserved