36.4 通過中斷降低CPU開銷
????多年前為了提升這種交互的性能礼饱,許多工程師發(fā)明了我們現(xiàn)在熟知的:中斷坏为。操作系統(tǒng)不是重復的輪詢設備,而是發(fā)出一個命令镊绪,使請求設備的進程進入休眠狀態(tài)匀伏,并且進行環(huán)境切換到另一任務。
當設備最終完成了操作蝴韭,它將會發(fā)出一個硬件中斷够颠,在預定的中斷服務程序中或者更簡單的中斷處理程序下使CPU跳進OS中。中斷處理系統(tǒng)只是操作系統(tǒng)代碼中的一部分榄鉴,它將會完成請求(例如履磨,通過讀取數(shù)據(jù)和可能來自設備的錯誤代碼)并且喚醒等待I/O的進程,這樣進程就能如愿執(zhí)行下去庆尘。
????因此剃诅,中斷使得計算和I/O可以同時進行,這是提升利用率的關(guān)鍵驶忌。以下的時間線展示了這一點:
????在圖中综苔,進程1某段時間占用CPU(用CPU時間線上重復的1表示),然后它向硬盤發(fā)出一個I/O請求讀取數(shù)據(jù)位岔。在沒有中斷的情況下,系統(tǒng)簡單的運行堡牡,反復的輪詢設備狀態(tài)直到I/O完成(圖中用P表示)抒抬。硬盤響應了請求,最終進程1可以再一次在CPU中執(zhí)行晤柄。
????如果我們利用中斷擦剑,允許CPU和I/O并行,當?shù)却脖P操作時芥颈,操作系統(tǒng)干點別的事惠勒。
????在這個例子中,當硬盤為進程1提供服務時爬坑,操作系統(tǒng)可以將進程2調(diào)入CPU纠屋。當硬盤請求完成,發(fā)生中斷盾计,操作系統(tǒng)喚醒進程1然后再次執(zhí)行它售担。因此赁遗,在圖中重疊的時間段中,CPU和硬盤都得到了適當?shù)氖褂谩?br>
????注意到族铆,使用中斷并不一直是最好的解決方案岩四。例如,想象一個設備非掣缛粒快地執(zhí)行它的任務:在第一次輪詢時間內(nèi)任務通常都能完成剖煌。在這個系統(tǒng)中使用中斷反而會減慢速度:切換到其他進程,處理中斷然后切回被中斷的進程逝淹,這一過程系統(tǒng)開銷很大耕姊。因此,如果一個設備運行速度很快创橄,那么最好的方式是采用輪詢箩做;如果它運行速度很慢,那么允許設備CPU并行的中斷則是最好的方式妥畏。如果設備的速度是未知的邦邦,或者有些時候快,有些時候慢醉蚁,那么最好的方式可能是混合的燃辖,即先輪詢一小會,然后如果設備還不能響應网棍,再使用中斷黔龟。在上述情況下,這種兩步的方法可能獲得最好的效果滥玷。
TIP:中斷并不一定一直優(yōu)于PIO(Programming Input/Output Model氏身,CPU控制I/O)。
盡管中斷允許計算和I/O并發(fā)執(zhí)行惑畴,但這只對低速設備有意義蛋欣。另外,中斷處理和環(huán)境切換的開銷可能超過中斷帶來的好處如贷。有這樣的案例陷虎,大量的中斷可能使得系統(tǒng)過載,并且導致活鎖現(xiàn)象杠袱;在這樣的例子中尚猿,輪詢在調(diào)度中為操作系統(tǒng)提供更多的控制,因而又是有用的楣富。
????另一個理由不去使用中斷凿掂,出現(xiàn)在網(wǎng)絡中。當巨量的即將到來的數(shù)據(jù)包每一個都產(chǎn)生一個中斷的話菩彬,很可能使得操作系統(tǒng)活鎖缠劝,即操作系統(tǒng)只顧著執(zhí)行中斷而不去執(zhí)行用戶進程也不響應請求潮梯。例如,想象一個web服務突然由于slashdot效應而受到大量訪問惨恭。在這一案例中秉馏,最好是間或使用輪詢來更好的控制系統(tǒng),并且允許web服務在返回設備檢查更多包裹到來之前脱羡,響應某些請求萝究。
????另一種基于中斷的優(yōu)化方法是聚集。在這一方法中锉罐,當一個需要發(fā)出中斷的設備向CPU遞交中斷之前帆竹,首先需要等待一小會。等待的過程中脓规,其他的請求可能很快得到完成栽连,然后多個中斷可以聚集成一個中斷遞交給CPU,從而降低中斷處理的開銷。當然侨舆,等待太久秒紧,將會增加請求的延遲,這是系統(tǒng)中常見的權(quán)衡挨下。見Ahmad et al.[A+11] 熔恢,有極好的總結(jié)。