linux阻塞和非阻塞(linux阻塞与非阻塞)
linux阻塞指令?
1.阻塞(block)概念:指進程或線程在執行設備操作或管道,或則網絡時,不能獲取到資源就被掛起,
直到滿足可操作的條件后在進行操作,被掛起的進程進入休眠狀態,從運行隊列移走,直到
等待的條件滿足才繼續執行。也就是執行到某些函數時必須等待某個事件發生函數才返回。
2.非阻塞(non_block):進程就算沒有獲取到資源或沒有等到事件發生時不掛起,通常會直接放棄或不斷查詢,
直到可以進行的位置。也就是函數的執行不必等待事件發生,一旦執行肯定返回,用返回值來反應函數執行情況。
3.例如:read讀取輸入輸出設備/dev/tty
4.read設備文件時發生阻塞
linux accept()函數一直處于阻塞狀態,什么原因?
accept()函數就是阻塞的啊,要等待接收到有客戶端請求才可以進行后續的操作,你所謂的不可以是指什么?
Linux下read函數默認到底是阻塞的還是非阻塞的?
不知題主的read是指socket的read還是文件的read。
默認情況下,socket的read是阻塞的; 對文件進行read,要看內核態的read接口是注冊為同步接口還是異步接口(可參見file_operations結構體)
線程進入阻塞時,線程會不會讓出CPU?
那要看操作系統context switch的機制。一般windows linux ios都會給定每個線程指定的執行時間,如果時間到了會出現計時器中斷信號(timer interrupt signal),而線程會被動丟失CPU的使用權。
而有些簡單的嵌入式系統沒有這個機制,context switch一般是要求線程主動放棄CPU使用權而交給kernel。
如果這時候當前線程被阻塞那就會導致死循環,這時候要主動的叫reschedule 或者 yield等函數給kernel發信號。
當然有timer的系統也可以叫這些函數要當前線程提早主動放棄CPU資源從而避免在循環里等待浪費時間。
linux串口讀取數據被截斷,怎樣一次全部接收?
沒辦法保證能夠一次全部接收,只能自己緩存起來處理。比如,發送數據時候增加帶有長度的數據頭以及末尾的校驗,用 select 對串口做非阻塞讀取,讀到數據后檢查是否完整,不完整就接著讀,直到獲得完整數據再處理。
總結
以上是生活随笔為你收集整理的linux阻塞和非阻塞(linux阻塞与非阻塞)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3d电影播放软件安卓(3d安卓电影)
- 下一篇: 如何在ADF中将参数传递给ActionL