1. 程式人生 > >Linux基礎之檔案讀寫流程

Linux基礎之檔案讀寫流程

頁快取機制

讀檔案流程

  1. 程序呼叫庫函式向核心發起讀檔案請求;
  2. 核心通過檢查程序的檔案描述符定位到虛擬檔案系統的已開啟檔案列表表項;
  3. 呼叫該檔案可用的系統呼叫函式read();
  4. read()函式通過檔案表項鍊接到目錄項模組,根據傳入的檔案路徑,在目錄項模組中檢索,找到該檔案的inode;
  5. 在inode中,通過檔案內容偏移量計算出要讀取的頁;
  6. 通過inode找到檔案對應的address_space;
  7. 在address_space中訪問該檔案的頁快取樹,查詢對應的頁快取結點:如果頁快取命中,那麼直接返回檔案內容;如果頁快取缺失,那麼產生一個頁缺失異常,建立一個頁快取頁,同時通過inode找到檔案該頁的磁碟地址,讀取相應的頁填充該快取頁
    ;重新進行第6步查詢頁快取;
  8. 檔案內容讀取成功;

寫檔案流程

 前5步和讀檔案一致
6. 在address_space中查詢對應頁的頁快取是否存在:
  如果頁快取命中,直接把檔案內容修改更新在頁快取的頁中。寫檔案就結束了。這時候檔案修改位於頁快取,並沒有寫回到磁碟檔案中去
  如果頁快取缺失,那麼產生一個頁缺失異常,建立一個頁快取頁,同時通過inode找到檔案該頁的磁碟地址,讀取相應的頁填充該快取頁。此時快取頁命中,進行第6步。
7. 一個頁快取中的頁如果被修改,那麼會被標記成髒頁。髒頁需要寫回到磁碟中的檔案塊。有兩種方式可以把髒頁寫回磁碟:
  1) 手動呼叫sync()或者fsync()系統呼叫把髒頁寫回;
  2) pdflush程序會定時把髒頁寫回到磁碟;
注意: 髒頁不能被置換出記憶體,如果髒頁正在被寫回,那麼會被設定寫回標記,這時候該頁就被上鎖,其他寫請求被阻塞直到鎖釋放。

讀寫檔案特點

  1. 發生了系統呼叫,需要從使用者態切換到核心態;
  2. 發生了兩次資料拷貝:資料先從磁碟拷貝到頁快取,在從頁快取拷貝到使用者主存;

相關推薦

Linux基礎檔案流程

讀檔案流程 程序呼叫庫函式向核心發起讀檔案請求; 核心通過檢查程序的檔案描述符定位到虛擬檔案系統的已開啟檔案列表表項; 呼叫該檔案可用的系統呼叫函式read(); read()函式通

python基礎檔案

python檔案讀寫 python程式的輸入主要有兩種,一種是通過命令列輸入,另一種是通過檔案進行輸入。在大規模引數情況下,第二種方式輸入相比於第一種顯得方便而易行。因此,本文主要記錄下如何對檔案進行讀寫操作。 常見檔案操作函式 首先,介紹一下檔案開啟

Python基礎知識檔案與修改

基本操作 f = open("file1", "r")  # 開啟檔案 first_line = f.readline() # 讀一行 data = f.read() # 讀取剩下所有內容,檔案大時候不要用 f.close()  #關閉檔案

linux shell 終端文件數據流和重定向>,<,<<,>>

運行 文件的 方式 ech 描述符 run 傳遞 實例 pan 終端實現文件中數據流的讀寫; 重定向命令列表如下: 命令說明 command > file 將輸出重定向到 file。將終端數據寫到文件file中 command < file 將輸入重定

linux塊設備流程

臨時 無效 rect patch 得到 喚醒 處理 字符 構建 在學習塊設備原理的時候,我最關系塊設備的數據流程,從應用程序調用Read或者Write開始,數據在內核中到底是如何流通、處理的呢?然後又如何抵達具體的物理設備的呢?下面對一個帶Cache功能的塊設備數據流程進行

Java 檔案及效能比較總結

Java 之 檔案讀寫及效能比較總結 2014年05月12日 17:56:49 閱讀數:21765  幹Java這麼久,一直在做WEB相關的專案,一些基礎類差不多都已經忘記。經常想得撿起,但總是因為一些原因,不能如願。 其實不是沒有時間,只是有些時候疲於總結,今得空,下定決心

