1. 程式人生 > 其它 >計算機作業系統總結

計算機作業系統總結

轉載:計算機作業系統知識點總結(有這一篇就夠了!!!)_原來如此呀的部落格-CSDN部落格_作業系統知識點總結

一、作業系統概述

1.1 作業系統的定義與目標

定義:作業系統是控制管理計算機系統的硬軟體,分配排程資源的系統軟體

目標:方便性,有效性(提高系統資源的利用率、提高系統的吞吐量),可擴充性,開放性。

1.2 作業系統的基本功能

  1. 統一管理計算機資源:處理器資源,IO裝置資源,儲存器資源,檔案資源;
  2. 實現了對計算機資源的抽象:IO裝置管理軟體提供讀寫介面,檔案管理軟體提供操作檔案接;
  3. 提供了使用者與計算機之間的介面:GUI(圖形使用者介面),命令形式,系統呼叫形式。

1.3 作業系統的特徵

最基本的特徵,互為存在條件:併發,共享;

(1)並行:指兩個或多個事件可以在同一個時刻發生,多核CPU可以實現並行,一個cpu同一時刻只有一個程式在執行;

(2)併發:指兩個或多個事件可以在同一個時間間隔發生,使用者看起來是每個程式都在執行,實際上是每個程式都交替執行

(3)共享性:作業系統的中資源可供多個併發的程式共同使用,這種形式稱之為資源共享

  • 互斥共享:當資源被程式佔用時,其它想使用的程式只能等待。
  • 同時訪問:某種資源併發的被多個程式訪問。

虛擬和非同步特性前提是具有併發性

(4)虛擬性:表現為把一個物理實體轉變為若干個邏輯實體。

  • 時分複用技術
    :資源在時間上進行復用,不同程式併發使用,多道程式分時使用計算機的硬體資源,提高資源的利用率。
  • 空分複用技術:用來實現虛擬磁碟(物理磁碟虛擬為邏輯磁碟,電腦上的C盤、D盤等)、虛擬記憶體(在邏輯上擴大程式的儲存容量)等,提高資源的利用率,提高程式設計效率。

(5)非同步性:在多道程式環境下,允許多個程序併發執行,但由於資源等因素的限制,使程序的執行以“停停走走”的方式執行,而且每個程序執行的情況(執行、暫停、速度、完成)也是未知的

1.4 作業系統的中斷處理

中斷機制的作用:為了在多道批處理系統中讓使用者進行互動;

中斷產生

  • 發生中斷時,CPU立馬切換到管態,開展管理工作;(管態又叫特權態,系統態或核心態,是作業系統管理的程式執行時,機器所處的狀態。)
  • 發生中斷後,當前執行的程序回暫停執行,由作業系統核心對中斷進行處理;
  • 對於不同的中斷訊號,會進行不同的處理。

中斷的分類

  1. 內中斷(也叫“異常”、“例外”、“陷入”)------- 訊號來源:CPU內部,與當前執行指令有關;
  2. 外中斷(中斷)----------訊號來源:CPU外部,與當前執行指令無關。

外中斷的處理過程

  1. 每執行完一個指令後,CPU都需要檢查當前是否有外部中斷 訊號;
  2. 如果檢查到外部中斷訊號,則需要保護被中斷程序的CPU環境(如程式狀態字PSW,程式計數器PC、各種通用暫存器)把他們儲存在PCB(程序控制塊中);
  3. 根據中斷訊號型別轉入相應的中斷處理程式;
  4. 恢復原程序的CPU環境並退出中斷,返回原程序繼續執行。

二、程序管理

2.1 程序管理之程序實體

為什麼需要程序

  1. 程序是系統進行資源分配和排程的基本單位
  2. 程序作為程式獨立執行的載體保障程式正常執行;
  3. 程序的存在使得作業系統資源的利用率大幅提升。+

程序控制塊(PCB):用於描述和控制程序執行的通用資料結構,記錄程序當前狀態和控制程序執行的全部資訊,是程序存在的唯一標識

程序(Process)與執行緒(Thread)

  • 執行緒:作業系統進行**執行排程的最小單位**。
  • 程序:系統進行**資源分配和排程的基本單位**。

區別與聯絡

  1. 一個程序可以有一個或多個執行緒
  2. 執行緒包含在程序之中,是程序中實際執行工作的單位
  3. 程序的執行緒共享程序資源
  4. 一個程序可以併發多個執行緒,每個執行緒執行不同的任務

