自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java編程入門——異步事件:輪詢與中斷

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

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

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

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

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

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

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

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

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

由眾多設(shè)備組成的計算機(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ī)系統(tǒng)可以這樣組織:

如今,鍵盤、鼠標(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ù)。因為CPU需要持續(xù)地輪詢輸入設(shè)備來檢測是否有輸入數(shù)據(jù)需要處理,所以這個 方法叫做輪詢。不幸的是,盡管輪詢很簡單,但它的效率同樣也很低。因為CPU把大量的時間都只花費在等待輸入上。

為了提高效率,通常使用中斷來代替輪詢。中斷是其他設(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ī)制完全是使用硬件實現(xiàn)的:設(shè)備單純地通過接通導(dǎo)線來表示中斷信息。CPU被設(shè)計成當(dāng)接通導(dǎo)線時,它就會把正在處理的 事務(wù)信息保存下來(保存現(xiàn)場信息)用以之后能夠返回同一狀態(tài)(恢復(fù)現(xiàn)場)。這些信息包含程序計數(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的運行速度,硬盤的速度顯得很慢。當(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í)行,中斷同樣會把時間花費在輪詢輸入上或者 等待硬盤驅(qū)動操作的完成。所有的現(xiàn)代計算機(jī)都使用多任務(wù)處理(multitasking)來一次執(zhí)行多個任務(wù)。有些計算機(jī)能夠在同一時間給多個用戶同時使 用。因為CPU的速度是很快的,所有它能夠快速地從一個用戶切換到另一個用戶上工作,并依次為每個用戶工作很短的時間。這種多任務(wù)處理的運用叫做分時系統(tǒng) (timesharing)。盡管如此,只有一個用戶的現(xiàn)代個人計算機(jī)同樣使用了多任務(wù)處理。例如,在時鐘程序持續(xù)地顯示時間和在網(wǎng)上下載文件的同時,用 戶可能也在使用計算機(jī)寫論文。

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

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

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

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

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

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

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

原文鏈接: math.hws.edu 翻譯: ImportNew.com - 進(jìn)林
譯文鏈接: http://www.importnew.com/16620.html

 

責(zé)任編輯:王雪燕 來源: ImportNew
相關(guān)推薦

2013-03-08 09:33:25

JavaScript同步異步

2013-04-01 15:25:41

異步編程異步EMP

2017-07-13 12:12:19

前端JavaScript異步編程

2023-09-06 09:00:00

架構(gòu)開發(fā)異步編程

2013-04-01 15:38:54

異步編程異步編程模型

2009-08-20 17:47:54

C#異步編程模式

2023-07-07 07:44:41

線程中斷LockSuppor

2010-04-06 15:20:56

ASP.NET MVC

2023-11-28 08:49:01

短輪詢WebSocket長輪詢

2020-07-07 14:49:17

中斷輪詢數(shù)據(jù)包

2011-02-24 12:53:51

.NET異步傳統(tǒng)

2024-05-23 11:26:02

2021-08-02 11:13:28

人工智能機(jī)器學(xué)習(xí)技術(shù)

2021-03-22 08:45:30

異步編程Java

2011-03-03 10:21:11

Windows事件追蹤

2023-10-30 23:25:48

FuturesGo語言

2020-10-15 13:29:57

javascript

2020-08-18 10:20:50

Java 編程開發(fā)

2021-02-21 14:35:29

Java 8異步編程

2011-02-22 09:09:21

.NETAsync CTP異步
點贊
收藏

51CTO技術(shù)棧公眾號