最近面試問的比較多的問題就是IO這一塊了,有些也答出來了,有些答的不好,最近這段時間開始深入瞭解一些這方面的東西,也想總結一下。
前置點
1,使用者空間系統空間
Linux系統會把一個程式分為兩個空間,使用者空間和系統空間,比如我們正常的編碼,操作的都是使用者空間的,那如果我們需要呼叫系統功能,比如拷貝系統檔案,這種就需要呼叫系統元件,獲取核心服務,完成操作
IO的兩個階段
IO的執行過程中分為兩個階段,等待就緒,執行拷貝
等待就緒:我們知道,我們執行IO操作的時候,資料可能來自別的應用程式或者網路,如果沒有資料,作業系統是會一直等待的,此時,應用程式可能也會一直等待
執行拷貝:將資料拷貝到應用程式工作區
阻塞與非阻塞,同步與非同步
先說同步與非同步,最簡單就是看是否啟動一個執行緒或者程式來完成IO這件事情,同步IO的時候,系統會停下來等這個做完才能做別的事情,而非同步IO就利用多執行緒的方式,啟動一個新的執行緒去做這件事情,而自己就可以去幹別的事情等待通知
再說阻塞與非阻塞吧,這兩個其實關注的是程式在等待呼叫結果的時候的狀態,阻塞是指,你在獲取這個結果的時候,你會一直掛起,直到等到完整結果之後你才會繼續執行,非阻塞是指,在該程式不能獲取結果的時候,沒有阻塞執行緒,這個有點繞,有一個通俗的解釋,如果是阻塞的,我要獲取這個東西,獲取過程中,我就失去了CPU,等到結果之後我才會獲取CPU,但是如果我是非阻塞,我就繼續持有CPU,我還可以一直檢查
幾種IO模型
目前比較多的就是5種
- 阻塞IO
最傳統的一種IO,即讀寫會發生阻塞現象的 - 非阻塞IO
使用者發起read的時候,並不會失去CPU,會一直check,如果沒有成功,會返回一個error,如果收到成功訊號,就會發起read操作,獲取完整結果 - 多路複用IO
這個就是Java NIO的核心了,會有一個執行緒管理多個socket的狀態,檢查是否有準備好的,只有發現真正準備好,才會呼叫cpu執行IO操作,這塊是比較重要的 - 訊號驅動IO
用的少,忽略 - 非同步IO
起一個執行緒去執行吧