IO操作
IO分兩階段(一旦拿到數據后就變成了數據操作,不再是IO):
1.數據准備階段
2.內核空間復制數據到用戶進程緩沖區(用戶空間)階段
在操作系統中,程序運行的空間分為內核空間和用戶空間。
應用程序都是運行在用戶空間的,所以它們能操作的數據也都在用戶空間。
阻塞IO和非阻塞IO的區別在於第一步發起IO請求是否會被阻塞:
如果阻塞直到完成那么就是傳統的阻塞IO,如果不阻塞,那么就是非阻塞IO。
一般來講:
阻塞IO模型、非阻塞IO模型、IO復用模型(select/poll/epoll)、信號驅動IO模型都屬於同步IO,因為階段2是阻塞的(盡管時間很短)。
同步IO和異步IO的區別就在於第二個步驟是否阻塞:
如果不阻塞,而是操作系統幫你做完IO操作再將結果返回給你,那么就是異步IO

同步和異步IO 阻塞和非阻塞IO
同步和異步IO的概念:
同步是用戶線程發起I/O請求后需要等待或者輪詢內核I/O操作完成后才能繼續執行
異步是用戶線程發起I/O請求后仍需要繼續執行,當內核I/O操作完成后會通知用戶線程,或者調用用戶線程注冊的回調函數
阻塞和非阻塞IO的概念:
阻塞是指I/O操作需要徹底完成后才能返回用戶空間
非阻塞是指I/O操作被調用后立即返回一個狀態值,無需等I/O操作徹底完成



同步與異步(線程間調用)
同步與異步是對應於調用者與被調用者,它們是線程之間的關系,兩個線程之間要么是同步的,要么是異步的
同步操作時,調用者需要等待被調用者返回結果,才會進行下一步操作
而異步則相反,調用者不需要等待被調用者返回調用,即可進行下一步操作,被調用者通常依靠事件、回調等機制來通知調用者結果
阻塞與非阻塞(線程內調用)
阻塞與非阻塞是對同一個線程來說的,在某個時刻,線程要么處於阻塞,要么處於非阻塞
阻塞和非阻塞關注的是程序在等待調用結果(消息,返回值)時的狀態:
阻塞調用是指調用結果返回之前,當前線程會被掛起。調用線程只有在得到結果之后才會返回。
非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞當前線程。
同步與異步調用/線程/通信
同步就是兩種東西通過一種機制實現步調一致,異步是兩種東西不必步調一致
一、同步調用與異步調用:
在用在調用場景中,無非是對調用結果的不同處理。
同步調用就是調用一但返回,就能知道結果,而異步是返回時不一定知道結果,還得通過其他機制來獲知結果,如:
a. 狀態 b. 通知 c. 回調函數
二、同步線程與異步線程:
同步線程:即兩個線程步調要一致,其中一個線程可能要阻塞等待另外一個線程的運行,要相互協商。快的阻塞一下等到慢的步調一致。
異步線程:步調不用一致,各自按各自的步調運行,不受另一個線程的影響。
三、同步通信與異步通信:
同步和異步是指:發送方和接收方是否協調步調一致
同步通信是指:發送方和接收方通過一定機制,實現收發步調協調。
如:發送方發出數據后,等接收方發回響應以后才發下一個數據包的通訊方式
異步通信是指:發送方的發送不管接收方的接收狀態。
如:發送方發出數據后,不等接收方發回響應,接着發送下個數據包的通訊方式。
阻塞可以是實現同步的一種手段!例如兩個東西需要同步,一旦出現不同步情況,我就阻塞快的一方,使雙方達到同步。
同步是兩個對象之間的關系,而阻塞是一個對象的狀態。
四種組合方式
同步阻塞方式:
發送方發送請求之后一直等待響應。
接收方處理請求時進行的IO操作如果不能馬上等到返回結果,就一直等到返回結果后,才響應發送方,期間不能進行其他工作。
同步非阻塞方式:
發送方發送請求之后,一直等待響應。
接受方處理請求時進行的IO操作如果不能馬上的得到結果,就立即返回,取做其他事情。
但是由於沒有得到請求處理結果,不響應發送方,發送方一直等待。
當IO操作完成以后,將完成狀態和結果通知接收方,接收方再響應發送方,發送方才進入下一次請求過程。(實際不應用)
異步阻塞方式:
發送方向接收方請求后,不等待響應,可以繼續其他工作。
接收方處理請求時進行IO操作如果不能馬上得到結果,就一直等到返回結果后,才響應發送方,期間不能進行其他操作。 (實際不應用)
異步非阻塞方式:
發送方向接收方請求后,不等待響應,可以繼續其他工作。
接收方處理請求時進行IO操作如果不能馬上得到結果,也不等待,而是馬上返回去做其他事情。
當IO操作完成以后,將完成狀態和結果通知接收方,接收方再響應發送方。(效率最高)