Java異步事件的輪詢與中斷怎么理解

這篇文章主要講解了“Java異步事件的輪詢與中斷怎么理解”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java異步事件的輪詢與中斷怎么理解”吧!

網(wǎng)站的建設(shè)成都創(chuàng)新互聯(lián)專注網(wǎng)站定制,經(jīng)驗(yàn)豐富,不做模板,主營網(wǎng)站定制開發(fā).小程序定制開發(fā),H5頁面制作!給你煥然一新的設(shè)計(jì)體驗(yàn)!已為門簾等企業(yè)提供專業(yè)服務(wù)。

CPU幾乎把所有的時間都花費(fèi)在從內(nèi)存獲取指令并運(yùn)行它們的過程中。然而,CPU和主存僅僅只是計(jì)算機(jī)硬件系統(tǒng)中眾多組件的其中兩個。一個完整的系統(tǒng)還包含其他的設(shè)備,比如:

  • 硬盤或者固態(tài)硬盤,用來存儲程序和數(shù)據(jù)文件的。(注意,主存僅保存少量的信息,并且只有在計(jì)算機(jī)接通電源的時候才能保存信息。硬盤或者固態(tài)硬盤用 來***存儲大量的信息。但是在程序真正運(yùn)行前,程序必須把硬盤或者固態(tài)硬盤里的數(shù)據(jù)加載到主存中。硬盤把數(shù)據(jù)存儲在旋轉(zhuǎn)磁盤中(spinning  magnetic disk),而固態(tài)硬盤把數(shù)據(jù)存儲在純粹的電子設(shè)備里,它不需要旋轉(zhuǎn)或者任何的機(jī)械運(yùn)動。

  • 鍵盤和鼠標(biāo),給用戶進(jìn)行輸入。

  • 顯示器和打印機(jī),用來顯示計(jì)算機(jī)的輸出。

  • 音頻輸出設(shè)備,使計(jì)算能夠播放聲音。

  • 網(wǎng)絡(luò)接口,使計(jì)算機(jī)能夠與其他聯(lián)網(wǎng)的計(jì)算機(jī)進(jìn)行通信,這些聯(lián)網(wǎng)的計(jì)算機(jī)通過有線或者無線的方式進(jìn)行聯(lián)網(wǎng)。

  • 掃描儀,把圖片轉(zhuǎn)化為能夠在計(jì)算機(jī)上存儲和操作的二進(jìn)制代碼。

上面列出的設(shè)備全都是開放式的(open  ended),并且計(jì)算機(jī)被設(shè)計(jì)成能夠通過添加新的設(shè)備來簡易地?cái)U(kuò)展計(jì)算機(jī)。CPU必須以某種方式和這些設(shè)備通信并控制它們,并且它只能通過運(yùn)行機(jī)器語言 指令來實(shí)現(xiàn)這個過程(這是它所能做到的一切了)。這個過程的實(shí)現(xiàn)方式是在系統(tǒng)中的每個設(shè)備都對應(yīng)一個設(shè)備驅(qū)動,這些驅(qū)動都是一些應(yīng)用軟件并在CPU與設(shè)備 交互時運(yùn)行。在系統(tǒng)中安裝新的設(shè)備通常需要兩個步驟:把物理設(shè)備查到計(jì)算機(jī)里,然后安裝設(shè)備驅(qū)動軟件。如果沒有設(shè)備驅(qū)動,由于CPU不能與物理設(shè)備進(jìn)行通 信,物理設(shè)備將會變得毫無用處。

由眾多設(shè)備組成的計(jì)算機(jī)系統(tǒng)通常是把這些設(shè)備連接到一條或者多條總線上進(jìn)行組織的。一條總線就是一組導(dǎo)線,這些導(dǎo)線攜帶著連接到這些導(dǎo)線上的設(shè)備的 各種信息。導(dǎo)線攜帶的信息包括數(shù)據(jù)、地址和控制信號。地址信息指引數(shù)據(jù)到特定的設(shè)備或者特定的寄存器或者特定設(shè)備內(nèi)的特定位置??刂菩盘柨梢杂糜谝粋€設(shè)備 通知另外一個設(shè)備可以在數(shù)據(jù)總線上獲取該數(shù)據(jù)。一個非常簡單的計(jì)算機(jī)系統(tǒng)可以這樣組織:

Java異步事件的輪詢與中斷怎么理解

如今,鍵盤、鼠標(biāo)和網(wǎng)絡(luò)接口等設(shè)備都可以產(chǎn)生輸入數(shù)據(jù)并需要CPU處理這些數(shù)據(jù)。那么CPU是怎樣知道數(shù)據(jù)已經(jīng)到來了呢?一個簡單并不太理想的方法 就是讓CPU不停地檢查數(shù)據(jù)是否已經(jīng)到來,并在每次發(fā)現(xiàn)數(shù)據(jù)時就處理這些數(shù)據(jù)。因?yàn)镃PU需要持續(xù)地輪詢輸入設(shè)備來檢測是否有輸入數(shù)據(jù)需要處理,所以這個 方法叫做輪詢。不幸的是,盡管輪詢很簡單,但它的效率同樣也很低。因?yàn)镃PU把大量的時間都只花費(fèi)在等待輸入上。

為了提高效率,通常使用中斷來代替輪詢。中斷是其他設(shè)備發(fā)送給CPU的信號。CPU為了響應(yīng)中斷信號,它會擱置正在處理的事務(wù)去響應(yīng)中斷信號。一旦 CPU處理完中斷,它就會返回并處理中斷出現(xiàn)時擱置的事務(wù)。例如,當(dāng)你按下鍵盤的一個鍵位時,鍵盤中斷就會被發(fā)到CPU那。然后CPU就通過中斷正在處理 的事務(wù)來響應(yīng)這個中斷信號,并讀取和處理你按下的鍵位信息。***,CPU會返回到你按下鍵位前正在執(zhí)行的任務(wù)。

此外你需要知道的是,這個中斷機(jī)制完全是使用硬件實(shí)現(xiàn)的:設(shè)備單純地通過接通導(dǎo)線來表示中斷信息。CPU被設(shè)計(jì)成當(dāng)接通導(dǎo)線時,它就會把正在處理的 事務(wù)信息保存下來(保存現(xiàn)場信息)用以之后能夠返回同一狀態(tài)(恢復(fù)現(xiàn)場)。這些信息包含程序計(jì)數(shù)器等重要內(nèi)部寄存器內(nèi)容。然后CPU會跳到一些預(yù)設(shè)的內(nèi)存 位置并執(zhí)行存儲在那的指令。這些指令構(gòu)成了一個中斷處理器用來進(jìn)行一些必要的處理去響應(yīng)中斷(這個中斷處理器是發(fā)送信號的設(shè)備的驅(qū)動軟件的一部分)。中斷 處理器的***一條指令利用之前保存的狀態(tài)信息來指示CPU跳回現(xiàn)場。

中斷使CPU能夠處理異步事件。在定期的讀取-執(zhí)行循環(huán)中,事件都是在預(yù)定的順序發(fā)生的;所有的事件都是和其他事件“同步”發(fā)生的。中斷讓CPU使用“異步”高效地處理事件成為可能,這時事件發(fā)生的時間是不可預(yù)測的。

作為使用中斷的另一個例子,思考一下當(dāng)CPU需要訪問存儲在硬盤上的數(shù)據(jù)時會發(fā)生什么事情?CPU只能直接訪問內(nèi)存里的數(shù)據(jù)。所以在訪問硬盤上的數(shù) 據(jù)前必須把數(shù)據(jù)復(fù)制到內(nèi)存里。不幸的是,相比于CPU的運(yùn)行速度,硬盤的速度顯得很慢。當(dāng)CPU需要硬盤上的數(shù)據(jù)時,它會給硬盤驅(qū)動發(fā)出信號要求它去定位 并準(zhǔn)備數(shù)據(jù)(這個信號是在常規(guī)的程序下異步發(fā)送的)。然后CPU繼續(xù)去做一些其他的任務(wù)而不是進(jìn)行不可預(yù)測的長時間等待,這個等待過程將由硬盤驅(qū)動去完 成。當(dāng)硬盤驅(qū)動準(zhǔn)備好數(shù)據(jù)后,它會發(fā)送一個中斷信號給CPU。之后中斷處理器會讀取請求數(shù)據(jù)。

現(xiàn)在你可能已經(jīng)注意到只有在CPU有多個任務(wù)要執(zhí)行時才能體現(xiàn)出中斷的作用。如果CPU只有一個任務(wù)要執(zhí)行,中斷同樣會把時間花費(fèi)在輪詢輸入上或者 等待硬盤驅(qū)動操作的完成。所有的現(xiàn)代計(jì)算機(jī)都使用多任務(wù)處理(multitasking)來一次執(zhí)行多個任務(wù)。有些計(jì)算機(jī)能夠在同一時間給多個用戶同時使 用。因?yàn)镃PU的速度是很快的,所有它能夠快速地從一個用戶切換到另一個用戶上工作,并依次為每個用戶工作很短的時間。這種多任務(wù)處理的運(yùn)用叫做分時系統(tǒng) (timesharing)。盡管如此,只有一個用戶的現(xiàn)代個人計(jì)算機(jī)同樣使用了多任務(wù)處理。例如,在時鐘程序持續(xù)地顯示時間和在網(wǎng)上下載文件的同時,用 戶可能也在使用計(jì)算機(jī)寫論文。

