對於一個應用程序即一個操作系統進程來說,它既有內核空間(與其他進程共享),也有用戶空間(進程私有),它們都是處於虛擬地址空間中。用戶進程是無法訪問內核空間的,它只能訪問用戶空間,通過用戶空間去內核空間復制數據,然后進行處理。
阻塞io(同步io):
發起請求就一直等待,直到數據返回。好比你去商場試衣間,里面有人,那你就一直在門外等着。(全程阻塞)
非阻塞io(同步io):
不管有沒有數據都返回,沒有就隔一段時間再來請求,如此循環。好比你要喝水,水還沒燒開,你就隔段時間去看一下飲水機,直到水燒開為止。(復制數據時阻塞)
io復用(同步io):
I/O是指網絡I/O,多路指多個TCP連接(即socket或者channel),復用指復用一個或幾個線程。意思說一個或一組線程處理多個連接。比如課堂上學生做完了作業就舉手,老師就下去檢查作業。(對一個IO端口,兩次調用,兩次返回,比阻塞IO並沒有什么優越性;關鍵是能實現同時對多個IO端口進行監聽,可以同時對多個讀/寫操作的IO函數進行輪詢檢測,直到有數據可讀或可寫時,才真正調用IO操作函數。)
信號驅動io(同步io):
事先發出一個請求,當有數據后會返回一個標識回調,這時你可以去請求數據。好比銀行排號,當叫到你的時候,你就可以去處理業務了(復制數據時阻塞)。
異步io:
發出請求就返回,剩下的事情會異步自動完成,不需要做任何處理。好比有事秘書干,自己啥也不用管。
總結:
五種IO的模型:阻塞IO、非阻塞IO、多路復用IO、信號驅動IO和異步IO;前四種都是同步IO,在內核數據copy到用戶空間時都是阻塞的。
阻塞IO和非阻塞IO的區別在於第一步,發起IO請求是否會被阻塞,如果會那就是傳統的阻塞IO,如果不會那就是非阻塞IO。
同步IO和異步IO的區別就在於第二個步驟是否阻塞,如果實際的IO讀寫阻塞請求進程,那么就是同步IO;如果不阻塞,而是操作系統幫你做完IO操作再將結果返回給你,那么就是異步IO