操做系統

概述

基本特徵

  1. 併發:在一段時間內能同時運行多個程序。並行指同一時刻能運行多個指令。並行須要硬件支持。
  2. 共享:系統中的資源能夠被多個併發進程共同使用。分爲互斥共享和同時共享。互斥共享的資源成爲臨界資源。須要使用同步機制實現對臨界資源的訪問。
  3. 虛擬:把一個屋裏實體轉換爲多個邏輯實體。多進程併發使用時分複用技術,虛擬內存使用空分複用技術。
  4. 異步:進程不是一次性執行完畢,而是走走停停,以不可知的速度向前推動

基本功能

  1. 進程管理:進程控制、進程同步、進程通訊、死鎖處理、處理機調度
  2. 內存管理:內存分配、地址映射、內存保護與共享、虛擬內存
  3. 文件管理:文件存儲空間的管理、目錄管理、文件讀寫管理和保護
  4. 設備管理:緩衝管理、設備分配、設備處理、虛擬設備

系統調用 若是一個進程在用戶態須要使用內核態的功能,就進行系統調用從而陷入內核,由操做系統代爲完成。程序員

中斷分類算法

  1. 外中斷:由CPU執行指令之外的事件殷勤,如I/O完成中斷
  2. 異常:由CPU執行指令的內部事件引發,如越界
  3. 陷入:在用戶程序中使用系統調用

進程管理

進程與線程

進程是資源分配的基本單位。進程控制塊PCB描述進程的基本信息和運行狀態。安全

線程是獨立調度的基本單位。一個進程中能夠有多個線程,它們共享進程資源。服務器

比較:併發

  1. 擁有資源:進程是資源分配的基本單位,線程不擁有資源,線程能夠訪問隸屬進程的資源。
  2. 調度:線程是獨立調度的基本單位。同一進程中,線程的切換不會引發進程切換。
  3. 系統開銷:建立或撤銷進程,系統要爲之分配或回收資源,開銷大。進程切換時,設計當前線程CPU環境的保存以及新調度進程CPU環境的設置。線程切換時只須要保存和設置少許寄存器內容,開銷小。
  4. 線程能夠直接讀寫同一進程數據進行通訊,進程通訊須要藉助IPC。

進程狀態圖

  • 運行態:進程在CPU上運行
  • 就緒態:等待被調度,葉集進程得到了除CPU以外的一切所需資源。
  • 阻塞態:進程等待除CPU以外的資源或等待某一事件而暫停進行,即便CPU空閒也不能運行。

進程調度算法

  1. 批處理系統:目標是保證吞吐量和週轉時間
  • 先來先服務:按照請求的順序進行調度,利於長做業不利於短做業
  • 最短做業優先:按估計運行時間最短的順序調度,長做業可能會餓死
  • 最短剩餘時間有限:按估計生於時間最短的順序調度
  1. 交互式系統:有大量的用戶交互操做,目標是快速進行響應
  • 時間片輪轉:就緒進程按 FCFS 原則排成一個隊列,每次調度時,把CPU時間分配給隊列首進程,時間片用完,中斷並將該進程送往就緒隊列末尾。
  • 優先級調度:爲每一個進程分配一個優先級,按照優先級進行調度。防止低優先級的進程得不到調度,隨着時間推移增長等待進程優先級。
  • 多級反饋隊列:時間片輪轉和優先級調度的結合。

進程同步

進程同步是用於控制多個進程按照必定順序執行異步

臨界區:對臨界資源進行訪問的代碼稱爲臨界區。爲了互斥訪問臨界資源,在進入臨界區以前,須要先進行檢查。操作系統

同步:多個進程按照必定順序執行線程

互斥:多個進程同一時刻只有一個進程能進入臨界區。設計

信號量:整形變量,也就是PV操做。若是信號量只能取0或者1,就成爲互斥量,0表示臨界區加鎖,1表示臨界區解鎖。指針

進程同步的幾種機制

信號量

PV 操做由P原語和V原語組成。 P(S):將信號量S的值減去1;若是S > 0,則進程繼續執行;不然該進程置爲等待狀態,排入等待隊列。 V(S):將信號量S的值加1;若是S > 0,繼續執行,不然釋放隊列中第一個等待信號量的進程。

管程

將共享變量和對它們的操做幾種在一個模塊中,併發程序就由這樣的模塊構成。

生產者消費者問題

使用信號量:使用 empty 和 full 分別記錄緩衝區爲空或者滿的數量,使用 mutex 控制對緩衝區的互斥訪問。在生產或消費以前,先判斷是否爲滿或空,若是滿或空,則進入睡眠等待;不然加鎖進行生產或者消費。

讀寫者問題

容許多個進程同時讀,可是不容許讀寫或寫寫同時發生。使用 count 記錄讀操做的進程數量,一個互斥量 countMutex 對 count 加鎖,一個互斥量 data_mutex 對讀寫的數據加鎖。

哲學家進餐問題

爲了防止死鎖:能夠設置條件:

  • 必須同時拿起左右兩根筷子
  • 只有兩個鄰居都不進餐的狀況下容許進餐。

進程通訊

  1. 管道:
  • 普通管道:只支持半雙工通訊,只能在父子進程中使用
  • 命名管道:一般用於客戶端進程和服務器進程之間傳遞數據,去除了只能在父子進程使用的限制
  1. 系統IPC
  • 消息隊列:獨立於讀寫進程;避免了FIFO的同步阻塞問題,不須要進程本身提供同步;讀進程能夠有選擇的接收
  • 信號量:用於爲多個進程提供對共享數據對象的訪問
  • 共享存儲:容許多個進程共享一個給定的存儲區,不須要數據複製,須要使用信號量進行同步
  1. SOCKET(套接字):能夠用於不一樣機器間的進程通訊。

死鎖

在兩個或者多個併發進程中,若是每一個進程持有某種資源而又等待其它進程釋放它或它們如今保持着的資源,在未改變這種狀態以前都不能向前推動,稱這一組進程產生了死鎖。通俗的講就是兩個或多個進程無限期的阻塞、相互等待的一種狀態。

必要條件

  • 互斥:每一個資源要麼已經分配給了一個進程,要麼就是可用的
  • 佔有和等待:已經獲得了某個資源的進程能夠再請求新的資源
  • 不可搶佔:已經分配給一個進程的資源不能強制性的被搶佔,它只能被佔有它的進程顯式地釋放
  • 循環等待:有兩個或者兩個以上的進程組成一條環路,每個進程都在等待下一個進程所佔有的資源

處理方法

鴕鳥策略

解決死鎖問題的代價很高,若是發生死鎖不會對用戶形成多大影響,或者發生死鎖機率很低,能夠採用鴕鳥策略。

死鎖檢測與死鎖恢復

不試圖阻止死鎖,當檢測到死鎖發生時,採起措施進行恢復。

死鎖恢復:利用搶佔恢復;利用回滾恢復;經過殺死進程恢復

死鎖預防

在程序運行以前預防發生死鎖,破壞四個必要條件任意一個便可。

死鎖避免

程序運行時避免發生死鎖。若是沒有死鎖發生,而且即便全部進程忽然請求對資源的最大需求,也仍然存在某種調度次序可以使得每個進程運行完畢,則稱該狀態是安全的。

銀行家算法:

  • 查找右邊的矩陣是否存在一行小於等於A,若是不存在則會發生死鎖,狀態不安全
  • 若是存在,則將該進程終止,將其資源加到A中
  • 重複直到全部進程都終止,確認安全

內存管理

虛擬內存

虛擬內存的目的是爲了讓物理內存擴充成更大的邏輯內存,從而讓程序得到更多的可用內存。

爲了更好的管理內存,操做系統將內存抽象成地址空間。每一個程序擁有本身的地址空間,這個地址空間被分割成多個塊,每一塊稱爲一頁。這些頁被映射到物理內存,但不須要映射到連續的物理內存,也不須要全部頁都必須在物理內存中。當程序引用到不在物理內存中的頁時,由硬件執行必要的映射,將缺失的部分裝入物理內存並從新執行失敗的指令。

內存連續分配

在程序裝入內存時,根據進程的大小動態創建分區,並使得分區的大小正好適合進程的須要,所以系統中分區的大小和數據是可變的。

  • 首次適應算法:空閒分析以地址遞增次序鏈接,分配時順序查找,找到大小能知足要求的第一個分區。
  • 最佳適應算法:空閒分區以容量遞增造成分區鏈,找到第一個能知足要求的空閒分區。
  • 最壞適應算法:空閒分區以容量遞減次序連接,找到第一個也即最大的空閒分區。

分頁存儲管理方式

把主存空間劃分紅大小相等且固定的塊,做爲主存的基本單位。每一個進程也以塊爲單位進行劃分,進程在執行時,以塊爲單位逐個申請主存中的塊空間。

頁表存儲在內存中,用來記錄邏輯地址和實際存儲地址之間的映射關係,以實現從頁號到物理塊號的映射。訪問分頁系統中內存數據須要兩次內存訪問。首先從內存中訪問頁表,從中找到指定的物理塊號,加上頁內偏移獲得實際物理地址;而後根據第一次獲得的物理地址訪問內存取出數據。