CPU在執(zhí)行的每一個單一的任務(wù)叫作一條線程(或者一個進(jìn)程;線程和進(jìn)程之間是有技術(shù)差異的,不過這個差異在這不重要,因?yàn)槲覀円懻摰木€程是 Java中的線程)。很多CPU可以同時運(yùn)行多個線程——這些CPU包含多個“核”并且每個核都能運(yùn)行一條線程,然而同時運(yùn)行的線程數(shù)量是有限的。時常因 為線程太多了而不能同時運(yùn)行所有的線程,計(jì)算機(jī)必須能夠從一條線程切換到另一條線程上工作,就像分時計(jì)算機(jī)從一個用戶切換到兩一個用戶一樣。通常,一條正 在運(yùn)行的線程會一直運(yùn)行下去,除非出現(xiàn)這些情況的其中一個:

  • 線程自愿讓出(yield)控制權(quán),給其他線程運(yùn)行的機(jī)會。

  • 線程可能必須要等待一些異步事件的發(fā)生。例如,線程可能需要硬盤上的一些數(shù)據(jù),或者它可能在等待用戶按下鍵位。當(dāng)線程在等待時,我們稱它被阻塞了 (blocked)。此時,如果還有其他線程的話,它們就擁有了運(yùn)行的機(jī)會。當(dāng)?shù)却氖录霈F(xiàn)時,中斷將會“喚醒”阻塞線程繼續(xù)運(yùn)行。

  • 線程可能因?yàn)楹谋M分配給它的時間片而被掛起來使其他的線程能夠運(yùn)行。不是所有的計(jì)算機(jī)都能夠以這種方式”強(qiáng)制”掛起線程的。那些能夠“強(qiáng)制”掛起 的叫作搶占式多任務(wù)系統(tǒng)(preemptive  multitasking)。要使用搶占式多任務(wù),計(jì)算機(jī)需要一個能夠定期產(chǎn)生中斷的特殊定時設(shè)備,比如每秒產(chǎn)生100次。當(dāng)定時中斷產(chǎn)生時,CPU就可 以從一條線程切換到另一條線程,而不管線程是否正在執(zhí)行。所有的現(xiàn)代臺式機(jī)和筆記本,甚至是平常的智能手機(jī)和平板,都在使用搶占式多任務(wù)。

普通用戶,甚至普通程序員,不需要與中斷和中斷處理器打交道。他們可以集中精力在不同的任務(wù)處理或者他們要計(jì)算機(jī)執(zhí)行的線程上。計(jì)算機(jī)是如何完成這 些任務(wù)的細(xì)節(jié)對他們來說不重要。實(shí)際上,大多數(shù)用戶和很多的程序員都可以忽視線程和多任務(wù)。然而,隨著計(jì)算機(jī)變得越來越強(qiáng)大、多任務(wù)和多進(jìn)程的使用越來越 多,線程已經(jīng)變得越來越重要了。實(shí)際上,使用線程的能力很快就會變成程序員的一項(xiàng)基本能力了。幸運(yùn)的是,Java對線程提供了很好的支持,它把線程當(dāng)做一 個基本的程序概念內(nèi)置到Java編程語言里。在第12章里將會講到使用線程編程的內(nèi)容。

通常,在Java和現(xiàn)代編程里同樣重要的是異步事件的基本概念。即使程序員實(shí)際上并不直接與中斷打交道,他們常常也會發(fā)現(xiàn)他們在編寫事件處理器。事 件處理器與中斷處理器類似,當(dāng)特定的事件發(fā)生時它就會被調(diào)用。與很多傳統(tǒng)的、直通式的、同步的編程相比,“事件驅(qū)動編程”擁有不一樣的體驗(yàn)。我們將會從傳 統(tǒng)類型的編程開始講起,它們現(xiàn)在依然被用來編寫單一任務(wù)的程序。不過我們將會在第6章里再來講解線程和事件。

順便提一下,執(zhí)行所有的中斷處理、操縱用戶與硬件設(shè)備之間的交互和控制哪條線程可以運(yùn)行的軟件叫作操作系統(tǒng)。操作系統(tǒng)是最基本、最重要的軟件,沒有 它計(jì)算機(jī)就不能夠正常地運(yùn)作。文字處理器和Web瀏覽器等其他的程序都要依賴于操作系統(tǒng)。常見的操作系統(tǒng)包括Linux、各個版本的Windows和 Mac OS。

感謝各位的閱讀,以上就是“Java異步事件的輪詢與中斷怎么理解”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Java異步事件的輪詢與中斷怎么理解這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

當(dāng)前標(biāo)題:Java異步事件的輪詢與中斷怎么理解
鏈接地址:http://bm7419.com/article32/jdeepc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、微信小程序關(guān)鍵詞優(yōu)化、電子商務(wù)、動態(tài)網(wǎng)站用戶體驗(yàn)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)