I/O的相關概念
1、I/O
I/O即Input和Output,用戶進程執行I/O操作,歸結起來,也就是向操作系統發出請求,讀請求就把數據填到緩沖區里,寫數據就把緩沖區里數據排干,目的地可以是磁盤也可以是其他通道。進程通過這種方式處理所有數據的讀寫。
I/O可以分為廣義的兩大類別:File I/O和Stream I/O。
所以了解緩沖區,以及緩沖區如何工作,是所有I/O的基礎。
2、緩沖區
緩沖區可以被看作是一塊真實物理內存中的區域,用于臨時存儲數據。
讀取時數據先進入緩沖區,寫入時數據先從緩沖區發出。它能減少頻繁的磁盤操作,提高效率。
因為直接操作內存比操作磁盤要快的多。
3、用戶空間、內核空間、磁盤
下圖是 用戶進程讀磁盤數據的流程。
可以看到數據要先被讀取到內核空間緩沖區、再復制到用戶空間緩沖區這樣程序才能看得到數據。
把數據從內核空間拷貝到用戶空間似乎有些多余。為什么不直接讓磁盤控制器把數據送到用戶空間的緩沖區呢?
這樣做有幾個問題。
首先,硬件通常不能直接訪問用戶空間。
其次,像磁盤這樣基于塊存儲的硬件設備操作的是固定大小的數據塊,而用戶進程請求的可能是任意大小的字節或非對齊的數據塊。
在數據往來于用戶空間與存儲設備的過程中,內核負責數據的分解、再組合工作,因此充當著中間人的角色。
操作系統為什么要分為 用戶空間和內核空間?
主要是為了 安全性、穩定性 和 效率。
用戶空間(User Space):程序員寫的應用程序運行的空間,比如我們寫的 Java、Python、C 程序。
內核空間(Kernel Space):操作系統的核心部分(內核)運行的空間,包括內存管理、文件系統、網絡協議、硬件控制等功能。
舉個例子:
如果不分開,任何程序都能訪問內核資源,那系統崩潰或被攻擊就太容易了。
用戶程序 不能直接操作硬件,只能通過系統調用讓內核代為處理。如果不加限制,一個有 bug 或惡意的程序可能會改亂內存、讀寫設備、破壞系統。
4、虛擬內存
虛擬內存要和 物理內存的swap交換空間區分開。
概念 | 本質 | 位置 | 作用 |
---|---|---|---|
虛擬內存(Virtual Memory) | 一種地址映射機制(虛擬地址 → 物理地址) | CPU 看到的是虛擬地址 | 把程序運行時看到的內存空間抽象成一個連續的大空間 |
Swap(交換空間) | 硬盤上的一塊區域 | 磁盤 | 當物理內存不夠用時,把一部分內存內容臨時“換出去” |
虛擬內存可以大致理解為是給程序看的 大塊連續地址空間(假的,操作系統管理的)。
所有現代操作系統都使用虛擬內存。
虛擬內存意為使用虛假(或虛擬)地址取代物理(硬件RAM)內存地址。
這樣做好處頗多,總結起來可分為兩大類:
1.一個以上的虛擬地址可指向同一個物理內存地址。
2.虛擬內存空間可大于實際可用的硬件內存。
上面圖片中讀取流程、設備控制器不能通過DMA直接存儲到用戶空間,但通過利用多個虛擬地址映射同一個物理地址,則可以達到相同效果。把內核空間地址與用戶空間的虛擬地址映射到同一個物理地址,這樣,DMA硬件(只能訪問物理內存地址)就可以填充對內核與用戶空間進程同時可見的緩沖區
5、分頁技術
分頁(paging)是一種虛擬內存的實現機制。它的核心含義是:
將虛擬地址空間劃分成固定大小的“頁”(page),而物理內存同樣劃分為“頁框”(page frame),通過頁表把虛擬頁映射到物理頁框。
換句話說:分頁是一種地址映射策略。
虛擬內存 = 看起來比你實際內存多得多的“假內存”。
但你電腦真的只有 8G 內存怎么辦?裝不下了!
當物理內存不夠用時,操作系統會將某些不活躍的頁臨時存放到磁盤中(swap),等需要時再調回,這個過程叫做頁置換(page replacement),是基于分頁機制實現的。
6、文件I/O和流I/O
特性 | 文件 I/O | 流 I/O |
---|---|---|
操作對象 | 文件 | 任意數據流(文件、網絡、內存、管道) |
訪問方式 | 支持隨機訪問(seek) | 只能順序訪問 |
抽象層次 | 底層字節塊操作 | 高層數據抽象(可以處理字符、對象) |
使用場景 | 本地文件操作 | 更廣泛:網絡、IO管道、系統輸入輸出等 |
Java中的IO、NIO
參考下面兩篇博客
IO
https://blog.csdn.net/qq_37883866/article/details/140047819
NIO
https://blog.csdn.net/qq_37883866/article/details/140047866