一、操作系統概述
1.1 操作系統的定義與目標
定義:操作系統是控制管理計算機系統的硬軟件,分配調度資源的系統軟件。
目標:方便性,有效性(提高系統資源的利用率、提高系統的吞吐量),可擴充性,開放性。
1.2 操作系統的基本功能
- 統一管理計算機資源:處理器資源,IO設備資源,存儲器資源,文件資源;
- 實現了對計算機資源的抽象:IO設備管理軟件提供讀寫接口,文件管理軟件提供操作文件接;
- 提供了用戶與計算機之間的接口:GUI(圖形用戶界面),命令形式,系統調用形式。
1.3 操作系統的特征
最基本的特征,互為存在條件:并發,共享;
(1)并行:指兩個或多個事件可以在同一個時刻發生,多核CPU可以實現并行,一個cpu同一時刻只有一個程序在運行;
(2)并發:指兩個或多個事件可以在同一個時間間隔發生,用戶看起來是每個程序都在運行,實際上是每個程序都交替執行。
(3)共享性:操作系統的中資源可供多個并發的程序共同使用,這種形式稱之為資源共享。
- 互斥共享:當資源被程序占用時,其它想使用的程序只能等待。
- 同時訪問:某種資源并發的被多個程序訪問。
虛擬和異步特性前提是具有并發性。
(4)虛擬性:表現為把一個物理實體轉變為若干個邏輯實體。
- 時分復用技術:資源在時間上進行復用,不同程序并發使用,多道程序分時使用計算機的硬件資源,提高資源的利用率。
- 空分復用技術:用來實現虛擬磁盤(物理磁盤虛擬為邏輯磁盤,電腦上的C盤、D盤等)、虛擬內存(在邏輯上擴大程序的存儲容量)等,提高資源的利用率,提高編程效率。
(5)異步性:在多道程序環境下,允許多個進程并發執行,但由于資源等因素的限制,使進程的執行以“停停走走”的方式運行,而且每個進程執行的情況(運行、暫停、速度、完成)也是未知的。
1.4 操作系統的中斷處理
中斷機制的作用:為了在多道批處理系統中讓用戶進行交互;
中斷產生:
- 發生中斷時,CPU立馬切換到管態,開展管理工作;(管態又叫特權態,系統態或核心態,是操作系統管理的程序執行時,機器所處的狀態。)
- 發生中斷后,當前運行的進程回暫停運行,由操作系統內核對中斷進行處理;
- 對于不同的中斷信號,會進行不同的處理。
中斷的分類:
- 內中斷(也叫“異常”、“例外”、“陷入”)------- 信號來源:CPU內部,與當前執行指令有關;
- 外中斷(中斷)----------信號來源:CPU外部,與當前執行指令無關。
外中斷的處理過程:
- 每執行完一個指令后,CPU都需要檢查當前是否有外部中斷 信號;
- 如果檢查到外部中斷信號,則需要保護被中斷進程的CPU環境(如程序狀態字PSW,程序計數器PC、各種通用寄存器)把他們存儲在PCB(進程控制塊中);
- 根據中斷信號類型轉入相應的中斷處理程序;
- 恢復原進程的CPU環境并退出中斷,返回原進程繼續執行。
二、進程管理
2.1 進程管理之進程實體
為什么需要進程:
- 進程是系統進行資源分配和調度的基本單位;
- 進程作為程序獨立運行的載體保障程序正常執行;
- 進程的存在使得操作系統資源的利用率大幅提升。
進程控制塊(PCB):用于描述和控制進程運行的通用數據結構,記錄進程當前狀態和控制進程運行的全部信息,是進程存在的唯一標識。
進程(Process)與線程(Thread):
- 線程:操作系統進行 運行調度的最小單位 。
- 進程:系統進行 資源分配和調度的基本單位 。
區別與聯系:
- 一個進程可以有一個或多個線程;
- 線程包含在進程之中,是進程中實際運行工作的單位;
- 進程的線程共享進程資源;
- 一個進程可以并發多個線程,每個線程執行不同的任務。
2.2 進程管理之五狀態模型
就緒狀態:其它資源(進程控制塊、內存、棧空間、堆空間等)都準備好、只差CPU的狀態。
執行狀態:進程獲得CPU,其程序正在執行。
阻塞狀態:進程因某種原因放棄CPU的狀態,阻塞進程以隊列的形式放置。
創建狀態:創建進程時擁有PCB但其它資源尚未就緒。
終止狀態:進程結束由系統清理或者歸還PCB的狀態。
2.3 進程管理之進程同步
生產者-消費者問題:有一群生產者進程在生產產品,并將這些產品提供給消費者進程進行消費,生產者進程和消費者進程可以并發執行,在兩者之間設置了一個具有n個緩沖區的緩沖池,生產者進程需要將所生產的產品放到緩沖區中(+1操作),消費者進程可以從緩沖區取走產品消費(-1操作)。
產生問題:當兩者并發執行時可能出差錯,導致預期的結果與真實的結果不相符:當執行生產者+1和消費者-1操作之后,緩沖區的值從10變為了11。
哲學家進餐問題:有5個哲學家,他們的生活方式是交替的思考和進餐,哲學家們共同使用一張圓桌,分別坐在5張椅子上,圓桌上有5只碗和5只筷子。平時哲學家們只進行思考,饑餓時則試圖取靠近他們的左右兩只筷子,只有兩只筷子都被拿到的時候才能進餐,否則等待,進餐完畢后,放下左右筷子進行思考。
這會導致以下的問題,筷子就相當于臨界資源:
臨界資源指的是一些雖作為共享資源卻又無法同時被多個線程共同訪問的共享資源。當有進程在使用臨界資源時,其他進程必須依據操作系統的同步機制等待占用進程釋放該共享資源才可重新競爭使用共享資源。
進程同步的作用:對競爭資源在多進程間進行使用次序的協調,使得并發執行的多個進程之間可以有效使用資源和相互合作。
進程間同步的四原則:
- 空閑讓進:資源無占用,允許使用;
- 忙則等待:資源被占用,請求進程等待;
- 有限等待:保證有限等待時間能夠使用資源;
- 讓權等待:等待時,進程需要讓出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的進程管理
進程的類型:
- 前臺進程:具有終端,可以和用戶交互;
- 后臺進程:沒有占用終端,基本不和用戶交互,優先級比前臺進程低(將需要執行的命令以“&”符號結束);
- 守護進程:特殊的后臺進程,在系統引導時啟動,一直運行直到系統關閉(進程名字以“d”結尾的一般都是守護進程),如crond、sshd、httpd、mysqld…
進程的標記:
- 進程ID:非負整數,進程的唯一標記,每個進程擁有不同的ID;
- 進程的狀態標記:R表示進程處于運行狀態,S表示進程處于睡眠狀態…
操作Linux進程的相關命令:
- ps命令:列出當前的進程,結合-aux可以打印進程的詳細信息(ps -aux);
- top命令:查看所有進程的狀態;
- kill命令:給進程發送信號。
三、作業管理
3.1 作業管理之進程調度
定義:指計算機通過決策決定哪個就緒進程可以獲得CPU使用權。
什么時候需要進程調度?
- 主動放棄:進程正常終止;運行過程中發生異常而終止;主動阻塞(如等待I/O);
- 被動放棄:分給進程的時間片用完;有更高優先級的進程進入就緒隊列;有更緊急的事情需要處理(如I/O中斷);
進程調度方式:
非搶占式調度:只能由當前運行的進程主動放棄CPU;
- 處理器一旦分配給某個進程,就讓該進程一直使用下去;
- 調度程序不以任何原因搶占正在被使用的處理器;
- 調度程序不以任何原因搶占正在被使用的處理器;
搶占式調度:可由操作系統剝奪當前進程的CPU使用權。
- 允許調度程序以一定的策略暫停當前運行的進程;
- 保存好舊進程的上下文信息,分配處理器給新進程;
進程調度的三大機制:
就緒隊列的排隊機制:為了提高進程調度的效率,將就緒進程按照一定的方式排成隊列,以便調度程序可以最快找到就緒進程。
選擇運行進程的委派機制:調度程序以一定的策略,選擇就緒進程,將CPU資源分配給它。
新老進程的上下文切換機制:保存當前進程的上下文信息,裝入被委派執行進程的運行上下文。
進程調度算法:
- 先來先服務算法:按照在就緒隊列中的先后順序執行。
- 短進程優先調度算法:優先選擇就緒隊列中估計運行時間最短的進程,不利于長作業進程的執行。
- 高優先權優先調度算法:進程附帶優先權,優先選擇權重高的進程,可以使得緊迫的任務優先處理。
- 時間片輪轉調度算法:按照FIFO的原則排列就緒進程,每次從隊列頭部取出待執行進程,分配一個時間片執行,是相對公平的調度算法,但是不能保證就是響應用戶。
3.2 作業管理之死鎖
3.2.1 進程死鎖、饑餓、死循環的區別:
死鎖:兩個或兩個以上的進程在執行過程中,由于競爭資源或者由于彼此通信而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。永遠在互相等待的進程稱為死鎖進程。
饑餓:由于長期得不到資源導致進程無法推進;
死循環:代碼邏輯BUG。
死鎖的產生:競爭資源(共享資源數量不滿足各進程需求)、進程調度順序不當,當調度順序為A->B->C->D時會產生死鎖,但改為A->D->B->C則不會產生。
死鎖的四個必要條件:
- 互斥條件:必須互斥使用資源才會產生死鎖;
- 請求保持條件:進程至少保持一個資源,又提出新的資源請求,新資源被占用,請求被阻塞,被阻塞的進程不釋放自己保持的資源;
- 不可剝奪條件:進程獲得的資源在未完成使用前不能被剝奪(包括OS),只能由進程自身釋放;
- 環路等待條件:發生死鎖時,必然存在進程-資源環形鏈,環路等待不一定造成死鎖,但是死鎖一定有循環等待。
死鎖的處理策略:
一.預防死鎖的方法:破壞四個必要條件的中一個或多個。
- 破壞互斥條件:將臨界資源改造成共享資源(Spooling池化技術);(可行性不高,很多時候無法破壞互斥條件)
- 破壞請求保持條件:系統規定進程運行之前,一次性申請所有需要的資源;(資源利用率低,可能導致別的線程饑餓)
- 破壞不可剝奪條件:當一個進程請求新的資源得不到滿足時,必須釋放占有的資源;(實現復雜,剝奪資源可能導致部分工作失效,反復申請和釋放造成額外的系統開銷)
- 破壞環路等待條件:可用資源線性排序,申請必須按照需要遞增申請;(進程實際使用資源順序和編號順序不同,會導致資源浪費)
二.銀行家算法:檢查當前資源剩余是否可以滿足某個進程的最大需求;如果可以,就把該進程加入安全序列,等待進程允許完成,回收所有資源;重復1,2,直到當前沒有線程等待資源;
三.死鎖的檢測和解除:死鎖檢測算法,資源剝奪法,撤銷進程法(終止進程法),進程回退法;
-
操作系統
+關注
關注
37文章
6803瀏覽量
123285 -
計算機系統
+關注
關注
0文章
282瀏覽量
24105 -
IO設備
+關注
關注
0文章
21瀏覽量
7370
發布評論請先 登錄
相關推薦
評論