操作系統(tǒng)——進(jìn)程、線程、調(diào)度

本文為學(xué)習(xí)筆記,一部分來(lái)自于《現(xiàn)代操作系統(tǒng)》 荷蘭 Andrew S. Tanenbaum著,一部分來(lái)自于浙江大學(xué)李善平教授主講的《操作系統(tǒng)》課程,網(wǎng)址:http://www.icourses.cn/coursestatic/course_6801.html

  • 進(jìn)程

    • 進(jìn)程:資源分配的最小單位

    • 定義:一個(gè)進(jìn)程就是一個(gè)正在執(zhí)行程序的實(shí)例;進(jìn)程是某種類(lèi)型的活動(dòng),它有程序、輸入、輸出以及狀態(tài)

    • 嚴(yán)格說(shuō),某個(gè)瞬間,CPU只能運(yùn)行一個(gè)進(jìn)程,一個(gè)程序運(yùn)行了兩次,那么就算運(yùn)行了兩次進(jìn)程,進(jìn)程可以擁有多個(gè)線程

    • 守護(hù)進(jìn)程(daemon):運(yùn)行在后臺(tái)的進(jìn)程

    • 創(chuàng)建進(jìn)程:

      • UNIX:fork

        • 父進(jìn)程與子進(jìn)程擁有相同的存儲(chǔ)映像(image)

        • fork系統(tǒng)調(diào)用創(chuàng)建一個(gè)新(子)進(jìn)程

        • fork之后,exec系統(tǒng)調(diào)用裝入一個(gè)新程序

        • 父進(jìn)程與子進(jìn)程只有pid不一樣,其他資源都一樣,父進(jìn)程的pid>0,子進(jìn)程的pid=0

        • fork后執(zhí)行父進(jìn)程還是子進(jìn)程,取決于內(nèi)核所使用的調(diào)度算法

      • Windows:CreateProcess

    • 進(jìn)程的終止(可以讓該進(jìn)程的所有后輩進(jìn)程都隨之終止,也可以不這樣做):

      • 正常退出(自愿)

        • UNIX:exit

        • Windows:ExitProcess

      • 出錯(cuò)退出(自愿)

      • 嚴(yán)重錯(cuò)誤(非自愿)

      • 被其他進(jìn)程殺死(非自愿)

        • UNIX:kill

        • Windows:TerminateProcess

    • 進(jìn)程的狀態(tài):

      • 運(yùn)行態(tài)(此進(jìn)程實(shí)際占用CPU)

      • 就緒態(tài)(可運(yùn)行,但因其他進(jìn)程正在運(yùn)行而暫時(shí)停止)

      • 阻塞態(tài)(除非某種外部事件發(fā)生,否則進(jìn)程不能運(yùn)行)

      1. 進(jìn)程為等待而阻塞

      2. 調(diào)度程序選擇另一個(gè)進(jìn)程

      3. 調(diào)度程序選擇這個(gè)進(jìn)程

      4. 出現(xiàn)有效輸入(外部事件)

    • 為了實(shí)現(xiàn)進(jìn)程模型,操作系統(tǒng)維護(hù)著一張表格(一個(gè)結(jié)構(gòu)數(shù)組),即進(jìn)程表(process table)

    • 每個(gè)進(jìn)程占用一個(gè)進(jìn)程表項(xiàng),該表項(xiàng)包含了進(jìn)程狀態(tài)的重要信息,包括程序計(jì)數(shù)器、堆棧指針、內(nèi)存分配狀況、所打開(kāi)文件的狀態(tài)、帳號(hào)和調(diào)度信息

    • CPU利用率=1-p?

      • 一個(gè)進(jìn)程等待I/O操作的時(shí)間與其停留在內(nèi)存中的時(shí)間比為p

      • 內(nèi)存中同時(shí)有n個(gè)進(jìn)程

  • 線程

    • 線程:“輕量級(jí)的進(jìn)程”(lightweight process)

    • 為什么多線程?

      • 并行實(shí)體共享同一個(gè)地址空間和所有可用數(shù)據(jù)的能力

      • 線程比進(jìn)程更輕量級(jí),所以它們比進(jìn)程更容易、更快創(chuàng)建,也更容易撤銷(xiāo)

      • 擁有多個(gè)線程允許這樣活動(dòng)彼此重疊進(jìn)行,從而會(huì)加快應(yīng)用程序執(zhí)行速度

        • Windows 多線程

        • Linux 單線程

    • 線程模型

      • 多個(gè)線程共享同一個(gè)地址空間和其他資源,比如共享全局變量

      • 進(jìn)程中的不同線程不像不同進(jìn)程之間那樣存在很大的獨(dú)立性

      • 嚴(yán)格來(lái)說(shuō),同一時(shí)刻只有一個(gè)線程占用CPU,但高速切換給人帶來(lái)并行運(yùn)行的假象

      • 線程與進(jìn)程一樣,也具有三種狀態(tài),運(yùn)行態(tài)、就緒態(tài)、阻塞態(tài),并且轉(zhuǎn)化關(guān)系也一樣(見(jiàn)上文的圖)

      • 每個(gè)線程都有其自己的堆棧,其中有一幀,供各個(gè)被調(diào)用但還沒(méi)返回的過(guò)程中使用,在該幀存放了相應(yīng)過(guò)程的局部變量以及過(guò)程調(diào)用完成之后使用的返回地址

      • 常見(jiàn)的線程調(diào)用:thread_yield,它允許線程自動(dòng)放棄CPU從而讓另一個(gè)線程運(yùn)行,因?yàn)椴煌谶M(jìn)程,線程無(wú)法利用時(shí)鐘中斷強(qiáng)制讓出CPU

    • 線程和進(jìn)程的區(qū)別:

      • 調(diào)度 :在引入線程的操作系統(tǒng)中,線程是調(diào)度和分配的基本單位 ,進(jìn)程是資源擁有的基本單位 。把傳統(tǒng)進(jìn)程的兩個(gè)屬性分開(kāi),線程便能輕裝運(yùn)行,從而可顯著地提高系統(tǒng)的并發(fā)程度。 在同一進(jìn)程中,線程的切換不會(huì)引起進(jìn)程的切換;在由一個(gè)進(jìn)程中的線程切換到另一個(gè)進(jìn)程中的線程時(shí),才會(huì)引起進(jìn)程的切換。

      • 并發(fā)性 :在引入線程的操作系統(tǒng)中,不僅進(jìn)程之間可以并發(fā)執(zhí)行,而且在一個(gè)進(jìn)程中的多個(gè)線程之間亦可并發(fā)執(zhí)行,因而使操作系統(tǒng)具有更好的并發(fā)性,從而能更有效地使用系統(tǒng)資源和提高系統(tǒng)吞吐量。

      • 擁有資源 :不論是傳統(tǒng)的操作系統(tǒng),還是設(shè)有線程的操作系統(tǒng),進(jìn)程都是擁有資源的一個(gè)獨(dú)立 單位,它可以擁有自己的資源。 一般地說(shuō),線程自己不擁有系統(tǒng)資源(只有一些必不可少的資源),但它可以訪問(wèn)其隸屬進(jìn)程的資源。

      • 系統(tǒng)開(kāi)銷(xiāo): 由于在創(chuàng)建或撤消進(jìn)程時(shí),系統(tǒng)都要為之分配或回收資源,因此,操作系統(tǒng)所付出的開(kāi)銷(xiāo)將顯著地大于在創(chuàng)建或撤消線程時(shí)的開(kāi)銷(xiāo)。 進(jìn)程切換的開(kāi)銷(xiāo)也遠(yuǎn)大于線程切換的開(kāi)銷(xiāo)。

    • 實(shí)現(xiàn)線程包:在用戶空間中和在內(nèi)核

      1. 內(nèi)核級(jí)線程:

        • 線程的創(chuàng)建、撤銷(xiāo)和切換等,都需要內(nèi)核直接實(shí)現(xiàn),即內(nèi)核了解每一個(gè)作為可調(diào)度實(shí)體的線程。
        1. 這些線程可以在全系統(tǒng)內(nèi)進(jìn)行資源的競(jìng)爭(zhēng)。

        2. 內(nèi)核空間內(nèi)為每一個(gè)內(nèi)核支持線程設(shè)置了一個(gè)線程控制塊(PCB),內(nèi)核根據(jù)該控制塊,感知線程的存在,并進(jìn)行控制。

        3. 在一定程度上類(lèi)似于進(jìn)程,只是創(chuàng)建、調(diào)度的開(kāi)銷(xiāo)要比進(jìn)程小。有的統(tǒng)計(jì)是1:10

        • 內(nèi)核線程的優(yōu)點(diǎn):

          1. 不需要任何新的、非阻塞的系統(tǒng)調(diào)用;

          2. 當(dāng)有多個(gè)處理機(jī)時(shí),一個(gè)進(jìn)程的多個(gè)線程可以同時(shí)執(zhí)行。

        • 內(nèi)核線程的缺點(diǎn):

          1. 由內(nèi)核進(jìn)行調(diào)度,如果線程的操作比較多,就會(huì)帶來(lái)很大的開(kāi)銷(xiāo)。
      2. 用戶級(jí)線程:

        • 用戶級(jí)線程僅存在于用戶空間?!?gt;對(duì)比內(nèi)核(3)
        1. 內(nèi)核并不能看到用戶線程。——>重要的區(qū)別

        2. 內(nèi)核資源的分配仍然是按照進(jìn)程進(jìn)行分配的;各個(gè)用戶線程只能在進(jìn)程內(nèi)進(jìn)行資源競(jìng)爭(zhēng)。

        • 用戶進(jìn)程的優(yōu)點(diǎn):

          1. 線程的調(diào)度不需要內(nèi)核直接參與,控制簡(jiǎn)單;具有較好的可擴(kuò)展性。
        • 內(nèi)核線程的缺點(diǎn):

          1. 資源調(diào)度按照進(jìn)程進(jìn)行,多個(gè)處理機(jī)下,同一個(gè)進(jìn)程中的線程只能在同一個(gè)處理機(jī)下分時(shí)復(fù)用;

          2. 如果有一個(gè)線程引起頁(yè)面故障,由于內(nèi)核不知道有線程的存在,通常會(huì)把整個(gè)進(jìn)程阻塞直到磁盤(pán)I/O完成為止,盡管其他線程是可以運(yùn)行的。

    • 多線程設(shè)計(jì)不是并行設(shè)計(jì)(而是切換進(jìn)行)

  • 進(jìn)程間通信(線程類(lèi)似)

    • 三個(gè)問(wèn)題:

      • 如何傳遞消息?

      • 確保多個(gè)進(jìn)程在關(guān)鍵活動(dòng)時(shí)不會(huì)交叉

      • 正確的順序

    • 競(jìng)爭(zhēng)條件(race condition):兩個(gè)或多個(gè)進(jìn)程讀寫(xiě)某些共享數(shù)據(jù),而最后結(jié)果取決于進(jìn)程運(yùn)行時(shí)的精確時(shí)序

    • 互斥(mutual exclusion):解決競(jìng)爭(zhēng)條件的手段,確保當(dāng)一個(gè)進(jìn)程在使用一個(gè)共享變量或文件時(shí),其他進(jìn)程不能做同樣的操作

    • 臨界區(qū)域(critical region):對(duì)共享內(nèi)存進(jìn)行訪問(wèn)的程序片段稱作臨界區(qū)域,或臨界區(qū)(critical section)

    • 解決并發(fā)的方案,需要滿足4個(gè)條件:

      1. 空閑讓進(jìn)

      2. 忙則等待

      3. 有限等待

      4. 讓權(quán)等待(阻塞的進(jìn)程把CPU讓給其他進(jìn)程)

    • 忙等待互斥的5種方法

      1. 屏蔽中斷:進(jìn)程進(jìn)入臨界區(qū)后立即屏蔽所有中斷,因?yàn)镃PU只有在發(fā)生中斷時(shí)才會(huì)進(jìn)行進(jìn)程切換,所以可以實(shí)現(xiàn)互斥。

        • 結(jié)論:對(duì)于操作系統(tǒng)而言是很用的,但是對(duì)于用戶進(jìn)程而言則不是一個(gè)合適的方法,因?yàn)榘哑帘沃袛嗟臋?quán)力交給用戶不明智
      2. 鎖變量:軟件解決方案,這把鎖實(shí)際就是個(gè)變量,可用0來(lái)表示當(dāng)前進(jìn)程可以進(jìn)入臨界區(qū),1表示已有進(jìn)程在臨界區(qū)中。

        • 最后還是有可能兩個(gè)進(jìn)程同時(shí)進(jìn)入臨界區(qū)
      3. 嚴(yán)格輪換法:

        • 雖然可以實(shí)現(xiàn)互斥,但不能讓權(quán)等待

        • 忙等待(busy waiting):連續(xù)測(cè)試一個(gè)變量直到某個(gè)值出現(xiàn)為止

      4. Peterson解法:忙等待的一種,不能讓權(quán)等待

      5. TSL指令:需要硬件支持,同屬于忙等待,不能讓權(quán)等待

    • 生產(chǎn)者-消費(fèi)者問(wèn)題

      • 描述:兩個(gè)進(jìn)程共享一個(gè)公共的固定大小的緩沖區(qū),其中一個(gè)是生產(chǎn)者,將信息放入緩沖區(qū);另一個(gè)是消費(fèi)者,從緩沖區(qū)中取出消息。

      • 問(wèn)題1:當(dāng)緩沖區(qū)已滿時(shí),生產(chǎn)者還想向其中放入一個(gè)新的數(shù)據(jù)項(xiàng)要怎么辦?

        • 解決:讓生產(chǎn)者睡眠,待消費(fèi)者從緩沖區(qū)中取出一個(gè)或多個(gè)數(shù)據(jù)項(xiàng)時(shí)再喚醒它。
      • 問(wèn)題2:當(dāng)緩沖區(qū)為空時(shí),消費(fèi)者想從中取出一個(gè)數(shù)據(jù)項(xiàng)怎么辦?

        • 解決:讓消費(fèi)者睡眠,待生產(chǎn)者放入數(shù)據(jù)項(xiàng)后再喚醒它
      • 代碼:

          #define N 100
          int count = 0;
          void producer(void)
          {
               int item;
               while(TRUE){
                    item = produce_item();
                    if(count == N)sleep();
                    insert_item(item);
                    count = count + 1;
                    if(count == 1)wakeup(consumer);
               }
          }
          void consumer(void)
          {
               int item;
               while(TRUE){
                    if(count == 0)sleep();
                    item = remove_item();
                    count = count - 1;
                    if(count == N-1)wakeup(producer);
                    consume_item(item);
               }
          }
        
    • 進(jìn)程間通信(IPC:Interprocess Communication):提供一套進(jìn)程通信、進(jìn)程同步的機(jī)制

    • 消息系統(tǒng):進(jìn)程間相互通信的途徑,不需要共享變量的介入

    • 信號(hào)量(semaphore):使用一個(gè)整型變量來(lái)累計(jì)喚醒次數(shù),供以后使用,取值可以為0(表示沒(méi)有保存下來(lái)的喚醒操作),或者為正值(表示有一個(gè)或多個(gè)喚醒操作)

    • 互斥量(mutex):如果不需要信號(hào)量的計(jì)數(shù)能力,可以簡(jiǎn)化,稱作互斥量,它僅僅適用于管理共享資源或一小段代碼,因?yàn)閷?shí)現(xiàn)容易且高效,所以在實(shí)現(xiàn)用戶空間線程包時(shí)特別有用

    • 互斥量有兩種取值,解鎖(取0)和加鎖(取其他值)

  • 調(diào)度

    • 調(diào)度程序(scheduler):當(dāng)多進(jìn)程同時(shí)競(jìng)爭(zhēng)CPU時(shí),只要有超過(guò)兩個(gè)的進(jìn)程處于就緒態(tài),那么單CPU必須選擇下一個(gè)要運(yùn)行的進(jìn)程,完成選擇工作的程序稱為調(diào)度程序(另稱CPU調(diào)度器)

    • CPU分配器(Dispatcher):調(diào)度器決定了將CPU分配給誰(shuí),然后分配器將CPU控制權(quán)交給該進(jìn)程,操作內(nèi)容通常包括:

      • 上下文切換(switching context):這通常是一種額外開(kāi)銷(xiāo)(overhead),切換時(shí)間取決于CPU硬件支持力度

      • 從內(nèi)核態(tài)(kernel mode)轉(zhuǎn)移至用戶態(tài)(user mode)

    • 調(diào)度算法(scheduling algorithm):調(diào)度程序所使用的算法

    • 進(jìn)程行為:進(jìn)程的行為一般分為I/O和計(jì)算(CPU),根據(jù)占用時(shí)間不同,分為I/O密集型(I/O burst)進(jìn)程和CPU密集型(CPU burst)進(jìn)程

    • 有必要指出:隨著CPU變得越來(lái)越跨,更多進(jìn)程傾向于I/O密集型,因?yàn)镃PU的改進(jìn)比磁盤(pán)快得多

    • 何時(shí)調(diào)度:

      1. 創(chuàng)建一個(gè)新進(jìn)程之后,需要決定是運(yùn)行父進(jìn)程還是子進(jìn)程(調(diào)度程序可以合法選擇)

      2. 當(dāng)一個(gè)進(jìn)程退出時(shí)必須作出調(diào)度決策

      3. 當(dāng)一個(gè)進(jìn)程阻塞在I/O和信號(hào)量上或由于其他原因阻塞時(shí),必須選擇另一個(gè)進(jìn)程運(yùn)行

      4. 在一個(gè)I/O中斷發(fā)生時(shí),必須作出調(diào)度決策

    • 調(diào)度算法分為兩類(lèi):

      1. 非搶占式(nonpreemptive)調(diào)度算法:挑選一個(gè)進(jìn)程讓它一直執(zhí)行直至被阻塞或自動(dòng)釋放CPU(在這種情況下,該進(jìn)程若交出CPU都是自愿的)

      2. 搶占式(preemptive)調(diào)度算法:挑選一個(gè)進(jìn)程讓它運(yùn)行某個(gè)固定時(shí)間的最大值,結(jié)束時(shí)會(huì)被掛起,調(diào)度程序會(huì)選擇另一個(gè)合適的進(jìn)程來(lái)運(yùn)行(優(yōu)先級(jí)高的先調(diào)度),必須要有可用的時(shí)鐘來(lái)發(fā)生時(shí)鐘中斷,不然只能用非搶占式調(diào)度算法

    • 衡量調(diào)度程序(調(diào)度算法)好壞的幾個(gè)指標(biāo):

      • 吞吐量(throughout):系統(tǒng)每小時(shí)完成的作業(yè)數(shù)量

      • 周轉(zhuǎn)時(shí)間(turnaround time):從一個(gè)批處理作業(yè)提交時(shí)刻開(kāi)始直到該作業(yè)完成時(shí)刻位置的統(tǒng)計(jì)平均時(shí)間

      • CPU利用率(CPU Utilization)

      • 等待時(shí)間

    • 調(diào)度算法(批處理、交互式、實(shí)時(shí))

      • 批處理系統(tǒng):

        • 先來(lái)先服務(wù)(FCFS:first-come first-served)

          • 容易理解:建立一個(gè)隊(duì)列,選取進(jìn)程運(yùn)行時(shí),從隊(duì)列頭部選取,添加進(jìn)程時(shí),添加到隊(duì)列的尾部

          • 但是通過(guò)例子可以發(fā)現(xiàn),短進(jìn)程比長(zhǎng)進(jìn)程先執(zhí)行,平均等待時(shí)間會(huì)縮短

        • 最短作業(yè)優(yōu)先法(shortest job first)

          • 前提:預(yù)知進(jìn)入就緒隊(duì)列的進(jìn)程執(zhí)行時(shí)間

          • 原理:假設(shè)有4個(gè)進(jìn)程,其運(yùn)行時(shí)間分別為a,b,c,d,第一個(gè)進(jìn)程在a時(shí)刻結(jié)束,第二個(gè)進(jìn)程在a+b時(shí)刻結(jié)束,以此類(lèi)推,平均周轉(zhuǎn)時(shí)間為(4a+3b+2c+d)/4,可以看到a對(duì)平均值的影響最大,所以a應(yīng)該取最小值才好,這樣平均周轉(zhuǎn)時(shí)間才能取到最小值

          • 搶占式SJF算法:當(dāng)一個(gè)進(jìn)程進(jìn)入就緒隊(duì)列,如果它的CPU時(shí)間小于當(dāng)前擁有CPU的進(jìn)程的剩余“預(yù)估”時(shí)間,前者搶占后者的CPU,稱為 Shortest-Remaining-Time-First(SRTF),不能實(shí)現(xiàn)

          • SJF算法是最優(yōu)的算法

          • SJF有致命缺陷,如何預(yù)估進(jìn)入就緒隊(duì)列的進(jìn)程的執(zhí)行時(shí)間?

            • 不可能準(zhǔn)確地預(yù)測(cè),比如需要用戶輸入,這是不可知的

            • 只能根據(jù)過(guò)去的CPU burst cycle來(lái)預(yù)測(cè)

          • HRN(Highest response Ratio Next)

            • HRN = (W + T)/ T

            • W為等待時(shí)間,T代表預(yù)估CPU時(shí)間

      • 交互式系統(tǒng):

        • 輪轉(zhuǎn)調(diào)度(Round Robin,RR)

          • 時(shí)間片(quantum):每個(gè)進(jìn)程被分配一個(gè)時(shí)間段,即允許該進(jìn)程在該時(shí)間段中運(yùn)行,如果在時(shí)間片結(jié)束時(shí)該進(jìn)程還在運(yùn)行,則將剝奪CPU給下一個(gè)進(jìn)程,如果該進(jìn)程在時(shí)間片結(jié)束前阻塞或結(jié)束,則CPU立即切換

          • 假設(shè)n個(gè)就緒進(jìn)程,時(shí)間片q,每個(gè)就緒進(jìn)程得到1/n的CPU時(shí)間,任何就緒進(jìn)程最多等待(n-1)q單位時(shí)間

          • 平均周轉(zhuǎn)時(shí)間通常優(yōu)于SJF

          • 響應(yīng)時(shí)間一定優(yōu)于SJF

          • 性能分析:

            • q如果很大,則FIFO

            • q如果很小,則進(jìn)程切換,或稱上下文切換(context switch)開(kāi)銷(xiāo)太大,所謂上下文切換是:從一個(gè)進(jìn)程切換到另一個(gè)進(jìn)程是需要一定的時(shí)間的,所以q必須遠(yuǎn)遠(yuǎn)大于上下文切換時(shí)間

          • 結(jié)論:時(shí)間片設(shè)得太短會(huì)導(dǎo)致過(guò)多的進(jìn)程切換,降低了CPU的效率;而設(shè)得太長(zhǎng)有可能引起對(duì)短的交互請(qǐng)求的響應(yīng)時(shí)間變長(zhǎng),通常將時(shí)間片設(shè)為20ms~50ms是合理的這種

        • 優(yōu)先級(jí)調(diào)度(Priority Schedule)

          • 每個(gè)進(jìn)程都有一個(gè)優(yōu)先數(shù)(priority number),通常是整數(shù)

          • Scheduler每次會(huì)選取就緒隊(duì)列中,優(yōu)先級(jí)最高的進(jìn)程執(zhí)行

          • 當(dāng)優(yōu)先級(jí)定義為“進(jìn)程需要的CPU時(shí)間”時(shí),SJF算法就是優(yōu)先級(jí)調(diào)度

          • 優(yōu)先級(jí)可由系統(tǒng)動(dòng)態(tài)確定,例如:有些進(jìn)程為I/O密集型,其多數(shù)時(shí)間在等待I/O操作,當(dāng)這樣的進(jìn)程需要CPU時(shí),應(yīng)盡快地給它CPU,已便它能很快地執(zhí)行完CPU操作然后去等待I/O操作,下一個(gè)進(jìn)程就可以同時(shí)進(jìn)入CPU。如何實(shí)現(xiàn)這樣的效果呢?一個(gè)簡(jiǎn)單算法:其優(yōu)先級(jí)設(shè)為1/f,f為該進(jìn)程在上一個(gè)時(shí)間片所占的部分。

          • 進(jìn)程饑餓(Starvation):優(yōu)先級(jí)較低的進(jìn)程可能永遠(yuǎn)得不到CPU

          • 解決:Aging思想,優(yōu)先級(jí)要考慮就緒進(jìn)程在就緒隊(duì)列里的等待時(shí)間,因此,若一個(gè)進(jìn)程在就緒隊(duì)列中等待,那它的優(yōu)先級(jí)會(huì)單調(diào)遞增

        • 多級(jí)隊(duì)列(Multilevel Queue)

          • 把就緒隊(duì)列拆分成幾個(gè)隊(duì)列

          • 每個(gè)隊(duì)列有其自己的調(diào)度算法,比如前臺(tái)就緒隊(duì)列需交互性,采用輪轉(zhuǎn)法,后臺(tái)就緒隊(duì)列需批處理,采用先來(lái)先服務(wù)法

          • CPU怎么在隊(duì)列間分配?

            • 固定優(yōu)先權(quán)法,例如,先前臺(tái)隊(duì)列,再后臺(tái)隊(duì)列

            • 時(shí)間片辦法,例如,80%的CPU時(shí)間給前臺(tái)隊(duì)列,20%的CPU時(shí)間給后臺(tái)進(jìn)程

        • 多級(jí)反饋隊(duì)列(Multilevel Feedback Queue)

          • 基于多級(jí)隊(duì)列,但另外考慮了進(jìn)程在就緒隊(duì)列之間可以遷移

          • 定義這樣的算法應(yīng)該著重考慮:

            • 隊(duì)列個(gè)數(shù)

            • 每級(jí)隊(duì)列的調(diào)度算法

            • 如何將就緒進(jìn)程升級(jí)至高層次隊(duì)列

            • 如何將就緒進(jìn)程降低至低層次隊(duì)列

            • 當(dāng)一個(gè)就緒進(jìn)程進(jìn)入就緒隊(duì)列時(shí),應(yīng)該去哪一級(jí)?

      • 實(shí)時(shí)調(diào)度

        • 硬實(shí)時(shí)(hard real time)調(diào)度:調(diào)度機(jī)制確保一個(gè)關(guān)鍵任務(wù)能在指定時(shí)間前完成

        • 軟實(shí)時(shí)(soft real time)調(diào)度:調(diào)度機(jī)制盡量給予關(guān)鍵任務(wù)最高優(yōu)先級(jí),盡量在指定時(shí)間前完成

    • 調(diào)度算法目標(biāo):1)公平;2)保持系統(tǒng)素有部分盡可能忙碌;

      • 批處理:1)吞吐量;2)周轉(zhuǎn)時(shí)間;3)CPU利用率。

      • 交互式:1)最小響應(yīng)時(shí)間;2)均衡性。

      • 實(shí)時(shí):1)滿足截止時(shí)間;2)可預(yù)測(cè)性。

    • 調(diào)度算法評(píng)估:

      • 確定模型法(Deterministic modeling):采用事先設(shè)定的特定負(fù)荷,計(jì)算在給定負(fù)荷下每個(gè)算法的性能

      • 排隊(duì)模型(Queueing models)

      • 編程實(shí)現(xiàn)該算法,觀察其執(zhí)行情況

      • 仿真

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容