一、操作系統(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)的基本功能
1.3 操作系統(tǒng)的特征最基本的特征,互為存在條件:并發(fā),共享; (1)并行:指兩個或多個事件可以在同一個時刻發(fā)生,多核CPU可以實現(xiàn)并行,一個cpu同一時刻只有一個程序在運(yùn)行; (2)并發(fā):指兩個或多個事件可以在同一個時間間隔發(fā)生,用戶看起來是每個程序都在運(yùn)行,實際上是每個程序都交替執(zhí)行。
(3)共享性:操作系統(tǒng)的中資源可供多個并發(fā)的程序共同使用,這種形式稱之為資源共享。
虛擬和異步特性前提是具有并發(fā)性。 (4)虛擬性:表現(xiàn)為把一個物理實體轉(zhuǎn)變?yōu)槿舾蓚€邏輯實體。
(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)生:
中斷的分類:
外中斷的處理過程:
二、進(jìn)程管理2.1 進(jìn)程管理之進(jìn)程實體為什么需要進(jìn)程:
進(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):
區(qū)別與聯(lián)系:
2.2 進(jìn)程管理之五狀態(tài)模型就緒狀態(tài):其它資源(進(jìn)程控制塊、內(nèi)存、棧空間、堆空間等)都準(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)程間同步的四原則:
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)程。
2.共享內(nèi)存:在某種程度上,多進(jìn)程是共同使用物理內(nèi)存的,但是由于操作系統(tǒng)的進(jìn)程管理,進(jìn)程間的內(nèi)存空間是獨(dú)立的,因此進(jìn)程默認(rèn)是不能訪問進(jìn)程空間之外的內(nèi)存空間的。
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)高于互斥鎖。特點(diǎn):避免了進(jìn)程或者線程上下文切換的開銷,但是不適合在單核CPU使用。 3.讀寫鎖:是一種特殊的自旋鎖,允許多個讀操作同時訪問資源以提高讀性能,但是對寫操作是互斥的,即**對多讀少寫的操作效率提升**很顯著。 4.條件變量:是一種相對比較復(fù)雜的線程同步方法,條件變量允許線程睡眠,直到滿足某種條件,當(dāng)**滿足條件時,可以給該線程信號通知喚醒**。 2.3.3 線程同步方法對比(重要)
2.4 Linux的進(jìn)程管理進(jìn)程的類型:
進(jìn)程的標(biāo)記:
操作Linux進(jìn)程的相關(guān)命令:
三、作業(yè)管理3.1 作業(yè)管理之進(jìn)程調(diào)度定義:指計算機(jī)通過決策決定哪個就緒進(jìn)程可以獲得CPU使用權(quán)。 什么時候需要進(jìn)程調(diào)度?
進(jìn)程調(diào)度方式: 非搶占式調(diào)度:只能由當(dāng)前運(yùn)行的進(jìn)程主動放棄CPU;
搶占式調(diào)度:可由操作系統(tǒng)剝奪當(dāng)前進(jìn)程的CPU使用權(quá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)度算法:
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)生。
死鎖的四個必要條件:
死鎖的處理策略: 一.預(yù)防死鎖的方法:破壞四個必要條件的中一個或多個。
二.銀行家算法:檢查當(dāng)前資源剩余是否可以滿足某個進(jìn)程的最大需求;如果可以,就把該進(jìn)程加入安全序列,等待進(jìn)程允許完成,回收所有資源;重復(fù)1,2,直到當(dāng)前沒有線程等待資源; 三.死鎖的檢測和解除:死鎖檢測算法,資源剝奪法,撤銷進(jìn)程法(終止進(jìn)程法),進(jìn)程回退法; 四、存儲管理存儲管理為了確保計算機(jī)有足夠的內(nèi)存處理數(shù)據(jù);確保程序可以從可用內(nèi)存中獲取一部分內(nèi)存使用;確保程序可以歸還使用后的內(nèi)存以供其他程序使用。 4.1 存儲管理之內(nèi)存分配與回收內(nèi)存分配的過程:單一連續(xù)分配(已經(jīng)過時)、固定分區(qū)分配、動態(tài)分區(qū)分配(根據(jù)實際需要,動態(tài)的分配內(nèi)存)。 動態(tài)分區(qū)分配算法:
內(nèi)存回收的過程:
4.2 存儲管理之段頁式存儲管理頁式存儲管理:將進(jìn)程邏輯空間等分成若干大小的頁面,相應(yīng)的把物理內(nèi)存空間分成與頁面大小的物理塊,以頁面為單位把進(jìn)程空間裝進(jìn)物理內(nèi)存中分散的物理塊。 頁面大小應(yīng)該適中,過大難以分配,過小內(nèi)存碎片過多;頁面大小通常是512B~8K; 現(xiàn)代計算機(jī)系統(tǒng)中,可以支持非常大的邏輯地址空間(232~264),具有32位邏輯地址空間的分頁系統(tǒng),規(guī)定頁面大小為4KB,則在每個進(jìn)程頁表中的頁表項可達(dá)1M(2個20)個,如果每個頁表項占用1Byte,故每個進(jìn)程僅僅頁表就要占用1MB的內(nèi)存空間。
段式存儲管理:將進(jìn)程邏輯空間分成若干段(不等分),段的長度由連續(xù)邏輯的長度決定。 頁式和者段式存儲管理相比:
段頁式存儲管理:現(xiàn)將邏輯空間按照段式管理分成若干段,再將內(nèi)存空間按照頁式管理分成若干頁,分頁可以有效提高內(nèi)存利用率,分段可以更好的滿足用戶需求。
4.3 存儲管理之虛擬內(nèi)存虛擬內(nèi)存概述:是操作系統(tǒng)內(nèi)存管理的關(guān)鍵技術(shù),使得多道程序運(yùn)行和大程序運(yùn)行成為現(xiàn)實,把程序使用內(nèi)存劃分,將部分暫時不使用的內(nèi)存放置在輔存,實際是對物理內(nèi)存的擴(kuò)充。 局部性原理:指CPU訪問存儲器時,無論是存取指令還是存取數(shù)據(jù),所訪問的存儲單元都趨于聚集在一個較小的連續(xù)區(qū)域中。 虛擬內(nèi)存的置換算法:先進(jìn)先出(FIFO)、最不經(jīng)常使用(LFU)、最近最少使用(LRU) 虛擬內(nèi)存的特征:
4.4 Linux的存儲管理Buddy內(nèi)存管理算法:經(jīng)典的內(nèi)存管理算法,為解決內(nèi)存外碎片的問題,算法基于計算機(jī)處理二進(jìn)制的優(yōu)勢具有極高的效率。 Linux交換空間:交換空間(Swap)是磁盤的一個分區(qū),Linux內(nèi)存滿時,會把一些內(nèi)存交換至Swap空間,Swap空間是初始化系統(tǒng)時配置的。 Swap空間與虛擬內(nèi)存的對比:
五、文件管理5.1 操作系統(tǒng)的文件管理文件的邏輯結(jié)構(gòu):
輔存的存儲空間分配:
目錄樹:使得任何文件或目錄都有唯一的路徑。
Linux文件的基本操作:參考鏈接
Linux的文件系統(tǒng):FAT、NTFS(對FAT進(jìn)行改進(jìn))、EXT2/3/4(擴(kuò)展文件系統(tǒng),Linux的文件系統(tǒng)) 六、設(shè)備管理I/O設(shè)備的基本概念:將數(shù)據(jù)輸入輸出計算機(jī)的外部設(shè)備; 廣義的IO設(shè)備:
IO設(shè)備的緩沖區(qū):減少CPU處理IO請求的頻率,提高CPU與IO設(shè)備之間的并行性。 SPOOLing技術(shù):虛擬設(shè)備技術(shù),把同步調(diào)用低速設(shè)備改為異步調(diào)用,在輸入、輸出之間增加了排隊轉(zhuǎn)儲環(huán)節(jié)(輸入井、輸出井),SPoOLing負(fù)責(zé)輸入(出)井與低速設(shè)備之間的調(diào)度,邏輯上,進(jìn)程直接與高速設(shè)備交互,減少了進(jìn)程的等待時間。 七、實現(xiàn)支持異步任務(wù)的線程池線程池:線程池是存放多個線程的容器,CPU調(diào)度線程執(zhí)行后不會銷毀線程,將線程放回線程池重新利用。 使用線程池的原因:
實現(xiàn)線程安全的隊列Queue
實現(xiàn)基本任務(wù)對象Task 實現(xiàn)的基本功能:任務(wù)參數(shù),任務(wù)唯一標(biāo)記(UUID),任務(wù)具體的執(zhí)行邏輯 實現(xiàn)任務(wù)處理線程ProcessThread:任務(wù)處理線程需要不斷地從任務(wù)隊列里取任務(wù)執(zhí)行,任務(wù)處理線程需要有一個標(biāo)記,標(biāo)記線程什么時候應(yīng)該停止。 實現(xiàn)的基本功能:基本屬性(任務(wù)隊列、標(biāo)記),線程執(zhí)行的邏輯(run),線程停止(stop)。 實現(xiàn)任務(wù)處理線程池Pool:存放多個任務(wù)處理線程,負(fù)責(zé)多個線程的啟停,管理向線程池的提交任務(wù),下發(fā)給線程去執(zhí)行。 實現(xiàn)的基本過程:基本屬性,提交任務(wù)(put,batch_put),線程啟停(start,join),線程池大?。╯ize)。 實現(xiàn)異步任務(wù)處理AsyncTask:給任務(wù)添加一個標(biāo)記,任務(wù)完成后,則標(biāo)記為完成;任務(wù)完成時可直接獲取任務(wù)運(yùn)行結(jié)果;任務(wù)未完成時,獲取任務(wù)結(jié)果,會阻塞獲取線程。 主要實現(xiàn)的兩個函數(shù):設(shè)置運(yùn)行結(jié)果(set_result),獲取運(yùn)行結(jié)果(get_result) |
|
|