2.2 程序管理之五狀態模型

就緒狀態:其它資源(程序控制塊、記憶體、棧空間、堆空間等)都準備好、只差CPU的狀態。
  執行狀態:程序獲得CPU,其程式正在執行。
  阻塞狀態:程序因某種原因放棄CPU的狀態,阻塞程序以佇列的形式放置。
  建立狀態:建立程序時擁有PCB但其它資源尚未就緒。
  終止狀態:程序結束由系統清理或者歸還PCB的狀態。

2.3 程序管理之程序同步

生產者-消費者問題:有一群生產者程序在生產產品,並將這些產品提供給消費者程序進行消費,生產者程序和消費者程序可以併發執行,在兩者之間設定了一個具有n個緩衝區的緩衝池,生產者程序需要將所生產的產品放到緩衝區中(+1操作),消費者程序可以從緩衝區取走產品消費(-1操作)。

產生問題:當兩者併發執行時可能出差錯,導致預期的結果與真實的結果不相符:當執行生產者+1和消費者-1操作之後,緩衝區的值從10變為了11

哲學家進餐問題:有5個哲學家,他們的生活方式是交替的思考和進餐,哲學家們共同使用一張圓桌,分別坐在5張椅子上,圓桌上有5只碗和5只筷子。平時哲學家們只進行思考,飢餓時則試圖取靠近他們的左右兩隻筷子,只有兩隻筷子都被拿到的時候才能進餐,否則等待,進餐完畢後,放下左右筷子進行思考。

這會導致以下的問題,筷子就相當於臨界資源:

臨界資源指的是一些雖作為共享資源卻又無法同時被多個執行緒共同訪問的共享資源。當有程序在使用臨界資源時,其他程序必須依據作業系統的同步機制等待佔用程序釋放該共享資源才可重新競爭使用共享資源。

程序同步的作用:對競爭資源在多程序間進行使用次序的協調,使得併發執行的多個程序之間可以有效使用資源和相互合作

程序間同步的四原則

  1. 空閒讓進:資源無佔用,允許使用;
  2. 忙則等待:資源被佔用,請求程序等待;
  3. 有限等待:保證有限等待時間能夠使用資源;
  4. 讓權等待:等待時,程序需要讓出CPU。

2.3.1程序同步的方法(重要)

1.使用fork系統呼叫建立程序:使用fork系統呼叫無引數,fork會返回兩次,分別返回子程序id和0,返回子程序id的是父程序,返回0的是子程序。

  • fork系統呼叫是用於建立程序的;
  • fork建立的程序初始化狀態與父程序一樣;
  • 系統會為fork的程序分配新的資源

2.共享記憶體:在某種程度上,多程序是共同使用實體記憶體的,但是由於作業系統的程序管理,程序間的記憶體空間是獨立的,因此程序預設是不能訪問程序空間之外的記憶體空間的。

  • 共享儲存允許不相關的程序訪問同一片實體記憶體;
  • 共享記憶體是兩個程序之間共享和傳遞資料最快的方式
  • 共享記憶體未提供同步機制,需要藉助其他機制管理訪問;

3.Unix域套接字

域套接字是一種高階的程序間通訊的方法,可以用於同一機器程序間通訊。

套接字(socket):為網路通訊中使用的術語。

Unix系統提供的域套接字提供了網路套接字類似的功能,如Nfinx、uWSGI等。

服務端和客戶端分別使用Unix域套接字的過程:

2.3.2 執行緒同步的方法(重要)

執行緒同步的方法

  1. 互斥鎖:互斥鎖是最簡單的執行緒同步的方法,也稱為互斥量,處於兩態之一的變數:解鎖和加鎖,兩個狀態可以保證資源訪問的序列。 原子性:指一系列操作不可被中斷的特性,要麼全部執行完成,要麼全部沒有執行。

  2. 自旋鎖:自旋鎖是一種多執行緒同步的變數,使用自旋鎖的執行緒會反覆檢查鎖變數是否可用,自旋鎖不會讓出CPU,是一種忙等待狀態,即死迴圈等待鎖被釋放自旋鎖的效率遠高於互斥鎖。特點:避免了程序或者執行緒上下文切換的開銷,但是不適合在單核CPU使用

  3. 讀寫鎖:是一種特殊的自旋鎖,允許多個讀操作同時訪問資源以提高讀效能,但是對寫操作是互斥的,即**對多讀少寫的操作效率提升**很顯著。

  4. 條件變數:是一種相對比較複雜的執行緒同步方法,條件變數允許執行緒睡眠,直到滿足某種條件,當**滿足條件時,可以給該執行緒訊號通知喚醒**。

