1. 程式人生 > >作業系統精髓與設計原理(原書第6版)——學習筆記(2)

作業系統精髓與設計原理(原書第6版)——學習筆記(2)



1.3.1 取指令和執行指令

指令暫存器(InstructionRegisterIR)放置取到的指令。指令中包含確定處理器要執行的操作位,處理器解釋指令並執行對應的操作。大體上,這些操作可分為4類:

  • 處理器-儲存器:資料可以從處理器傳送到儲存器,或者從儲存器傳送到處理器。

  • 處理器-I/O通過處理器和I/O模組間的資料傳送,資料可以輸出到外部裝置,或者從外部裝置輸入資料

  • 資料處理:處理器可以執行很多與資料相關的算術操作或邏輯操作。

  • 控制:某些指令可以改變執行順序。例如,處理器從地址為149的儲存單元中取出一條指令,該指令指定下一條指令應該從地址為182的儲存單元中取,這樣處理器要把程式計數器設定為

    182.因此,在下一個取址階段中,將從地址為182的儲存單元而不是地址為150的儲存單元中取指令。

假設有一臺機器具備圖1.3中列出的所有特徵,處理器包含一個稱為累加器(AC)的資料暫存器,所有指令和資料長度均為16位,使用16位的單元或字來組織儲存器。指令格式中有4位操作碼,因而最多有16種不同的操作碼(由一位十六進位制數字表示),操作碼定義了處理器要執行的操作。通過指令格式的餘下12位,可以直接訪問的儲存器大小為40964k)個字(用三位十六進位制數表示)。

1.4描述了程式的部分執行過程,顯示了儲存器和處理器的暫存器的相關部分。給出的程式片段把地址為940的儲存單元中的內容與地址為

941的儲存單元的內容相加,並將結果儲存在後一個單元中。這需要三條指令,可用三個取址階段和三個執行階段描述:

  1. PC中包含第一條指令的地址為300,該指令內容(值為十六進位制數1940)被送入指令暫存器IR中,PC1。注意,此處理過程使用了儲存器地址暫存器MAR和儲存器快取暫存器MBR。為簡單起見,這些中間暫存器沒有顯示。

  2. IR中最初的4位(第一個十六進位制數)表示需要載入AC,剩下的12位(後三個十六進位制數)表示地址為940.

  3. 從地址為301的儲存單元中取下一個指令(5941),PC1

  4. AC中以前的內容和地址為941的儲存單元中的內容相加,結果儲存在AC

  5. 從地址為302

    的儲存單元取下一條指令(2941),PC1

  6. AC中的內容被儲存在指令941的儲存單元中。

1.3.2I/O函式

I/O模組可以直接與處理器交換資料。正如處理器可以通過指定儲存單元的地址來啟動對儲存器的讀和寫一樣,處理器也可以從I/O模組中讀取資料或向I/O模組寫入資料。

