1. 程式人生 > >作業系統篇-作業系統概述(外加自我理解)

作業系統篇-作業系統概述(外加自我理解)

作業系統概述

細節疑問:

記憶體:儲存資料–整數實數,程式碼,指令
CPU:執行指令.執行一個程式:程式被載入入記憶體,CPU從記憶體中取指令,然後執行指令,如此迴圈,直到程式執行完成.
計算機指令:
• 指令是計算機執行的最小的功能單元,是指揮計算機硬體的命令.
• 算術運算指令、邏輯運算指令、資料傳輸指令、輸入輸出指令.
指令結構:
這裡寫圖片描述

正文

1. 為什麼引入作業系統

用高階語言編寫個程式:
1.從鍵盤接受:一個人名,如悟空
2.從螢幕上顯示人名
通過簡單的輸入輸出函式就可以完成

如果程式設計師直接對硬體程式設計:
1.瞭解鍵盤的工作原理
2.如何把鍵盤緩衝區的資料複製到記憶體
3.知道顯示器的工作原理
4.如何在顯示器的的某個位置顯示字元
一般人完成不了,或者需要很長時間才能完成
如果每一個程式猿在編寫應用程式時,都要考慮這些細節,那麼程式設計的效率會及其低下。

如何解決這一問題?

在硬體和應用軟體之間引入一層專門的軟體(其實就是作業系統),其主要功能有兩種:
1.向下管理系統的各個部分,使它們能夠正常運轉;
2.向上為應用軟體提供一個易於理解和程式設計的藉口.這層軟體就叫做作業系統.
作業系統的定義:
作業系統是計算機系統的一個系統軟體,它是一些程式模組的集合,這些程式模組能夠以儘量有效、合理的方式管理和分配計算機的軟硬體資源,合理的組織計算機的工作流程,控制程式的執行並向用戶提供各種服務功能,使使用者能夠靈活、方便、有效的使用計算機,使整個計算機系統能夠有效地執行.

不同人眼中的OS:
對作業系統的設計者:OS是系統資源的管理者,即如何管理CPU、記憶體和I/O裝置等系統部件,使他們能正常運轉 。
對應用程式開發人員:OS是一組抽象的API(Application Programming Interface,應用程式介面)。如CopyFile、CreateProcess等。
對普通終端使用者:OS是則是一種操作環境,是執行各種操作的一個平臺,使用者可以在上面編寫程式,也可以在上面執行各種各樣的應用程式,如使用word編寫文件,使用QQ上網聊天。

2 作業系統的發展歷史

CPU和外設同時被佔用:
2.1 第一階段
1946-50年代 程式設計全部採用機器語言。程式的輸入與輸出主要通過紙帶來完成。
程式設計師程式設計就是在紙帶上編寫機器語言指令,即二進位制0、1形式的指令。
主要問題:由於手工操作的效率低下,造成CPU等待時間過長,從而導致資源的浪費。
2.2 第二階段
1950-1960 單道批處理系統(還是沒脫離單程式執行,即一個程式執行到底):設計了批處理管理程式。操作員把很多作業“成批”地輸入到計算機當中。最後,由常駐記憶體的批處理管理程式自動地去識別、裝入一個作業,並執行它,執行結束後,再去取下一個作業。
主要問題:序列的執行作業,每次只執行一個作業。
1.程式除錯比較困難,因為程式設計師沒辦法在現場實時地除錯程式。
2.由於慢速的輸入輸出處理仍然直接由CPU來控制,這就使CPU和輸入輸出裝置的使用忙閒不均。具體來講,由於輸入輸出裝置的訪問速度比較慢,而CPU的計算速度非常快,因此在單道批處理的方式下,對於那些以計算為主的作業,在大部分的時間內,外設都是空閒的;而對於那些以輸入輸出為主的作業,雖然它們也用到CPU,但CPU的工作量小,且速度快,因此在大部分時間內,CPU都是空閒的。這樣一來,就又造成了資源浪費。
1960年代初 多道批處理系統:為了解決輸入輸出裝置與CPU之間速度不匹配問題

,在20世紀60年代初,發展了通道技術中斷技術,這些技術的出現使得輸入輸出訪問與CPU技術可以重疊進行。
通道技術:用於輸入輸出裝置和記憶體之間的資料傳輸,它有專用的輸入輸出處理器,在啟動後可以獨立於CPU執行,從而實現了CPU與輸入輸出之間的並行工作。
中斷技術:是指CPU在收到外部中斷訊號後,停止原來的工作,轉去處理該中斷事件,在完成後重新回到原來的斷點繼續工作。
20世紀60年代中期到70年代中期,出現了多道批處理系統,這也標誌著現代意義上的作業系統的出現。

