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