操作系統學習筆記(1)

在進行嵌入式開發的時候,尤其是在進行較大規模的嵌入式開發時,對於原來的裸機開發已經難以支撐一個較大項目的嵌入式開發,因此這裏需要採用操作系統的方式,通過操作系統來實現各個任務的實現。

因此這裏對於操作系統,進行一個學習。通過博客來記錄一些學習筆記。

操作系統

操作系統五花八門,但是其內核的實現基本相似。一般來說,操作系統需要實現進程管理、存儲管理、文件管理、設備管理這幾個功能。

在具體介紹各個功能實現之前,我們需要對一些基本的內容進行了解,首先對操作系統內核進行簡單的介紹。明白,操作系統功能的實現,實際上是中斷機制和系統時鐘相互配合的結果。

然後我們再來看進程管理、存儲管理、文件管理、設備管理等功能是如何實現的。

內核

操作系統的內核,是操作系統中,實現進程管理和調度的程序模塊。其實現離不開時鐘與中斷。

中斷機制和系統時鐘

操作系統內核的實現,離不開幾個重要的機制:中斷機制和系統時鐘

首先先說,中斷機制對於操作系統的重要性。

之所以操作系統可以進行進程管理,是因爲中斷機制具有以下幾個特點:

  1. 1.程序在運行時是可以被打斷
  2. 2.被打斷的程序的執行狀態是可以被保存的
  3. 3.中斷程序執行完後,是可以返回斷點(或從指定的斷點)繼續執行原程序的

有了上述特點,才能進行任務之間的切換、任務狀態的保存,任務之間的選擇執行。所以說,操作系統內核,離不開中斷。

然後再說系統時鐘,僅僅有中斷機制並不能實現操作系統,因爲操作系統需要對任務進行週期性的管理,而不是隨意的進行中斷,因此必須要有一個固定時間間隔的週期性信號,來幫助操作系統獲得時間的概念,這就是系統時鐘。由系統時鐘引起的中斷服務程序叫做時鐘節拍服務。

內核的功能

提供中斷處理、進程的調度管理、系統的基本操作三個方面的功能。

  • 中斷處理:操作系統的運行離不開中斷,內核的功能就是對中斷進行管理和處理。
  • 進程的調度管理:內核需要對處理器的使用進行管理。
  • 系統的基本操作:承擔時鐘、設備、安全以及文件系統的操作任務。

內核是操作系統對裸機的一次封裝。

宏內核與微內核

如果把所有的爲進程服務有關的模塊都放在操作系統的內核中,那麼操作系統的內核可能就變得非常冗餘。會產生許多問題,因此我們常常需要一個較小的內核。常見的兩種實現方法爲:
宏內核和微內核。
宏內核是雖然內核被劃分成許多模塊,但是其在運行時是一個整體,模塊在內核內部,模塊之間的通信不是信息傳遞,而是調用其他模塊的函數。
微內核是,將操作系統中的許多模塊如進程管理、設備管理、文件管理等,作爲一個進程放在內核外面,操作系統的內核只負責信息傳遞,這樣操作系統的內核就可以很小,並且還可以根據需要對操作系統的功能進行裁剪。

進程和線程

瞭解了操作系統實現的兩個基礎機制,我們來具體看操作系統的功能。首先就是進程管理。

什麼是進程

首先我們要理解什麼是進程,在我的理解,進程就是處理器對某些資源、代碼、數據進行一系列的處理的行爲就叫做進程,往往這一系列處理行爲是以某些功能、目的的實現爲聯繫的。

就像,處理器是一個老師,進程就是等待批改的一張試卷。

進程還有一個重要的特點,那就是進程是系統分配資源和進行調度的獨立單位。

進程的組成

一個進程包括以下三個部分:

  1. 程序代碼,程序代碼是進程執行的依據。
  2. 數據集合,數據集合是進程在運行時所需要的數據全體。
  3. 進程控制塊,是操作系統爲了記錄、描述、管理進程而分配給進程的數據結構。

就像試卷的姓名、學號等,進程控制塊就是爲了方便識別、管理、描述、記錄等而給進程分配的數據結構。一般來說以一個結構體的方式來出現。

進程的狀態

一般來說,進程至少具有以下三種狀態:

  1. 就緒狀態:一個進程已經獲得了除處理器之外的所有必須資源,只需要執行器處理就能執行的狀態。
  2. 運行狀態:一個進程正在被執行器執行的狀態。
  3. 阻塞狀態:一個進程暫時無法運行,需要等待其他事件出現後才能實現就緒或運行的狀態

