操作系统基础知识分享
1. 操作系統的四個特性
并發:同一段時間內多個程序執行(注意區別并行和并發,前者是同一時刻的多個事件,后者是同一時間段內的多個事件)
共享:系統中的資源可以被內存中多個并發執行的進線程共同使用
虛擬:通過時分復用(如分時系統)以及空分復用(如虛擬內存)技術實現把一個物理實體虛擬為多個
異步:系統中的進程是以走走停停的方式執行的,且以一種不可預知的速度推進
2,進程與線程
2.1 多進程的組織形式包括下面3個關鍵部分:
1)PCB(Process Control Block):用來記錄進程信息的數據結構(管理進程的核心,包含了PID等進程的所有關鍵信息)https://blog.csdn.net/rongwenbin/article/details/9860253
2)進程的狀態:1:就緒狀態,2:執行狀態,3:阻塞狀態(多線程時也是這些狀態)
3)隊列:就緒隊列、等待(阻塞)隊列。
處于就緒狀態的進程,在調度程序為之分配了處理機之后便開始執行, 就緒 -> 執行
正在執行的進程如果因為分配他的時間片已經用完,而被剝奪處理劑, 執行 -> 就緒
如果因為某種原因致使當前的進程執行受阻,使之不能執行。 執行 -> 阻塞
2.2 CPU調度算法 (在就緒序列中怎么挑選進程讓CPU執行)
先了解兩個概念:
周轉時間: 從開始申請執行任務,到執行任務完成
響應時間: 從開始申請執行任務到開始執行任務
先來先服務調度算法FCFS:按作業或者進程到達的先后順序依次調度;(平均周轉時間可能會很長 )
短作業優先調度算法SJF:算法從就緒隊列中選擇估計時間最短的作業進行處理,直到得出結果或者無法繼續執行(周轉時間短,但是響應時間長 )
高相應比算法HRN:響應比=(等待時間+要求服務時間)/要求服務時間;
時間片輪轉調度RR:按到達的先后對進程放入隊列中,然后給隊首進程分配CPU時間片,時間片用完之后計時器發出中斷,暫停當前進程并將其放到隊列尾部,循環 ;(響應時間可以得到保證)
多級反饋隊列調度算法:目前公認較好的調度算法;設置多個就緒隊列并為每個隊列設置不同的優先級,第一個隊列優先級最高,其余依次遞減。優先級越高的隊列分配的時間片越短,進程到達之后按FCFS放入第一個隊列,如果調度執行后沒有完成,那么放到第二個隊列尾部等待調度,如果第二次調度仍然沒有完成,放入第三隊列尾部…。只有當前一個隊列為空的時候才會去調度下一個隊列的進程。
2.3 進程的分類
https://www.cnblogs.com/xdyixia/p/9257160.html
2.4 線程
線程有自己的TCB(thread control block線程控制塊), 只負責這條流程的信息,包括PC程序計數器,SP棧,State狀態,和寄存器,線程id。
線程有內核級線程和用戶級線程,我們一般說的都是用戶級線程,內核級線程由內核管理。
補充小知識:
1)只有內核級線程才能發揮多核性能,因為內核級線程共用一套MMU(即內存映射表),統一分配核1核2(即有多個CPU,可以一個CPU執行一個內核級線程)。進程 無法發揮多核性能,因為進程切換都得切MMU
2)為什么需要內核級線程??如果只有用戶級線程,在內核中只能看到進程,所以當用戶級線程中一個線程進行IO讀寫阻塞時,內核會將該線程所在的進程直接切換。例如當用瀏覽器打開網頁,這個進程中有下載數據線程,有顯示數據線程,當數據下載讀寫阻塞時,內核直接切到qq(這些切換是指在CPU上運行的程序的切換)
2.5 進程和線程的對比
進程是系統進行資源調度和分配的基本單位;線程是CPU調度的基本單位。
進程 = 資源 (包括寄存器值,PCB,內存映射表)+ TCB(棧結構)
線程 = TCB(棧結構)
線程 的資源是共享的
進程 間的資源是分隔獨立的,內存映射表不同,占用物理內存地址是分隔的
線程 的切換只是切換PC,切換了TCB(棧結構)
進程 的切換不僅要切換PC,還包括切換資源,即切換內存映射表
2.6 進程間通信方式
https://www.cnblogs.com/xdyixia/p/9257668.html
2.7 進程間同步
經典的進程同步問題:生產者-消費者問題;哲學家進餐問題;讀者-寫者問題
同步的解決方案:管程,信號量。
死鎖定義:
在兩個或多個并發進程中,如果每個進程持有某種資源而又都等待別的進程釋放它或它們現在保持著的資源,在未改變這種狀態之前都不能向前推進,稱這一組進程產生了死鎖。通俗地講,就是兩個或多個進程被無限期地阻塞、相互等待的一種狀態。
產生條件:
1:互斥條件 – 一個資源一次只能被一個進程使用
2:請求保持條件 – 一個進程因請求資源而阻塞時,對已經獲得資源保持不放
3:不可搶占條件 – 進程已獲得的資源在未使用完之前不能強行剝奪
4:循環等待條件 – 若干進程之間形成一種頭尾相接的循環等待資源的關系
死鎖處理:
預防死鎖:破壞產生死鎖的4個必要條件中的一個或者多個;實現起來比較簡單,但是如果限制過于嚴格會降低系統資源利用率以及吞吐量
避免死鎖:在資源的動態分配中,防止系統進入不安全狀態(可能產生死鎖的狀態)-如銀行家算法
檢測死鎖:允許系統運行過程中產生死鎖,在死鎖發生之后,采用一定的算法進行檢測,并確定與死鎖相關的資源和進程,采取相關方法清除檢測到的死鎖。實現難度大
解除死鎖:與死鎖檢測配合,將系統從死鎖中解脫出來(撤銷進程或者剝奪資源)。對檢測到的和死鎖相關的進程以及資源,通過撤銷或者掛起的方式,釋放一些資源并將其分配給處于阻塞狀態的進程,使其轉變為就緒態。實現難度大
死鎖忽略: windows,Linux個人版都不做死鎖處理,直接忽略,大不了重啟就好了,小概率事件,代價可以接受
3,內存管理
要解決的兩個問題
1)每個進程代碼中使用的地址可能相同。解決思路:對代碼中的地址重定向(加個基地址)。
2)物理內存可能比較小,不能同時放很多進程進來。解決思路:把要運行的代碼移到內存,暫時不用的代碼移入磁盤,即交換(swap),內存置換
3.1 分段
一個程序分成多個段(每個段特性不同為了方便管理,例如代碼段只讀、數據段等等),當然這都是邏輯上的。
管理段的結構叫段表,段表保存中進程的PCB中。
3.2 頁表
把程序按段分對程序員是友好的,但是如果物理存儲也按段存,則會導致大塊的內存碎片,例如現在需要分個10M的段但是連續的存儲空間只有8M/9M/5M三個。解決辦法: (將段打散存到頁中)不要對內存進行連續的分配,將內存劃分成1頁1頁,按頁分配,1頁4kb大小,最多浪費的也就4KB。這樣不會有內存碎片,也不會出現沒有符合要求大小的內存可以申請的情況,因為可以打散了分散到一頁一頁中。
整個系統的頁表就是https://www.cnblogs.com/xdyixia/p/9253138.html中說的多級頁表(這個整個系統的多級頁表簡單來說就是把物理地址都進行了按頁劃分,保存了每頁的基地址(對應下圖中的頁框號))。程序向系統申請時內存時,系統就會把哪幾個頁框號分給程序的某個段,程序再把它段0中的第3頁數據放到頁框6中。
說明:進程需要有自己的“頁表”,里面映射雙方是程序的邏輯地址中的頁號和系統分給這給程序的頁框號。
3.3 段頁結合的內存管理
實際在內存管理中的段頁結合如下圖,頁號加偏移稱為虛擬地址,MMU負載從虛擬地址到物理地址的轉換,同時也負責權限檢查。
上面解決了每個進程代碼中使用的地址可能相同,系統給每個進程分配基地址,進程保存在PCB中。
但是進程可操作的虛擬地址為4G(32位系統),可物理地址為1G怎么辦。
3.4 請求調頁內存換入
CPU對數據進行請求時,才會進行映射(虛擬內存到物理內存)。
例如進程1正在運行,進行映射拿數據,查頁表發現頁框號中沒有數據或有進程2的數據,則需要頁表調入內存。
3.5 內存換出
有頁表需要調入,那么誰調出。
頁面置換算法
1:最佳置換算法(Optimal):一種理論的算法,選著淘汰的頁面是以后一定不再使用的頁面(理想化的),該算法無法實現,只能作為其他算法好壞的一個評價對比。
2:先進先出(FIFO)算法:總是最先淘汰最先進去的頁面,該算法容易實現。缺點:通常程序調入內存的先后順序和程序執行的先后順序不一致,導致缺頁率高。
3:最近最久未使用算法LRU:算法賦予每個頁面一個訪問字段,用來記錄上次頁面被訪問到現在所經歷的時間t,每次置換的時候把t值最大的頁面置換出去(實現方面可以采用寄存器或者棧的方式實現)。
4:時鐘算法clock(也被稱為是最近未使用算法NRU):頁面設置一個訪問位R,并將頁面鏈接為一個環形隊列,頁面被訪問的時候訪問位設置R為1。頁面置換的時候,如果當前指針所指頁面訪問R為0,那么置換,否則將其置為0,循環直到遇到一個訪問為位0的頁面。
但是這個方法有缺點:缺頁比較少的時候(最近沒有使用淘汰中的“最近”太長了),所有的R都為1(很少變成0),每次都要轉一圈才能找到換出去的頁,退化成FIFO,效率不高。
改進: 雙指針,一個快,一個慢,像時鐘一樣 (定時清除R位)(更像clock)
快時鐘做R的清0定時清0,等到慢指針轉到這里的時候R=0,說明在定時時間片內沒有備訪問,該頁可以被替換了。
————————————————
版權聲明:本文為CSDN博主「于云秀」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yyx3214/article/details/89075540
總結
以上是生活随笔為你收集整理的操作系统基础知识分享的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL Server(MSSQLSERV
- 下一篇: Windows2008中IIS7如何关闭