您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java異步事件的輪詢與中斷怎么理解”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java異步事件的輪詢與中斷怎么理解”吧!
CPU幾乎把所有的時間都花費在從內存獲取指令并運行它們的過程中。然而,CPU和主存僅僅只是計算機硬件系統中眾多組件的其中兩個。一個完整的系統還包含其他的設備,比如:
硬盤或者固態硬盤,用來存儲程序和數據文件的。(注意,主存僅保存少量的信息,并且只有在計算機接通電源的時候才能保存信息。硬盤或者固態硬盤用 來***存儲大量的信息。但是在程序真正運行前,程序必須把硬盤或者固態硬盤里的數據加載到主存中。硬盤把數據存儲在旋轉磁盤中(spinning magnetic disk),而固態硬盤把數據存儲在純粹的電子設備里,它不需要旋轉或者任何的機械運動。
鍵盤和鼠標,給用戶進行輸入。
顯示器和打印機,用來顯示計算機的輸出。
音頻輸出設備,使計算能夠播放聲音。
網絡接口,使計算機能夠與其他聯網的計算機進行通信,這些聯網的計算機通過有線或者無線的方式進行聯網。
掃描儀,把圖片轉化為能夠在計算機上存儲和操作的二進制代碼。
上面列出的設備全都是開放式的(open ended),并且計算機被設計成能夠通過添加新的設備來簡易地擴展計算機。CPU必須以某種方式和這些設備通信并控制它們,并且它只能通過運行機器語言 指令來實現這個過程(這是它所能做到的一切了)。這個過程的實現方式是在系統中的每個設備都對應一個設備驅動,這些驅動都是一些應用軟件并在CPU與設備 交互時運行。在系統中安裝新的設備通常需要兩個步驟:把物理設備查到計算機里,然后安裝設備驅動軟件。如果沒有設備驅動,由于CPU不能與物理設備進行通 信,物理設備將會變得毫無用處。
由眾多設備組成的計算機系統通常是把這些設備連接到一條或者多條總線上進行組織的。一條總線就是一組導線,這些導線攜帶著連接到這些導線上的設備的 各種信息。導線攜帶的信息包括數據、地址和控制信號。地址信息指引數據到特定的設備或者特定的寄存器或者特定設備內的特定位置。控制信號可以用于一個設備 通知另外一個設備可以在數據總線上獲取該數據。一個非常簡單的計算機系統可以這樣組織:
如今,鍵盤、鼠標和網絡接口等設備都可以產生輸入數據并需要CPU處理這些數據。那么CPU是怎樣知道數據已經到來了呢?一個簡單并不太理想的方法 就是讓CPU不停地檢查數據是否已經到來,并在每次發現數據時就處理這些數據。因為CPU需要持續地輪詢輸入設備來檢測是否有輸入數據需要處理,所以這個 方法叫做輪詢。不幸的是,盡管輪詢很簡單,但它的效率同樣也很低。因為CPU把大量的時間都只花費在等待輸入上。
為了提高效率,通常使用中斷來代替輪詢。中斷是其他設備發送給CPU的信號。CPU為了響應中斷信號,它會擱置正在處理的事務去響應中斷信號。一旦 CPU處理完中斷,它就會返回并處理中斷出現時擱置的事務。例如,當你按下鍵盤的一個鍵位時,鍵盤中斷就會被發到CPU那。然后CPU就通過中斷正在處理 的事務來響應這個中斷信號,并讀取和處理你按下的鍵位信息。***,CPU會返回到你按下鍵位前正在執行的任務。
此外你需要知道的是,這個中斷機制完全是使用硬件實現的:設備單純地通過接通導線來表示中斷信息。CPU被設計成當接通導線時,它就會把正在處理的 事務信息保存下來(保存現場信息)用以之后能夠返回同一狀態(恢復現場)。這些信息包含程序計數器等重要內部寄存器內容。然后CPU會跳到一些預設的內存 位置并執行存儲在那的指令。這些指令構成了一個中斷處理器用來進行一些必要的處理去響應中斷(這個中斷處理器是發送信號的設備的驅動軟件的一部分)。中斷 處理器的***一條指令利用之前保存的狀態信息來指示CPU跳回現場。
中斷使CPU能夠處理異步事件。在定期的讀取-執行循環中,事件都是在預定的順序發生的;所有的事件都是和其他事件“同步”發生的。中斷讓CPU使用“異步”高效地處理事件成為可能,這時事件發生的時間是不可預測的。
作為使用中斷的另一個例子,思考一下當CPU需要訪問存儲在硬盤上的數據時會發生什么事情?CPU只能直接訪問內存里的數據。所以在訪問硬盤上的數 據前必須把數據復制到內存里。不幸的是,相比于CPU的運行速度,硬盤的速度顯得很慢。當CPU需要硬盤上的數據時,它會給硬盤驅動發出信號要求它去定位 并準備數據(這個信號是在常規的程序下異步發送的)。然后CPU繼續去做一些其他的任務而不是進行不可預測的長時間等待,這個等待過程將由硬盤驅動去完 成。當硬盤驅動準備好數據后,它會發送一個中斷信號給CPU。之后中斷處理器會讀取請求數據。
現在你可能已經注意到只有在CPU有多個任務要執行時才能體現出中斷的作用。如果CPU只有一個任務要執行,中斷同樣會把時間花費在輪詢輸入上或者 等待硬盤驅動操作的完成。所有的現代計算機都使用多任務處理(multitasking)來一次執行多個任務。有些計算機能夠在同一時間給多個用戶同時使 用。因為CPU的速度是很快的,所有它能夠快速地從一個用戶切換到另一個用戶上工作,并依次為每個用戶工作很短的時間。這種多任務處理的運用叫做分時系統 (timesharing)。盡管如此,只有一個用戶的現代個人計算機同樣使用了多任務處理。例如,在時鐘程序持續地顯示時間和在網上下載文件的同時,用 戶可能也在使用計算機寫論文。
CPU在執行的每一個單一的任務叫作一條線程(或者一個進程;線程和進程之間是有技術差異的,不過這個差異在這不重要,因為我們要討論的線程是 Java中的線程)。很多CPU可以同時運行多個線程——這些CPU包含多個“核”并且每個核都能運行一條線程,然而同時運行的線程數量是有限的。時常因 為線程太多了而不能同時運行所有的線程,計算機必須能夠從一條線程切換到另一條線程上工作,就像分時計算機從一個用戶切換到兩一個用戶一樣。通常,一條正 在運行的線程會一直運行下去,除非出現這些情況的其中一個:
線程自愿讓出(yield)控制權,給其他線程運行的機會。
線程可能必須要等待一些異步事件的發生。例如,線程可能需要硬盤上的一些數據,或者它可能在等待用戶按下鍵位。當線程在等待時,我們稱它被阻塞了 (blocked)。此時,如果還有其他線程的話,它們就擁有了運行的機會。當等待的事件出現時,中斷將會“喚醒”阻塞線程繼續運行。
線程可能因為耗盡分配給它的時間片而被掛起來使其他的線程能夠運行。不是所有的計算機都能夠以這種方式”強制”掛起線程的。那些能夠“強制”掛起 的叫作搶占式多任務系統(preemptive multitasking)。要使用搶占式多任務,計算機需要一個能夠定期產生中斷的特殊定時設備,比如每秒產生100次。當定時中斷產生時,CPU就可 以從一條線程切換到另一條線程,而不管線程是否正在執行。所有的現代臺式機和筆記本,甚至是平常的智能手機和平板,都在使用搶占式多任務。
普通用戶,甚至普通程序員,不需要與中斷和中斷處理器打交道。他們可以集中精力在不同的任務處理或者他們要計算機執行的線程上。計算機是如何完成這 些任務的細節對他們來說不重要。實際上,大多數用戶和很多的程序員都可以忽視線程和多任務。然而,隨著計算機變得越來越強大、多任務和多進程的使用越來越 多,線程已經變得越來越重要了。實際上,使用線程的能力很快就會變成程序員的一項基本能力了。幸運的是,Java對線程提供了很好的支持,它把線程當做一 個基本的程序概念內置到Java編程語言里。在第12章里將會講到使用線程編程的內容。
通常,在Java和現代編程里同樣重要的是異步事件的基本概念。即使程序員實際上并不直接與中斷打交道,他們常常也會發現他們在編寫事件處理器。事 件處理器與中斷處理器類似,當特定的事件發生時它就會被調用。與很多傳統的、直通式的、同步的編程相比,“事件驅動編程”擁有不一樣的體驗。我們將會從傳 統類型的編程開始講起,它們現在依然被用來編寫單一任務的程序。不過我們將會在第6章里再來講解線程和事件。
順便提一下,執行所有的中斷處理、操縱用戶與硬件設備之間的交互和控制哪條線程可以運行的軟件叫作操作系統。操作系統是最基本、最重要的軟件,沒有 它計算機就不能夠正常地運作。文字處理器和Web瀏覽器等其他的程序都要依賴于操作系統。常見的操作系統包括Linux、各個版本的Windows和 Mac OS。
感謝各位的閱讀,以上就是“Java異步事件的輪詢與中斷怎么理解”的內容了,經過本文的學習后,相信大家對Java異步事件的輪詢與中斷怎么理解這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。