好好學習,天天向上
本文已收錄至我的Github倉庫DayDayUP:github.com/RobodLee/DayDayUP,歡迎Star
前言
之前一直沒有系統地學過作業系統,感覺自己在平時的學習過程中對於某些概念理解得一塌糊塗,比如中斷、記憶體、程式和執行緒等。所以打算系統的學習一下作業系統。一開始我是在B站看哈工大的李治軍老師講的,但是一上來就開始從彙編程式碼去分析開機的過程,雖然講得挺好的,但是可能是我太笨了吧,理解不了。於是我又在中國大學MOOC上看蘇州大學的《作業系統》。
怎麼說這也是個國家精品,雖然講得也沒多好,但挺容易接受的。我看的書是《作業系統概念第七版》
這個系列的文章就當作我學習作業系統的筆記,也希望能夠幫助到那些想學和正在學作業系統的小夥伴們。不多逼逼,下面開始正式的內容。
什麼是作業系統
這是一張計算機系統組成部分的邏輯圖,從圖中可以看出,使用者想讓軟體執行在計算機硬體上,就得藉助作業系統。作業系統是計算機最底層的軟體,是應用程式執行的基本支撐環境,不可或缺。但作業系統也並不一定是必須的,比如一些小型的計算機像微控制器就算沒有作業系統也可以執行程式。
那作業系統的意義何在呢?我覺得對於普通使用者和開發者而言就是 “方便”。printf("hello world!");
大家都寫過吧,為什麼這樣一行程式碼就能在螢幕上輸出一句話呢?是因為執行了這行程式碼後,就去呼叫作業系統的介面了,然後作業系統再去控制底層硬體進行相關操作,對於我們而言,這些都是無感的,只不過是寫了一行程式碼而已。
所以我對於作業系統的理解就是:作業系統就是管家,而計算機硬體就是大宅子,使用者是大宅子的主人。比如當我們想吃飯的時候,告訴管家可以燒飯了,然後管家就去排程了,去安排人買菜,做飯,而我們只需要等待飯菜上桌就可以了。如果沒有管家,那麼這些事情都得自己幹。所以有了作業系統,我們才可以很舒適,高效地使用計算機。
多道程式設計和分時
現在的作業系統這麼牛掰並不是一開始就這樣,而是經過了多個階段的進化。
無作業系統(手工操作)
最早期的計算機是沒有作業系統的,比如ENIAC就是手動操作線纜來執行任務,效率極低。
批處理系統
當出現電晶體後,第二代計算機也隨之誕生,體積,可靠性都大幅提高。為了能夠更好地發揮計算機的效能,批處理系統也就出現了。批處理系統就是將一批作業交給作業系統,然後由常駐監控程式(Monitor)去控制作業的執行及排程,不需要人工的干預,極大地提高了計算機的工作效率。
有點類似於工廠的流水線,CPU就是工人。一批待加工的產品從傳送帶上傳送過來,然後工人依次加工產品。
多道程式系統
批處理系統有個缺點就是沒有考慮到程式執行的並行性,比如一個程式得等待I/O操作才能進行接著執行,等待的時候CPU也跟著在那乾耗著,浪費時間。比如流水線上突然停了一會,工人就在那兒歇著。為了能夠更好地榨乾CPU的效能,多道程式系統就出現了。
就是在記憶體中同時存在多個作業,在管理程式控制下相互穿插執行。當一個程式需要等待時,馬上切換到另一個作業,提高了CPU的利用率。
從對比圖中可以看出,多道程式系統中CPU執行的時間明顯比單道程式系統的執行時間要多,幾乎沒得休息。所以說,多道程式系統就是黑心老闆,充分榨乾了CPU的勞動力,使得CPU苦不堪言。
分時系統
雖說多道程式系統相對於批處理系統而言已經提高了CPU的利用率,但一次只能執行一個程式,還是被老闆嫌棄。多道程式系統便退出江湖,潛心修煉。待出山之時,世人早已忘卻了多道程式系統的名號,被人熟知的只有那將無影手打得出神入化的分時系統。
沒錯,分時系統就是多道程式系統的進階版,本質上還是作業的切換。但作業系統卻給每個程式分配了一定時間的CPU時間片,當一個程式的時間結束後馬上切換到另一個程式。因為CPU的時間片足夠短,切換的時間也足夠快,使得使用者感覺不到程式的切換,誤以為是多個程式同時在執行。
作業系統操作
開發者在寫程式碼的時候,可能是無心之舉,也可能是有意而為之導致了程式出錯,有的錯誤嚴重的會破壞其它程式或作業系統。所以作業系統在設計的時候就要確保錯誤程式或惡意程式不會影響到其它程式和作業系統的正常執行。
雙重模式操作
雙重模式將使用者程式和系統程式分開,使用者程式執行在使用者模式下,系統程式則執行在核心模式下。如果使用者程式出現了異常,就會立即切換到核心模式,交給作業系統去處理。那些可能會引起損害的指令被稱作特權指令,使用者模式下是執行不了特權指令的。當使用者程式需要呼叫系統服務的時候,就必須要從使用者模式切換到核心模式來執行。
這個模式位是在計算機硬體中的,有了它就可以區分使用者程式和系統程式了。
I/O和記憶體保護
為了防止使用者程式去執行非法的I/O操作,所有的I/O指令都是特權指令,使用者模式下是執行不了I/O操作的,只能切換到核心模式下去執行,這樣由作業系統去控制I/O就可以有效地減少非法I/O的出現。
在多道程式系統下,多個程式在記憶體中執行,為了保證應用程式不能非法訪問其它應用程式的記憶體空間,就出現了記憶體保護機制。這需要有硬體的支援,比如基址暫存器和限長暫存器。
在這張圖中,兩個暫存器合作,限制了該程式只能訪問300040~420940的記憶體空間。
定時器
如果現在有個程式發生了死迴圈,長時間霸佔著CPU怎麼辦?這樣控制權不就一直在使用者程式手上麼,這可不行。為了能確保CPU控制權在作業系統手上,可以採用定時器。定時器有固定定時器和可變定時器,在到達指定的時間後,產生中斷,就從使用者模式切換到核心模式,這樣控制權就回到了作業系統手上,確保了系統的正常執行。
作業系統功能
程式管理
作業系統的核心目標就是執行程式,也就是如何管理CPU,一個執行中的程式被稱之為程式。程式管理解決了程式的執行問題,作業系統負責的與程式管理相關的活動有以下幾個:
- 建立和刪除使用者和系統程式
- 暫停和恢復程式
- 提供程式同步機制
- 提供程式通訊機制
- 提供死鎖處理機制
記憶體管理
只有程式是滿足不了程式執行的需要,還需要記憶體。因為CPU只能直接訪問暫存器、快取記憶體和記憶體這三類儲存裝置,一個程式處理前和處理後的所有資料,執行的指令都在記憶體。作業系統負責的有關記憶體管理的活動有:
- 記錄記憶體的哪部分正在被使用及被誰使用
- 當有記憶體空間時,決定哪些程式可以裝入記憶體
- 根據需要分配和釋放記憶體空間
總結一下:記憶體管理提供了記憶體的分配、回收、地址轉換、共享和保護等功能。提高了記憶體利用率和訪問速度,從而提高計算機執行效率。
檔案管理
程式管理和記憶體管理解決了程式的執行問題,但是記憶體並不能長時間儲存資料,所以就有了檔案,檔案既然要儲存就得把檔案管理起來,所以檔案管理解決了計算機的儲存問題。現代操縱系統主要是以目錄這種樹形結構去進行檔案管理的,作業系統主要負責以下和檔案管理有關的活動:
- 建立和刪除檔案
- 建立和刪除目錄來組織檔案
- 提供操作檔案和目錄的原語(由若干條指令組成的程式段)
- 將檔案對映到磁碟等二級儲存裝置上
- 在穩定儲存介質上備份檔案
I/O裝置管理
作業系統的目的之一在於對使用者隱藏具體硬體裝置的特性。I/O裝置管理負責管理種類繁多的各種I/O裝置,解決計算機中資訊
的輸入和輸出問題。
總結
這篇文章主要是簡單介紹了一下作業系統,總共分為四個小節,前面兩個小節探討了什麼是作業系統,介紹了作業系統的發展。後面兩個小節介紹了作業系統的操作和功能,從巨集觀角度上了解作業系統可以做什麼。
碼字不易,可以的話,給我來個
點贊
,收藏
,關注