網路城邦
上一篇 回創作列表 下一篇   字體:
作業系統筆記(10) I/O系統
2020/11/23 11:11:11瀏覽12378|回應0|推薦0

10章輸出入系統

電腦在進行運算處理的前後或是進行的過程中,都可能有跟外界溝通的需要,

所以在電腦發展的過程中,不只電腦的效率進步,周遭的設備也是一直在進步中。

每一台電腦的主要工作除了進行各種運算之外,就是和各種週邊裝置交換資料與訊息。

電腦輸出入系統簡介

電腦系統裡的CPU和其他的控制單元或稱控制器,Controller是以匯流排連接在一起的,每個控制單元負責管理某種裝置,CPU和裝置之間資料的流通必須經由控制單元來協調。簡單地說,CPU和裝置之間資料的流動就是所謂的「輸出」(output)和「輸入」(input)的作業,也簡稱為I/O

認識I/O作業

1. 同步SynchronousI/O:執行中的程序等待I/O作業完成,資料傳送完以後,程序才會繼續執行。

2. 非同步asynchronousI/O:送出I/O請求的程序繼續執行,這種方式可以提昇作業系統的效率,因為CPU的使用率提高了。

對於作業系統而言,I/O作業的執行源於中斷的請求interrupt request,這種請求可能來身硬體,也有可能來自軟體。硬體要求中斷時,只要送訊號到CPU即可;若是軟體要求中斷,則是透過所謂的系統呼叫System call

為了讓I/O作業能有效率地進行,同時也善用CPU的處理能力,我們必須盡可能地讓CPU做有用的工作,促使I/O裝置盡可能地早點完成作業,這樣整個電腦系統的運作才會順暢。因此,作業系統提供了一些複雜的機制來達成這個目的,我們下面就以這些機制做為主題來認識作業系統所扮演的角色。

傳輸的模式

序列傳輸一次在單一線路上傳送一個位元,傳送的資料依照順序排列,傳送的資料區塊前後用「開始位元」(start bit)與「終止位元」(stop bit)來區分。

平行傳輸使用多條線路同時傳送,資料位元在平行的線路上依照順序排列,資料傳送時運用另外一條線路來控制同步的傳輸。通常序列傳輸比較慢,平行傳輸較快,可是平行傳輸使用的線路多,控制的機制較複雜。

一般個人電腦各主要裝置的配置圖

硬體層面的作業