若是內存的邏輯地址很大,頁表項不少,須要較大的連續內存空間。能夠採用多級頁表的方法,外層頁表一次性調入內存連續存放,內存頁表離散存放。

分段存儲管理方式

分頁是爲了提升內存利用率,分段是爲了知足程序員編寫代碼的邏輯需求。分段內存管理中,地址是二維的,一維是段號,一維是段內地址;其中每一個段的長度不同,並且每一個段內部都是從0開始編址。

分段管理中,每一個段內部是來喜怒內存分配,段和段之間是離散分配的,段表用來保存邏輯地址到物理地址的映射關係。

訪問內存時首先根據段號和段表項的長度計算當前訪問段在段表中的位置,而後訪問段表,獲得該段的物理地址,根據該物理地址以及段內偏移量就能夠獲得須要訪問的內存。

段頁式

程序的地址空間劃分紅多個擁有獨立地址空間的段,每一個段上的地址空間劃分紅大小相同的頁。這樣既擁有分段系統的共享和保護,又擁有分頁系統的虛擬內存功能。

分頁和分段比較

  • 段是信息的邏輯單位,它是根據用戶的須要劃分的,所以段對用戶是可見的;頁是信息的物理單位,是爲了管理主存的方便而劃分的,對用戶是透明的。
  • 分頁是一維地址空間,分段是二維
  • 段的大小不固定,由它所完成的功能決定;頁大大小固定,由系統決定
  • 分頁用於實現虛擬內存,得到更大地址空間;分段是爲了使程序和數據能夠被劃分爲邏輯上獨立的地址空間而且有助於共享和保護。

頁面置換算法

程序運行過程當中,若是要訪問的頁面不在內存中,發生缺頁中斷從而將該頁調入內存中。此時若是內存已經沒有空閒空間,系統必須從內存調出一個頁面到磁盤中來騰出空間。

頁面置換算法的主要目標是使頁面置換頻率最低。

OPT

所選擇的被換出的頁面將是最長時間內不被訪問的頁面。這是一種理論上的算法,由於沒法得知一個頁面多長時間不被訪問。

LRU 最近最久未使用

LRU將最近最久未使用的頁面換出。須要在內存中維護一個全部頁面的鏈表,當頁面被訪問時,將其移動到鏈表表頭。由於每次訪問都須要更新鏈表,代價高。

FIFO 先進先出

選擇換出的頁面是最早進入的頁面,該算法將那些常常被訪問的頁面也被換出,缺頁率升高。

NRU 最近未使用,時鐘算法

頁面設置一個訪問位,並將頁面連接爲一個環形隊列,頁面被訪問的時候訪問位設置爲1。頁面置換的時候,若是當前指針所指頁面訪問爲爲0,那麼置換,不然將其置爲0,循環直到遇到一個訪問爲位0的頁面。

磁盤調度算法

讀寫磁盤塊的時間的影響因素主要有旋轉時間、尋道時間、數據傳輸時間。其中尋道時間最長。

  1. FCFS 先來先服務
  2. SSTF 最短尋到時間優先。優先調度與當前磁頭所在磁道最近的磁道。可能存在飢餓
  3. SCAN 電梯算法。保持一個方向運行直到沒有請求,而後掉頭。

Linux 相關

文件類型

  1. 普通文件
  2. 目錄文件(/root)
  3. 連接文件:用於不一樣目錄下的文件的共享(快捷方式)
  4. 設備文件:用來訪問硬件設備
  5. 命名管道(FIFO):特殊類型的文件,用於進程通訊

常見目錄

  • /bin: 二進制可執行文件
  • /etc: 系統管理和配置文件
  • /home: 用戶文件
  • /usr: 系統應用程序
  • /proc: 系統內存映射,虛擬文件系統目錄
  • /root: 超級用戶的主目錄
  • /dev: 設備文件
  • /var: 運行時須要改變數據的文件(如日誌)

常見命令

目錄切換

  • cd /home 切換到對應目錄
  • cd .. 切換到上級目錄
  • cd / 切換到根目錄
  • cd ~ 切換到用戶主目錄
  • cd - 切換到上一個操做所在目錄

目錄操做

  • mkdir dirname 建立目錄
  • ls , ll 查看目錄信息
  • find 目錄 參數 在目錄下查找知足的文件
  • mv 目錄名 新目錄名 修改目錄名
  • mv 目錄名 新位置 移動
  • cp -r 目錄名 目標位置 拷貝目錄(-r 遞歸拷貝)
  • rm -rf 目錄名 刪除

文件操做

  • touch 文件名 新建文件
  • cat 文件名 查看文件內容
  • more 文件名 查看,能夠顯示百分比,回車能夠向下一行, 空格能夠向下一頁,q能夠退出查看
相關文章
相關標籤/搜索