操作系统 -- 处理器管理
文章目錄
- 進(jìn)程的由來
- 進(jìn)程的定義
- 注意
- 該如何去理解進(jìn)程和進(jìn)程實體
- PCB記錄的信息
- 處理器管理概述
- 處理器管理實例 -- Linux2.6內(nèi)核上的實現(xiàn)
- Linux調(diào)度器的簡史
- Linux2.4調(diào)度器
- Linux的O(1)調(diào)度器
- Linux的cfs調(diào)度器
- 參考
??在前面 操作系統(tǒng)緒論中有介紹到操作系統(tǒng)的幾大部分:處理機(jī)管理 存儲管理 設(shè)備管理 文件管理 用戶接口。這篇文章主要是對處理器管理這一部分進(jìn)行詳細(xì)說明。
進(jìn)程的由來
??從聯(lián)機(jī)批處理 -> 脫機(jī)批處理 -> 多道批處理 -> 多道程序設(shè)計技術(shù),很大的原因是cpu和其他硬件資源速度不匹配(cpu太快,其他硬件速度都跟不上),操作系統(tǒng)設(shè)計人員為了緩解cpu和硬盤等硬件速度上的差距、提高cpu的利用率而不斷改進(jìn)操作系統(tǒng)的結(jié)果。充分體現(xiàn)了物盡其用這個原則。
??程序就是一個指令序列。在未出現(xiàn)多道程序設(shè)計之前,只支持單道程序,操作系統(tǒng)只是一個一個按順序執(zhí)行程序,所以計算機(jī)中的所有資源都被當(dāng)前運行的程序所享有,包括內(nèi)存。當(dāng)時內(nèi)存僅僅被劃分為程序段和數(shù)據(jù)段,程序段用于存放程序代碼,數(shù)據(jù)段則用于存放程序的數(shù)據(jù)。因為只有一個程序,所以很容易就可以找到相應(yīng)的程序段和數(shù)據(jù)段。
??多道程序設(shè)計技術(shù)的出現(xiàn),支持同一時間內(nèi)多個程序并發(fā)(當(dāng)一道程序因I/O請求而暫停運行時,CPU便立即轉(zhuǎn)去運行另一道程序。)。這樣內(nèi)存中就需要存放各個運行程序的相關(guān)信息。這樣就產(chǎn)生一個問題,操作系統(tǒng)如何才能找到個程序的存放位置?
??所以為了方便操作系統(tǒng)管理和完成多個程序并發(fā)執(zhí)行,引入了進(jìn)程和進(jìn)程實體的概念。操作系統(tǒng)為每一個運行的程序配置了一個數(shù)據(jù)結(jié)構(gòu),進(jìn)程控制塊(PCB)用來描述進(jìn)程的各種信息,例如代碼的存放位置,數(shù)據(jù)存放位置等。并不是直接存放程序段和數(shù)據(jù)段的內(nèi)容,程序段、數(shù)據(jù)段的內(nèi)容存放在內(nèi)存其他地方,但是由于PCB的存中,很容易獲取到這些信息。
??PCB、程序段、數(shù)據(jù)段三個部分構(gòu)成了進(jìn)程實體,也稱進(jìn)程印象。一般情況下,我們把進(jìn)程實體簡稱為進(jìn)程,例如所謂的創(chuàng)建進(jìn)程,實質(zhì)上是創(chuàng)建進(jìn)程實體的PCB;而撤銷進(jìn)程,實質(zhì)上是撤銷進(jìn)程實體中的PCB。
進(jìn)程的定義
??進(jìn)程的定義并沒有一個統(tǒng)一的說法,自己比較認(rèn)同的就是:
??進(jìn)程是具有獨立功能的程序在一個數(shù)據(jù)集合上一次動態(tài)執(zhí)行的過程。
注意
??嚴(yán)格來說,進(jìn)程實體和進(jìn)程并不一樣,進(jìn)程實體是靜態(tài)的,進(jìn)程則是動態(tài)的。Linux內(nèi)核通常把進(jìn)程也叫任務(wù)。
該如何去理解進(jìn)程和進(jìn)程實體
??PCB、程序段、數(shù)據(jù)段三個部分構(gòu)成了進(jìn)程實體。程序本身和進(jìn)程實體只相差了一個PCB,二者均是靜態(tài)的,即是存儲起來的狀態(tài),而進(jìn)程所描述的,是進(jìn)程實體運行的過程,或者說是程序運行的過程,即強(qiáng)調(diào)的是程序的運行,動態(tài)的過程。
PCB記錄的信息
??從上述可以知道,pcb是一個很重要的結(jié)構(gòu),里面一般存放什么信息呢?
- 進(jìn)程描述信息
- 進(jìn)程標(biāo)識符PID:當(dāng)進(jìn)程被創(chuàng)建時,操作系統(tǒng)會為該進(jìn)程分配一個唯一的、不重復(fù)的ID,用于區(qū)分不同的進(jìn)程,就像是身份證號
- 用戶標(biāo)識符UID
- 進(jìn)程控制和管理信息
- 進(jìn)程當(dāng)前狀態(tài)
- 進(jìn)程優(yōu)先級
- 資源分配清單
- 處理機(jī)相關(guān)信息
處理器管理概述
??處理器管理是操作系統(tǒng)的重要組成部分,它負(fù)責(zé)管理,調(diào)度和分派計算機(jī)系統(tǒng)的重要資源————處理器,并控制程序的執(zhí)行。
??操作系統(tǒng)的基本任務(wù)是對“進(jìn)程”實施管理,操作系統(tǒng)必須有效有效控制進(jìn)程的執(zhí)行,給進(jìn)程分配資源,準(zhǔn)許進(jìn)程之間交換信息,保護(hù)每個進(jìn)程在運行期間免受其他進(jìn)程干擾,控制進(jìn)程的互斥、同步和通信。
??早期的計算機(jī)系統(tǒng)是基于單個處理器的順序處理機(jī)器。程序員編寫串行執(zhí)行的代碼,讓其在處理器上串行執(zhí)行,每一條指令的執(zhí)行也是串行的(取指令,取操作數(shù),執(zhí)行操作,存出結(jié)果)。單核的處理器管理也很容易理解,cpu調(diào)度策略也很多(FCFS、優(yōu)先級調(diào)度、SJF調(diào)度、RR調(diào)度、多級反饋調(diào)度)
??但是為了提高cpu硬件的性能,逐步發(fā)展出了流水線系統(tǒng)(解決了指令并行的問題)和多核CPU。由于多核處理器有多個核心,那么在多核處理器工作時就存在任務(wù)分配、調(diào)度、仲裁以及負(fù)載均衡等諸多問題。這時候的操作系統(tǒng)的處理器管理要是想利用上多核cpu的優(yōu)勢,必須優(yōu)化系統(tǒng)任務(wù)調(diào)度算法,一般多核上任務(wù)調(diào)度算法有全局隊列調(diào)度和局部隊列調(diào)度。前者是指操作系統(tǒng)維護(hù)一個全局的任務(wù)等待隊列,后者是指操作系統(tǒng)為每個CPU內(nèi)核維護(hù)一個局部的任務(wù)等待隊列。
硬件知識:
按照計算機(jī)在一個執(zhí)行階段能執(zhí)行的指令或能處理的最大可能數(shù)可將計算機(jī)分為四類:
??1.單指令流單數(shù)據(jù)流(SISD);
??2.單指令流多數(shù)據(jù)流(SIMD);
??3.多指令流單數(shù)據(jù)流(MISD);
??4.多指令流多數(shù)據(jù)流(MIMD)。
??MIMD系統(tǒng)劃分為:共享內(nèi)存的緊密耦合MIMD系統(tǒng);內(nèi)存分布的松散耦合MIMD系統(tǒng)。
??根據(jù)處理器分配策略,緊密耦合MIMD系統(tǒng)可以分為主從式系統(tǒng)MSP;對稱式系統(tǒng)SMP。
??操作系統(tǒng)對不同的計算機(jī)結(jié)構(gòu)有不同的支持,我們接觸的個人計算機(jī)大多是SMP(最大的特點就是共享所有資源)。
處理器管理實例 – Linux2.6內(nèi)核上的實現(xiàn)
??下面提到的Linux如果不是特別指明都是代指Linux2.6.32內(nèi)核。
Linux調(diào)度器的簡史
從Linux2.4之前的內(nèi)核調(diào)度器 -> Linux2.4調(diào)度器 -> Linux2.6的O(1)調(diào)度器 -> Linux新一代調(diào)度器CFS
Linux2.4調(diào)度器
過程:2.4的調(diào)度算法,將所有的就緒進(jìn)程組織成一條可運行隊列,不管是單核環(huán)境還是smp環(huán)境,cpu都只從這條可運行隊列中循環(huán)遍歷直到挑選到下一個要運行的進(jìn)程。如果所有的進(jìn)程的時間片都用完,就重新計算所有進(jìn)程的時間片。
2.4調(diào)度的不足:
1)一個明顯的缺點就是時間復(fù)雜度為O(n),每次都要遍歷隊列,效率低!。雖然說O(n)的復(fù)雜度看起來不是很糟糕,而且系統(tǒng)能容納進(jìn)程數(shù)量也不一定會很大,但復(fù)雜度為O(n)還是很難忍受的。
2)由于在smp環(huán)境下多個cpu還是使用同一條運行隊列,所以進(jìn)程在多個cpu間切換會使cpu的緩存效率降低,降低系統(tǒng)的性能。
3)多個cpu共享一條運行隊列,使得每個cpu在對隊列操作的時候需要對運行隊列進(jìn)行加鎖,這時如果其他空閑cpu要訪問運行隊列,則只能等待了。由2、3兩點可以看出2.4的調(diào)度算法對smp環(huán)境的伸縮性不高!不能很好地支持smp環(huán)境。
4)不支持內(nèi)核搶占,內(nèi)核不能及時響應(yīng)實時任務(wù),無法滿足實時系統(tǒng)的要求(即使linux不是一個硬實時,但同樣無法滿足軟實時性的要求)。
5)進(jìn)程的剩余時間是除了nice值外對動態(tài)優(yōu)先級影響最大的因素,并且系統(tǒng)將休眠次數(shù)多的進(jìn)程的剩余時間疊加起來,從而得出更大的動態(tài)優(yōu)先級。這體現(xiàn)了 系統(tǒng)更傾向優(yōu)先執(zhí)行I/O型進(jìn)程。內(nèi)核就是通過這種方式來提高交互進(jìn)程的優(yōu)先級,使其優(yōu)先執(zhí)行。但休眠多的進(jìn)程就代表是交互型的進(jìn)程嗎?并不是的,這只能 說明它是I/O型進(jìn)程。I/O型進(jìn)程需要進(jìn)行I/O交互,如讀寫磁盤時進(jìn)程會經(jīng)常處于休眠的狀態(tài)。如果把這種進(jìn)程當(dāng)成是交互進(jìn)程,反而會影響其他真正的交 互進(jìn)程。
6)簡單的負(fù)載平衡。那個cpu空閑就把就緒的進(jìn)程調(diào)度到這個cpu上去執(zhí)行。或者某個cpu的進(jìn)程的優(yōu)先級比某個進(jìn)程低,就調(diào)度到那個cpu上去執(zhí)行。這樣簡單的負(fù)載平衡缺點不言而喻。進(jìn)程遷移比較頻繁,而且出現(xiàn)2、3的情況。這樣的負(fù)載平衡弊大于利!
Linux的O(1)調(diào)度器
過程:每個cpu維護(hù)一個自己的運行隊列,每個運行隊列有分別維護(hù)自己的active隊列與expried隊列。當(dāng)進(jìn)程的時間片用完后就會被放入expired 隊列中。當(dāng)active隊列中所有進(jìn)程的時間片都用完,進(jìn)程執(zhí)行完畢后,交換active隊列和expried。這樣expried隊列就成為了 active隊列。這樣做只需要指針的交換而已。當(dāng)調(diào)度程序要找出下一個要運行的進(jìn)程時,只需要根據(jù)上面提過的位圖宏來找出優(yōu)先級最高的且有就緒進(jìn)程的隊 列。這樣的數(shù)據(jù)組織下,2.6的調(diào)度程序的時間復(fù)雜度由原來2.4的O(n)提高到O(1)。而其對smp環(huán)境具有較好的伸縮性。
Linux的cfs調(diào)度器
過程:與之前的Linux調(diào)度器不同,CFS沒有將任務(wù)維護(hù)在鏈表式的運行隊列中,它拋棄了active/expire數(shù)組,而是對每個CPU維護(hù)一個以時間為順序的紅黑樹。
Linux的CFS調(diào)度器詳細(xì)。
??Linux進(jìn)程調(diào)度一些設(shè)計思想:
??把進(jìn)程抽象成進(jìn)程描述符task_struct:包含進(jìn)程所必需的數(shù)據(jù),如狀態(tài)信息、調(diào)度信息、優(yōu)先級信息、內(nèi)存頁信息等。
??把需要調(diào)度的東西抽象成調(diào)度實體sched_entity:調(diào)度實體可以是進(jìn)程、進(jìn)程組、用戶等。這里包含負(fù)載權(quán)重值、對應(yīng)紅黑樹結(jié)點、虛擬運行時vruntime等。
??把調(diào)度策略(算法)抽象成調(diào)度類sched_class:包含一組通用的調(diào)度操作接口,將接口和實現(xiàn)分離。你可以根據(jù)這組接口實現(xiàn)不同的調(diào)度算法,使得一個Linux調(diào)度程序可以有多個不同的調(diào)度策略。
??把調(diào)度的組織抽象成可運行隊列rq:包含自旋鎖、進(jìn)程數(shù)量、用于公平調(diào)度的CFS信息結(jié)構(gòu)、當(dāng)前正在運行的進(jìn)程描述符等。實際的進(jìn)程隊列用紅黑樹來維護(hù)(通過CFS信息結(jié)構(gòu)來訪問)。
??把CFS調(diào)度的運行隊列信息抽象成cfs_rq:包含紅黑樹的根結(jié)點、正在運行的進(jìn)程指針、用于負(fù)載平衡的葉子隊列等。
??
??
??
??
??
??
??
參考
??https://www.cnblogs.com/814467783sweet/p/9634631.html
??https://www.cnblogs.com/zhoug2020/p/3967328.html
??https://blog.csdn.net/zhoudaxia/article/details/7375668
??https://www.docin.com/p-1396901563.html
??《Linux設(shè)計與實現(xiàn)》
總結(jié)
以上是生活随笔為你收集整理的操作系统 -- 处理器管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WPF DataGridTemplate
- 下一篇: 02-SA8155P ADB数据传输