進程的存儲映像

從進程在內存中的所有存儲映像來看,我們可以看到,在內存中的存儲有一下幾個部分:

1. 存有該進程的進程控制塊:控制進程的運行
2. 該進程的數據存儲區域:進程運行涉及到的數據
3. 該進程的程序代碼存儲區域:進程的運行代碼
4. 該進程的堆棧存儲區域:中斷時用於存儲進程的堆棧空間

四個部分

什麼是線程

開始的時候,人們把進程作爲系統分配資源的基本單位。但是這種系統進行進程運行的時間和空間開銷太大,就像老師必須批改完一張試卷後才批改下一張試卷,每張試卷花費的時間太多。

因此後來人們把處理器的資源進行劃分,出現了線程。因此有以下新的改變,對於存儲空間資源的分配,仍然以進程爲單位進行分配,但是對於處理器資源,則以線程爲單位進行分配。總而言之,進程是系統分配資源的基本單位,線程是系統調度的基本單位。

進程管理

進程管理主要是以下幾個方面的內容:

  1. 進程的調度:多個等待使用處理器的進程,按照一定的策略選擇合適的進程,賦予其處理器的使用權。
  2. 進程的同步:對系統中的多個進程在對共享資源的使用出現競爭時進行協調和控制。
  3. 進程的控制:進程的創建、撤銷以及進程狀態的切換。
  4. 進程的安全:解決因多個進程爭奪資源的使用權而進入死鎖狀態,從而保證系統安全順利的運行。

進程的調度:
進程的調度有兩類,一類是可剝奪方式,一類是不可剝奪方式
可剝奪方式下,優先級高的進程可以剝奪優先級低的進程的處理器使用權。
常用的調度算法有以下幾種:
1.時間片輪轉法:該方法是每個進程輪流佔用處理器運行一個相同的時間片。通過隊列的方式,從隊首開始執行,執行一個時間片後,將該進程插入到隊尾,然後執行下一個進程,這樣不斷循環執行。

2.優先級調度法:在調度器調度時,通過觀察就緒進程的優先級,選擇優先級級別大的進程來執行。

3.多級反饋隊列調度法:把進程分成若干個優先級組,同一組的進程的優先級相同。並且把每組進程通過一個先入先出的隊列進程組合,按照優先級級別高的組,應得的時間片越短的原則分配時間片。在調度的時候,調度器每次都從優先級高的分組開始,當優先級高的分組中沒有進程了,纔到低優先級的分組中選擇進程來執行。

進程的切換

進程的切換,實際上就是將正在運行的進程的中間數據存在該進程的私有堆棧,並記錄該進程的斷點指針,然後將要運行的進程的中間數據從該進程的私有堆棧中提取出來,然後從該進程的斷點指針處開始執行程序。
主要涉及到的寄存器是PC寄存器,PSW寄存器,SP寄存器等。以及主要通過壓棧指令、出棧指令等彙編語言來實現。

進程的同步與通訊

進程之間可能會出現,多個進程需要共同使用一些共享資源,以及進程之間的通訊,進程之間的順序同步等問題。

許多進程之間存在着互斥關係,或者說執行上有先後次序,因此需要進程之間進行同步。

進程之間的同步是通過進程之間的通訊來實現的。在操作系統中,進程之間通訊的方式,是通過信號量、郵箱、消息隊列等被稱作事件的中間環節來實現的把信息發送到事件上,叫做發送事件。讀事件的操作叫做請求事件。

進程的控制

進程的創建,進程的刪除,進程的掛起,進程的恢復都算進程的控制。

存儲管理

操作系統另一個十分重要的功能就是對內存進行管理。

存儲器的分層