main()
{
int x,y,z;                                    
scanf("%d,%d",&x,&y);   //I/O,從鍵盤接受資料
z=x+y;                  //CPU運算        
printf("%d",z);         //I/O,在螢幕列印資料
}

為什麼高階語言寫的程式可移植性好?(可移植性好好,即編寫的程式在不同機子上,做少量改動或者不做改動就能執行)
不同機器(作業系統不同或者相同作業系統不同型號),執行指令不同,即直接面對硬體程式設計的低階語言(如機器語言)只適用於特定的機型,不同機子上相同的高階語言程式要想執行,改變的是編譯器,將相同的高階語言程式編譯成不同的機器語言在不同機子上執行。

多道批處理系統:
即在記憶體中同時存放多個作業,由CPU以切換的方式為它們服務。假設開始時作業A在CPU中執行,後來它需要進行輸入輸出操作,因此CPU轉而執行另一個作業B,這樣就使得多個作業可以同時執行。(所謂的同時執行只是從巨集觀上來看,任務們都處於執行狀態,但是都沒有執行完。從微觀上來看,各個作業實際上是序列執行,作業們只是交替的使用CPU和輸入輸出裝置即IO
2個作業輪流使用CPU,先是作業A佔用CPU,當作業A需要從鍵盤接受資料,CPU切換到作業B,作業A去IO執行相應操作,如下圖
作業A使用CPU
作業B使用CPU,A執行IO操作
2.3 第三階段 分時系統

所謂分時:指的是多個終端使用者(只有顯示器、鍵盤和通訊等裝置)通過網路分享的使用同一臺計算機。把計算機的CPU的時間劃分為一個個時間片,然後讓每個從終端發來的作業輪流執行,由於CPU的運算速度非常快,因此每個作業都感覺不到是在輪流執行,以為是在獨享主機。

3 作業系統的型別

1. 批處理作業系統
2. 分時作業系統
3. 實時作業系統
4. 嵌入式作業系統
5. 個人計算機作業系統

分散式系統:把大量計算機通過網路連線在一起,以獲得極高的運算能力和廣泛的資料共享。

4 作業系統的硬體環境
設計一個作業系統時,需要硬體提供5個方面的支援:受保護的指令,系統呼叫,記憶體保護,中斷機制和輸入輸出系統。

4.1 受保護的指令,即特權指令:就是指那些只有作業系統才有權使用的指令。
有一些硬體資源禁止讓使用者程式使用:磁碟、印表機等輸入輸出裝置,還有一些特權指令:操作記憶體管理狀態的指令,某些特殊狀態位的設定指令以及停機指令。
目的:為了保證作業系統和各個應用程式能夠順利地執行,保證系統的安全性和穩定性。
根據執行程式對資源和機器指令的使用許可權,把處理器設定為不同的狀態:
管態:可以執行所有指令,包括各種特權指令,也可以使用所有的資源,並且可以改變處理器狀態。
目態:即使用者程式執行時的狀態。在這種狀態下,不能使用特權指令,不能直接使用系統資源,也不能改變CPU的工作狀態,並且只能訪問這個使用者程式自己的儲存空間

只有系統程式才能執行特權指令,CPU怎麼知道當前執行的程式是作業系統程式還是使用者程式?

答:引入程式狀態字(Program Status Word,PSW),CPU內部一個專門的暫存器,用來指示處理器當前的狀態(是目態還是管態)。
PSW包括:工作狀態碼、條件碼和中斷遮蔽碼等。
工作狀態碼:用來指明CPU當前的狀態,從而編碼當前在CPU上執行的是作業系統還是一般使用者程式。
條件碼:用來反映指令執行後的特徵。
中斷遮蔽碼:是否允許中斷。
狀態的轉換?即從目態轉換成管態,從管態到目態
管態到目態:修改程式狀態暫存器裡的狀態標誌位
目態到管態:修改狀態標誌位本身就是特權指令,只能系統程式來完成,在目態下不能執行。

所以問題來了:使用者程式在執行的過程中,經常會用到比如訪問IO裝置這些特權指令,使用者態不能直接執行,怎麼辦?

答:系統呼叫。
4.2 系統呼叫:使用者程式通過訪管指令或者陷阱指令,來請求作業系統為其提供某種功能服務。
系統呼叫指令的實現過程:
1. 當CPU執行一條訪管指令或者陷阱指令時,即會引起一箇中斷,稱為:訪管中斷或者陷阱中斷
2. 處理器會儲存中斷點的程式執行上下文環境,包括程式狀態字、程式計數器和其他一些暫存器裡面的內容,然後CPU的狀態被切換到管態(不是通過指令修改CPU的狀態標誌位,而是由CPU在中斷時自動完成)
3. 處理器會把控制權轉移到相應的中斷處理程式,然後呼叫相應的系統服務
4. 當中斷結束後,CPU會恢復被中斷程式的上下文環境,因此,CPU被恢復為目態,並且回到中斷點繼續執行。
系統呼叫過程
如圖,使用者程式執行在目態下,想要呼叫一個系統服務,如從鍵盤輸入資料或者螢幕顯示資料,就會執行一條系統呼叫指令。此時CPU就會產生一個陷阱中斷,並從目態升級為管態(中斷時自動完成),然後跳轉到中斷處理程式去執行,在中斷處理程式中再去呼叫相應的系統服務程式。當這些事情完成後,又回到中斷點,同時CPU的狀態從管態恢復到目態。

自我理解:應用程式自身申請的中斷,屬於軟中斷。產生中斷的每個裝置都有一個相應的中斷處理程式。一個裝置的中斷處理程式是它裝置驅動程式的一部分。
根據中斷號找到相應程式的入口(即中斷處理程式),交給裝置驅動程式。以此推斷,在應用程式中,執行到指令原型:int n(彙編指令),CPU從中斷向量表(用於記錄相應中斷處理程式入口地址的對映表。表中有為中斷型別分配的中斷號和相對應的中斷處理程式的入口地址。當中斷來臨時,由中斷控制器確定中斷號,再到表中尋找程式)中,找到第n號表項,即可確定與n對應的中斷程式。也就是說比如int x 中斷指令代表去鍵盤接受資料,int y 代表在螢幕顯示資料。

4.3 記憶體保護 :由於記憶體當中同時有多個程式在執行,因此需要防止一個使用者程式去訪問其他使用者程式的資料(不同使用者程式(對作業系統而言是不同程序)之間的資料不能共享,隨便更改資料會造成執行結果錯誤),同時,也要保護作業系統免受使用者程式破壞。因此,每一個使用者程式,都應該被設定位元組的活動範圍(即在記憶體中的空間),只能訪問該範圍內的程式碼(程序執行的程式)和資料(棧和堆儲存的資料,地址呀中間結果值上面的)。
4.4 中斷機制
中斷:所謂的中斷,指的是由於某些事件的發生,改變了正在CPU上執行的指令的順序(也就是放下現在執行的程式,去執行別的程式。具體來說,中斷現在的程序,儲存現場【即上下文環境,結構體PCB裡的變數值,直接對應的就是暫存器裡的值】,CPU切換到別的程序【切換:CPU暫存器裡的值變為此程序PCB裡對應變數的值】,執行完後,恢復被中斷程序的上下文,從中斷點開始繼續執行被中斷程序)。
中斷的種類:
1. 同步中斷:是指當前CPU正在執行指令的時候,由CPU的控制器單元發出的中斷,也稱為“異常”。
異常可分為2類:
1 由CPU檢測到的異常,例如:算術溢位、被0除、使用者態下使用特權指令
2 程式主動設定的異常,例如:程式設計師通過int n指令(前面提到了彙編中的中斷指令)發出中斷請求,也叫軟中斷,主要用作系統呼叫。
2. 非同步中斷:指的是由CPU以外的其他硬體裝置在任意時刻發出的中斷,簡稱為“中斷”。
分2類:
1 可遮蔽中斷,即IO中斷。它是當外部裝置或者通道操作(輸入輸出裝置可以和CPU重疊執行的關鍵,內有專門的處理器,可以獨立於單獨CPU執行)正常結束或者發生錯誤時所發出的中斷。例如,印表機列印完成或者缺紙。
2 不可遮蔽中斷,即由掉電、儲存器校驗錯等硬體故障引起的硬體中斷。
發生中斷時,執行過程
一般來說,每一箇中斷或者一場都用一個0~255(2^8,8位一位元組)直接的整數來標識,稱為中斷向量,系統根據中斷向量,來為每一箇中斷或者異常指定相應的程式(也就是中斷處理程式)。系統會維護一箇中斷向量表,表中存放了相應的處理程式的起始地址。當發生某個中斷(執行到組合語言中的 int n 中斷指令),先從該表中取出相應的起始地址,然後跳過去執行。