1. 中斷就是從中斷掉
不是讓太監來幫你干活的,他沒有那個能力。太監是用來給你調度工作的。
比如,有反叛的軍隊攻到了城外,太監慌慌張張來報告,你就不得不暫停后宮的活動,提著褲子處理首要的問題;再比如,有剛來的妃子頻頻拋媚眼,但你還有一大堆公文要批,心有余而力不足。
這種處理問題的方式,就是中斷(從中斷掉就是太監)。中斷是指在CPU正常運行期間,由于內外部事件或由程序預先安排的事件引起的 CPU 暫時停止正在運行的程序,轉而為該內部或外部事件或預先安排的事件服務的程序中去,服務完畢后再返回去繼續運行被暫時中斷的程序。
我們來看下底層的中斷處理程序。
request_irq(unsignedintirq,irq_handler_thandler,unsignedlongflags,constchar*name,void*dev)
可以看到,太監只需要給皇帝要做的事情,都編碼備案,并固定下處理流程,調整好優先級,皇帝的時間片就可以有效的輪轉起來。不至于江山都丟了,還在后宮里風花雪月。
拿網絡傳輸來說,當有了網絡數據包,就需要及時處理,否則客戶端會超時。這個時候,網卡會立馬發出中斷請求,CPU就會通過網卡的中斷程序去處理這些緩沖區。這都是非常重要的工作。
中斷又有硬中斷和軟中斷之分。硬中斷是由硬件產生的,比如,像磁盤,網卡,鍵盤,時鐘等。軟中斷是由當前正在運行的進程所產生的,通常優先級比硬中斷低一些。
2. 阻塞會占用CPU么?
代入了皇帝這個身份,我們就可以解釋一些平常遇到的,令人疑惑的問題。
我們都見過在Concurent包下面,有一個叫做LinkedBlockingQeque的類。從它的名字就可以看出,這是一個阻塞隊列。實際上,它也并不是掛著羊頭賣狗肉。
如下面的代碼,我們通常把它放在循環中。我對while(true)這種東西是有心理陰影的,因為它有可能會跑滿你的CPU。
while(true){Objecto=linkedBlockingQeque.poll();}
但實際上,并不會。因為人家都說了,這是個阻塞隊列。
相似的,還有NIO中的select。把邏輯放在while循環里,不怕得報應么?
while(!stop){intnum=selector.select();if(num==0){continue;}Iterator<SelectionKey>events=selector.selectedKeys().iterator();}
這還真不怕。因為阻塞并不會占用任何資源。
比如,小太監上報了一個折子,是關于呂嬪妃的舅舅的貪污問題處理。但是這個問題,需要等待司法調查的結果,還需要聽聽愛妃的意見,就先可以把它擱置在一旁。
把問題記錄在一個其他的小冊子里,等這些依賴的事辦的差不多了,同時你又有龍時,那就可以繼續處理。
可以看到,這種阻塞性的問題,雖然是個任務,但并不會占用你的任何時間,這在計算機中是一樣的。
我們來看一下常見的Java阻塞方式。
sleep和wait
睡和等。用詞很巧妙,到底妙在哪呢?因為它是現實中的場景。
sleep
sleep函數會讓線程在一定的時間內進入阻塞狀態,不能得到cpu時間,但不會釋放鎖資源。指定的時間一過,線程重新進入可執行狀態。
注意我們這里說的是線程,并不是CPU本身。線程不活動了,并不代表CPU不能干其他事情。
比如,今天是接見大臣的黃道吉日,王天師得到了接見的機會,其他的大臣們就得在外面等著被傳喚。結果王天師的談話又臭又長,勾不起你的任何興趣。正好小太監急匆匆跑來,在你耳邊悄悄說:李貴妃生了個兒子!
這是讓人振奮的事情,因為其他兒子都在宮斗中被KO了。于是你裝模作樣的對王天師說:我現在有點頭痛,需要小憩一會兒?!?其實你已經偷偷去探望李貴妃了。
注意,這個時候,王天師只能唯唯諾諾的等著。對于“接見”這個主線來說,其他的大臣也只能在外面等著被傳喚。它們都沒有拿到“接見”這把鎖,王天師也一直占用著這把鎖,直到你看完了兒子歸來。
這就是sleep不釋放鎖的意思,因為sleep后,在sleep那一瞬間的任何東西都沒有改變。
wait
wait( ) 使線程進入阻塞狀態,同時釋放自己占有的鎖資源,和notify( )搭配使用。
對于wait來說,就完全不一樣了。
如圖,每個監視器(Monitor)在某個時刻,只能被一個線程擁有,該線程就是 “Active Thread”。而其它線程都是 “Waiting Thread”,分別在兩個隊列 “ Entry Set”和 “Wait Set”里面等候。在 “Entry Set”中等待的線程狀態是 “Waiting for monitor entry”,而在 “Wait Set”中等待的線程狀態是 “in Object.wait()”。
術語難以理解,還是以皇帝的身份來瀟灑一下。
這個時候,你還打算接見大臣。不過,現在不想再one by one了,因為這太低效太枯燥了。某個大臣在你的書房里待得長了些,就有可能有大臣懷疑你在搞gay,這種副作用讓人心里不悅。
p2p不行,那就聚在一塊談談心吧。
正在和你談話的是王天師,因為這貨話比較多,你也比較喜歡他。
王天師說:小太子出生在三伏天,就叫史三伏吧!。
你這才想起自己姓史。作為熟讀文章的皇帝,你對此嗤之以鼻,聽著這不入流的名字,還隱隱有點生氣。
王愛卿,你還是先wait一下吧,聽聽別人意見。
這個時候,一大堆等著拍馬屁的大臣開始舉手,躍躍欲試。劉道長搶到了 談話主線 這把鎖。
劉道長: 天地長久,人有終時,北冥有魚,其名為鯤,可活億年。我看,就叫史鯤吧。
你聽后微微頷首,果然仙人嘴下口水香,但總感覺有點怪異。
注意注意。等著發言的這群大臣,就叫做Entry Set,誰舉手舉得快,就可以回答這個問題。
像王天師這種被喊停的大臣,就屬于Wait Set,只有你重新讓他說話,他才有機會。
這整個過程,談話是可以繼續的,并不因為王天師被禁言了談話就無法進行下去。我們就可以說,wait操作是釋放了對象鎖的。
計算機中各種所謂的阻塞,都是通過劃分不同的隊列資源進行處理。比如epoll就是圍繞著工作隊列和等待隊列進行編程的。雖然底層的數據結構有些不同,但思想都是一樣的。
線程如何獲取時間片?
這個不容易回答,因為你需要知道一個事實:Java中的線程,在Linux上本質是一個輕量級進程,它的調度都是操作系統來完成的。
可以看一下我們最上面那一副讓人容易產生密集恐懼癥的圖片。我們的CPU時間,就劃分為多個CPU時間片。你的程序雖然在執行while(true),但不代表它總能夠得到CPU資源,所以其他的進程也有機會去執行。
JVM采用搶占式調度模型,指的是讓優先級高的線程占用比較多的CPU,如果線程優先級相同,那么就隨機選擇一個線程,使其占用CPU。
注意“隨機”這兩個字,就非常的有魔性。它可以讓你每天都中100萬的彩票,也可能每天喝水都被嗆著。
可憐的計算機系統,也參與到大千世界讓人無奈的隨機命運而來。
但有一種很霸道的任務,對CPU一搶一個準,那就是我們上面提到的硬中斷--那些不得不優先處理的事情。
到此,相信大家對“什么是阻塞”有了更深的了解,不妨來實際操作一番吧!這里是本站網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
(資料圖片僅供參考)據美媒紐報當地時間22日稱,傳媒大亨魯伯特·默多克(Rupert Murdoch)即將迎來人生第4次離婚。據英媒11日稱,霍爾曾在前一日要求法院取消離婚申請。但就在此消息流出短短幾小時后,二人就正式公布完成離婚。英媒稱,10日晚間,默多克發言人代二人發表一份聲明,稱他們離婚了但“仍然是好朋友”。據悉,默多克和霍爾結婚6年。2022年,魯伯特...
今日據多位IT之家網友投稿,國內蘋果 App Store 突然無法訪問,IT之家拿身邊的 iPhone 測試發現屬實。IT之家在微博搜索發現,不少網友也遇到了這個問題,還有網友反映天氣和 Apple Music 也無法打開。不過IT之家查看蘋果官網的系統服務狀態頁面發現,App Store 為綠色“可用”狀態,目前蘋果還未給出回應。相關閱讀:今天下午,不少網友在網上反饋稱,...
400億韓元等于多少人民幣?韓國硬幣最小單位是什么?40000000000韓元=206024400人民幣(約2.06億元人民幣)也就是說400億韓元可以兌換約2.06億元人民幣,需要說明的是,匯率每天都有波動,不等于每天都可以兌換這么多,有漲有跌,所以數據僅供大家參考,請以當天匯率為準。韓幣有紙幣和硬幣兩種。紙幣有1000韓元、5000韓元、10000韓元、50000韓元四種。韓國硬幣總共有1韓元...