徹底理解BIO,NIO,AIO

用戶空間和內核空間

在IO操作過程中都是應用程序先把數據拷貝到用戶空間的緩衝區,在把緩衝區的數據拷貝的內核空間的緩衝區,最後再將內核空間緩衝區的數據保存到磁盤。

徹底理解BIO,NIO,AIO

io操作過程

BIO操作IO過程

徹底理解BIO,NIO,AIO

bio

BIO是同步阻塞IO :同步表示線程A發起IO操作後會親自接收IO操作完後的結果,阻塞主要表現在IO在操作過程中由於數據沒有準備好或者內核空間還沒有把數據返回 這兩個過程一直處於阻塞狀態.

注:在NIO還沒有出現的時候 為了提高BIO的性能主要是用多線程方式解決:當一個客戶端的請求來的時候,首先accept()會收到客戶端的請求,此時會新建一個線程去處理客戶端的請求。這樣會有一個問題,當客戶端請求多了以後,服務器的線程會愈來愈多,服務器的壓力會很大。

BIO缺點:

1.每個Socket接收到,都會創建一個線程,線程的競爭、切換上下文影響性能;

2.每個線程都會佔用棧空間和CPU資源;

3.並不是每個socket都進行IO操作,無意義的線程處理;

NIO操作IO過程:

徹底理解BIO,NIO,AIO

nio

NIO是同步非阻塞:非阻塞的過程主要表現在所有請求都會註冊到selector選擇器上,當數據沒有準備好就直接返回,而selector選擇器會通過輪詢的方式判斷請求的線程數據是否已經準備好。IO操作數據是通過Buffer緩衝區與內核交付,當數據準備好後就會馬上去讀取,而BIO此時會一直阻塞等待數據準備和返回,而NIO通過這個Buffer緩衝區做了一個橋樑大大提高了效率

AIO是異步IO:是指當線程發起IO操作時馬上就返回了,把所有的操作都交給了操作系統去完成,當操作系統完成IO操作後會通過事件回調的方式通過IO線程。

關於阻塞與非阻塞 同步與異步的區別:

一般來說IO分為兩個階段,第一階段是等待數據階段,第二階段是內核空間的數據拷貝到用戶空間,

假設一個線程(或是進程)P準備執行一個IO操作的話它會經歷以下過程:

第一階段:

P發出一個IO請求,這時候會有兩種情況:

1:立刻返回: 非阻塞

2:一直等待,P調用sleep/wait休眠或是掛起,讓出CPU給別的線程/進程 阻塞

第二階段:

這時內核的數據終於準備好了,

那麼現在用戶進程想要讀取內核空間的數據有兩種方式:

1: P自己把數據從內核空間拷貝到用戶空間 同步

2:P創建一個線程做數據copy的工作 異步

現在應該明白了吧。阻塞/非阻塞是針對IO的第一階段的描述。異步/同步是針對IO的第二階段的描述也就是IO的主體。

這裡主要比較難理解的就是同步/異步。首先P在發起IO的請求的時候如果P本身還要負責IO請求後的數據copy(內核空間到用戶空間)工作。那麼我們就可以說是同步的。

如果P在發起IO操作後數據copy的工作由內核線程/進程或是P自己再創建一個線程/進程去完成,那麼我們就可以稱之為異步


分享到:


相關文章: