中斷是什麼?
中斷的漢語解釋是半中間發生阻隔、停頓或故障而斷開。那麼,在計算機系統中,我們為什麼需要「阻隔、停頓和斷開」呢?
舉個日常生活中的例子,比如說我正在廚房用煤氣燒一壺水,這樣就只能守在廚房裡,苦苦等著水開——如果水溢位來澆滅了煤氣,有可能就要發生一場災難了。等啊等啊,外邊突然傳來了驚奇的叫聲「怎麼不關水龍頭?」於是我慚愧的發現,剛才接水之後只顧著抱怨這份無聊的差事,居然忘了這事,於是慌慌張張的衝向水管,三下兩下關了龍頭,聲音又傳到耳邊,「怎麼幹什麼都是這麼馬虎?」。伸伸舌頭,這件小事就這麼過去了,我落寞的眼神又落在了水壺上。
門外忽然又傳來了鏗鏘有力的歌聲,我最喜歡的古裝劇要開演了,真想奪門而出,然而,聽著水壺發出「咕嘟咕嘟」的聲音,我清楚:除非等到水開,否則沒有我享受人生的時候。
這個場景跟中斷有什麼關係呢?
如果說我專心致志等待水開是乙個過程的話,那麼叫聲、電視裡傳出的**不都讓這個過程「半中間發生阻隔、停頓或故障而斷開」了嗎?這不就是活生生的「中斷」嗎?
在這個場景中,我是唯一具有處理能力的主體,不管是燒水、關水龍頭還是看電視,同乙個時間點上我只能幹一件事情。但是,在我專心致志幹一件事情時,總有許多或緊迫或不緊迫的事情突然出現在面前,都需要去關注,有些還需要我停下手頭的工作馬上去處理。只有在處理完之後,方能回頭完成先前的任務,「把一壺水徹底燒開!」
中斷機制不僅賦予了我處理意外情況的能力,如果我能充分發揮這個機制的妙用,就可以「同時」完成多個任務了。回到燒水的例子,實際上,無論我在不在廚房,煤氣灶總是會把水燒開的,我要做的,只不過是及時關掉煤氣灶而已,為了這麼乙個一秒鐘就能完成的動作,卻讓我死死地守候在廚房裡,在10分鐘的時間裡不停地看壺嘴是不是冒蒸氣,怎麼說都不划算。我決定安下心來看電視。當然,在有生之年,我都不希望讓廚房成為火海,於是我上了鬧鐘,10分鐘以後它會發出「尖叫」,提醒我爐子上的水燒開了,那時我再去關煤氣也完全來得及。我用乙個中斷訊號——鬧鈴——換來了10分鐘的歡樂時光,心裡不禁由衷地感嘆:中斷機制真是個好東西。
正是由於中斷機制,我才能有條不紊地「同時」完成多個任務,中斷機制實質上幫助我提高了併發「處理」能力。它也能給計算機系統帶來同樣的好處:如果在鍵盤按下的時候會得到乙個中斷訊號,cpu就不必死守著等待鍵盤輸入了;如果硬碟讀寫完成後傳送乙個中斷訊號,cpu就可以騰出手來集中精力「服務大眾」了——無論是人類敲打鍵盤的指尖還是來回讀寫介質的磁頭,跟cpu的處理速度相比,都太慢了。沒有中斷機制,就像我們苦守廚房一樣,計算機談不上有什麼並行處理能力。
跟人相似,cpu也一樣要面對紛繁蕪雜的局面——現實中的意外是無處不在的——有可能是使用者等得不耐煩,猛敲鍵盤;有可能是運算中碰到了0除數;還有可能網絡卡突然接收到了乙個新的資料報。這些都需要cpu具體情況具體分析,要麼馬上處理,要麼暫緩響應,要麼置之不理。無論如何應對,都需要cpu暫停「手頭」的工作,拿出一種對策,只有在響應之後,方能回頭完成先前的使命,「把一壺水徹底燒開!」
計算機系統實現中斷機制是非常複雜的一件工作,再怎麼說人都是高度智慧型化的生物,而計算機作為乙個鐵疙瘩,沒有程式的教導就一事無成。而處理乙個中斷過程,它受到的限制和需要學習的東西太多了。
首先,計算機能夠接收的外部訊號形式非常有限。中斷是由外部的輸入引起的,可以說是一種刺激。在燒水的場景中,這些輸入是叫聲和電視的**,我們這裡只以聲音為例。其實現實世界中能輸入人類cpu——大腦的訊號很多,影象、氣味一樣能被我們接受,人的資訊介面很完善。而計算機則不然,接受外部訊號的途徑越多,設計實現就越複雜,代價就越高。因此個人計算機(pc)給所有的外部刺激只留了一種輸入方式——特定格式的電訊號,並對這種訊號的格式、接入方法、響應方法、處理步驟都做了規約(具體內容本文後面部分會繼續詳解),這種訊號就是中斷或中斷訊號,而這一整套機制就是中斷機制。
其次,計算機不懂得如何應對訊號。人類的大腦可以自行處理外部輸入,我從來不用去擔心鬧鐘響時會手足無措——走進廚房關煤氣,這簡直是天經地義的事情,還用大腦想啊,小腿肚子都知道——可惜計算機不行,沒有程式,它就紋絲不動。因此,必須有機制保證外部中斷訊號到來後,有正確的程式在正確的時候被執行。
還有,計算機不懂得如何保持工作的持續性。我在看電視的時候如果去廚房關了煤氣,回來以後能繼續將電視進行到底,不受太大的影響。而計算機則不然,如果放下手頭的工作直接去處理「意外」的中斷,那麼它就再也沒有辦法想起來曾經作過什麼,做到什麼程度了。自然也就沒有什麼「重操舊業」的機會了。這樣的處理方式就不是併發執行,而是東一榔頭,西一棒槌了。
那麼,通用的計算機系統是如何解決這些問題的呢?它是靠硬體和軟體配合來協同實現中斷處理的全過程的。我們將通過intel x86架構的實現來介紹這一過程。
cpu執行完一條指令後,下一條指令的邏輯位址存放在cs和eip這對暫存器中。在執行新指令前,控制單元會檢查在執行前一條指令的過程中是否有中斷或異常發生。如果有,控制單元就會拋下指令,進入下面的流程:
1. 確定與中斷或異常關聯的向量i (0£i£255)
2. 尋找向量對應的處理程式
3. 儲存當前的「工作現場」,執行中斷或異常的處理程式
4. 處理程式執行完畢後,把控制權交還給控制單元
5. 控制單元恢復現場,返回繼續執行原程式
了解一下NTLM
ntlm 在客戶機與伺服器之間提供身份認證的安全包。ntlm 身份驗證協議 是 質詢 應答身份驗證協議,是windows nt 4.0 及其早期版本中用於網路身份驗證的預設協議。windows 2000 中仍然支援該協議,但它不再是預設的。ntlm身份驗證過程 ntlm 是用於 windows nt...
了解一下 display flex
一 display flex flex 是flexuble box的縮寫,意為 彈性盒子 用來為盒狀模型提供最大的靈活性.任何乙個容器都可以指定為flex布局.box 行內元素也可以使用flex布局.box webkit核心的瀏覽器,必須加上 webkit box 注意為父級設計flex布局以後,子...
指標了解一下
在c語言中,我們會頻繁的使用指標,那麼什麼是指標?首先我們來看一段 include int main 假如建立的變數a的位址為0x0000ff11,那麼指標變數指向變數a,存放的是變數a的位址。總結 指標就是位址,指標變數是變數,指標變數是用來儲存位址的變數。存放在指標變數中的值都會被當做位址來處理...