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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM