作業系統基礎

什么是作業系統
作業系統(Operating System,簡稱OS)是管理計算機硬體和軟體資源的程式,是計算機的基石,
作業系統本質上是一個運行在計算機上的軟體程式用于管理計算機硬體和軟體資源,如運行在電腦上的所有應用程式都通過作業系統來呼叫系統記憶體以及磁盤等硬體,
作業系統屏蔽了硬體層的復雜性,
作業系統的內核(kernel)是作業系統的核心部分,他負責系統的行程管理,記憶體管理,硬體設備管理、檔案系統管理以及應用程式管理,內核是連接應用程式和硬體的橋梁,決定系統的性能和穩定性,

系統呼叫(使用系統態的子功能)
根據行程訪問資源的特點,我們把行程在系統上的運行分為兩個級別:
- 用戶態(user mode),用戶態運行的行程或可以直接讀取用戶程式的資料
- 系統態(kernel mode),系統態運行的行程或程式幾乎可以訪問計算機的任何資源,不受限制
什么是系統呼叫?
我們運行的程式基本都運行在用戶態,但如果我們要呼叫作業系統提供的系統態級別的子功能怎么辦呢?這時就需要用到系統呼叫了,也就是說再我們運行的用戶程式中,凡是與系統態級別的資源有關的操作(如檔案管理,行程管理,記憶體管理等),都必須通過系統呼叫的方式向作業系統提出服務請求,并由作業系統代為完成,
這些系統呼叫按功能大致可分為以下幾類:
- 設備管理:完成設備的請求與釋放,以及設備啟動等功能
- 檔案管理:完成檔案的讀、寫、創建以及洗掉等功能
- 行程管理:完成行程的創建、撤銷、阻塞、喚醒以及行程間的通信等功能
- 記憶體管理:完成記憶體的分配,回收
行程管理
行程與執行緒的關系以及區別
行程是具有一定獨立功能的程式關于某個資料集合上的一次運行活動,行程是系統進行資源分配和調度的基本單位
執行緒是行程的一個物體,是CPU調度和分派的基本單位,它是比行程更小的能獨立運行的基本單位,執行緒自己基本上不擁有系統資源,只擁有一點運行中必不可少的資源(如程式計數器,一組暫存器和堆疊),因此切換代價比行程低,但是他可以與屬于 同一個 行程的其他執行緒共享擁有的全部資源,管理較行程來說更繁瑣
區別:行程是執行緒的容器,執行緒是行程的一個物體,而行程是程式的物體,是程式關于某資料集合上的一次運行活動, 程式一旦運行就是行程
簡而言之,行程就是指正在運行的一個應用程式,程式一旦運行就是行程,行程是資源分配的最小單元;執行緒是行程的一個單元執行流(物體),是CPU調度分派的基本單元,

深入理解
行程(執行緒+記憶體+檔案/網路句柄)
記憶體:這里的記憶體不是所見到的(2G/4G)等物理記憶體,而是邏輯記憶體,指記憶體的尋址空間,每個行程的記憶體相互獨立
執行緒(堆疊+PC+TLS)
程式與行程的區別
- 行程是一個動態的概念,程式是一個靜態的概念
- 行程是競爭計算機系統資源的基本單位,而程式不反映執行也就不會競爭計算機系統資源
- 行程具有并行特征,而程式不反映執行所以沒有并行特征
- 不同的行程可以包含同一程式,只要該程式所對應的資料集不同,
行程有哪幾種狀態
- 創建狀態:行程正在被創建,尚未到就緒
- 就緒狀態:行程已獲得除處理機以外的所需資源,等待分配處理機資源
- 運行狀態:占用處理機資源運行,處于此狀態的行程數小于等于CPU數
- 阻塞狀態:行程等待某種條件,在條件滿足前無法執行
- 結束狀態:行程正在從系統中消失,可能是行程正常結束或其他原因中斷退出

行程通信的方式有哪些(7種)
每個行程都有自己獨立的用戶地址空間,任何一個行程的全域變數在另一個行程中都看不到,所以行程間交換資料必要要通過內核,在內核中開辟一塊緩沖區,行程1把資料從用戶空間拷貝到內核緩沖區,行程2再從內核緩沖區中把資料讀走,內核提供的這種機制叫行程間通信(IPC,InterPreocess Communication)

-
管道:
-
一種半雙工的通信方式,資料只能單向流動,并且只能在具有親緣關系的行程間流動(父子行程,兄弟行程),
-
管道是一種獨立的檔案系統,他不是普通的檔案,不屬于檔案系統,而是單獨構成一種檔案系統,只存在于記憶體中,
-
行程中資料的讀出和寫入,是一個行程向管道中寫入內容,另一個管道在另一端讀出,寫入的內容每次都寫在管道緩沖區的末尾,并每次從緩沖區頭部讀取資料,模型類似生活中的管道
-
管道的實質是一個內核緩沖區,行程以先進先出的方式從緩沖區存取資料,該緩沖區可以看做一個回圈佇列
-
管道的局限在于只支持單向流動,必須在親緣關系的行程間通信,沒有名字,管道的緩沖區是有限的

-
-
命名管道:由于管道沒有名字,只能在具有親緣關系的行程間通信,為了克服這個缺點提出了命名管道,其與匿名管道不同之處在于它提供了一個路徑名與之關聯, 這樣,即使與有名管道的創建行程不存在親緣關系的行程,只要可以訪問該路徑,就能夠彼此通過有名管道相互通信 也是半雙工通信方式,但他允許無親緣關系的行程間通信
-
信號:信號是Linux系統中用于行程間互相通信或操作的一種機制,信號可以在任何時候發給某一個行程,而無需知道這個行程的狀態,如果該行程并未處于執行狀態,則將此信號保存在內核中,直到該行程恢復執行并傳遞給他為止,如程式終止信號Ctrl+C可以產生該信號
信號的生命周期及處理流程:
- 信號被某個行程產生,并設定此信號傳遞的物件(一般為對應行程的pid),然后傳遞給作業系統;
- 作業系統將信號傳遞給對應行程
- 目的行程收到信號后,暫時終止當前代碼,保護背景關系(臨時暫存器資料,當前程式位置以及CPU狀態),進入中斷執行

-
訊息佇列:訊息佇列是存放在內核中的訊息鏈表,與管道(無名管道:只存在于記憶體中的檔案;命名管道:存在于實際的磁盤介質或檔案系統)不同的是
- 訊息佇列存放于內核中,只有內核重啟或顯示洗掉一個訊息佇列時才會真正洗掉
- 訊息佇列在某個行程往一個佇列寫入訊息之前,不需要另一個行程在該佇列上等待訊息的到達,此外,訊息佇列允許一個或多個行程向他寫入或讀取資料
- 訊息佇列可以實作訊息的隨機查詢,訊息也不一定以先進先出的次序讀取,也可以按訊息的型別讀取
-
共享記憶體:使得多個行程可以直接讀取同一個記憶體空間,是最快的IPC方式,是針對其他通信機制效率低而設計的,為了在多個行程間交換資訊,內核專門留出一塊記憶體區,可以由需要訪問的行程將其映射到自己的私有地址空間,行程就可以讀取這一塊記憶體而不需要資料拷貝,大大提升效率, 由于多個行程共享一段記憶體,因此需要依靠某種同步機制(如信號量)來達到行程間的同步及互斥,

-
信號量: 信號量是一個計數器,可用來控制多個行程對共享資源的訪問, 它通常作為一種鎖機制,防止某行程正在訪問共享資源時,其他行程也訪問該資源,因此,主要作為行程間以及同一行程內不同執行緒之間的同步手段,
-
socket套接字:可用于不同設備及其間的行程通信
執行緒之間的通信方式
執行緒間由于共享行程的記憶體空間,因此執行緒中沒有像行程通信中那樣的資料交換通信機制,執行緒間的通信目的主要是用于執行緒同步
- 共享變數
- 互斥量(Mutex) : 采用互斥物件機制,只有擁有互斥物件的執行緒才有訪問公共資源的權限, 因為互斥物件只有一個,所以可以保證公共資源不會被多個執行緒同時訪問,比如 Java 中的 synchronized 關鍵詞和各種 Lock 都是這種機制,
- 信號量: 它允許同一時刻多個執行緒訪問同一資源,但是需要控制同一時刻訪問此資源的最大執行緒數量
- 事件 :Wait/Notify:通過通知操作的方式來保持多執行緒同步,還可以方便的實作多執行緒優先級的比較
行程的調度演算法
為了確定首先執行哪個行程以及最后執行哪個行程以實作最大CPU利用率,計算機科學家定義了一些演算法
- 先到先服務(FCFS)調度演算法:從就緒佇列中選擇一個最先進入佇列的行程為之分配資源,使他立即執行到完成或發生某時間而被阻塞放棄占用CPU時再重新調度
- 短作業優先(SJF)呼叫演算法:從就緒佇列中選出一個估計運行時間最短的行程為之分配資源
- 時間片輪轉調度演算法:時間片輪轉調度是一種最古老,最簡單,最常用的行程調度演算法,又稱RR(Round robin)調度,每個行程被分配一個時間段,稱他為時間片,即行程允許運行的時間,
- 優先級調度:為每個行程分配優先級,首先執行具有最高優先級的行程,依次類推,可以根據記憶體要求,時間要求,任何其他資源要求來確定優先級,
- 多級反饋佇列調度演算法”:短作業優先調度演算法僅照顧到了短行程而忽略了長行程,多級反饋佇列調度即可以使高優先級的作業得到回應又能使短作業迅速完成
什么是死鎖
在兩個或多個并發行程中,如果每個行程擁有某個資源,而這個資源又是對方所需要的,雙方都等待對方釋放自己需要的資源,而都不釋放,在未改變這種狀態之前不能繼續推進,這一組行程就產生了死鎖,也就是兩個或多個行程無限期的阻塞,相互等待的一種狀態
產生的主要原因是:系統資源不足,行程推進順序非法
死鎖產生的四個必要條件(有 一個不成立,則不會產生死鎖)
- 互斥條件:一個資源只能被一個行程使用
- 請求與保持條件:一個行程因請求資源而阻塞時,對已獲得的資源保持不放
- 不剝奪條件:行程獲得的資源,在未完全使用完之前,不能強行剝奪
- 回圈等待條件:若干行程之間形成一種頭尾相接的喚醒等待資源關系
死鎖的基本處理策略和常用方法
預防死鎖(資源分配問題)
- 資源一次性分配:破壞請求和保持條件
- 可剝奪資源:當某行程新的資源未滿足時,釋放已占有的資源(破壞不可剝奪條件)
- 資源有序分配:系統給每類資源分配一個編號,每個行程按編號遞增的順序請求資源,釋放則相反(破壞環路等待條件)
避免死鎖
預防死鎖的幾種策略會嚴重損害系統性能,因此在避免死鎖時需要施加較弱的限制,從而獲得較滿意的系統性能,由于在避免死鎖的策略中,允許行程動態地申請資源,因而,系統在進行資源分配之前需先計算資源分配的安全性,若此次分配不會導致系統進入不安全狀態,則將資源分配給行程,否則行程等待,最具代表性的避免死鎖的演算法是銀行家演算法
Windows下記憶體管理
作業系統的記憶體管理主要是做什么
作業系統的記憶體管理主要負責記憶體的分配與回收(malloc函式:申請記憶體,free函式:釋放記憶體),另外地址轉換即邏輯地址轉換成相應的物理地址等功能也是記憶體管理做的事情
常見的記憶體管理機制
主要分為連續分配管理和非連續分配管理方式,連續分配管理方式指為一個用戶程式分配一個連續的記憶體空間,常見的如塊式管理,同樣的,非連續非配管理方式允許一個程式使用的記憶體分布在離散或不相鄰的記憶體中,常見的頁式管理和段式管理,
- 塊式管理:很早時計算機作業系統的記憶體管理方式,將記憶體分為幾個固定大小的塊,每個塊包含一個行程,當一個運行的程式需要記憶體的話,作業系統就分配一塊,如果程式運行時只需要很小的空間的話,分配的空間中一部分就會被浪費了,這個塊中未被利用的空間我們稱之為碎片,
- 頁式管理:把記憶體分為大小相等且固定的一頁一頁的形式,頁較小,相對于塊式管理劃分力度更大,提高了記憶體利用率,減少了碎片,頁式管理通過頁表對應邏輯地址和物理地址,
- 段式管理:頁式管理雖然提高了記憶體利用率,但頁式管理其中的頁實際無任何實際意義,段式管理把主存分為一段段的,每一段的空間比頁空s間小很多,但是,最重要的是段是有實際意義的,每個段定義了一組邏輯資訊, 例如,有主程式段 MAIN、子程式段 X、資料段 D 及堆疊段 S 等, 段式管理通過段表對應邏輯地址和物理地址**,
- 段頁式管理:結合段式管理和頁式管理的有點,現將主存分為若干段,每個段分為若干頁,也就是說段頁式管理機制中段與段的之間及段的內部都是離散的,
快表和多級頁表
塊表和分級頁表時頁表管理機制中兩個很重要的概念,這個兩個東西分別解決了頁表管理中很重要的兩個問題,
- 虛擬地址到物理地址的轉換要快
- 解決虛擬地址空間大,頁表也會很大的問題
快表
為了解決虛擬地址到物理地址的轉換速度,作業系統在頁表方案的基礎上引入了快表來加速虛擬地址到物理地址的轉換,可以把快表理解為一種特殊的高速緩沖存盤器(Cache),其中內容是頁表的一部分或全部部分,作為頁表的Cache,他的作用與頁表類似,但提高了訪問速率,由于采用頁表作為地址轉換,讀寫記憶體資料時CPU要訪問兩次主存,有了塊表,有時只訪問一次高速緩沖存盤器,一次主存,這個樣子可以加速查找,
使用快表的執行流程:
- 根據虛擬地址中的頁號查塊表
- 如果該頁在快表中,直接從快表中獲取相應的物理地址
- 如果該頁不在快表中,那么就訪問記憶體中的頁表,再從頁表中獲取到物理地址,同時將頁表中的該映射表添加到快表中
- 當快表填滿時,采用一定的淘汰機制淘汰掉表中的一個頁
多級頁表
引入多級頁表時為了避免把全部頁表放在記憶體中占用過多的空間,特別是那些經常不需要的頁表, 多級頁表屬于時間換空間的典型場景
總結:為了提高記憶體的空間性能,提出了多級頁表的概念,但是提高空間性能是以浪費時間換來的,因此為了補償時間上的損失,提出了快表的概念,無論是快表還是多級頁表,都利用到了程式的區域性原理,
分頁機制和分段機制的共同點和區別
共同點:
- 分頁機制和分段機制都是為了提高記憶體利用率,減少記憶體碎片
- 頁和段都是離散存盤的,所以兩者都是離散分配記憶體的方式,但是,每個頁和段中都是連續的
區別:
- 頁的大小是固定的,由作業系統決定,而段的大小不固定,由當前運行的程式決定,
- 分頁僅僅是為了滿足作業系統記憶體管理的需求,而段式邏輯資訊的單位,程式中可以體現為代碼段,資料段,能更好的滿足用戶的需要,
- 段向用戶提供二維地址空間;頁向用戶提供的是一維地址空間
- 段是資訊的邏輯單位,便于存盤保護和資訊的共享,頁的保護和共享受到限制,
邏輯(虛擬)地址和物理地址
與程式接觸的一般就是邏輯地址,在分段和分頁記憶體管理機制中,要想訪問物理地址,必須通過邏輯地址去訪問,就像C語言程式中的指標,指標存盤的數值就是邏輯地址,通過這個地址我們能夠找到真正的物理地址
為什么不直接給物理地址而需要邏輯地址轉換
如果沒有虛擬地址,程式都是直接訪問和操作物理記憶體,如果是這樣的話會造成一些問題
- 用戶可以訪問任意記憶體,尋址記憶體的每個位元組,這樣很容易破壞作業系統,造成作業系統崩潰,(安全問題:系統崩潰)
- 想要同時運行多個程式很困難,比如先運行微信時,給的記憶體地址是1xxxx,而QQ音樂打開時同樣賦值記憶體空間1xxx ,那么QQ音樂對記憶體空間的賦值就會覆寫微信之前的賦值,造成微信崩潰,(安全問題:多行程)
- 如何分配記憶體,分配多的話造成浪費并且沒幾個行程記憶體就耗盡了,分配少的話不夠用(大小分配問題)
- 如果動態分配記憶體,則行程拿到的記憶體空間是不連續的,系統要解決碎片問題,(地址空間不連續問題)
總結來說,如果直接暴露物理地址會導致很多問題,比如可能對作業系統造成傷害以及給同時運行多個程式造成困難,
通過虛擬地址訪問的優勢:
- 程式可以使用一系列相鄰的虛擬地址來訪問物理記憶體中不相鄰的記憶體緩沖區(使用離散物理地址)
- 程式可以使用一系列虛擬地址來訪問大于可用物理記憶體的記憶體緩沖區,當物理記憶體的供應量變小時,記憶體管理器會將物理記憶體頁(通常為4KB)保存到磁盤檔案,資料或代碼頁會根據需要在物理記憶體與磁盤之間移動,(使用物理記憶體可大可小)
- 不同行程使用的虛擬地址彼此隔離,一個行程中的代碼無法更改正在由另一行程或作業系統使用的物理記憶體,(虛擬記憶體物理記憶體彼此隔離)
虛擬記憶體(Virtual Mmory)
虛擬記憶體是計算機中系統記憶體管理的一種技術,它使得應用程式認為它擁有連續可用的記憶體(一段連續完整的地址空間),而實際上,他通常被分割成多個物理記憶體碎片,還有部分暫時存盤在外部磁盤存盤器上(將記憶體擴展到硬碟空間),在需要時進行資料交換,目前大多數作業系統都使用了虛擬記憶體,如Windows的虛擬記憶體,Linux的交換空間,
舉個簡單的例子,比如我們很多時候一次性點開很多應用和網頁,這時可能會出現卡屏的現象,但過了一會兒又恢復了,這里面就用到了虛擬記憶體,當我們點開很多應用時,記憶體可能被耗盡了,這時虛擬空間就將記憶體擴展到硬碟,使記憶體依然夠用,但由于磁盤比記憶體的訪問速度慢多了,所以需要等待的時間就比較長,這就是為什么等一段時間可以恢復
區域性原理
區域性原理是虛擬記憶體技術的基礎,正式因為程式運行具有區域性原理,才可以只裝入部分程式到記憶體就開始運行
也就是說在某個較短的時間內,程式執行局限于某一小部分,程式訪問的存盤空間也局限于某個區域
區域性原理表現在以下兩個方面
- 時間區域性:如果程式中的某條指令一旦執行,不就以后該指令可能再次執行;如果某資料被訪問過,不就以后該資料可能被再次訪問,產生時間區域性的典型原因是由于在程式中存在大量回圈操作
- 空間區域性:一旦程式訪問了某個存盤單元,不久之后,其附近的存盤單元也將被訪問,即程式在一段時間內所訪問的地址可能集中在一定范圍內,這是因為指令通常是順序存放,順序執行的,
虛擬記憶體技術實際上就是建立了 “記憶體一外存”的兩級存盤器的結構,利用區域性原理實作髙速快取,
虛擬存盤器
基于區域性原理,在程式裝入時,可以將程式的一部分裝入記憶體,而將其他部分留在外存,就可以啟動程式執行,由于外存往往比記憶體大很多,所以我們運行的原件的記憶體大小實際可以比計算機系統實際的記憶體大的,在程式執行程序中,當所訪問的資訊不在記憶體時,由作業系統將所需要的部分調入記憶體,然后繼續執行程式,另一方面,作業系統可以將記憶體中暫時不同的內容換到外存上,從而騰出空間放入調入記憶體的資訊,這樣計算機好像為用戶提供了一個比實際記憶體大的多的存盤器--虛擬存盤器,這也是一個時間換空間的策略,使用CPU的計算時間,頁的調入調出時間,換來更大的空間,
虛擬記憶體的技術實作
虛擬記憶體的實作需要建立在離散分配的記憶體管理基礎之上,虛擬記憶體的實作方式有以下三種方式
- 請求分頁存盤管理:建立在分頁管理基礎上,為了支持虛擬存盤器功能而增加了請求調頁功能和管理置換功能,請求分頁是目前最常用的一種虛擬存盤器實作方法,請求分頁存盤管理系統中,在作業運行之前,僅裝入當前要執行的部分即可運行,加入在作業運行的程序中發現要訪問的頁面不在記憶體,則由處理器通知作業系統按照對應的頁面置換演算法將相應的頁面調入到主存,同時作業系統也可以將暫時不用的頁面置換到外存中
- 請求分段存盤管理:建立在分段存盤管理之上,增加了請求調段功能、分段置換功能,請求分段存盤管理方式就如同請求分頁存盤管理方式一樣,在作業運行之前,僅裝入當前要執行的部分即可運行,在執行程序中,可使用請求調入中斷動態裝入要訪問但又不在記憶體中的程式段,當記憶體空間已滿時,根據置換功能調出某個段,以騰出空間裝入新的段,
- 請求段頁式存盤管理
以上的幾種實作方式,我們一般需要:
- 一定容量的記憶體和外存,在載入程式的時候,只需要將程式的一部分裝入記憶體,而將其他部分留在外存,程式就可以運行了
- 缺頁中斷:如果需要執行的指令或訪問的資料尚未在記憶體(稱為缺頁或缺段),則由處理器通知作業系統將相應的頁面或段調入到記憶體,然后繼續執行程式
- 虛擬地址空間:邏輯地址到物理地址的轉換
請求分頁存盤管理和分頁存盤管理的區別:請求分頁存盤管理是建立在分頁存盤管理基礎之上的,他們的根本區別在于是否將一作業的全部地址空間同時裝入主存,請求分頁存盤管理不需要將作業的全部地址空間同時裝入主存(請求調頁功能和頁面置換功能),基于這一點請求分頁存盤管理可以提供虛擬記憶體,而分頁存盤管理卻不能提供
頁面置換演算法
虛擬記憶體最重要的一個概念就是頁面置換演算法
什么叫頁面置換演算法?
地址映射程序中若在頁面中發現需要訪問的頁面不在記憶體中,則發生缺頁中斷,當發生缺頁中斷時,如果當前記憶體中并沒有空閑的頁面,作業系統就必須在記憶體選擇一個頁面將其移除記憶體,以便為即將調入的頁面讓出空間,用來淘汰頁面的演算法叫頁面置換演算法
常見的頁面置換演算法
- OPT(Optimal)頁面置換演算法(最佳頁面置換演算法):最佳(Optimal,OPT)置換演算法所選擇的被淘汰頁面是以后永不使用的,或者是最長時間內不再被訪問的頁面,這樣可以保證獲得最低的缺頁率,但由于人們目前無法預知行程在記憶體下的若干頁面中哪個是最長時間不使用的,因而該演算法無法實作,一般用來衡量其他置換演算法的方法
- FIFO (First In First Out) 頁面置換演算法(先進先出頁面置換演算法):總是淘汰最先進入記憶體的頁面,即選擇在記憶體中駐留時間最久的頁面進行淘汰
- LRU( Least Currently Used )頁面置換演算法(最近最久未使用頁面置換演算法):LRU演算法賦予每個頁面一個訪問欄位,用來記錄一個頁面自上次被訪問以來所經歷的時間T,當選擇一個頁面淘汰時,將選擇現有頁面中T值最大的,即最近最久未使用的頁面予以淘汰,
- LFU( Least Frequently Used )頁面置換演算法(最少使用頁面置換演算法):該置換演算法選擇在之前時期使用最少的頁面作為淘汰頁,
什么是緩沖區溢位
緩沖區溢位是指當計算機向緩沖區填充資料時超出了緩沖區本身的容量,溢位的資料覆寫在了合法資料上
危害:程式崩潰或跳轉并執行一段惡意代碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/172109.html
標籤:Java
上一篇:【Java】內部類
下一篇:HTTPS證書知識掃盲
