一、操作系统引论
??這學期開始操作系統課程,作為計算機專業的核心課程,這門課自然還是要好好滴學。按照之前的習慣,繼續寫博客梳理學到的知識,希望能夠堅持下去吧!
??在正式課程開始之前,老師拋出了十個問題(遺憾的是,我一個都不會。嗚嗚嗚~)。這十個問題反映了操作系統的功能,在此對十個問題進行下列舉。希望本系列的最后一篇能夠對十個問題進行詳盡的回答。
??1. EXE、ELF是什么?運行一個EXE到底發生了什么?
??2. C語言的庫函數printf、scanf等是怎么實現的?
??3. 512M的內存為什么能跑4G的游戲?
??4. 一個while(true)的計算程序運行時,CPU利用率是多少?
??5. 內存不能為written什么意思?是內存壞了?還是“寫保護打開”?這個程序還能繼續執行嗎?該錯誤是誰先發現的呢?CPU或者內存?
??6. 需要相互之間通信的程序是怎么傳送數據的呢?
??7. 為什么早期的IE瀏覽器,打開一個頁面崩潰,其他頁面也崩潰了?后續的一些瀏覽器是怎么解決這個問題的呢?
??8. 為什么程序有時運行正常,有時卻報錯了呢?
??9. 磁盤上被刪除的數據還能被恢復嗎?為什么?操作系統原本可以避免數據被恢復,但沒有這么做,為什么呢?
??10. 怎么學好操作系統呢?(這個問題還不曉得能不能找到答案)
??按照我往常的管理,學東西前先問幾個為什么?
????1. 為什么要學操作系統?
????2. 什么是操作系統?
????3. 操作系統能干什么?
??帶著這三個問題,正式進入操作系統的學習。也希望這篇的末尾,能對這三個問題有一個粗淺的認識。
??古人云:一切的一切還要從歷史的源頭說起。操作系統的發展歷經了三個階段發展至今。這個過程也是充滿曲折滴呀!下面來簡單介紹一下,這篇文章主要從操作系統歷史發展的角度初步的認識一下操作系統。
??第一階段:沒有操作系統——人工操作方式
??啥意思?全人干!計算機的定位就是執行程序得到結果。但程序如何輸入到計算機里是一個問題。人工操作方式就是把程序變成穿孔的紙帶,裝入紙帶輸入機送入計算機中執行。且不談穿孔多么費事,光說說執行效率如何呢?這種方式一個用戶獨占全機,在該用戶進行I/O操作時(可以理解成換紙帶),CPU在等待,又因為只有一個用戶,此時所有的計算資源都被浪費。再發展發展,變成了脫機輸入輸出,就是將紙帶變成磁帶。磁帶提前錄入,CPU需要時可以高速調入內存。這種方式比人工操作快了不少,整個過程是由外圍機控制的,所以叫脫機。但這種方式的優點更多體現在便捷,沒有改變程序I/O是CPU空閑等待的本質。CPU的利用率依舊較低。
??第二階段:單道批處理系統
??在之前的基礎上改進,有什么問題改什么問題。因為程序有I/O時間,導致CPU的利用率不高。那在程序A進行I/O的時候(可能I/O的時間比較長),運行程序B不就行了?這就是單道批處理系統的思想!下圖是單道批處理的運行流程圖:
??系統中有一個監督程序,將作業裝入內存后,控制權給到作業。當作業執行I/O的時候,控制權回到監督程序,調入另外一個作業執行。
??為啥叫單道批處理系統,就是因為在內存中始終保持一道作業。這就引起了兩個主要缺點:一是作業I/O時,監督程序要負責將原來的作業拿出來,再把新的作業放到內存中。這個過程也要時間。CPU的資源也就浪費掉了。二是對大多數程序來說,計算機的內存還是比較大的,一次一個程序,未免有點兒內存浪費。
??第三階段:多道批處理系統
??這一階段又是解決上面的問題,程序在內存進進出出導致CPU利用率較低,還浪費內存。那把內存里多放幾個程序不就OK嘛?這就是多道批處理系統的思想(也是名字由來,多道程序)。將程序排成隊列,按照算法調度到內存中。程序A發生I/O的時候,立馬換到程序B。這樣保證了CPU的利用率保持很高的狀態。整個運行流程如下圖:
??這種方式優點就是資源利用率高、系統的吞吐量大。但也有缺點:作業要排隊,平均的運轉周期長。多道批處理程序只有在程序I/0的時候才會切換程序,如果上一個程序一直不I/O,那么下一個程序就無法被執行。有失公平性。另外用戶和程序之間沒什么交互(這個看上去不重要,但對大多數非計算機專業的人來講,良好的人機交互才是使用的根本。側面反映了windows為啥比Linux更廣泛)。
??現階段:分時系統
??上階段的問題主要兩個:有的程序排不上隊無法執行,和用戶的交互太少(也可以理解成一口氣執行完了,沒有根據交互情況做對應處理)。那分時系統的解決策略就是給每個程序一個時間片,時間片內執行自己程序。時間一到,切換到下一個。這樣每個程序都能夠執行。這樣CPU還是一直在工作,保證了資源利用率。多道批處理系統的兩個問題也得到解決。
??分時系統的工作過程不像是我們想的那樣切換只發生在程序間,其實每兩個時間片之間都要返回到操作系統程序中。這樣做的目的是為了保存上一個程序的一些狀態,以免再次輪到的時候無法順利執行。同時也為即將運行的程序恢復執行環境。底層的實現是用結構體完成的,叫PCB(process control block,進程控制塊),后面也會介紹。
??分時系統相較于多批道處理系統來說有四個特征:多路性(不同程序可能來自不同終端,且都能夠得到很好的執行)、獨立性(有操作系統做保障,每個程序獨立存放和運行)、及時性(用戶給出請求在下一個屬于該程序的時間片就能給到響應)、交互性(不屬于該程序的時間片就可以進行I/O交互)。
??還有另外一種叫做實時系統,這個用在嵌入式中比較多。分時系統中只有在特定時間片才能響應,實時系統中有了就能夠立即響應。實時系統對于可靠性的要求會更高,而且也不提供太多的用戶交互(嵌入到機器里面的,用戶看不到摸不著,自然也沒啥交互)。
??可以看的出來,從第二階段以后都有了操作系統的參與。能夠通過操作系統提供的性能來更好的幫助系統的實現。上面的名字都不叫操作系統,那我們給一個操作系統的定義:操作系統是一組能夠有效地組織和管理計算機硬件和軟件資源,合理地對各類作業進行調度,以及方便用戶使用的程序的集合。所以,操作系統是軟件!下面來更深入的了解一下操作系統吧!
??操作系統的基本特性
??操作系統有四個基本特性:并發、共享、虛擬、異步。下面來分別介紹一下:
??并發
??并發總是和并行被綁在一起說,那二者之間有什么區別呢?
??并行是指兩個或多個事件在同一時刻發生、并發指兩個或多個事物在同一時間間隔內發生。舉個例子,同一個CPU分時處理程序,不同程序在一段時間內都得到執行,就可以說這幾個程序并發。并行指多個CPU同時工作,程序被同時執行。
??那并發有什么用呢?為了提高CPU的利用率,把I/O時間也利用上。為每個程序建立進程,而進程就可以通過并發執行達到很好的效果,提高系統資源的利用率,增加系統的吞吐量。
??共享
??在操作系統環境下的共享(學名叫資源共享或資源復用)指系統中的資源可供內存中多個并發執行的進程共同使用。共享的方式有兩種:互斥共享方式,同時訪問方式。
??互斥共享方式指在一段時間內只能有一個進程對資源進行訪問,該進程結束后其他進程可以訪問。把這種資源稱為臨界資源(物理設備、棧、變量、表格都屬于臨界資源)
??同時訪問方式:一段時間內多個進程可“同時“訪問,這個同時是宏觀意義上的,微觀上還是輪流使用,可以理解成也是分時復用。不過相比互斥共享來講,是同一時刻了。
??并發和共享是最基本的兩個特征。它們之間相互影響,相互制約
??虛擬
??操作系統中的虛擬技術包括時分復用、空分復用。時分復用一個具體例子就是分時系統,不同時間片分配給不同的進程。但外界看不到,像被虛擬一樣的。空分復用典型的例子是虛擬存儲器,用到的程序被拿到主存中。這段空間隨運行情況被不斷復用。
??異步
??操作系統中異步主要體現在進程執行過程中的不確定性。進程I/0時間的長短,什么時候能夠得到CPU服務。這些都是不確定,不可預知的。
??操作系統的主要功能:
??談功能就要從我們希望它干什么事兒說起。我們引入操作系統的主要目的是為多道程序的運行提供良好的運行環境,以保證多道程序能有條不紊、高效地運行,并能最大程度地提高系統中各種資源的利用率,方便用戶的使用。所以主要有以下幾個功能:處理機管理功能、存儲器管理功能、設備管理功能、文件管理功能、與用戶交互的接口以及現代操作系統的新要求。我們一一介紹下:
??處理器管理功能
??處理機的運行是以進程為基本單位的,所以所謂的管理好處理器就是管理好進程。進程到后面還會更詳細的介紹,這里埋個伏筆,簡單介紹下幾個概念。
??進程控制:把要運行的程序叫做作業,會為每個作業分多個進程,即這些進程的資源提供給這個作業。系統是分時系統,當時間到達時,進程需要切換作業,把資源給其他的。過程的實現就是進程控制。因此進程控制的主要功能是為作業創建進程、撤銷(終止)已結束的進程,以及控制進程在運行過程中的狀態轉換(有什么狀態,后面會介紹滴~)
??進程同步:多個進程要想流暢的運行,就需要實現同步(否則的話,都要使用這個資源,沖突了就不好了)。常用來協調同步的方式有兩種:進程互斥方式和進程同步方式。這與前面互斥及同步概念相似,都涉及到對于臨界資源的訪問。同步的實現使用了信號量機制。
??進程通信:一組合作的進程完成同一任務時需要通信以及數據傳遞。這個過程也應該是有條不紊的,需要管理的參與。
??調度:調度分作業調度和進程調度。作業的概念前面解釋過了,就是程序。一個作業會有多個進程。作業調度就是按照一定算法從一堆待處理的程序中選出要執行的。進程調度就是為這個作業分配進程。從時間的角度上看,先作業調度,再進程調度。
??存儲器管理功能
??存儲器可太重要了,程序慢的很大一部分原因就是來回讀寫內存的時間太長了。所以管理好存儲器能夠大大提升性能。存儲器的主要任務是為多道程序的運行提供良好的環境,提高存儲器的利用率,方便用戶使用、并能從邏輯上擴充內存(虛擬存儲器嘛~)。
??內存分配:為每個程序分配內存空間,通過分配管理減少那些碎片化(不可用)空間。提供動態分配的可能(C語言里面時不時的malloc)。分配包括靜態分配和動態分配,靜態就是分多大就是多大,而且不許動。動態分配最開始是確定的,但后續可以追加,也可以移動。
??內存保護:保護每道程序的獨立性,就是不讓程序A去訪問程序B的內存,更不能讓普通用戶程序去訪問操作系統本身的內存。內存保護的實現是設置兩個界限寄存器,一旦發生地址溢出,立馬就中斷執行對應的中斷程序。
??地址映射:多道程序的背景下,編譯鏈接后的可執行程序地址都是從0開始的。但真實的物理地址不是這樣的,所以需要邏輯地址和物理地址之間的轉換。
??內容擴充:這個內容擴充不是實際的內容擴充,而是虛擬存儲器的方式,通過調度表面上提高內存大小(具體的內容查查虛擬存儲器就明白了呀~)
??設備管理功能
??存儲器和I/0設備可是占了計算機的半邊天,要好好管理呀!設備管理的主要任務就是完成用戶進程對于I/0設備的請求,完成指定的I/O操作。并且盡可能提高I/0的速度。
??緩沖處理:CPU和I/O之間的速度相差太多了,所以大多在之間設置緩沖區來提高CPU的利用率,進而提高系統吞吐量。
??設備分配:I/0設備那么多,哪個來完成任務呢?這就需要設備分配啦,設備分配的時候肯定要查詢狀態,同時也會保存一些信息滴(具體內容在此不展開了)。設備用完了,當然也要及時回收。
??設備處理:又稱設備驅動程序,用于實現CPU和設備之間的通信(通常是設備控制器)。設備處理過程是首先檢查I/0請求的合法性,判斷是否處于空閑狀態,啟動設備完成操作。以上是CPU向I/0發送數據,倒過來的I/O中斷也屬于設備處理。通道(后面會介紹)程序也通過這個建立通道。
??文件管理功能
??在Linux中有種說法:一切皆文件。文件主要兩種:用戶文件和系統文件。我們肯定不希望我們文件中的數據是可以隨意讀寫的,所以文件管理很重要。
??文件存儲空間的管理:為一個文件分配空間,那么多文件,人工肯定不行。通過文件管理提高對于外存的利用率。
??目錄管理:文件那么多,如何能在最短的時間找到我要的那個呢?遍歷肯定行不通,所以在文件建立的時候就要按照一定規則建立目錄,幫助索引。
??文件的讀/寫管理和保護:讀寫管理就是能讓我順利的在想讀的時候讀,想寫的時候寫。保護這個不用說,安全嘛,懂得都懂。
??操作系統與用戶之間的接口
??這里面的用戶有兩種:普通用戶,程序員。對于普通用戶,不懂計算機但能夠上網完成應用(像windows)就是因為操作系統提供的接口易上手。對于程序員的話,也不是每個程序員都能使用底層編程的。像一些高級語言的,都是在系統封裝之后進行接口的調用。
??現代操作系統的新功能包括系統安全、網絡的功能和服務、支持多媒體就不詳細說了,感興趣的自己去查查吧~
??操作系統最開始的時候只有幾十K大小,但現在windows的代碼聽說超過幾千萬行。那這么龐大的軟件結構是如何設計演變過來的呢?下面就來聊聊操作系統結構設計的發展史吧。大致可以分成兩個大階段:
??第一階段:傳統操作系統結構
??1.1無結構操作系統:最開始的比較小,管理比較容易。所以只注重于功能的實現,程序間來來回回的引用比較亂。初期OK,但也很快被淘汰。
??1.2模塊化結構操作系統:通過對于功能的區分,將每塊功能實現模塊化。比如整個操作系統分成進程管理、存儲器管理、文件管理。進程管理又細分進程控制、進程調度等等等。模塊化的優點就不說了,說說缺點:模塊之間的切分太難了,而且開發時各模塊并行進行,造成各種決定的無序性,無法使開發的每一步建立在可靠的基礎上。
??1.3分層式結構操作系統:既然上面無序,不可靠。那就從底層開始,一層一層的開發。確保這一層的功能完全實現了,再開發后面的。好處也不說了,這樣的壞處就是效率太低,每執行一個功能都要從上到下穿越好多層(因為它也不知道這層能不能完成這個功能)
??第二階段:微內核階段
??在介紹這個之前,先介紹兩種技術:客戶/服務器模式、面對對象
??客戶/服務器模式(CS模式),一方申請,一方應答。交互過程一來一回。一般服務器的資源更多。
??面對對象就是把一切抽象成對象,通過對象封裝可以提高隱蔽性。對象重用也可以提高產品質量和生產率。
??微內核結構就是通過精心設計的,能實現現代操作系統最基本核心功能的小型內核。內核不是完成的操作系統,但可以通過擴展內核完成所有的操作系統功能。微內核中將一切都設定為進程,將進程分為客戶和服務器兩類。分別叫做用戶態和內核態。微內核負責兩種狀態間的通信。用戶態提出申請可切換至內核態完成更多的功能。操作系統及其龐大,微內核利用面對對象技術中的抽象、隱蔽原則控制系統的復雜性、利用對象、封裝、繼承確保操作系統的正確性、可靠性、易修改性、易擴展性。微內核技術有很多優點:系統的擴展性很好(內核確定,剩下的全可以擴展),系統可靠性更強(內核比較小,經過精心設計更加穩定)、可移植性強(所有與硬件設備相關的代碼均放在硬件隱藏層,大多數是軟件,與平臺無關,移指代價較小),CS模式的加入更適合分布式系統,面對對象增強各方面性能。但確定也比較明顯,狀態來回的切換都是要花費時間的。最佳的方案是根據需要裁剪內核,實現最佳的性價比。(內核的擴展是如何完成的呢?Linux下pip install 算是內核的擴展嗎?)
??寫到這兒這篇文章已經接近六千字了,我們對于操作系統有了個初步的了解。我們回到最初的三個問題:
??1. 為什么要學操作系統?
操作系統是一門基礎課程,通過學習操作系統可以了解程序在計算機中是如何執行的。在不同的執行階段,程序的狀態是什么樣子的。學好操作系統,計算機就不再是一臺機器,就變成了會說話的“人”吧。hhh
??2. 什么是操作系統? 和 3.操作系統能干什么?
??兩個問題一起回答,操作系統是一組軟件,通過操作系統對上可以為用戶提供更方便的軟件接口,屏蔽硬件的復雜性。對下可以最大限度地發揮硬件性能。操作系統的核心就是對于資源的高效管理。
??這篇文章的完成時間比我想象要久的多,可見操作系統內容的龐大。引論的內容繁多,沒有引發我太多深度的思考。不過也更加發現了其中的有趣之處,引發了更多的問題,留下了更多的好奇。希望在后續的過程不斷學習,不斷進步吧!
因作者水平有限,如有錯誤之處,請在下方評論區指出,謝謝!
總結
- 上一篇: liteide无法自动补全代码问题解决【
- 下一篇: linux 可执行文件去除绝对路径