下面根據我自己的理解,以讀過程為例,簡要的描述一下應用程式和硬體塊裝置之間進行資料交換的流程。
首先,應用程式呼叫庫函式fread或者直接呼叫read系統呼叫產生讀請求,在這裡讀請求可以理解成需要從檔案的某個偏移處讀取多長的資料到使用者的緩衝區中。上面的兩個函式會呼叫sys_read進入到核心中,從這裡開始程序在系統空間中執行。sys_read又會呼叫具體的檔案系統註冊的函式對請求進行處理,首先檢視請求對應的資料是否在該檔案的page cache中存在,如果請求的資料已經在page cache中,則直接將資料返回給使用者空間的緩衝區中,這次請求結束。如果不再page cache中,檔案系統將經過處理後的請求封裝成bio請求格式,傳送到塊層。bio請求包括讀請求的邏輯扇區位址(lba),讀到記憶體的位址和長度(可能包含多個記憶體片段)。塊層首先檢視該bio請求是否能合併到請求佇列的某個請求中,若能則合併請求,若不能則為該bio生成乙個新的request請求經過重排序後加入到請求佇列中。到這裡,請求已經到了請求佇列中,等待進一步的處理。作業系統的後台執行緒會定期(還有其他可能觸發的條件)的從請求佇列中取下請求交給scsi子系統進行處理,包括呼叫scsi上層的塊裝置驅動準備scsi命令、準備用於dma的聚雜湊表等,最後通過scsi底層也就是底層驅動將命令傳送到裝置端。底層驅動往往是通過pio的方式寫裝置端的暫存器將命令傳送下去,或者將命令的位址寫到裝置的某個暫存器中,裝置再通過dma的方式從該位址把命令讀下去。最終的結果是命令在裝置端被解析、執行,然後裝置將讀取的資料通過dma的方式寫到主機端核心緩衝區或者直接到使用者空間快取(聚散dma方式),並通過中斷的方式通知主機請求執行完成。在中斷服務程式中會喚醒之前在該資料上等待的程序繼續執行。這樣整個請求處理結束,fread或者read函式執行完成,應用程式繼續往下執行。
寫過程與上門的流程基本類似,不太多說。
Linux 檔案讀寫流程
讀檔案流程 程序呼叫庫函式向核心發起讀檔案請求 核心通過檢查程序的檔案描述符定位到虛擬檔案系統的已開啟檔案列表表項 呼叫該檔案可用的系統呼叫函式read read 函式通過檔案表項鍊接到目錄項模組,根據傳入的檔案路徑,在目錄項模組中檢索,找到該檔案的inode 在inode中,通過檔案內容偏移量計算...
linux系統中讀寫鎖的問題
問題描述 我們的應用程式採用了共享記憶體和讀寫鎖的機制來實現多程序的併發訪問,但測試時發現讀寫鎖有問題,我們所採用的鎖是pthread rwlock rdlock pthread rwlock wrlock這組函式。現象 pthread rwlockattr setpshared attr,pthr...
linux系統讀寫快取
1.作業系統快取 在linux世界裡,一切可讀寫裝置都可看作是檔案。檔案cache設計的好壞直接影響著檔案系統和磁碟的效能。最直觀的是使用free命令看到的cached列。這裡面的cached列就是作業系統快取,作業系統會把空閒的記憶體拿來做快取,提高系統效能。當然這裡的cached不僅僅快取檔案的...