linux阻塞与非阻塞(linux 阻塞)
linux平臺(tái)下如何讓字符設(shè)備支持阻塞和非阻塞io模型,以read操作為例?
不知題主的read是指socket的read還是文件的read。 默認(rèn)情況下,socket的read是阻塞的; 對(duì)文件進(jìn)行read,要看內(nèi)核態(tài)的read接口是注冊(cè)為同步接口還是異步接口(可參見file_operations結(jié)構(gòu)體)
linux阻塞指令?
1.阻塞(block)概念:指進(jìn)程或線程在執(zhí)行設(shè)備操作或管道,或則網(wǎng)絡(luò)時(shí),不能獲取到資源就被掛起,
直到滿足可操作的條件后在進(jìn)行操作,被掛起的進(jìn)程進(jìn)入休眠狀態(tài),從運(yùn)行隊(duì)列移走,直到
等待的條件滿足才繼續(xù)執(zhí)行。也就是執(zhí)行到某些函數(shù)時(shí)必須等待某個(gè)事件發(fā)生函數(shù)才返回。
2.非阻塞(non_block):進(jìn)程就算沒有獲取到資源或沒有等到事件發(fā)生時(shí)不掛起,通常會(huì)直接放棄或不斷查詢,
直到可以進(jìn)行的位置。也就是函數(shù)的執(zhí)行不必等待事件發(fā)生,一旦執(zhí)行肯定返回,用返回值來反應(yīng)函數(shù)執(zhí)行情況。
3.例如:read讀取輸入輸出設(shè)備/dev/tty
4.read設(shè)備文件時(shí)發(fā)生阻塞
Linux下read函數(shù)默認(rèn)到底是阻塞的還是非阻塞的?
不知題主的read是指socket的read還是文件的read。
默認(rèn)情況下,socket的read是阻塞的; 對(duì)文件進(jìn)行read,要看內(nèi)核態(tài)的read接口是注冊(cè)為同步接口還是異步接口(可參見file_operations結(jié)構(gòu)體)
線程進(jìn)入阻塞時(shí),線程會(huì)不會(huì)讓出CPU?
那要看操作系統(tǒng)context switch的機(jī)制。一般windows linux ios都會(huì)給定每個(gè)線程指定的執(zhí)行時(shí)間,如果時(shí)間到了會(huì)出現(xiàn)計(jì)時(shí)器中斷信號(hào)(timer interrupt signal),而線程會(huì)被動(dòng)丟失CPU的使用權(quán)。
而有些簡(jiǎn)單的嵌入式系統(tǒng)沒有這個(gè)機(jī)制,context switch一般是要求線程主動(dòng)放棄CPU使用權(quán)而交給kernel。
如果這時(shí)候當(dāng)前線程被阻塞那就會(huì)導(dǎo)致死循環(huán),這時(shí)候要主動(dòng)的叫reschedule 或者 yield等函數(shù)給kernel發(fā)信號(hào)。
當(dāng)然有timer的系統(tǒng)也可以叫這些函數(shù)要當(dāng)前線程提早主動(dòng)放棄CPU資源從而避免在循環(huán)里等待浪費(fèi)時(shí)間。
Linux內(nèi)存占用過高的問題解決方案?
1.首先考慮增加物理內(nèi)存,2G太少了2.查看mysql里的線程,觀察是否有長(zhǎng)期運(yùn)行或阻塞的sql:show full processlist3.查看mysql內(nèi)存,緩存的相關(guān)配置,使用如show global variables like '%sort_buffer_size%';如不符合當(dāng)前系統(tǒng)負(fù)載量,說明當(dāng)前配置不合理,需要進(jìn)行調(diào)整
總結(jié)
以上是生活随笔為你收集整理的linux阻塞与非阻塞(linux 阻塞)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决Spring自动装配中的循环依赖
- 下一篇: 接触Jenkins(Hudson)API