首先先介紹一下計算機存儲器的分層。

  1. 處理器內部有一個寄存器,例如運算寄存器,地址寄存器,這些寄存器主要用於處理器實時運算時儲存中間數據。
  2. 處理器和主存儲器(RAM+FLASH)之間存在一個高速緩存(Cache),它是位於CPU與內存間的一種容量較小但速度很高的存儲器。CPU的速度遠高於內存,當CPU直接從內存中存取數據時要等待一定時間週期,而Cache則可以保存CPU剛用過或循環使用的一部分數據,如果CPU需要再次使用該部分數據時可從Cache中直接調用,這樣就避免了重複存取數據,減少了CPU的等待時間,因而提高了系統的效率。
  3. 主存儲器,用來存放程序和程序運行所需要的數據。存放程序的存儲器一般來說是掉電不丟失的存儲器,如FLASH,而存放臨時數據的內存空間一般來說是掉電丟失的,如RAM。雖然這兩個存儲器設備不同,功能不同,性能不同,但是其存儲器的地址是在一個數字空間內的,例如我們通過32位的地址可以訪問到FLASH,也可以訪問到ARM,調用地址的人可以不用去關心該地址是指向FLASH的存儲器還是指向ARM的存儲器。
  4. 操作系統外存儲設備,該部分的存儲不屬於操作系統存儲管理的管轄範圍,而是屬於操作系統設備管理的管轄範圍,這部分存儲一般來說是掉電保存的存儲設備。如磁盤、可移動存儲介質等都屬於這一範疇。

存儲的距離離處理器越近,那麼處理器讀取和存放數據的速度越快。
我們在進行芯片選型的時候,常常關注芯片的存儲大小,RAM和FLASH大小。
其中FLASH主要用於存放系統的運行代碼,操作系統內核等,因此如果我們的項目工程量較大,所編寫的代碼較多或用到了較爲複雜的操作系統內核,那麼就需要較大的FLASH。
而RAM往往用於存儲一些運行數據,其概念等同於PC電腦的內存大小。內存越大,那麼操作系統在運行時就能夠緩存和調用更多的數據。

存儲器的分區劃分

存儲空間的劃分是段頁式的分區劃分。
通常來說,一個存儲單元的存儲大小爲一個字節(1B),而我們所需要佔用的存儲空間遠大於一個字節,並且我們的存儲器總量的大小也遠大於一個字節,爲了方便對存儲器進行管理,操作系統對存儲器進行了一些劃分。
常見的操作系統先分段,再分頁,頁內的存儲地址用偏移量來表示(頁內偏移量),例如Linux操作系統;有些小的操作系統只分段,不分頁,段內的存儲地址用偏移量來表示(段內偏移量)。即通過以下兩種方法來表示一個存儲單元:
段號+段內偏移量
段號+頁號+頁內偏移量

這個概念就像,所有的存儲空間是一個城市,一個存儲單元是一個房子,如果我們直接在一個城市裏面尋找一個房子,是比較困難的,因此我們對城市的房子進行劃分,首先進行分區,武侯區,青羊區,等價於操作系統的分段;然後劃分街道,望江路街道,等價於操作系統的分頁;然後標出房號,等價於操作系統中的地址偏移量。有些小的城市只劃分街道,不劃分市區,相當於操作系統只劃分段,不劃分頁。

通過分頁管理存儲空間,系統就可以將一個較大的程序按頁爲單位存儲數據,這些頁可以不用連續,而可以通過鏈表的方式將頁聯繫起來。這樣就可以減少內存碎片的存在,提高存儲空間的利用率。

而分段管理存儲空間,除了具有模塊式的管理存儲空間的功能之外,往往還有一些邏輯關係在其中,一個段內的程序往往具有相同的意義,例如主程序段、子程序段、數據段、堆棧段等。通過分段,我們就賦予了不同存儲地址不同的功能,方便我們管理。

虛擬存儲器

假如說,處理器的地址位數爲32位,那麼對應的內存容量爲4GB,但是實際上計算機的真實內存空間(內存空間而不包括外部存儲設備)肯定是遠小於這個容量的。
爲了避免地址空間的浪費,在編程的時候可用地址是全部地址位數,這樣我們在編程的時候就可以不用考慮實際的存儲地址,可以從地址0用到地址END。不過我們所編寫的程序大部分情況下是存儲在外部存儲空間的物理地址中。
我們知道,一個操作系統的內存大小往往小於外部存儲器的大小,因此計算機在運行時,將外部存儲器中的數據先緩存到內存空間中,當需要用到其他部分時,再將其他部分緩存進來,把之前的卸回磁盤。
這就是虛擬存儲技術。

設備管理

設備管理的設備無關性

