非阻塞IO與阻塞IO

2021-10-19 23:27:21 字數 720 閱讀 4684

非阻塞式呼叫的問題

kibuv提供了乙個執行緒池

阻塞於非阻塞對於被呼叫者,即系統層面,系統為程式提供了阻塞呼叫和非阻塞呼叫,同步和非同步是對於呼叫者,就是自己的程式,發七呼叫,沒有其他操作,只是等待結果這個過程就是同步,發起呼叫後會等待結果,繼續完成其他的工作,等有回掉再執行,這個過程就是非同步的。

不需要關注執行緒安全問題。

微任務佇列:

巨集觀任務佇列:

事件佇列初始化

settimeout

( fn1 )

setimmediate

( fn2 )

// 理論上是fn1() >>> fn2()

// 先會將settimeout的回掉內容掛在到事件樹上去,放入佇列中,但是這個過程需要消耗時間

// 當同步**執行完成,此時,就會初始化事件迴圈 這個過程需要消耗時間

// 開始第一次tick 會一次執行settimeout 然後會有乙個check過程,檢測是否有setimmediate,有就執行setimmediate;

// 假設 同步**執行完成後,時間迴圈初始化的時間快於settimeout回掉掛在到佇列樹上的時候,就會出現 fn2() >>> fn1()

// 初始化事件迴圈佇列後就會立馬開始執行,遇到check後檢測是否有setimmediate,就會執行setimmediate,不會等待settimeout掛在到佇列樹上之後在執行,

阻塞IO與非阻塞IO

阻塞io,當前程序因不滿足一些條件,而被掛起,即阻塞,cpu改去服務其它程序,read乙個普通檔案,就馬上執行,read乙個滑鼠,可是滑鼠沒有動,於是就阻塞了,阻塞的好處,利於os效能的發揮,cpu發揮高,雖然個體的費了點時間,但是總的效率得到了提高,阻塞在多路io的時候,缺陷就出來了,比如2路io...

阻塞I O,非阻塞I O

拿 socket舉例。當read資料時,如果這時沒有資料可讀,阻塞i o會一直等待有資料讀,資料從kernel copy 到socket的buffer後返回 非阻塞i o會立即返回,但如果有資料可讀,非阻塞i o也是等資料從kernel copy 到socket的buffer後返回。以上是阻塞與非阻...

阻塞與非阻塞I O

還記得上篇 我們講到的是linux中併發控制訪問的手段有哪些?原子 訊號量 自旋鎖 互斥體。這是為了保護臨界區的資源,是多個程序對共享資源的併發訪問的一種處理手段。但是,在驅動程式中,我們常常為了支援使用者空間對裝置的靈活訪問,引入了阻塞與非阻塞i o兩種不同模式。阻塞操作是指在執行裝置操作時若不能...