在某些情況下,允許I/O模組直接與記憶體發生資料交換,以減輕在完成I/O任務過程中的處理器負擔。此時,處理器允許I/O模組具有從儲存器中讀或向儲存器中寫的特權,這樣I/O模組與儲存器之間的資料傳送無需通過處理器完成。I/O模組對儲存器發出讀或寫的命令,而免去了處理器負責資料交換的任務,這個操作稱為直接記憶體存取(Direct Memory AccessDMA.

1.4 中斷

所有計算機都提供允許其他模組(I/O、儲存器)中斷處理器正常處理過程的機制。圖表1.1列出最常見的中斷類別。

這裡給出個例項,假設一個1GHzCPUPC機,大約每秒執行10億條指令。一個典型的硬碟的速度是7200/分,這樣大約旋轉半轉的時間是4ms,處理比這要快4百萬倍。

1.5a顯示了這種事件狀態。使用者程式在處理過程中交織著執行一系列WRITE呼叫。豎實線表示程式程式碼段,程式碼段123表示不涉及I/O指令序列。WRITE呼叫要執行一個I/O程式,此I/O程式是一個系統工具程式,由它執行真正的I/O操作。此I/O程式由三部分組成:

  • 圖中標記為4的指令序列用於為實際的I/O操作做準備。這包括賦值將要輸出到特定快取區的資料,為裝置命令準備引數。

  • 實際的I/O指令。如果不使用中斷,當執行此命令時,程式必須等待I/O裝置執行請求的函式(或週期性地檢查I/O裝置的狀態或輪詢I/O裝置)。程式可能通過簡單地重複執行一個操作的方式進行等待,以確定I/O操作是否完成

  • 圖中標5的指令序列,用於完成操作。包括設定一個表示操作成功或失敗的標記。

虛線代表處理器執行的路徑;也就是說,這條線顯示了指令執行的順序。當遇到第一條WRITE指令之後,使用者程式被中斷,I/O程式開始執行。在I/O程式執行完成之後,WRITE指令之後的使用者程式立即恢復執行。

1.4.1中斷和指令週期

處理器可以在I/O操作的執行過程中執行其他指令。考慮圖1.5b所示控制流,使用者程式到達系統呼叫WRITE處,但涉及的I/O程式僅包括準備程式碼和真正的I/O命令。在執行完指令後,控制返回到使用者程式。在這期間,外部裝置從計算機儲存器接收資料並列印。這種I/O操作和使用者程式中指令的執行是併發的。

當外部裝置準備好從處理器接收更多的資料時,該外部裝置的I/O模組給處理器傳送一箇中斷請求訊號。這時處理器做出響應,暫停當前程式,轉去處理服務於特定I/O裝置的程式,這個程式稱作中斷處理程式。在對該裝置的服務響應完成後,處理器恢復原先的執行。圖1.5b中“X”表示發生中斷的點。PS:中斷可以在主程式中的任何位置發生,而不是在一條特定的指令處。

從使用者程式的角度看,中斷打斷了正常執行的序列。當中斷處理完後,在恢復執行(見圖1.6)。使用者程式並不需要為中斷新增任何特殊的程式碼,處理器和作業系統負責掛起使用者程式,然後在同一個地方恢復執行。

為適應中斷產生的情況,在指令週期中要增加一箇中斷階段,如圖1.7所示(與圖1.2對照)。

在中斷階段中,處理器檢查是否有中斷髮生,即檢查是否出現中斷訊號。如果沒有中斷,處理器繼續執行,並在取指週期取當前程式的下一條指令;如果有中斷,處理器掛起當前程式的執行,並執行一箇中斷處理程式。這個中斷程式通常是作業系統的一部分,它確定中斷的性質,並執行所需要的操作。

為進一步理解在效率上的提高,圖1.8,它是關於圖1.5a和圖1.5b中控制流的時序圖。圖1.5b和圖1.8假設I/O操作的時間相當短,小於使用者程式中寫操作之間完成指令的時間。二更典型的情況是,特別是對比較慢的裝置如印表機來說,I/O操作比執行一系列使用者指令的時間要長的多,圖1.5c顯示了這類時間狀態。這種情況,使用者程式在由第一次呼叫產生的I/O操作完成之前,就達到了第二次WRITE呼叫。如果使使用者在這一點掛起,當前面的I/O操作完成後,才能繼續新的WRITE呼叫,也才能開始一次新的I/O操作。圖1.9給出了在這種情況下使用中斷和不使用中斷的時序圖,可以看到I/O操作在未完成時與使用者指令的執行有所重疊。

1.4.2 中斷處理

中斷激活了很多事件,包括處理器硬體中的事件以及軟體中的事件。圖1.10顯示經典型的序列,當I/O裝置完成一次I/O操作時,發生下列硬體事件:

  1. 裝置給處理器發出一箇中斷訊號

  2. 處理器在響應中斷前結束當前指令的執行,如圖1.7

  3. 處理器對中斷進行測定,確定存在未響應的中斷,並給提交中斷的裝置傳送確認訊號,確認訊號允許該裝置取消它的中斷訊號

  4. 處理器需要為把控制權轉移到中斷程式中去做準備。首先,需要儲存從中斷點恢復當前程式所需要的程式,要求的最少資訊包括程式狀態字(PSW)和儲存在程式中的程式計數器中的下一條要執行的指令地址(PC),它們被壓入系統控制棧中。

  5. 處理器把響應此中斷的中斷處理程式入口地址裝入程式計數器中。可以針對每類中斷有一箇中斷處理程式,也可以針對每個裝置和每類中斷各有一箇中斷處理程式,這取決於計算機系統結構和作業系統設計。如果有多箇中斷處理程式,處理器就必須決定呼叫哪一個,這個資訊可能已經包含在最初的中斷訊號中,否則處理器必須給發中斷的裝置傳送請求,以獲取含有所需資訊的響應。

一旦完成程式計數器的裝入,處理器則繼續到下一個指令週期,該指令週期也是從取指開始。由於取指是由於程式計數器的內容決定的,因此控制被轉移到中斷處理程式,該程式的執行引起一下操作:

  1. 與被中斷程式相關的程式計數器和PSW被儲存到系統棧中,此外,還有一些其他資訊被當做正在執行程式的狀態的一部分。特別需要儲存處理器暫存器的內容,因為中斷處理程式可能會用到這些暫存器,因此所有這些值和任何其他的狀態資訊都需要儲存。在典型情況下,中斷處理程式一開始就在棧中儲存所有暫存器內容。圖1.11a給出了一個簡單的例子。在這個例子中,使用者程式在執行地址為N的儲存單元中的指令之後被中斷,所有暫存器的內容和下一條指令的地址(N+1,一共M個字,被壓入控制棧中。棧指標被更新指向新的棧頂,程式計數器被更新指向中斷服務程式的開始。

  2. 中斷處理程式現在可以開始處理中斷,其中包括檢查與I/O操作相關的狀態資訊或其他引起中斷的事件,還可能包括I/O裝置傳送附加命令或應答。

  3. 當中斷處理結束後,被儲存的暫存器值從棧中釋放並恢復到暫存器中,如圖1.11b

  4. 最後的操作時從棧中恢復PSW和程式計數器的值,其結果是下一條要執行的指令來自前面被中斷的程式。

儲存被中斷程式的所有狀態資訊並在以後恢復這些資訊,非常重要,因為中斷並不是程式呼叫的歷程,它可以在任何時候發生,可以在使用者程式執行過程中的任何一點上發生,它的發生是不可預測的。

1.4.3 多箇中斷

處理多箇中斷有兩種方法。第一種方法是當正在處理一箇中斷時,禁止再發生中斷。禁止中斷的意思是處理器將對任何新的中斷請求訊號不予理睬。如果在這期間發生了中斷,通常中斷保持掛起,當處理器再次允許中斷時,再由處理器檢查。因此,當用戶程式正在執行並且有一箇中斷髮生時,立即禁止中斷;當中斷處理程式完成後,在恢復使用者程式之前再允許中斷,並且由處理器檢查是否還有中斷髮生。這種方法所有中斷都嚴格按順序處理(圖1.12a)。

這種方法的缺點是沒有考慮相對優先順序和時間限制的要求。例如,當來自通訊線的輸入到達時,可能需要快速接收,以便為更多的輸入讓出空間。如果在第二批輸入到達時第一批還沒有處理完,就有可能由於裝置的緩衝區裝滿或溢位二丟失資料。

         第二種方法是定義中斷優先順序,允許高優先順序的中斷打斷低優先順序的中斷處理程式的執行(圖1.12b)。例如,假設一個系統有三個I/O裝置:印表機、磁碟和通訊線,優先順序依次為245,圖1.13給出了可能的順序[TANE06]。使用者程式在t=0時開始,在t=10時發生一個印表機中斷;使用者資訊被放置到系統棧中並開始執行印表機中斷服務例程(Iterrrupt Service RoutineIRS);當這個例程仍在執行時,t=15時發生了一個通訊中斷,由於通訊線的優先順序高於印表機,必須處理這個中斷,印表機ISR被打斷,其狀態被壓入棧中,並開始執行通訊IRS;當這個程式正在執行時,又發生了一個磁碟中斷(t=20),由於這個中斷的優先順序比較低,它被掛起,通訊ISR執行直到結束。

當通訊ISR完成後(t=25),恢復以前關於執行印表機ISR的處理狀態。但是,在執行這個例程中的任何一條指令前,處理器必須完成高優先順序的磁碟中斷,這樣控制權轉移給磁碟ISR。只有當這個例程也完成時(t=35),才恢復印表機ISR。當印表機ISR完成時(t=40),控制最終返回到使用者程式。

1.4.4 多道程式設計

假設處理器執行兩道程式。一道程式從儲存器中讀資料並放入外部裝置中,另一道是包括大量計算的應用程式。處理器開始執行輸出程式,給外部裝置傳送一個寫命令,接著開始執行其他應用程式。當處理器處理很多程式時,執行順序取決於它們的相對優先順序以及它們是否在等待I/O。當一個程式被中斷時,控制權轉移給中斷處理程式,一旦中斷處理程式完成,控制權可能並不立即返回到使用者程式,而可能轉移到其他待執行的具有高優先順序的程式。最終,當原先被中斷的使用者程式變為最高的優先順序時,它將被重新恢復執行。這種多道程式輪流執行的概念稱作多道程式設計。

1.5 儲存器的層次結構

計算機儲存器的設計目的可以歸納成三個問題:多大的容量?多快的速度?多貴的價格?“多大的容量”的問題從某種意義上來說是無止境的,儲存器有多大的容量,就可能開發出相應的應用程式使用它。“多快的速度”的問題相對易於回答,為達到最佳的效能,儲存器的速度必須能夠跟得上處理器的速度。當處理器正在執行指令時,我們不希望它會因為等待指令或運算元而暫停。最後一個問題,對一個實際的計算機系統,儲存器的價格與計算機其他部件的價格相比應該是合理的。

在任何時候,實現儲存器系統會用到各種各樣的技術,但各種技術之間往往存在著以下關係:

  • 存取時間越快,每一個“位”的價格越高。

  • 容量越大,每一個“位”的價格越低。

  • 容量越大,存取速度越慢。

設計者面臨的困難時很明顯的,由於需求是較大的容量和每一個“位”較低的價格,因而設計者通常希望使用能夠提供大容量儲存的儲存器技術。但是為滿足效能要求,又需要使用昂貴的、容量相對比較小而具有快速存取時間的儲存器。

解決這個難題的方法是,不依賴於單一的儲存元件或技術,而是使用儲存器的層次結構。一種典型的層次結構如圖1.14所示:

當沿著這個層次結構從上往下看,會得到以下情況:

  1. 每一個“位”的價格遞減

  2. 容量遞增

  3. 存取時間遞增

  4. 處理器訪問儲存器的頻率遞減

因此,容量較大、價格較便宜的慢速儲存器是容量較小、價格較貴的快速儲存器的後備。這種儲存器的層次結構能夠成功的關鍵在於低層訪問頻率遞減。

假設處理器存取兩級儲存器,第一級儲存器的容量為1000個位元組,存取時間為0.1μs;第二級儲存器包含100000個位元組,存取時間為1μs。假如需要存取第一級儲存器中的一個位元組,則處理器可以直接存取此位元組;如果這個位元組位於第二級儲存器,則此位元組首先需要轉移到第一級儲存器中,然後再由處理器存取。為簡單起見,我們忽略了處理器用於確定這個位元組是在第一級儲存器還是在第二級儲存器所需時間。如圖1.15給出反映這種模型的一般曲線模型。

此圖表示了二級儲存器的平均存取時間是命中率H的函式,H定義為對較快儲存器(如快取記憶體)的訪問次數與對所有儲存器的訪問次數的比值,T1是訪問第一級儲存器的存取時間,T2是訪問第二級儲存器的存取時間。可以發現,當第一級儲存器的存取次數所佔比例較高時,總的平均存取時間更接近於第一儲存器的存取時間而不是第二級儲存器的存取時間。

例如,假設有95%的儲存器存取(H=0.95)發生在快取記憶體中,則訪問一個位元組的平均存取時間可表示為:

此結果非常接近於快速儲存器的存取時間。因此僅當條件a)到d)使用時,原則上可以實現該策略。通過使用各種技術手段,現有的儲存器系統滿足條件a)到c),而且條件d)通常也是有效的。