linux中的mmap和直接io的區別,兩者的使用場景有啥區別?

時間 2021-05-29 23:48:29

1樓:醉臥沙場

直接IO是不經過Page cache的,多用於資料庫,直接IO終歸還是IO操作,一般經過檔案系統(不是一定)向裝置IO請求讀寫。而mmap首先是虛擬記憶體的技術,用來建立新的虛擬儲存器區域,對映後的操作走的是虛擬記憶體那套東西,和普通的IO操作是兩個概念(當然下來對儲存器的讀寫還是要走bio的)

普通IO要走read/write系統呼叫,需要定位inode然後定位磁碟位址,然後直接IO就是直接對磁碟讀寫,buffer IO是有快取的。只是這點區別而已,性質是一樣的。

而記憶體對映是將檔案的磁碟空間對映到一塊虛擬記憶體的位址上,之後對這段區域的讀寫完全是對記憶體的操作而不是read/write操作。資料在記憶體中的修改會引起髒頁回寫,從而保證資料更新到磁碟,這些都是虛擬記憶體技術。記憶體對映的乙個用途是可以讓多個程序共享資料。

理解要從根源去理解,不能從不知道哪看來的一段斷章取義的話學起。包括我這裡的解釋也是片面的,因為已經有足夠多的正規的資料教人認識這些了,我只是拋磚引玉,希望你能知道自己接下來該去看什麼。

Golang中fmt Println和直接println有什麼區別?

LMO 摘自 https gfw.go101.org article u nofficial faq.html print builtin fmt log 內建的print println函式總是寫入標準錯誤。fmt標準包裡的列印函式總是寫入標準輸出。log標準包裡的列印函式會預設寫入標準錯誤,然而...

如何理解Linux中的OOM Out Of Memory Killer 機制?

最難不過二叉樹 針對題主的疑惑嘗試回答下 當物理記憶體不夠的時候啟用虛擬記憶體不就行了嗎?一般系統管理員會設定swap,記憶體不夠時會把暫時不用的記憶體頁swap到磁碟,騰出空間,也就是你說的虛擬記憶體了。但是這個swap大小都會設定為某乙個值,所以記憶體 swap 也會面臨都耗盡的情況。為什麼不可...

Mbti測試中的I和E如何正確區分?

蛋捲小麵包 定義上認為 E 社交獲取能量,變得越來越振奮。規模大,社交面廣。I 社交減少能量,需要時間恢復。規模小,社交深度高。實際舉例 INFJ 先洞察Ni,再Fe。說明INFJ社交依賴環境和地點。INFJ把洞察放在高於社交的位置。ENFJ 先Fe,再Ni。說明ENFJ把社交放在高於洞察的位置上。...