1. 使用特殊的I/O指令, 2. 記憶體映射(memory mapped

CPU和控制器之間的溝通是有一定的步驟來規範的,我們可以從協定protocol的角度來看這種溝通的過程,主要有3種:輪詢Polling、中斷Interrupt和直接記憶存取DMA Direct Memory Access

CPUI/O工作要執行時,可以反覆檢驗status register中的busy bit,定裝置是否忙碌,這個步驟就是所謂的「輪詢」Polling,一旦裝置不再忙碌,CPU會趕快利用command-ready位元告知ControllerI/O指令要執行,Controller發覺後,馬上將busy bit設定為1,然後開始處理I/O指令。輪詢的方式有一些缺點,假如I/O裝置效率很低,CPU可能要等很久才會完成I/O的作業

常見的中斷類型

中斷與指令週期(instruction cycle)的關係

沒有中斷時程式的控制流程

有中斷時程式的控制流程

支援中斷時的指令週期,通常中斷的處理與否是可以設定的,假如系統暫停中段的處理(interrupt disabled),則指令週期可以完全不理會中斷的發生。

PSW是什麼呢? PSW (program status word)代表程式狀態資訊,是位於處理器中一個或一組暫存器(register)裡頭的資料,包括一些條件碼(condition codes)與其他的狀態資訊(status information),例如interrupt enable/disable bitsupervisor/user mode bit

多重中斷的情況(multiple interrupts),有兩種主要的方式:

1. 在中斷正在處理時先暫停中斷(disable interrupts):這樣的話處理器會忽略隨後到達的中斷訊號。在處理器恢復中斷處理(enable interrupts)以後,還是可以處理這些原來被忽略的中斷。這個方法的缺點是沒有考慮到相對的優先順序與一些緊迫的需求。

2. 定義中斷的優先順序(priority):讓中斷具有優先順序,所以優先順序低的中斷處理程式有可能被優先順序高的中斷打斷,圖顯示的就是這種情況。

即使運用了中斷的機制,有時候處理器的使用還是沒有達到很好的效率,因為中斷只是讓同一個程式的執行做了調整,有的程式的特性就是無法因為中斷而大幅增進系統的效能,尤其是在完成I/O作業所需要的時間特別長的情況下,這時候可以利用多個使用者程式交錯執行的方法,觀念跟中斷有點像,也就是作業系統中多工(multiprogramming)的機制。

直接記憶存取(DMA

CPU必須處理大量的I/O作業時,可以用下面的程序來讓DMA幫忙:

1. 提供I/O資訊: CPU先將資料源、資料目的地和資料量的資訊寫入記憶體中,然後把包含這些資訊的位址交給DMA Controller。一旦完成這個步驟,CPU就可以繼續執行其他的工作。

2. DMAI/O作業:DMA Controller依照所得到的資訊,開始進行I/O作業,透過DMA協定向I/O裝置要求資料的傳送,這時候是由DMA ControllerDevice controller來掌控資料的傳送,I/O完成以後,DMA Controller會中斷CPU

DMA進行時,有時候主記憶體連接的匯流排會被DMA Controller佔用,造成CPU暫時無法使用主記憶體,這種現象稱為「cycle stealing」。對CPU的效能會有一些影響。但整體來說,DMA所減輕的負荷遠勝於帶來的副作用,尤其在I/O作業含大量資料的情況下更為明顯。

[深入了解DMA]對於效率比較高的輸入設備來說,可能輸入的速度接近儲存到buffer的速度,這樣就會造成CPU一直被中斷。DMA(direct memory access)的技術就是要解決這種問題,特別用來輔助高速的輸出入設備,主要的技巧是一次就傳送一整個block的輸入資料,所以CPU只要中斷一次,而不是一個byte就要中斷一次。

[DMA的原理]請求輸入資料的程式先提出資料輸入的請求,作業系統安排buffer,通常是1284096 bytes的大小,I/O device的類型有關,接著由特定的device driver設定DMA controller registers使用的sourcedestination addresses,DMA controller開始進行I/O,這時候不需要CPU的參與,但是memory通常還是一次處理一個bytes,所以DMA有時會把memoryCPU那裡搶過來,對於CPU的效能會有影響,這個現象也稱為cycle stealing,I/O完成時,DMA controller要中斷CPU

DMAI/O的進行盡量不打擾到CPU的工作,除非真的有必要。在沒有使用DMA的情況下,devicememory之間的資料交換一直有CPU的介入,假如有運用DMA,devicememory可以直接交換資料,另外DMA的功能通常是在硬體的層次上提供的。

軟體層面的作業

在作業系統的層次上,對於不同的I/O裝置仍然要提供一個標準而一致的介面,也就是說,作業系統本身得依照I/O裝置的特性來和它們打交道,但是透過作業系統來使用I/O裝置的程式,最好介面和溝通的方式不會因裝置的不同而異。

透過核心模組中的驅動程式device drivers,處理各種I/O裝置特殊的溝通方式,然提供一個一致的介面給應用程式,這是一種抽象化abstraction的過程。

在不同的作業系統中還是得不同的驅動程式,這是不太方便的地方。I/O裝置的特性可從以下幾個角度來分類:

1. 傳輸單位:可分成以一個位元組byte為傳輸單位的character-stream device,以及以多個位元組傳輸單位的block device

2. 同時性: 可分成同步裝置:Synchronous device與非同步裝置Asynchronous device,同步裝置進行I/O的回應時間是可以預期的,非同步裝置的回應時間則比較不規律。

3. 傳輸速率:從每秒幾個位元組到每秒幾GBs的速率都有。

4. 資料存取方式: 分成循序存取的裝置sequential device與隨機存取的裝置random-access device,循序存取必須按照某種順序來存取資料。隨機存取裝置可直接搜尋到某處的資料進行存取。

5. read與寫write的特性: I/O裝置可執行唯讀read only、唯寫write only或可讀寫read-write的操作,像一般的光碟機僅能讀取資料,就屬於唯讀的裝置。

6. 共用方式: 分成可共用的sharable與獨佔的dedicated,可共用的I/O裝置可讓多個程序同使用。

從系統呼叫和資料存取的角度來看,I/O作業可以分成下面幾大類:

1. block I/O: 磁碟是block I/O device的代表,readwrite是對這一類裝置常用的系統呼叫,假如是隨機存取的裝置,還可以加上seek的呼叫。

2. character-stream I/O: 鍵盤屬於這一類的裝置,常用GETPUT兩種系統呼叫,在這樣的介面上可以建立像整行輸入、編輯、輸入緩衝等額外的功能。

3. 記憶體映射memory-mapped的檔案存取: 利用記憶體空間和磁碟之間的對應,讓檔案用起來像是存在於主記憶體中。這種方式的存取效率很高。

4. 網路存取介面: 網路上的資料存取也可以看成是I/O的一種型式,通訊槽介面Socket Interface就是一種網路I/O的存取介面。

I/O作業經常會使用系統呼叫(system calls):

1. 阻絕式呼叫blocking call: 呼叫程式必須等I/O完成後才能繼續執行。

2. 非阻絕式呼叫Non-blocking call: 呼叫後馬上傳回目前I/O執行的狀態,呼叫程式不必等I/O程序完成。

3. 非同步的呼叫Asynchronous call: 呼叫後不必等I/O完成就可以執行其他的工作,等到I/O作業完成時再利用中斷或其他的方式來告知原來呼叫I/O的程式。

作業系統中執行的程序都有可能發出I/O作業的請求,I/O子系統必須妥善地安排資源的分配。讓輸出入能順利地完成。

I/O的排程(Scheduling

I/O請求累積時,I/O子系統要想辦法公平地安排執行I/O的先後次序,除了得維持系統的效能之外,還得儘量減少呼叫程序的等待時間。通常排程需要為每個I/O裝置保存一個請求佇列request queue,由排程的程式scheduler依照優先順序和排程演算法來改變或建立佇列中各請求的次序。假如安排得好,則系統的效能將可大幅改善。

緩衝處理3個主要的時機:

1. 資料傳送兩方的速率不一致: 若是一方資料送得快,另一方還來不及收的話,部分資料就得先放在緩衝區裡頭。

2. 資料傳送兩方接受的資料單位大小不同: 例如網路上的封包在傳送時會先分割成小塊資料,送達另一方時再組合起來,在所有的分割資料完全到達之前,等待重組的資料得先暫存在緩衝區。

3. 複製效應copy semantics: 當應用程式把資料寫入磁碟時,會呼叫write,提供資料的位址和資料量的資訊,從圖來看,資料在Application buffer,萬一write呼叫傳回時同一筆資料巳遭修改,則真正寫入的資料並不是當初想寫入磁碟的資料。解決的方法是依照圖中的第(1)種方式,呼叫write時也順便把資料寫入kernel buffer,write呼叫傳回時再從kernel buffer寫入disk,這樣就能保證複製的效應。

快取記憶體(cache)的運用

對快取記憶體進行資料存取的效率很高,同一份資料除了儲存在磁碟上之外,也可能存一份在buffercache,使存取的速度加快。有時候為了提昇I/O的效能,資料會暫存在cache,等聚集較多資料,再一次完成I/O的作業,使I/O的排程效率提昇。快取記憶體的運用也是透過Kernel I/O子系統來進行的。

有些輸出入裝置必須接收連續而有次序的資料,例如印表機,在這種情況下就得使用較大的緩衝區來暫存資料,以印表機來說,可能同時有來自許多應用程式的列印工作,但印表機一次只能列印一個工作,這時候作業系統必須將列印工作安排到列印儲位(print spool)中。

儲位系統spooling system: 從應用系統送往印表機的請求會被儲存系統攔截把列印工作放到列印佇列print queue,其實也就是儲位中,等待印表機依序完成列印的工作。

系統核心必須針對所處理的作業保存一些相關的資料,這些資料有一定的結構,作業系統核心透過這些資料來追蹤I/O作業的狀況。不同的作業系統所採用的核心內資料結構in_kernel data structure都不太一樣。我們下面以UNIXWindows NT為例來做一個簡單的比較:

1. UNIX系統: 以檔案系統的存取來說,UNIX使用READ系統呼叫來存取各種不同的檔案與裝置,假如是一般的使用者檔案,系統會先檢視快取緩衝區內是否巳經有該檔案的資料,若沒有才對磁碟進行存取。假如存取的是低階的磁碟裝置raw disk,則系統必須針對像磁區大小、存取資料大小等細節做進一步的處理,只不過從系統呼叫的角度來看,同樣是用read呼叫。

2. Windows NT系統: NT裡頭的I/O以訊息傳送message passing為基礎,任何I/O的請求會轉化成訊息,經由kernel送給I/O管理程式,再傳給I/O的驅動程式,傳送的過程中訊息的內容會被修改;在輸出作業中,訊息內含有要輸出的資料,在輸入作業中,訊息含有承載輸入資料的緩衝區。和UNIX系統比較起來,Windows NT的訊息沒有使用統一的資料結構,在處理上可能要花一些額外的工夫,但是對於作業系統來說,訊息的處理簡化了系統的設計,而且提昇了系統的彈性。

I/O請求與硬體作業之間的轉換

電腦系統的I/O作業從使用者端啟動以後,會對作業系統核心的I/O子系統發出系統呼叫,I/O子系統將I/O請求送給裝置的驅動程式,可能也暫時阻絕處理元的執行,驅動程式處理I/O的請求,將指令送往裝置控制器(device controller),接著裝置控制器啟動裝置硬體進行資料的傳送,驅動程式會以輪詢(poll)的方式來了解資料是否傳送完畢,或是運用DMA,在資料傳送完成時產生中斷,中斷處理程式進行適當的處理之後通知驅動程式。驅動程式負責告知I/O子系統目前I/O工作已經完成,作業系統核心安排好資料,然後讓原來阻絕等待I/O的處理元繼續執行。

( 知識學習隨堂筆記 )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=ben168&aid=153702018