2.3.3 執行緒同步方法對比(重要)

2.4 Linux的程序管理

程序的型別

  1. 前臺程序:具有終端,可以和使用者互動;
  2. 後臺程序:沒有佔用終端,基本不和使用者互動,優先順序比前臺程序低(將需要執行的命令以“&”符號結束);
  3. 守護程序:特殊的後臺程序,在系統引導時啟動,一直執行直到系統關閉(程序名字以“d”結尾的一般都是守護程序),如crond、sshd、httpd、mysqld…

程序的標記

  1. 程序ID:非負整數,程序的唯一標記,每個程序擁有不同的ID;
  2. 程序的狀態標記:R表示程序處於執行狀態,S表示程序處於睡眠狀態…

操作Linux程序的相關命令

  1. ps命令:列出當前的程序,結合-aux可以列印程序的詳細資訊(ps -aux);
  2. top命令:檢視所有程序的狀態;
  3. kill命令:給程序傳送訊號。

三、作業管理

3.1 作業管理之程序排程

定義:指計算機通過決策決定哪個就緒程序可以獲得CPU使用權

什麼時候需要程序排程

  1. 主動放棄:程序正常終止;執行過程中發生異常而終止;主動阻塞(如等待I/O);
  2. 被動放棄:分給程序的時間片用完;有更高優先順序的程序進入就緒佇列;有更緊急的事情需要處理(如I/O中斷);

程序排程方式

非搶佔式排程:只能由當前執行的程序主動放棄CPU

  • 處理器一旦分配給某個程序,就讓該程序一直使用下去;
  • 排程程式不以任何原因搶佔正在被使用的處理器;
  • 排程程式不以任何原因搶佔正在被使用的處理器;

搶佔式排程:可由作業系統剝奪當前程序的CPU使用權

  • 允許排程程式以一定的策略暫停當前執行的程序;
  • 儲存好舊程序的上下文資訊,分配處理器給新程序;

程序排程的三大機制

就緒佇列的排隊機制:為了提高程序排程的效率,將就緒程序按照一定的方式排成佇列,以便排程程式可以最快找到就緒程序。

選擇執行程序的委派機制:排程程式以一定的策略,選擇就緒程序,將CPU資源分配給它。

新老程序的上下文切換機制:儲存當前程序的上下文資訊,裝入被委派執行程序的執行上下文。

程序排程演算法

  1. 先來先服務演算法:按照在就緒佇列中的先後順序執行。
  2. 短程序優先排程演算法:優先選擇就緒佇列中估計執行時間最短的程序,不利於長作業程序的執行。
  3. 高優先權優先排程演算法:程序附帶優先權,優先選擇權重高的程序,可以使得緊迫的任務優先處理。
  4. 時間片輪轉排程演算法:按照FIFO的原則排列就緒程序,每次從佇列頭部取出待執行程序,分配一個時間片執行,是相對公平的排程演算法,但是不能保證就是響應使用者。

3.2 作業管理之死鎖

3.2.1 程序死鎖、飢餓、死迴圈的區別:

死鎖兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。永遠在互相等待的程序稱為死鎖程序。

飢餓:由於長期得不到資源導致程序無法推進;

死迴圈:程式碼邏輯BUG。

死鎖的產生:競爭資源(共享資源數量不滿足各程序需求)、程序排程順序不當,當排程順序為A->B->C->D時會產生死鎖,但改為A->D->B->C則不會產生。

死鎖的四個必要條件

  1. 互斥條件必須互斥使用資源才會產生死鎖
  2. 請求保持條件程序至少保持一個資源,又提出新的資源請求,新資源被佔用,請求被阻塞,被阻塞的程序不釋放自己保持的資源;
  3. 不可剝奪條件:程序獲得的資源在未完成使用前不能被剝奪(包括OS),只能由程序自身釋放
  4. 環路等待條件:發生死鎖時,必然存在程序-資源環形鏈,環路等待不一定造成死鎖,但是死鎖一定有迴圈等待。

死鎖的處理策略