python檔案(1)

1. 從檔案讀取資料 關於對檔案的操作,使用open(filename, mode),開啟檔案。與之對應的,close()用來關閉檔案。對檔案操作完畢切記要關閉。 open函式引數: mode 引數有: 模式 描述 t 文字模式

Linux-centosmysql分離的主從複製配置

Linux-centos之mysql讀寫分離的主從複製配置 一:概念 二:為什麼使用讀寫分離 三:操作步驟 一:概念 基本的原理:讓主資料庫處理事務性增、改、刪操作(INSERT、UPDATE、DELETE),而從

python基礎學習-檔案

1.讀取檔案 f=open('text','r',encoding='utf8');#讀檔案 data=f.readlines(); for i in data:#遍歷檔案內容 print(i); f.close();   2.寫入 f=open('text',

Unity3D檔案檔案

為了完成資源的讀取和儲存,這裡做了好多的實驗,也參考了很多的文章和帖子,這裡十分感謝雨鬆的網站,很多時候都能在那裡找到思路和相應的回答。希望這個網站能一直辦下去。 開始正文,為了完成上述功能,自己本地做了很多實驗,為了統一資源版本,我想到的辦法就是把所有的AssetsBun

Go語言學習筆記(十八)檔案

25.檔案讀寫 1.檔案開啟和讀 A.檔案分類:文字和二進位制檔案B.檔案存取方式:隨機存取和順序存取 檔案開啟程式碼示例: 1: package main 2: 3: import ( 4: "bufio" 5: "fmt" 6: "io" 7: "os" 8

程序通訊檔案

檔案也可以用來作為程序通訊的工具, 1.建立 讀取者程式 // InterProcess_Communucation_FILE_READER.cpp : 定義控制檯應用程式的入口點。 // #inc

arm應用程式檔案操作差異open與fopen

在am335x的arm系統中編寫應用程式時,發現想將資料儲存在文字檔案中,下次啟動應用程式時就能從檔案中讀出上次的資料。結果一直儲存不成功,於是寫了一個簡單的測試程式,將一個100長度的陣列儲存在檔案中,然後再讀出來。發現了問題。 寫入的資料是1到100,讀出的資料卻是到

C語言檔案——fscanf(),fprintf()詳解

1.fscanf():從檔案指標fp指向的檔案中,按format中對應的控制格式讀取資料,並存儲在agars對應的變數中; 原型: fscanf(FILE *fp, const char *forma

linux下裝置檔案例項

一般在linux下裝置分為字元裝置和塊裝置。字元裝置是指裝置傳送和接收資料以字元的形式進行;而塊裝置則以整個資料緩衝區的形式進行。在linux下對任何的操作可以看成是對裝置的操作。簡單而言之,可以是看成對裝置檔案的讀寫操作。那麼,怎樣對linux 的裝置檔案進行讀寫呢?我們通

Linux系統修改檔案許可權chmod、所有者或組chown

正 文:      Linux系統下檢視檔案或資料夾的許可權:      在終端輸入: ls -l xxx.xxx (xxx.xxx是檔名)   那麼就會出現相類似的資訊,主要都是這些:-rw-rw-r--      如下圖: 一共有10位數   其中: 最前面那個 

Linux下面的檔案操作方式

在Linux裡面有三種方式可以讀寫檔案,分別是系統呼叫、C語言檔案操作、c++方式檔案操作。下面我們來分別看看這三種方式的操作: 1、系統呼叫: #include <sys/types.h> #include <sys/stat.h>

java基礎I/O流(一)------------字元流的檔案操作

一.流的概念: java的輸入輸出稱為流,流是一組有順序的集合。而流的本質則是資料傳輸 二.流的分類:                  1.根據處理的功能分為位元組流(InputStream,OutPutStrean)和字元流(Writer,Reader)  

Python學習路——Linux基礎系統啟動流程

grub.conf 加載 text image ffffff 讀取 基礎 單用戶 python學習 系統啟動流程 整體過程:BIOS → MRB → Kernel → init 1.BIOS決定從哪個盤開始讀操作系統 主引導記錄MBR:共512bytes;前

Python基本語法文字檔案

  檔案讀寫相關係統函式說明 系統函式 說明 input(tips); 提示使用者輸入資訊,例如 str = input("Please input your ip:") 將輸入的資訊賦值給變數