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

2021-09-28 17:01:12 字數 1033 閱讀 2116

前言最近有同事問我同步非同步與阻塞非阻塞有什麼區別,後來發現很多同事不能區分這些概念。本篇文章主要想梳理一下計算機程式設計中的一些概念。

使用者空間

使用者空間就是使用者程序可以直接訪問的空間。使用者的程序,就是你寫的程式的執行例項,是生存在使用者空間的。比如說,你在你的程式裡宣告的變數a,就被儲存在使用者空間。

在程式設計時,使用者程序無法直接操作計算機硬體,與硬體發生io,需要通過核心間接的操作。

核心空間

系統核心是可以與硬體互動的,它所生存的空間就是核心空間。為了使使用者程序能夠使用包括操縱計算計硬體等作業系統更底層的功能,核心會暴漏出一些介面給使用者,這些介面是使用者程序使用核心功能的唯一手段。

系統呼叫

使用者程序使用核心暴漏的介面的行為,成為系統呼叫。外然系統呼叫也是由函式呈現的,但是它與普通的函式有明顯的區別。系統呼叫會導致核心空間重的資料的訪問和指令的執行,而普通函式卻只能在使用者空間中有所作為。

使用者態核心態

系統io

使用者程序不能直接訪問資料,對於一次io訪問,資料會先被拷貝到作業系統核心的緩衝區中,然後才會從作業系統核心的緩衝區拷貝到應用程式的位址空間。只有系統呼叫的時候才會涉及到io。

阻塞非阻塞

阻塞io與非阻塞io也是在系統呼叫的時候對系統呼叫的描述。

針對阻塞io執行的系統呼叫可能因為無法立即完成而被作業系統掛起,直到等待的事件(資料成功返回)發生為止。

針對非阻塞io執行的系統呼叫則總是立即返回,而不管事件是否已經發生。

同步非同步

對於同步io而言,使用者可以直接對io執行讀寫操作,這些操作告訴核心使用者讀寫緩衝區的位置,以及io操作完成之後核心通知應用程式的方式。

非同步io的讀寫操作總是立即返回的,而不論io是否是阻塞的,因為真正的讀寫操作已經由核心接管。

也就是說,同步io模型要求使用者**自行執行io操作(將資料從核心緩衝區讀入使用者緩衝區,或將資料從使用者緩衝區寫入核心緩衝區),而非同步io機制則由核心來執行io操作(資料在核心緩衝區和使用者緩衝區之間的移動由核心在後台完成的)。你可以這樣認為,同步io向應用程式通知的是io就緒事件,而非同步io向應用程式通知的是io完成事件。

理解阻塞非阻塞與同步非同步

同步和非同步關注的是訊息通訊機制 synchronous communication asynchronous communication 所謂同步,就是在發出乙個 呼叫 時,在沒有得到結果之前,該 呼叫 就不返回。但是一旦呼叫返回,就得到返回值了。換句話說,就是由 呼叫者 主動等待這個 呼叫 的結...

同步 非同步,阻塞 非阻塞理解

由於同步非同步,阻塞非阻塞都學習了有一段時間了。慢慢了快忘了,所以乾脆趁著寒假把知識點都撿起來,寫出來。同步和非同步是一組概念,阻塞和非阻塞是一組概念。大家不要搞混了,不要把同步和阻塞等價,也不要把非同步和非阻塞等價 戲說不是胡說,改編不是亂編 滑稽 在剛開始理解的時候很容易搞混,我們這樣想,同步和...

同步 非同步與阻塞 非阻塞的理解

在學習到python網路程式設計,socketserver.中,涉及到select的應用,由此了解到socket的setblocking模式,了解了socket有阻塞與非阻塞的區別,同時網上查詢了一下,感覺對非同步 同步的概念有些重疊,為此深入了解一下。在linux網路io中涉及到如下模型 1 阻塞...