一.預防死鎖的方法:破壞四個必要條件的中一個或多個。

  1. 破壞互斥條件:將臨界資源改造成共享資源(Spooling池化技術);(可行性不高,很多時候無法破壞互斥條件)
  2. 破壞請求保持條件:系統規定程序執行之前,一次性申請所有需要的資源;(資源利用率低,可能導致別的執行緒飢餓)
  3. 破壞不可剝奪條件:當一個程序請求新的資源得不到滿足時,必須釋放佔有的資源;(實現複雜,剝奪資源可能導致部分工作失效,反覆申請和釋放造成額外的系統開銷)
  4. 破壞環路等待條件:可用資源線性排序,申請必須按照需要遞增申請;(程序實際使用資源順序和編號順序不同,會導致資源浪費)

二.銀行家演算法:檢查當前資源剩餘是否可以滿足某個程序的最大需求;如果可以,就把該程序加入安全序列,等待程序允許完成,回收所有資源;重複1,2,直到當前沒有執行緒等待資源;

三.死鎖的檢測和解除:死鎖檢測演算法,資源剝奪法,撤銷程序法(終止程序法),程序回退法;

四、儲存管理

儲存管理為了確保計算機有足夠的記憶體處理資料;確保程式可以從可用記憶體中獲取一部分記憶體使用;確保程式可以歸還使用後的記憶體以供其他程式使用。

4.1 儲存管理之記憶體分配與回收

記憶體分配的過程:單一連續分配(已經過時)、固定分割槽分配、動態分割槽分配(根據實際需要,動態的分配記憶體)。
  動態分割槽分配演算法

  1. 首次適應演算法:分配記憶體時,從開始順序查詢適合記憶體區,若無合適記憶體區,則分配失敗,每次從頭部開始,使得頭部地址空間不斷被劃分;
  2. 最佳適應演算法:要求空閒區連結串列按照容量大小排序,遍歷以找到最佳適合的空閒區(會留下越來越多的內部碎片)。
  3. 快速適應演算法:要求有多個空閒區連結串列,每個空閒區連結串列儲存一種容量的空閒區。

記憶體回收的過程

  • 回收區在空閒區下方:不需要新建空閒連結串列節點;只需要把空閒區1的容量增大即可;
  • 回收區在空閒區上方:將回收區與空閒區合併;新的空閒區使用回收區的地址;
  • 回收區在空閒區中間方:將空閒區1、空閒區2和回收區合併;新的空閒區使用空閒區1的地址;
  • 僅僅剩餘回收區:為回收區建立新的空閒節點;插入到相應的空閒區連結串列中去;

4.2 儲存管理之段頁式儲存管理

頁式儲存管理:將程序邏輯空間等分成若干大小的頁面,相應的把實體記憶體空間分成與頁面大小的物理塊,以頁面為單位把程序空間裝進實體記憶體中分散的物理塊。

頁面大小應該適中,過大難以分配,過小記憶體碎片過多;頁面大小通常是512B~8K

現代計算機系統中,可以支援非常大的邏輯地址空間(232~264),具有32位邏輯地址空間的分頁系統,規定頁面大小為4KB,則在每個程序頁表中的頁表項可達1M(2個20)個,如果每個頁表項佔用1Byte,故每個程序僅僅頁表就要佔用1MB的記憶體空間。

段式儲存管理:將程序邏輯空間分成若干段(不等分),段的長度由連續邏輯的長度決定。

頁式和者段式儲存管理相比

  1. 段式儲存和頁式儲存都離散地管理了程序的邏輯空間
  2. 頁是物理單位,段是邏輯單位
  3. 分頁是為了合理利用空間,分段是滿足使用者要求頁大小由硬體固定段長度可動態變化
  4. 頁表資訊是一維的,段表資訊是二維的

段頁式儲存管理:現將邏輯空間按照段式管理分成若干段,再將記憶體空間按照頁式管理分成若干頁,分頁可以有效提高記憶體利用率分段可以更好的滿足使用者需求

4.3 儲存管理之虛擬記憶體

虛擬記憶體概述:是作業系統記憶體管理的關鍵技術,使得多道程式執行和大程式執行成為現實,把程式使用記憶體劃分,將部分暫時不使用的記憶體放置在輔存,實際是對實體記憶體的擴充
  區域性性原理:指CPU訪問儲存器時,無論是存取指令還是存取資料,所訪問的儲存單元都趨於聚集在一個較小的連續區域中
  虛擬記憶體的置換演算法:先進先出(FIFO)、最不經常使用(LFU)、最近最少使用(LRU)

虛擬記憶體的特徵

  • 多次性:無需再作業執行時一次性全部裝入記憶體,而是允許被分成多次調入記憶體;
  • 對換性:無需在作業執行時一直常駐記憶體,而是允許在作業執行過程中,將作業換入、換出;
  • 虛擬性:從邏輯上擴充了記憶體的容量,使使用者看到的記憶體用來,遠大於實際的容量;

