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操作完成以後,将完成狀态和結果通知接收方,接收方再響應發送方。(效率最高)