設備管理時操作系統的又一大功能。
由於許多功能的實現往往需要操作系統和設備共同協調運行才能實現,因此操作系統需要對設備進行管理。
設備管理的主要思想是將設備管理抽象化,不具體的依賴於設備的細節,而是對設備的管理進行抽象。從而增加設備管理的適用性。
換句話說,如果操作系統需要對不同的設備提供不同的架構進行管理,那麼這種操作系統只能對單一某些具體設備進行操作,靈活性差。因此我們將不同的設備都抽象成一種具有相同架構,相同特徵的設備,操作系統需要對這一種設備進行管理,而設備只需要將自己封裝成具有該架構的設備。
操作系統中最常用的設備就是存儲器,因此我們把其他的設備也抽象成存儲器,因此其他設備就需要有以下特點:

  1. 設備應該是可尋址的。具體做法就是,將設備的各種功能、狀態、控制操作等都用一個個寄存器來表示,這樣操作系統在管理設備時,只需要對設備對應的功能寄存器進行訪問,就能實現。
  2. 使用邏輯設備名。我們在存儲區域對設備標識時,應該使用邏輯設備名來進行標識,而不是物理設備的實際名稱,例如我們通過CON表示所有具有輸出屬性的設備,這種設備可以是打印機,可以是顯示器,操作系統可以不用去管具體設備是什麼,只需要進行數據輸出即可。
  3. 設備描述表。一個設備的屬性、功能很多,爲了便於對設備進行管理,我們將設備的屬性成像出來用一個數據結構集中起來進行管理,這個數據結構就是設備控制表(DCT)或設備轉接表(DST)。

操作系統對設備的管理

操作系統對設備的管理主要有三個內容,緩衝、調度、分配。

1.緩衝:

解決處理器和外圍設備工作速度上的不匹配,如果外圍設備數據傳輸速度大於處理器處理速度,那麼就有可能造成數據的丟失;如果外圍設備數據傳輸速度小於處理器處理速度,那麼就有可能造成處理器一直在等待外圍設備。因此操作系統通過緩衝的方法,如單緩衝、雙緩衝、多緩衝等,將數據暫存在主存儲區中,從而一定程度上改善速度不匹配的問題。

2.調度:

設備可以被進程訪問,如果多個進程都要訪問一個設備時,那麼就需要操作系統對設備訪問進行調度。換句話說,如果多個進程等待同一個設備時,設備如何選擇進程來執行。
常用的設備調度方法是先來先服務,但是對於磁盤調度,出於提高磁盤的效率的考慮,採用尋道時間最短調度。

3.設備的分配:

設備的分配是指,當設備資源出現共享競爭時,按照分配策略爲申請設備的進程分配設備。

文件管理

文件是一種信息的組織形式。存放在外存儲器中。

文件結構

  • 按邏輯結構劃分:文件可以分爲流式文件和記錄式文件。流式文件內的信息不再劃分結構,如程序,文本等。記錄式文件內的信息仍具有結構,如數據庫文件。
  • 按物理結構劃分:根據文件的物理存儲方式,劃分,文件可以分爲順序文件(連續存儲)、鏈接文件(鏈表存儲)、索引文件(索引表)。

文件系統

文件系統是操作系統中負責存取和管理文件的軟件模塊,主要有兩個基本功能:

  • 1.建立文件時分配存儲空間
  • 2.刪除文件時回收存儲空間

此外還有一些其他功能,例如文件和目錄的操作接口,文件和文件目錄的管理,多個用戶共享文件時的安全措施等。

文件目錄

創建一個文件時,文件系統會爲該文件建立一個文件目錄。文件目錄是記錄了文件屬性的結構體,通常包括以下信息:

  • 文件名。一個唯一的符號名,用於文件的標識,用戶可以按文件名對文件進行操作。
  • 文件的存儲位置。表明了文件在外存中的存放地址,文件長度以及存放文件的設備名稱。
  • 文件的結構。指示文件的邏輯結構和物理結構,決定了文件的尋址方式。
  • 文件的存儲權限。用於實現文件的共享與安全。
  • 文件的使用信息。文件的創建日期、時間以及當前的使用狀態等信息。

此外,爲了方便對文件目錄進行管理,操作系統將所有目錄整合在一起組成一個文件,叫做目錄文件。目錄文件有單級目錄文件、二級目錄文件、樹型目錄文件

文件存儲

文件存儲涉及兩個方面,一是存儲空間的分配單位,二是空閒空間的組織、分配、回收。
前述所述,文件存儲一般來說是按塊存儲。常見的存儲大小爲512B,1KB,2KB。
文件系統需要掌握存儲空間中哪些物理塊是空閒的,哪些是被佔用的。記錄和管理空閒空間的方法是建立一個位圖,用0和1來表示物理塊的空閒狀態,或者通過鏈表的方式,將空閒塊組成一個鏈表,分配空間時從表頭摘取物理塊,回收空間時,將回收的空閒塊鏈入鏈表末尾。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章