4.4 Linux的儲存管理

Buddy記憶體管理演算法:經典的記憶體管理演算法,為解決記憶體外碎片的問題,演算法基於計算機處理二進位制的優勢具有極高的效率。
  Linux交換空間:交換空間(Swap)是磁碟的一個分割槽,Linux記憶體滿時,會把一些記憶體交換至Swap空間,Swap空間是初始化系統時配置的。
  Swap空間與虛擬記憶體的對比

五、檔案管理

5.1 作業系統的檔案管理

檔案的邏輯結構

  • 邏輯結構的檔案型別:有結構檔案(文字檔案,文件,媒體檔案)、無結構檔案(二進位制檔案、連結庫)。
  • 順序檔案:按順序放在儲存介質中的檔案,在邏輯檔案當中儲存效率最高,但不適合儲存可變長檔案。
  • 索引檔案:為解決可變長檔案儲存而發明,需要配合索引表儲存。

輔存的儲存空間分配

  • 輔存的分配方式:連續分配(讀取檔案容易,速度快)、連結分配(隱式連結和顯式連結)、索引分配
  • 輔存的儲存空間管理:空閒表、空閒連結串列、位示圖。

目錄樹:使得任何檔案或目錄都有唯一的路徑。

Linux檔案的基本操作參考連結

Linux的檔案系統:FAT、NTFS(對FAT進行改進)、EXT2/3/4(擴充套件檔案系統,Linux的檔案系統)

六、裝置管理

I/O裝置的基本概念:將資料輸入輸出計算機的外部裝置;

廣義的IO裝置

  • 按照使用特性分類:儲存裝置(記憶體、磁碟、U盤)和互動IO裝置(鍵盤、顯示器、滑鼠);
  • 按照資訊交換分類:塊裝置(磁碟、SD卡)和字元裝置(印表機、shell終端);
  • 按照裝置共享屬性分類:獨佔裝置,共享裝置,虛擬裝置;
  • 按照傳輸速率分類:低速裝置,高速裝置;

IO裝置的緩衝區:減少CPU處理IO請求的頻率,提高CPU與IO裝置之間的並行性

SPOOLing技術:虛擬裝置技術,把同步呼叫低速裝置改為非同步呼叫,在輸入、輸出之間增加了排隊轉儲環節(輸入井、輸出井),SPoOLing負責輸入(出)井與低速裝置之間的排程,邏輯上,程序直接與高速裝置互動,減少了程序的等待時間。

七、實現支援非同步任務的執行緒池

執行緒池:執行緒池是存放多個執行緒的容器,CPU排程執行緒執行後不會銷燬執行緒,將執行緒放回執行緒池重新利用。

使用執行緒池的原因

  1. 執行緒是稀缺資源 ,不應該頻繁建立和銷燬;
  2. 架構解耦,業務建立和業務處理解耦,更加優雅;
  3. 執行緒池是使用執行緒的最佳實踐。

實現執行緒安全的佇列Queue

  • 佇列:用於存放多個元素,是存放各種元素的“池”。
  • 實現的基本功能:獲取當前佇列元素數量,往佇列放入元素,往佇列取出元素。
  • 注意:佇列可能有多個執行緒同時操作,因此需要保證執行緒安全,如下兩種情況:

實現基本任務物件Task
實現的基本功能:任務引數,任務唯一標記(UUID),任務具體的執行邏輯

實現任務處理執行緒ProcessThread:任務處理執行緒需要不斷地從任務佇列裡取任務執行,任務處理執行緒需要有一個標記,標記執行緒什麼時候應該停止。
實現的基本功能:基本屬性(任務佇列、標記),執行緒執行的邏輯(run),執行緒停止(stop)。

實現任務處理執行緒池Pool:存放多個任務處理執行緒,負責多個執行緒的啟停,管理向執行緒池的提交任務,下發給執行緒去執行。
實現的基本過程:基本屬性,提交任務(put,batch_put),執行緒啟停(start,join),執行緒池大小(size)。

實現非同步任務處理AsyncTask:給任務新增一個標記,任務完成後,則標記為完成;任務完成時可直接獲取任務執行結果;任務未完成時,獲取任務結果,會阻塞獲取執行緒。
主要實現的兩個函式:設定執行結果(set_result),獲取執行結果(get_result)