操作系統--阻塞,睡眠麻削,掛起
參考: http://www.reibang.com/p/ad29c92324a1
java中io操作會使線程阻塞,那IO操作怎么完成
場景:main方法開啟工作線程A 執(zhí)行阻塞式read()操作红碑,A進入阻塞狀態(tài)直到read()方法返回
疑問:
- 阻塞期間A無法獲得cpu時間片赶站,read()操作怎么執(zhí)行的?
- 為何io操作會使線程阻塞产喉? 我在A線城執(zhí)行其他耗時操作(比如復雜的數學計算)捂掰,為何A會一直運行
解答:
- 看這個就能知道, 阻塞IO在阻塞時候的操作不是在用戶線程執(zhí)行,用戶線程現在被阻塞, 而是操作系統來完成(這個時候Java的線程只能等待), 等操作系統那邊準備好數據以后用戶線程才繼續(xù).
I/O會一直占用CPU嗎曾沈?
阻塞io情況下这嚣,比如磁盤io,accept 塞俱,read姐帚,recv,write等調用導致進程或者線程阻塞障涯,這時候線程/進程 會占用cpu嗎罐旗?比如連接mysql,執(zhí)行一條需要執(zhí)行很長的sql語句唯蝶,recv調用的時候阻塞了尤莺,這個時候會不會大量占用cpu時間?磁盤io是什么操作生棍,比如linux調用cp拷貝大文件的時候會大量占用cpu嗎颤霎?
計算機硬件上使用DMA(Direct Memory Access,直接內存存取)來訪問磁盤等IO涂滴,也就是請求發(fā)出后友酱,CPU就不再管了,直到DMA處理器完成任務柔纵,再通過
中斷
告訴CPU完成了缔杉。所以,單獨的一個IO時間搁料,對CPU的占用是很少的或详,阻塞了就更不會占用CPU了系羞,因為程序都不繼續(xù)運行了,CPU時間交給其它線程和進程了霸琴。雖然IO不會占用大量的CPU時間椒振,但是非常頻繁的IO還是會非常浪費CPU時間的,所以面對大量IO的任務梧乘,有時候是需要算法來合并IO澎迎,或者通過cache來緩解IO壓力的。所以IO密集型其實是很耗CPU的选调。
知乎: https://www.zhihu.com/question/27734728
參考:https://segmentfault.com/q/1010000012982974/a-1020000012983411
https://www.zhihu.com/question/27734728/answer/37877484