linux下阻塞的系统调用,Linux下文件的阻塞与非阻塞对部分系统调用的影响
1.基本概念
所謂的阻塞,即內核在對文件操作I/O系統調用時,如果條件不滿足(可能需要產生I/O),則內核會將該進程掛起。非阻塞則是發現條件不滿足就會立即返回。此外需要注意的是非阻塞并不是輪詢,不然就和阻塞沒多大區別了,它只是調用不成功就直接返回了,不會在去看啥時候會滿足條件,而是有你自己去選擇接下來該咋辦,系統以不再負責
2.read/write阻塞與非阻塞的理解
read/write系統調用,并不會去直接讀寫文件,而只是去操作文件所對應的內存頁(此時的頁為虛擬內存),對于read如果在頁中找到了想要讀寫的數據,則直接從頁中將數據copy到用戶緩存即可,如果要讀的頁沒有找到,則只能從磁盤讀出該頁內容緩存在內存中即可。所謂的讀過程,其實文件系統所要做的只是鎖定頁面,然后構造一個讀請求,并將請求發給底層的IO子系統即可。linux內核中read系統調用默認是阻塞的write調用是非阻塞的,因為write時只是將用戶態的數據寫入緩存頁面中即可返回
3.對于網絡套接字阻塞/非阻塞對讀數據的影響
(1)在阻塞情況下
在阻塞條件下,read/recv/msgrcv的行為
1.如果沒有發現數據在網絡緩沖中會一直等
2.當發現有數據時會把數據讀到用戶指定的緩存區中(如果讀到的數據比指定的大小小,read此時并不會阻塞,而是會立即返回)
應為read的原則是在不超過指定長度的時候有多少讀多少,沒有數據就返回。所以一般情況下,如果我們想要讀取我們想要的字節量,就得循環read
(2)在非阻塞情況下
在非阻塞情況下read的行為
1.如果發現沒有數據就直接返回
2.如果發現有數據,那么也是采用有多少就讀多少,所以read完之后需要判斷是否再次進行read操作,以讀到我們想要的字節數
對于讀的阻塞與非阻塞區別就在于沒有數據可讀時,是否立即返回
4.對于網絡套接字阻塞/非阻塞對寫數據的影響
寫的操作本質也不是進行發送操作,而是把用戶態的數據copy到系統底層去,然后由系統幫忙發送。send,write返回成功,只表明數據已經copy到底層緩沖,而并不表明數據以發送出去,更不能表示對方端口已經接收到數據
(1)阻塞情況下
write會將數據發完之后才返回,這里與讀不同。當我們讀數據的時候,我們并不知道發送端是否還有數據要發,如果一直等待就可能造成死循環,所以為了避免這類事情發生,我們把當前緩存中的內容讀完,就返回了,并不關心是否讀夠了我們想要讀的字節數。而write,由于需要寫的長度是知道的,所以它會一直寫夠指定的字節才返回
(2)非阻塞情況下
非阻塞情況下,是采用可以寫多少就寫多少的策略,與讀不一樣的地方在于,有多少讀多少是由網絡發送端是否有數據傳輸到為標準。但是對于寫多少是由本地網絡堵塞情況為標準的,對于非阻塞的情況就是一次寫多少算多少,有可能會造成部分寫入
總結
以上是生活随笔為你收集整理的linux下阻塞的系统调用,Linux下文件的阻塞与非阻塞对部分系统调用的影响的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue 筛选
- 下一篇: 获取焦点改变输入框背景色