linux阻塞與非阻塞
1. linux下阻塞,非阻塞,輪詢
用淺顯的話來說吧。
在一般的情況下,在系統和應用程序之間有一個請求隊列層,起到調度的作用,應用程序不會直接訪問系統,而是把訪問請求放進隊列層中;而系統也在不停的從隊列層中提取請求然後不斷的分發執行,這種請求方式就是阻塞式訪問。
但是有些特殊的請求是不允許停止和等待的,這種請求就不會被放入隊列層中,而是直接插入到系統的當前處理的前端,而被優先執行,這種請求方式就是非阻塞式訪問。
這二者的區別是由於其工作性質決定的,單純從理論角度來說,與CPU佔用等沒有任何關系,CPU佔用只和和演算法復雜度有關。
一般非阻塞功能都是使用在系統級的請求上,比如某些驅動級的中斷請求或實時類請求,因為繞過了請求隊列,編制不良的非阻塞程序可能會導致系統失去響應。
2. Linux下read函數默認到底是阻塞的還是非阻塞的
不知題主的read是指socket的read還是文件的read。
默認情況下,socket的read是阻塞的;
對文件進行read,要看內核態的read介面是注冊為同步介面還是非同步介面(可參見file_operations結構體)
3. linux網路編程中阻塞和非阻塞socket的區別
阻塞的是意思是這樣:read函數讀的時候,如果此時數據包沒有來,那就程序就會暫停執行,在read函數裡面暫停。它如何繼續執行呢?那就是數據包來之後它繼續執行。非阻塞就是說,如何執行read函數的時候,數據包沒有,那麼read函數返回沒有讀到任何東西,如果執行read函數時候恰好有數據包,那麼read函數將返回讀到的數據包。也就是說,阻塞的socket使用read的時候,你都能保證讀到數據包。而非阻塞就不一定了,所以往往非阻塞需要配合循環,不停的讀,或者設置一個超時。如果讀了幾次,或者等待了多少秒沒有讀到,就超時。阻塞的,無法控制時間。
4. Linux 中的read系統調用到底是阻塞還是非阻
所謂阻塞,即當內核發現請求條件不滿足時(可能需要產生IO)將調用進程掛起,讓出CPU給需要的進程執行,提高效率,調用者進程被阻塞至條件滿足時再被喚醒。
我們來深入跟蹤read/write系統調用,因為Linux內核中對文件的讀寫採用了緩存,文件數據按照頁面(默認大小為4096位元組)為單位緩存在內存中,對於read系統調用,內核會根據應用程序發出的讀偏移在緩存中查找所讀位置對應的緩存頁面是否存在,如果存在,那麼萬事大吉,只需將數據從緩存頁面至用戶緩沖區即可,但如果此頁面尚未被緩存,那麼沒有別的辦法,只能從磁碟上讀出該頁面數據並緩存在內存中,所謂的讀過程,其實文件系統所需做的只是鎖定頁面,然後構造一個讀請求,並將請求發送給底層的IO子系統即可。文件系統發送完請求並不代表該頁面已經從磁碟中讀出,如果此時read系統調用返回,那就意味著該調用是非阻塞,不等IO完成即返回至調用者,但閱讀內核代碼發現,文件系統在發送完IO請求後並不立即返回,而是在接下來的流程中去嘗試鎖定該讀頁面,因為在前面文件系統發IO請求時頁面已經被鎖定,因此,如果頁面尚未被讀出的話,此時鎖定的話必然會阻塞,至此,我們就清楚了Linux內核中的read系統調用默認實現是阻塞方式。
5. linux 調試串口 是阻塞還是非阻塞模式
兩種方式都提供的,取決於你調用讀寫函數的參數timeout。