天天看點

徹底了解同步 異步 阻塞 非阻塞

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

繼續閱讀