操作系統(tǒng)(一)——概述
一、操作系統(tǒng)的概念

操作系統(tǒng)把用戶的高級操作轉(zhuǎn)換成一系列低級操作,所有低級操作對用戶都是透明的。操作系統(tǒng)把硬件全部隱藏起來,給用戶提供一個友好的、易于操作的界面。此外,操作系統(tǒng)還要進行大量的事務處理。
定義:操作系統(tǒng)是計算機系統(tǒng)中的一個系統(tǒng)軟件它是這樣一些程序模塊的集合它們能以盡量有效、合理的方式組織和管理計算機的軟硬件資源合理地組織計算機的工作流程,控制程序的執(zhí)行并向用戶提供各種服務功能,使得用戶能夠靈活、方便、有效地使用計算機,使整個計算機系統(tǒng)能高效地運行。是計算機與用戶之間的接口。


二、操作系統(tǒng)的發(fā)展歷史

三、操作系統(tǒng)的分類








四、操作系統(tǒng)的功能


五、操作系統(tǒng)的特征




六、操作系統(tǒng)的運行機制




七、中斷和異常






*快速面經(jīng)(OS篇)
1. 簡單介紹下操作系統(tǒng)
操作系統(tǒng)(Operating System,簡稱 OS)是管理計算機硬件與軟件資源的程序,是計算機的基石。操作系統(tǒng)本質(zhì)上是一個運行在計算機上的軟件程序 ,用于管理計算機硬件和軟件資源。 舉例:運行在你電腦上的所有應用程序都通過操作系統(tǒng)來調(diào)用系統(tǒng)內(nèi)存以及磁盤等等硬件。操作系統(tǒng)存在屏蔽了硬件層的復雜性。 操作系統(tǒng)就像是硬件使用的負責人,統(tǒng)籌著各種相關事項。操作系統(tǒng)的內(nèi)核(Kernel)是操作系統(tǒng)的核心部分,它負責系統(tǒng)的內(nèi)存管理,硬件設備的管理,文件系統(tǒng)的管理以及應用程序的管理。 內(nèi)核是連接應用程序和硬件的橋梁,決定著系統(tǒng)的性能和穩(wěn)定性。
操作系統(tǒng)的基本特征:
①并發(fā)
并發(fā)是指宏觀上在一段時間內(nèi)能同時運行多個程序,而并行則指同一時刻能運行多個指令。
并行需要硬件支持,如多流水線、多核處理器或者分布式計算系統(tǒng)。
操作系統(tǒng)通過引入進程和線程,使得程序能夠并發(fā)運行。
②共享
共享是指系統(tǒng)中的資源可以被多個并發(fā)進程共同使用。
有兩種共享方式:互斥共享和同時共享。
互斥共享的資源稱為臨界資源,例如打印機等,在同一時刻只允許一個進程訪問,需要用同步機制來實現(xiàn)互斥訪問。
③虛擬
虛擬技術把一個物理實體轉(zhuǎn)換為多個邏輯實體。
主要有兩種虛擬技術:時(時間)分復用技術和空(空間)分復用技術。
多個進程能在同一個處理器上并發(fā)執(zhí)行使用了時分復用技術,讓每個進程輪流占用處理器,每次只執(zhí)行一小個時間片并快速切換。
虛擬內(nèi)存使用了空分復用技術,它將物理內(nèi)存抽象為地址空間,每個進程都有各自的地址空間。地址空間的頁被映射到物理內(nèi)存,地址空間的頁并不需要全部在物理內(nèi)存中,當使用到一個沒有在物理內(nèi)存的頁時,執(zhí)行頁面置換算法,將該頁置換到內(nèi)存中。
④異步
異步指進程不是一次性執(zhí)行完畢,而是走走停停,以不可知的速度向前推進。
操作系統(tǒng)的基本功能:
1. 進程管理
進程控制、進程同步、進程通信、死鎖處理、處理機調(diào)度等。
2. 內(nèi)存管理
內(nèi)存分配、地址映射、內(nèi)存保護與共享、虛擬內(nèi)存等。
3. 文件管理
文件存儲空間的管理、目錄管理、文件讀寫管理和保護等。
4. 設備管理
完成用戶的 I/O 請求,方便用戶使用各種設備,并提高設備的利用率。
主要包括緩沖管理、設備分配、設備處理、虛擬設備等。
2.?進程和線程的區(qū)別
一個進程中可以有多個線程,多個線程共享進程的堆和方法區(qū) (JDK1.8 之后的元空間)資源,但是每個線程有自己的程序計數(shù)器、虛擬機棧 和 本地方法棧。線程是進程劃分成的更小的運行單位,一個進程在其執(zhí)行的過程中可以產(chǎn)生多個線程。線程和進程最大的不同在于基本上各進程是獨立的,而各線程則不一定,因為同一進程中的線程極有可能會相互影響。線程執(zhí)行開銷小,但不利于資源的管理和保護;而進程正相反。
調(diào)度:進程是資源管理的基本單位,線程是程序執(zhí)行的基本單位。
切換:線程上下文切換比進程上下文切換要快得多。
擁有資源: 進程是擁有資源的一個獨立單位,線程不擁有系統(tǒng)資源,但是可以訪問隸屬于進程的資源。
系統(tǒng)開銷: 創(chuàng)建或撤銷進程時,系統(tǒng)都要為之分配或回收系統(tǒng)資源,如內(nèi)存空間,I/O設備等,OS所付出的開銷顯著大于在創(chuàng)建或撤銷線程時的開銷,進程切換的開銷也遠大于線程切換的開銷。
3. 協(xié)程(goroutine)與線程的區(qū)別?
線程和進程都是同步機制,而協(xié)程是異步機制。
線程是搶占式,而協(xié)程是非搶占式的。需要用戶釋放使用權切換到其他協(xié)程,因此同一時間其實只有一個協(xié)程擁有運行權,相當于單線程的能力。
一個線程可以有多個協(xié)程,一個進程也可以有多個協(xié)程。
協(xié)程不被操作系統(tǒng)內(nèi)核管理,而完全是由程序控制。線程是被分割的CPU資源,協(xié)程是組織好的代碼流程,線程是協(xié)程的資源。但協(xié)程不會直接使用線程,協(xié)程直接利用的是執(zhí)行器關聯(lián)任意線程或線程池。
協(xié)程能保留上一次調(diào)用時的狀態(tài)。
可以理解為:協(xié)程是輕量級的線程(編譯器做優(yōu)化)。
go協(xié)程的特點:
1)有獨立的棧空間
2)共享程序堆空間
3)調(diào)度由用戶控制
4)協(xié)程是輕量級的線程
4. 進程有哪幾種狀態(tài)?
創(chuàng)建狀態(tài)(new) :進程正在被創(chuàng)建,尚未到就緒狀態(tài)。
就緒狀態(tài)(ready) :進程已處于準備運行狀態(tài),即進程獲得了除了處理器之外的一切所需資源,一旦得到處理器資源(處理器分配的時間片)即可運行。
運行狀態(tài)(running) :進程正在處理器上運行(單核 CPU 下任意時刻只有一個進程處于運行狀態(tài))。
阻塞狀態(tài)(waiting) :又稱為等待狀態(tài),進程正在等待某一事件而暫停運行如等待某資源為可用或等待 IO 操作完成。即使處理器空閑,該進程也不能運行。
結束狀態(tài)(terminated) :進程正在從系統(tǒng)中消失??赡苁沁M程正常結束或其他原因中斷退出運行。
5.進程間的通信方式
管道/匿名管道(Pipes) :用于具有親緣關系的父子進程間或者兄弟進程之間的通信。
有名管道(Named Pipes) : 匿名管道由于沒有名字,只能用于親緣關系的進程間通信。為了克服這個缺點,提出了有名管道。有名管道嚴格遵循先進先出(first in first out)。有名管道以磁盤文件的方式存在,可以實現(xiàn)本機任意兩個進程通信。
信號(Signal) :信號是一種比較復雜的通信方式,用于通知接收進程某個事件已經(jīng)發(fā)生;
消息隊列(Message Queuing) :消息隊列是消息的鏈表,具有特定的格式,存放在內(nèi)存中并由消息隊列標識符標識。管道和消息隊列的通信數(shù)據(jù)都是先進先出的原則。與管道(無名管道:只存在于內(nèi)存中的文件;命名管道:存在于實際的磁盤介質(zhì)或者文件系統(tǒng))不同的是消息隊列存放在內(nèi)核中,只有在內(nèi)核重啟(即,操作系統(tǒng)重啟)或者顯式地刪除一個消息隊列時,該消息隊列才會被真正的刪除。消息隊列可以實現(xiàn)消息的隨機查詢,消息不一定要以先進先出的次序讀取,也可以按消息的類型讀取.比 FIFO 更有優(yōu)勢。消息隊列克服了信號承載信息量少,管道只能承載無格式字 節(jié)流以及緩沖區(qū)大小受限等缺點。
信號量(Semaphores) :信號量是一個計數(shù)器,用于多進程對共享數(shù)據(jù)的訪問,信號量的意圖在于進程間同步。這種通信方式主要用于解決與同步相關的問題并避免競爭條件。
共享內(nèi)存(Shared memory) :使得多個進程可以訪問同一塊內(nèi)存空間,不同進程可以及時看到對方進程中對共享內(nèi)存中數(shù)據(jù)的更新。這種方式需要依靠某種同步操作,如互斥鎖和信號量等??梢哉f這是最有用的進程間通信方式。
套接字(Sockets) : 此方法主要用于在客戶端和服務器之間通過網(wǎng)絡進行通信。套接字是支持 TCP/IP 的網(wǎng)絡通信的基本操作單元,可以看做是不同主機之間的進程進行雙向通信的端點,簡單的說就是通信的兩方的一種約定,用套接字中的相關函數(shù)來完成通信過程。
優(yōu)缺點:
管道:速度慢,容量有限;
Socket:任何進程間都能通訊,但速度慢;
消息隊列:容量受到系統(tǒng)限制,且要注意第一次讀的時候,要考慮上一次沒有讀完數(shù)據(jù)的問題;
信號量:不能傳遞復雜消息,只能用來同步;
共享內(nèi)存區(qū):能夠很容易控制容量,速度快,但要保持同步,比如一個進程在寫的時候,另一個進程要注意讀寫的問題,相當于線程中的線程安全,當然,共享內(nèi)存區(qū)同樣可以用作線程間通訊,不過沒這個必要,線程間本來就已經(jīng)共享了同一進程內(nèi)的一塊內(nèi)存。
6. 進程間同步的方式有哪些?
1、臨界區(qū):通過對多線程的串行化來訪問公共資源或一段代碼,速度快,適合控制數(shù)據(jù)訪問。
優(yōu)點:保證在某一時刻只有一個線程能訪問數(shù)據(jù)的簡便辦法。
缺點:雖然臨界區(qū)同步速度很快,但卻只能用來同步本進程內(nèi)的線程,而不可用來同步多個進程中的線程。
2、互斥量:為協(xié)調(diào)共同對一個共享資源的單獨訪問而設計的?;コ饬扛R界區(qū)很相似,比臨界區(qū)復雜,互斥對象只有一個,只有擁有互斥對象的線程才具有訪問資源的權限。
優(yōu)點:使用互斥不僅僅能夠在同一應用程序不同線程中實現(xiàn)資源的安全共享,而且可以在不同應用程序的線程之間實現(xiàn)對資源的安全共享。
缺點:
互斥量是可以命名的,也就是說它可以跨越進程使用,所以創(chuàng)建互斥量需要的資源更多,所以如果只為了在進程內(nèi)部是用的話使用臨界區(qū)會帶來速度上的優(yōu)勢并能夠減少資源占用量。
通過互斥量可以指定資源被獨占的方式使用,但如果有下面一種情況通過互斥量就無法處理,比如現(xiàn)在一位用戶購買了一份三個并發(fā)訪問許可的數(shù)據(jù)庫系統(tǒng),可以根據(jù)用戶購買的訪問許可數(shù)量來決定有多少個線程/進程能同時進行數(shù)據(jù)庫操作,這時候如果利用互斥量就沒有辦法完成這個要求,信號量對象可以說是一種資源計數(shù)器。
3、信號量:為控制一個具有有限數(shù)量用戶資源而設計。它允許多個線程在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大線程數(shù)目?;コ饬渴切盘柫康囊环N特殊情況,當信號量的最大資源數(shù)=1就是互斥量了。
優(yōu)點:適用于對Socket(套接字)程序中線程的同步。
缺點:
信號量機制必須有公共內(nèi)存,不能用于分布式操作系統(tǒng),這是它最大的弱點;
信號量機制功能強大,但使用時對信號量的操作分散, 而且難以控制,讀寫和維護都很困難,加重了程序員的編碼負擔;
核心操作P-V分散在各用戶程序的代碼中,不易控制和管理,一旦錯誤,后果嚴重,且不易發(fā)現(xiàn)和糾正。
4、事件: 用來通知線程有一些事件已發(fā)生,從而啟動后繼任務的開始。
優(yōu)點:事件對象通過通知操作的方式來保持線程的同步,并且可以實現(xiàn)不同進程中的線程同步操作。
7. 進程與線程的切換流程?
進程切換分兩步:
1、切換頁表以使用新的地址空間,一旦去切換上下文,處理器中所有已經(jīng)緩存的內(nèi)存地址一瞬間都作廢了。
2、切換內(nèi)核棧和硬件上下文。
對于linux來說,線程和進程的最大區(qū)別就在于地址空間,對于線程切換,第1步是不需要做的,第2步是進程和線程切換都要做的。
因為每個進程都有自己的虛擬地址空間,而線程是共享所在進程的虛擬地址空間的,因此同一個進程中的線程進行線程切換時不涉及虛擬地址空間的轉(zhuǎn)換。
8. 線程間的同步的方式
線程同步是兩個或多個共享關鍵資源的線程的并發(fā)執(zhí)行。應該同步線程以避免關鍵的資源使用沖突。操作系統(tǒng)一般有下面三種線程同步的方式:
互斥量(Mutex):采用互斥對象機制,只有擁有互斥對象的線程才有訪問公共資源的權限。因為互斥對象只有一個,所以可以保證公共資源不會被多個線程同時訪問。比如 Java 中的 synchronized 關鍵詞和各種 Lock 都是這種機制。
信號量(Semaphore) :它允許同一時刻多個線程訪問同一資源,但是需要控制同一時刻訪問此資源的最大線程數(shù)量。
事件(Event) :Wait/Notify:通過通知操作的方式來保持多線程同步,還可以方便的實現(xiàn)多線程優(yōu)先級的比較操作。
臨界區(qū)(Critical Section):當多個線程訪問一個獨占性共享資源時,可以使用臨界區(qū)對象。擁有臨界區(qū)的線程可以訪問被保護起來的資源或代碼段,其他線程若想訪問,則被掛起,直到擁有臨界區(qū)的線程放棄臨界區(qū)為止,以此達到用原子方式操作共享資源的目的。
區(qū)別:
互斥量與臨界區(qū)的作用非常相似,但互斥量是可以命名的,也就是說互斥量可以跨越進程使用,但創(chuàng)建互斥量需要的資源更多,所以如果只為了在進程內(nèi)部是用的話使用臨界區(qū)會帶來速度上的優(yōu)勢并能夠減少資源占用量 。因為互斥量是跨進程的,互斥量一旦被創(chuàng)建,就可以通過名字打開它。
互斥量,信號量,事件都可以被跨越進程使用來進行同步數(shù)據(jù)操作。
9.?進程的調(diào)度算法
為了確定首先執(zhí)行哪個進程以及最后執(zhí)行哪個進程以實現(xiàn)最大 CPU 利用率,計算機科學家已經(jīng)定義了一些算法,它們是:
先到先服務(FCFS)調(diào)度算法 : 從就緒隊列中選擇一個最先進入該隊列的進程為之分配資源,使它立即執(zhí)行并一直執(zhí)行到完成或發(fā)生某事件而被阻塞放棄占用 CPU 時再重新調(diào)度。
短作業(yè)優(yōu)先(SJF)的調(diào)度算法 : 從就緒隊列中選出一個估計運行時間最短的進程為之分配資源,使它立即執(zhí)行并一直執(zhí)行到完成或發(fā)生某事件而被阻塞放棄占用 CPU 時再重新調(diào)度。
時間片輪轉(zhuǎn)調(diào)度算法 : 時間片輪轉(zhuǎn)調(diào)度是一種最古老,最簡單,最公平且使用最廣的算法,又稱 RR(Round robin)調(diào)度。每個進程被分配一個時間段,稱作它的時間片,即該進程允許運行的時間。
多級反饋隊列調(diào)度算法 :前面介紹的幾種進程調(diào)度的算法都有一定的局限性。如短進程優(yōu)先的調(diào)度算法,僅照顧了短進程而忽略了長進程 。多級反饋隊列調(diào)度算法既能使高優(yōu)先級的作業(yè)得到響應又能使短作業(yè)(進程)迅速完成。因而它是目前被公認的一種較好的進程調(diào)度算法,UNIX 操作系統(tǒng)采取的便是這種調(diào)度算法。
優(yōu)先級調(diào)度 : 為每個流程分配優(yōu)先級,首先執(zhí)行具有最高優(yōu)先級的進程,依此類推。具有相同優(yōu)先級的進程以 FCFS 方式執(zhí)行??梢愿鶕?jù)內(nèi)存要求,時間要求或任何其他資源要求來確定優(yōu)先級。
10. 為什么虛擬地址空間切換會比較耗時?
進程都有自己的虛擬地址空間,把虛擬地址轉(zhuǎn)換為物理地址需要查找頁表,頁表查找是一個很慢的過程,因此通常使用Cache來緩存常用的地址映射,這樣可以加速頁表查找,這個Cache就是TLB(translation Lookaside Buffer,TLB本質(zhì)上就是一個Cache,是用來加速頁表查找的)。
由于每個進程都有自己的虛擬地址空間,那么顯然每個進程都有自己的頁表,那么當進程切換后頁表也要進行切換,頁表切換后TLB就失效了,Cache失效導致命中率降低,那么虛擬地址轉(zhuǎn)換為物理地址就會變慢,表現(xiàn)出來的就是程序運行會變慢,而線程切換則不會導致TLB失效,因為線程無需切換地址空間,因此我們通常說線程切換要比較進程切換塊,原因就在這里。
11. 線程的分類?
從線程的運行空間來說,分為用戶級線程(user-level thread, ULT)和內(nèi)核級線程(kernel-level, KLT)
內(nèi)核級線程:這類線程依賴于內(nèi)核,又稱為內(nèi)核支持的線程或輕量級進程。無論是在用戶程序中的線程還是系統(tǒng)進程中的線程,它們的創(chuàng)建、撤銷和切換都由內(nèi)核實現(xiàn)。比如英特爾i5-8250U是4核8線程,這里的線程就是內(nèi)核級線程。
用戶級線程:它僅存在于用戶級中,這種線程是不依賴于操作系統(tǒng)核心的。應用進程利用線程庫來完成其創(chuàng)建和管理,速度比較快,操作系統(tǒng)內(nèi)核無法感知用戶級線程的存在。
12. 什么是臨界區(qū),如何解決沖突?
每個進程中訪問臨界資源的那段程序稱為臨界區(qū),一次僅允許一個進程使用的資源稱為臨界資源。
解決沖突的辦法:
如果有若干進程要求進入空閑的臨界區(qū),一次僅允許一個進程進入,如已有進程進入自己的臨界區(qū),則其它所有試圖進入臨界區(qū)的進程必須等待;
進入臨界區(qū)的進程要在有限時間內(nèi)退出。
如果進程不能進入自己的臨界區(qū),則應讓出CPU,避免進程出現(xiàn)“忙等”現(xiàn)象。
13.?系統(tǒng)調(diào)用
如果一個進程在用戶態(tài)需要使用內(nèi)核態(tài)的功能,就進行系統(tǒng)調(diào)用從而陷入內(nèi)核,由操作系統(tǒng)代為完成。

Linux 的系統(tǒng)調(diào)用主要有以下這些:
14. 宏內(nèi)核和微內(nèi)核
1. 宏內(nèi)核
宏內(nèi)核是將操作系統(tǒng)功能作為一個緊密結合的整體放到內(nèi)核。
由于各模塊共享信息,因此有很高的性能。
2. 微內(nèi)核
由于操作系統(tǒng)不斷復雜,因此將一部分操作系統(tǒng)功能移出內(nèi)核,從而降低內(nèi)核的復雜性。移出的部分根據(jù)分層的原則劃分成若干服務,相互獨立。
在微內(nèi)核結構下,操作系統(tǒng)被劃分成小的、定義良好的模塊,只有微內(nèi)核這一個模塊運行在內(nèi)核態(tài),其余模塊運行在用戶態(tài)。
因為需要頻繁地在用戶態(tài)和核心態(tài)之間進行切換,所以會有一定的性能損失。

15. 中斷分類
1. 外中斷
由 CPU 執(zhí)行指令以外的事件引起,如 I/O 完成中斷,表示設備輸入/輸出處理已經(jīng)完成,處理器能夠發(fā)送下一個輸入/輸出請求。此外還有時鐘中斷、控制臺中斷等。
2. 異常
由 CPU 執(zhí)行指令的內(nèi)部事件引起,如非法操作碼、地址越界、算術溢出等。
3. 陷入
在用戶程序中使用系統(tǒng)調(diào)用。