日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

操作系统(OS)进程与调度

發(fā)布時間:2023/12/14 windows 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 操作系统(OS)进程与调度 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、進程的定義、組成、組織方式、特征

1.1 進程的定義

1、程序:一個指令序列,即指令(或語句)的集合。
2、程序的順序執(zhí)行:指令之間是順序關系,是一個靜態(tài)的概念,僅當前一操作(程序段)執(zhí)行完后,才能執(zhí)行后繼操作。
3、順序執(zhí)行的特點:

  • 順序性;處理機的操作嚴格按照程序所規(guī)定的順序執(zhí)行
  • 封閉性;程序獨占全機資源,程序執(zhí)行結果不受外界因素的影響
  • 可再現性;只要輸入的初始條件相同,則無論何時重復執(zhí)行該程序都會得到相同的結果。

4、程序的并發(fā)執(zhí)行:

  • 間斷性:任意程序不可能一直占有CPU
  • 失去封閉性:多個程序共享系統(tǒng)中的各種資源,因而這些資源的狀態(tài)將由多個程序來改變,致使程序的運行失去了封閉性。
  • 不可再現性:程序在并發(fā)執(zhí)行時,由于失去了封閉性,也導致失去了可再現性。

5、PCB:進程控制塊,用來描述進程的各種信息。因為PCB經常被系統(tǒng)訪問,所以應常駐內存
6、進程實體:由PCB、程序段、數據段三部分組成,又稱為進程
7、進程:進程是進程實體的運行過程,是系統(tǒng)進行資源分配和調度的一個獨立單位
8、PCB與進程的關系:PCB是進程存在的唯一標志。所謂創(chuàng)建進程,即創(chuàng)建進程實體中的PCB;撤銷進程即撤銷進程實體中的PCB
9、進程的基本屬性:進程是一個可擁有資源的獨立單位;進程又是一個可獨立調度的基本單位。
10、進程與程序的關系:前者是一種動態(tài)概念,而后者是一種靜態(tài)概念,進程是程序的一次執(zhí)行

1.2 進程的組成

1、PCB:包括進程描述信息、進程控制和管理信息、資源分配清單、處理機相關信息
2、程序段:存放要執(zhí)行的代碼
3、數據段:存放程序運行過程中處理的各種數據

1.3 進程的組織方式

線性方式:按照進程狀態(tài)將PCB分為多個隊列,如就緒隊列、阻塞隊列等,操作系統(tǒng)持有指向各個隊列的指針
索引方式:根據進程狀態(tài)的不同建立幾張索引表,如就緒索引表、阻塞索引表等,操作系統(tǒng)持有指向各個索引表的指針

1.4 進程的特征

動態(tài)性:進程是進程實體的一次執(zhí)行過程(動態(tài)性),有一定的生命周期(由創(chuàng)建而產生,由調度而執(zhí)行,由撤消而消亡)。
并發(fā)性:多個進程同存于內存中,且能在一段時間內同時運行。
獨立性: 進程是一個能獨立運行,獨立分配資源和獨立接受調度的基本單位。
異步性:進程按各自獨立的、不可預知的速度向前推進。
結構性:從結構上看,進程實體至少包括: 程序、數據和進程控制塊(PCB) 。

二、進程的狀態(tài)與轉換

2.1 進程的五種狀態(tài)

  • 運行態(tài):占有CPU、并在CPU上運行
  • 就緒態(tài):已具備運行條件(已分配到除CPU以外的所有必要資源),但由于沒有空閑CPU而暫時不能運行
  • 阻塞態(tài):因等待某一事件而暫時不能運行,放棄CPU
  • *創(chuàng)建態(tài):進程正在被創(chuàng)建,操作系統(tǒng)為進程分配資源,初始化PCB
  • *終止態(tài):進程正在從系統(tǒng)中撤銷,操作系統(tǒng)會回收進程擁有的資源,撤銷PCB
  • 補充:掛起態(tài):掛起進程即把進程放在外存中
  • 引入掛起狀態(tài)的原因
    終端用戶的請求。暫停進程的執(zhí)行,修改程序。
    (2) 父進程請求。 掛起自己的子進程。
    (3) 負荷調節(jié)的需要。把不重要的進程掛起,避免系統(tǒng)負荷較重。
    (4) 操作系統(tǒng)的需要。 檢查資源使用情況等。

2.2 進程狀態(tài)的轉換


加入掛起態(tài)以后

三、進程控制

3.1 操作系統(tǒng)內核

  • 1、內核定義:計算機上配置的底層軟件,是操作系統(tǒng)最基本、最核心的部分。操作系統(tǒng)分為非內核部分和內核部分
  • 2、內核目的:便于對軟件進行保護,防止遭到其他應用程序的破壞;提高OS的運行效率
  • 3、內核功能:
    • 時鐘管理:實現計時功能
    • 中斷管理:負責實現中斷機制
    • 原語
    • 對系統(tǒng)資源進行管理:進程管理、存儲器管理、設備管理
    • 其中,時鐘管理、中斷管理和原語是與硬件關聯(lián)較為緊密的部分
  • 4、原語:一種特殊的程序,處于操作系統(tǒng)最底層,是最接近硬件的部分。這種程序的運行具有原子性——其運行只能一氣呵成,不可中斷

3.2 進程控制

1、進程控制定義:
① 進程控制包括創(chuàng)建新進程、終止已完成的進程、進程的阻塞與喚醒等功能
② 系統(tǒng)為進程進行的操作:創(chuàng)建進程(分配內存、I/O、PCB);進程切換(保留現場、恢復環(huán)境);撤消進程(回收資源、撤消PCB)
③ 進程控制一般是由OS內核中的原語實現控制,原語采用“開中斷指令”和“關中斷指令”實現

④ 進程控制具體流程如下圖:

3.2.1 進程的創(chuàng)建

1、引起創(chuàng)建進程的事件:用戶登錄、作業(yè)調度、提供服務(前三個由系統(tǒng)內核創(chuàng)建)、應用請求(由用戶創(chuàng)建)
2、進程狀態(tài)轉換:無 -> 創(chuàng)建態(tài) -> 就緒態(tài)
3、創(chuàng)建流程:(如下流程都是在 原語 中實現)

3.2.2 進程的終止

1、引起進程終止的事件:正常結束,異常結束,外界干擾
2、進程狀態(tài)轉換:就緒態(tài)/阻塞態(tài)/運行態(tài) -> 終止態(tài) -> 無
3、終止流程:

3.2.3 進程的阻塞與喚醒

1、引起進程阻塞與喚醒的事件:請求系統(tǒng)服務不能滿足時 ;啟動某種操作 如I/O;新數據尚未到達;無新工作可做
2、進程狀態(tài)轉換:

  • 阻塞:運行態(tài) -> 阻塞態(tài)
  • 喚醒:阻塞態(tài) -> 喚醒態(tài)

3、阻塞原語與喚醒原語必須成對出現
4、阻塞過程:

5、喚醒過程:

四、進程同步

1、進程同步定義:同步又稱直接制約關系,它是指未完成某種任務而建立的兩個或多個進程,這些進程因為需要在某些位置上協(xié)調他們的工作次序而產生的制約關系
2、兩種形式的制約關系

  • 間接相互制約關系。進程間要通過某種中介發(fā)生聯(lián)系。即互斥關系,排他性地對資源的訪問。
    互斥必須滿足兩個條件:
    (1)多個進程共享同一個臨界資源。
    (2)共享的方式是先來者先使用的異步方式。
  • 直接相互制約關系。即同步關系,指多個進程的執(zhí)行有先后順序的限制。

3、臨界資源: 系統(tǒng)中某些資源一次只允許一個進程使用,稱這樣的資源為臨界資源或互斥資源。如打印機、共享的變量、緩沖區(qū)等。
4、臨界區(qū)(互斥區(qū)):在進程中訪問臨界資源的程序段叫臨界區(qū)。
5、一個訪問臨界資源的循環(huán)進程應為如下結構:

While (1) { entry section; //進入區(qū)critical section; //臨界區(qū)exit section; //退出區(qū)remainder section;//剩余區(qū) }; 其中:進入區(qū):進入區(qū)的代碼用來檢查臨界資源是否正在被其它進程使用,若正在被訪問,則不能進入臨界區(qū),若未被訪問,則可進入臨界區(qū),并設置訪問標志為真。退出區(qū):將臨界區(qū)正在被訪問的標志設置為假

6、同步機制應遵循的準則

  • 為了保證進程互斥進入臨界區(qū),系統(tǒng)需設置專門的同步機制,同步機制應遵循4個準則:
  • 1空閑讓進。當無進程在臨界區(qū)時,任何有權使用臨界區(qū)的進程可進入。
  • 2忙則等待。不允許兩個以上的進程同時進入臨界區(qū)。
  • 3有限等待。任何進入臨界區(qū)的進程應在有限的時間內得到滿足。
  • 4讓權等待。當進程不能進入臨界區(qū)時,應立即放棄CPU,以免進程陷入“忙等”。

4.1 信號量機制

1、信號量其實就是一個變量,可以用一個信號量來表示系統(tǒng)中某種資源的數量
2、一對原語:包含wait(S)原語和signal(S)原語,簡稱P、V操作,通常使用這一對原語對信號量S實施操作。該P、V操作必須成對出現
3、整型信號量

void wait(int S){while(S <= 0);S = S - 1; } void signal(int S){S = S + 1; }

注意:注意:在wait操作中,當S≤0時,就會不斷測試而使進程處于“忙等”狀態(tài)。不滿足“讓權等待”原則。
4、記錄型信號量,可以實現讓權等待原則。

typedef struct{int value; //value的值表示系統(tǒng)中某類資源的數目struct process *L; //進程鏈表L,用來鏈接所有的等待進程。即等待隊列 }semaphore; void wait(semaphore S){S.value--;if(S.value < 0){block(S.L);//若資源數不夠,使用block原語將進程從運行態(tài)變成阻塞態(tài),并把信號量S掛到等待隊列(即阻塞隊列)中,即實現讓權等待原則} } void signal(semaphore S){S.value++;if(S.value <= 0){wakeup(S.L);//釋放資源后,使用wakeup原語將進程從等待隊列中取出,該進程從阻塞態(tài)變成就緒態(tài)} }

5、AND型信號量
實現思想:將進程在整個運行過程中需要的所有資源,一次性全部地分配給進程,待進程使用完后再一起釋放。只要尚有一個資源未能分配給進程,其它所有可能為之分配的資源,也不分配給他。
目的:避免死鎖

Swait(S1, S2,, Sn)if S1≥1 and … and Sn≥1 thenfor i∶=1 to n doSi∶=Si-1;endforelse把此執(zhí)行進程插入第一個小于1的信號量Si的等待隊列中,阻塞此執(zhí)行進程; endif Ssignal(S1, S2,, Sn)for i∶=1 to n doSi=Si+1;把等待資源Si的隊列中的所有進程移到就緒隊列中;endfor;

6、信號量集

Swait(S1, t1, d1,, Sn, tn, dn) //S為信號量,t為下限值,d為需求值if S1≥t1 and … and Sn≥tn thenfor i∶=1 to n doSi∶=Si-di;endforelse把此執(zhí)行進程插入第一個Si<ti的信號量Si的等待隊列中,阻塞此執(zhí)行進程;endif signal(S1, d1,, Sn, dn)for i∶=1 to n doSi∶=Si+di;把等待資源Si的隊列中的所有進程移到就緒隊列中; endfor;

7、信號量集的幾種情況:

  • (1) Swait(S, d, d)。 此時在信號量集中只有一個信號量S, 但允許它每次申請d個資源,當現有資源數少于d時,不予分配
  • (2) Swait(S, 1, 1)。 此時的信號量集已蛻化為一般的記錄型信號量(S>1時)或互斥信號量(S=1時)。
  • (3) Swait(S, 1, 0)。這是一種很特殊且很有用的信號量操作。當S≥1時,允許多個進程進入某特定區(qū);當S變?yōu)?后,將阻止任何進程進入特定區(qū)。換言之,它相當于一個可控開關。

8、信號量機制實現進程互斥

  • 1分析并發(fā)進程的關鍵活動,劃定臨界區(qū)
  • 2設置互斥信號量mutex(semaphore類型)
  • 3在臨界區(qū)之前執(zhí)行P操作;臨界區(qū)之后執(zhí)行V操作

9、信號量機制實現進程同步

  • 1分析什么地方需要同步關系,即必須保證“一前一后”執(zhí)行的兩個操作
  • 2設置同步信號量S,初始為0
  • 3在“前操作”之后執(zhí)行V操作;在“后操作”之前執(zhí)行P操作

10、信號量機制實現前驅關系(實際上也是進程同步問題)

Var a,b,c,d,e,f,g; semaphore∶=0,0,0,0,0,0,0;beginparbeginbegin S1; signal(a); signal(b); end;begin wait(a); S2; signal(c); signal(d); end;begin wait(b); S3; signal(e); end;begin wait(c); S4; signal(f); end;begin wait(d); S5; signal(g); end;begin wait(e); wait(f); wait(g); S6; end;parendend

*4.2 管程

1、背景:使用信號量機制,要求每個訪問臨界資源的進程都必須自備同步操作wait(s)和signal(s),使大量的同步操作分散在各
個進程中,1) 系統(tǒng)無法有效控制、管理;2)容易導致死鎖;3)不利于修改和維護
2、管程的定義:在程序設計級控制進程互斥與同步的機制
3、組成:① 局部于管程的共享變量說明;② 對該數據結構進行操作的一組過程;③ 對局部于管程的數據設置初始值的語句;④管程有一個名字(和類的概念類似)
4、管程使用的注意事項:
①局部于管程的數據結構,只能被局部于管程內的過程訪問。
②局部于管程的過程只能訪問管程內的數據結構。
③管程每次只允許一個進程進入,從而實現進程互斥。

五、經典進程的同步問題

同步問題的分析步驟
①關系分析:找出題目中的各個進程,分析它們之間的同步、異步關系
②整理思路:根據各進程的操作流程確定P、V操作的大致順序
③設置信號量:根據題目條件確定信號量初值(互斥一般為1,同步要根據資源的初始值)

5.1 生產者-消費者問題

1、問題描述:1個生產者生產數據后寫入緩沖區(qū)Buffer,1個消費者從緩沖區(qū)讀出數據后消費。

2、關系分析:

  • 同步關系:
    當Buffer為滿時,生產者進程必須等待消費者進程先執(zhí)行;
    當Buffer為空時,消費者進程必須等待生產者進程先執(zhí)行。
  • 互斥關系:
    緩沖區(qū)是臨界資源,各進程必須互斥的訪問

3、整理思路
生產者消耗(P)一個緩沖區(qū),同時生產(V)一個產品;
消費者消耗(V)一個產品同時釋放(P)一個緩沖區(qū)
取走/放入產品需要互斥
4、設置信號量
semaphone mutex = 1; //互斥信號量,實現對緩沖區(qū)的互斥訪問
semaphone empty = n; //同步信號量,表示空閑緩沖區(qū)的數量
semaphone full = 0; //同步信號量,表示產品的數量
5、實現

semaphore full=0, empty=N, mutex=1; Producer (){while(true) {生產數據; P(empty);P(mutex);寫數據到Buffer;V(mutex);V(full);} }; Consumer (){while(true) {P(full);P(mutex);從緩沖區(qū)讀數據;V(mutex);V(empty);消費數據;} };

注意:上述兩個P操作不可以改變順序。假設現在緩沖區(qū)已滿,即empty=0,full = n,此時先執(zhí)行P(mutex)操作,進入臨界區(qū);再執(zhí)行P(empty)操作,由于empty=0,因此該進程會被阻塞,此時若執(zhí)行消費者進程,由于mutex=0,因此消費者進程也會被阻塞,這樣會造成死鎖的產生。因此,實現互斥的P操作一定要在實現同步的P操作之后,V操作的順序是可以互換的
6、AND實現

semaphore mutex=1, empty=N, full=0; Producer i: while(true) {生產數據; Swait(empty, mutex); 寫數據到Buffer;Ssignal(mutex, full);}; Consumer i: while(true) {Swait(full, mutex);從緩沖區(qū)讀數據;Ssignal(mutex, empty);消費數據;};

5.2 多生產者-多消費者問題

1、問題描述:桌子上一個盤子,每次只能放一個水果。爸爸專門像盤子中放入蘋果,媽媽放入橘子。兒子專等橘子,而女兒專等蘋果。只有盤子為空時,爸爸或媽媽才能放水果。僅當盤子中有自己需要的水果時,兒子或女兒才可以取出水果
2、關系分析:

  • 互斥關系:
    對盤子的訪問要互斥進行
  • 同步關系:
    只有父親放入蘋果女兒才能取;
    只有母親放入橘子兒子才能取;
    只有盤子為空時父母才可以放水果

3、整理思路

4、設置信號量
semaphone mutex = 1; //互斥信號量,實現對盤子的互斥訪問
semaphone apple = 0; //同步信號量
semaphone orange = 0; //同步信號量
semaphone plate = 1; //同步信號量,表示還可以放多少個水果
5、實現

6、補充:即使不設置互斥變量mutex,也不會出現多個進程同時訪問盤子的現象。因為在任何時刻,apple、orange、plate三個同步信號量最多只有一個是1,因此任何時刻都是最多只有一個進程的p操作不會被阻塞順利進入臨界區(qū)。(要是plate≠1那就要設置互斥變量了)

5.3 吸煙問題

1、問題描述:一個系統(tǒng)有三個抽煙者進程和一個供應者進程,抽煙者需要煙草、紙和膠水三種材料才能抽的了煙。現在三個抽煙者分別擁有其中一種材料,供應者每次將其中兩種材料放入到桌子上,擁有剩下那種材料的抽煙者取走抽煙,并向供應者返回一個已抽完的信號,供應者就會再次放入兩種材料到桌子上。一直重復上述過程,三個抽煙者輪流抽煙
2、關系分析:

  • 互斥關系:
    桌子需要互斥訪問
  • 同步關系:
    供應者放入組合一,一號抽煙者才能抽煙
    供應者放入組合二,二號抽煙者才能抽煙
    供應者放入組合三,三號抽煙者才能抽煙
    抽煙者返回抽完信號供應者才能再放材料

3、整理思路

4、設置信號量

5、實現

6、上述問題也無需設置互斥信號量,理由同上一個問題

5.4 讀寫問題

1、問題描述:對于文件、數據,可能有多個讀者和寫者對其進行操作。要求:多個讀者可以同時操作;讀者與寫者、多個寫者之間的操作應互斥。
2、關系分析:

  • 互斥關系:
    寫者——寫者;寫者——讀者
  • 關鍵問題:讀者——讀者(雖然可以多個讀者一起訪問,但是若是多個讀者同時訪問可能會造成死鎖問題,因此要對讀者進行互斥進入訪問)

3、整理思路

4、設置信號量
semaphore rmutex = 1; //讀者對文件進行互斥訪問
int count = 0; //記錄當前有幾個讀者正在訪問進程
semaphore wmutex = 1; //寫者對文件進行互斥訪問
5、實現

semaphore rmutex=1, wmutex=1; Readcount=0; Writer()//寫者進程 { while(1){P(wmutex); 寫數據;V(wmutex); } } Reader()//讀者進程 { while(1){P(rmutex); //各讀進程互斥訪問if readcount=0 then P(wmutex); //第一個讀進程負責加鎖Readcount=Readcount+1; V(rmutex);…讀數據;…P(rmutex);readcount=readcount-1;if readcount=0 then V(wmutex); //最后一個讀進程負責解鎖V(rmutex);} }

上述方法稱為“讀者優(yōu)先”,即一旦有讀者正在讀數據,允許多個讀者同時進入讀數據,只有當全部讀者退出,才允許寫者進入寫數據。
若實現寫者優(yōu)先,則需再加一個信號量 w = 1

semaphore rmutex=1, wmutex=1; Readcount=0; Writer()//寫者進程 { while(1){P(w);P(wmutex); 寫數據;V(wmutex); V(w);} } Reader()//讀者進程 { while(1){P(w);P(rmutex); //各讀進程互斥訪問if readcount=0 then P(wmutex); //第一個讀進程負責加鎖Readcount=Readcount+1; V(rmutex);V(w);…讀數據;…P(rmutex);readcount=readcount-1;if readcount=0 then V(wmutex); //最后一個讀進程負責解鎖V(rmutex);} }

5.5 哲學家問題

1、問題描述:五個哲學家同座一張圓桌,每人一個碗,左右各一只筷子;其習慣為:思考-吃飯-思考…;只有拿到左右兩只筷子才開始吃飯,吃完后繼續(xù)思考…。

2、關系分析:

  • 互斥關系:
    5個哲學家與其左鄰右舍對其中的筷子的訪問是互斥關系

3、整理思路

4、設置信號量
為了實現對筷子的互斥使用,可以用一個互斥信號量表示一只筷子,由這五個信號量構成信號量數組,即semaphore chopstick[5]={1,1,1,1,1};
5、實現

philosopher (i) {while (true) {思考;P(chopstick[i])//取左邊筷子P(chopstick[(i+1) mod 5])//取右邊筷子進食;V(chopstick[i])//放左邊筷子V(chopstick[(i+1) mod 5])//放右邊筷子} } AND信號解決 philosopher (i) {while (true) {思考;Sswait(chopstick[(i+1) mod 5, chopstick [i]);進食;Ssignal(chopstick [(i+1) mod 5, chopstick [i]);} }

6、若五個哲學家并發(fā)的拿起左邊的筷子,則會導致死鎖問題,解決辦法如下:
(1) 至多只允許有四位哲學家同時去拿左邊的筷子。
(2) 僅當哲學家的左、右兩只筷子均可用時,才允許他拿起筷子進餐。

semaphore mutex = 1; philosopher (i) {while (true) {思考;P(mutex);P(chopstick[i])//取左邊筷子P(chopstick[(i+1) mod 5])//取右邊筷子V(mutex); 進食;V(chopstick[i])//放左邊筷子V(chopstick[(i+1) mod 5])//放右邊筷子} }

(3) 規(guī)定奇數號哲學家先拿他左邊的筷子,然后再去拿右邊的筷子;而偶數號哲學家則相反。

六、進程通信

1、定義:是指進程之間的信息交換。
2、進程通信分類:

  • 低級通信:
    特點:交換的信息量少,僅僅是一些數據和狀態(tài)的變化;通信由程序員完成。如P,V原語實現的進程互斥與同步。
  • 高級通信;
    特點:每次交換的信息量可以很大;系統(tǒng)提供高效、簡捷的信息傳輸命令。
    3、進程通信的類型:
  • 共享存儲
    • 基于共享數據結構的通信方式:公用數據結構的設置及對進程間同步的管理,都是由程序員完成,效率低,傳遞數據量少;
    • 共享存儲區(qū)的通信方式 (如windows的剪貼板):進程可隨時向系統(tǒng)申請一塊存儲區(qū), 并指定該區(qū)的關鍵字,用于進程通信。
  • 消息傳遞
    • 進程間的數據交換以格式化的消息為單位,通過OS提供的“發(fā)送消息/接收消息”兩個原語進行數據交換
    • 消息組成:消息頭+消息體
    • 消息傳遞方式:直接通信方式(將消息直接掛到緩沖隊列上)、間接通信方式 (消息發(fā)送到中間實體中進行暫存)
  • 管道通信

七、線程的基本概念

1、線程的引入:

  • 操作系統(tǒng)引入進程的目的是為了使多個程序能并發(fā)執(zhí)行,提高資源利用率和系統(tǒng)的吞吐量。
  • 引入線程的目的是為了減少程序并發(fā)執(zhí)行時所付出的時空開銷,使OS具有更好的并發(fā)性。

2、系統(tǒng)為進程進行的操作: 創(chuàng)建進程(分配內存、I/O、PCB);進程切換(保留現場、恢復環(huán)境); 撤消進程(回收資源、撤消PCB)
3、線程的屬性:

  • 輕型實體:線程基本上不擁有系統(tǒng)資源,只有一點必不可少的、能保證獨立運行的資源。
  • 獨立調度和分派的基本單位。
  • 可并發(fā)執(zhí)行:一個進程的多個線程可以并發(fā);不同進程中的線程也能并發(fā)。
  • 共享進程資源:同一進程中的各個線程可以共享該進程擁有的資源。

4、線程的定義:作為調度和分派的基本單位
5、引入線程的目的:將進程的資源申請和調度屬性分開,即進程作為資源的申請和擁有者,但不作為調度的基本單位。使得進程內部各線程之間也可以并發(fā)
6、線程的狀態(tài):

  • ① 執(zhí)行狀態(tài),表示線程正獲得處理機而運行;
  • ② 就緒狀態(tài), 指線程已具備了各種執(zhí)行條件,一旦獲得CPU便可執(zhí)行的狀態(tài);
  • ③ 阻塞狀態(tài),指線程在執(zhí)行中因某事件而受阻,處于暫停執(zhí)行時的狀態(tài)。

7、線程控制塊TCB:在內核空間還為每一個內核支持線程設置了一個線程控制塊, 內核是根據該控制塊而感知某線程的存在的,并對其加以控制
8、多線程OS中的進程有以下屬性:

  • (1) 作為系統(tǒng)資源分配的單位。
  • (2) 可包括多個線程(至少一個),在OS中的所有線程都只能屬于某一個特定的進程。
  • (3) 進程不是一個可執(zhí)行的實體。所謂進程處于“執(zhí)行”狀態(tài),實際上是該進程的某線程正在執(zhí)行。

7.1 線程的實現

1、內核支持線程 :每個線程的線程控制塊設置在內核中,所有對線程的操作(創(chuàng)建、撤消和切換等),都是通過系統(tǒng)調用進入內核,再依靠內核中的相應處理程序予以實現的。
2、用戶級線程:用戶級線程僅存在于用戶空間中,即每個線程的線程控制塊設置在用戶空間中,所有對線程的操作也是在用戶空間中完成的,無須內核的支持。內核完全不知道用戶級線程的存在。
3、二者的區(qū)別:對于設置了用戶級線程的系統(tǒng),調度仍以進程為單位進行。例若進程A中包含1個用戶級線程,進程B包含100個用戶級線程,用輪轉法調度,則A中線程的運行時間,將是B中線程運行時間的100倍;假如系統(tǒng)設置的是內核支持線程,則調度便是以線程為單位進行。例若進程A中包含1個內核支持線程,進程B包含100個內核支持線程,用輪轉法調度,則進程B可以獲得的CPU時間是進程A的100倍。

八、調度的基本概念

1、定義:當有一堆任務要處理,由于資源有限,需要確定某種規(guī)則來決定處理這些任務的順序,而確定的這些規(guī)則就稱為調度。
2、處理機調度定義:即從就緒隊列中按照一定的算法選擇一個進程并將處理機分配給它運行,以實現進程的并發(fā)執(zhí)行。
3、調度的三個層次

  • 高級調度
    定義:按照一定的原則從外存中處于后備隊列的作業(yè)中挑選一個(或多個)作業(yè),給他們分配內存等必要資源,并建立相應的進程(建立PCB),然后將新創(chuàng)建的進程排在就緒隊列上,準備執(zhí)行,又稱作業(yè)調度。
    在每次執(zhí)行作業(yè)調度時,都須做出以下兩個決定:
  • 接納多少個作業(yè)
  • 接納哪些作業(yè)
  • 中級調度
    引入中級調度的主要目的:為了提高內存利用率和系統(tǒng)吞吐量。
    定義:即將暫時不能運行的進程調至外存上去等待(掛起狀態(tài)),當這些進程又具備運行條件、且內存又稍有空閑時,由中級調度來把外存上的進程從掛起隊列中調入內存,并修改其狀態(tài)為就緒狀態(tài),掛在就緒隊列上等待進程調度,又稱內存調度。
    中級調度即存儲器管理中的對換功能。
  • 低級調度
    • 定義:也稱進程調度,按照某種方法和策略從就緒隊列中選取一個進程,將處理機分配給它,主要用來決定就緒隊列中的哪個進程應獲得處理機。
    • 調用方式:采用以下兩種調度方式:
      • 非搶占方式:也稱非剝奪調度方式。在該調度方式下,當進程分配到處理機時,其他進程不可以搶占,只有在進程自動放棄處理機時,才進行調度。
      • 搶占方式:又稱剝奪調度方式。當一個進程正在處理機上執(zhí)行時,若有一個更重要的進程需要使用處理器,則立即暫停正在執(zhí)行的進程,將處理機分配給更重要的進程。
      • 搶占的原則:優(yōu)先權原則,允許優(yōu)先權高的新到進程搶占當前進程的處理機;短作業(yè)(進程)優(yōu)先原則,短作業(yè)(進程)可以搶占當前較長作業(yè)(進程)的處理機;時間片原則,時間片用完則重新進行調度
調度發(fā)生在…對進程狀態(tài)的影響
高級調度(作業(yè)調度)外存->內存(面向作業(yè))無->創(chuàng)建態(tài)->就緒態(tài)
中級調度(內存調度)外存->內存(面向進程)掛起態(tài)->就緒態(tài)(阻塞掛起->阻塞態(tài))
低級調度 (進程調度)內存->CPU就緒態(tài)->運行態(tài)
補充知識:進程的七狀態(tài)摩模型

8.1計算參數

1、CPU利用率:指CPU“忙碌”的時間占總時間的比例

  • 利用率 = 忙碌的時間/總時間

2、系統(tǒng)吞吐量:單位時間內完成作業(yè)的數量

  • 系統(tǒng)吞吐量 = 總共完成了多少道作業(yè)/總共花了多少時間3、周轉時間:值從作業(yè)被提交給系統(tǒng)開始,到作業(yè)完成為止的這段時間。包括四部分:a、作業(yè)在外存后備隊列上等待(作業(yè))調度的時間。b、進程在就緒隊列上等待進程調度的時間。c、進程在CPU上執(zhí)行的時間。d、進程等待I/O操作完成的時間。其中bcd可能發(fā)生多次
  • 周轉時間 = 作業(yè)完成時間 - 作業(yè)提交(到達)時間
  • 平均周轉時間 = 各作業(yè)周轉時間之和/作業(yè)數
  • 帶權周轉時間 = 作業(yè)周轉時間 / 作業(yè)實際運行的時間(恒>= 1)
  • 平均帶權周轉時間 = 各作業(yè)帶權周轉時間之和 / 作業(yè)數

4、等待時間:指作業(yè)/進程處于等待處理機狀態(tài)時間之和,等待時間越長用戶滿意度越低。

  • 等待時間 = 周轉時間 - 運行時間

5、響應時間:指從用戶提交請求到首次產生響應所用的時間

九、常見調度算法

9.1 先來先服務 FCFS

1、算法思想:類似與排隊付款
2、算法規(guī)則:按照作業(yè)/進程到達的先后順序進行服務
3、適用范圍:用于作業(yè)調度,考慮的是哪個作業(yè)先到達后備隊列;用于進程調度,考慮的是哪個進程先到達就緒隊列
4、是否可搶占?:非搶占式算法
5、優(yōu)點:公平、算法易實現
6、缺點:對長作業(yè)有利,對短作業(yè)不利
7、是否會導致饑餓:不會 (饑餓:某進程/作業(yè)長期得不到服務)

9.2 短作業(yè)優(yōu)先 SJF

1、算法思想:最求最少的平均等待時間,最少的平均周轉時間、最少的平均帶權周轉時間
2、算法規(guī)則:最短的作業(yè)/進程優(yōu)先得到服務
3、適用范圍:可用于作業(yè)調度;也可用于進程調度(SPF)
4、是否可搶占?:非搶占式算法、也有搶占式算法
5、優(yōu)點:略
6、缺點:對短作業(yè)有利,對長作業(yè)不利
7、是否會導致饑餓:會 ,若不斷有短作業(yè)進程到來,長作業(yè)可能會一直得不到服務,從而產生“饑餓”

9.3 高響應比優(yōu)先 HRRN

1、算法思想:綜合考慮作業(yè)/進程的等待時間和要求服務的時間
2、算法規(guī)則:在每次調度時先計算各個作業(yè)/進程的響應比,選擇響應比最高的作業(yè)/進程為其服務
響應比 = ( 等待時間+要求服務時間 ) / 要求服務時間
3、適用范圍:可用于作業(yè)調度;也可用于進程調度
4、是否可搶占?:非搶占式算法
5、優(yōu)點:略
6、缺點:略
7、是否會導致饑餓:不會

9.4 時間片輪轉 RR

1、算法思想:公平地、輪流地為各個進程服務,讓每個進程在一定時間間隔內都可以得到相應
2、算法規(guī)則:按照各進程到達就緒隊列的順序,輪流讓各個進程執(zhí)行一個時間片。若進程未在一個時間片內執(zhí)行完則剝奪處理機,將進程重新放到就緒隊列隊尾重新排隊。一般默認新到達地進程先進入就緒隊列。+
3、適用范圍:只可用于進程調度
4、是否可搶占?:搶占式算法,但是若一個進程未執(zhí)行完一個時間片下一個進程不會搶奪處理機
5、優(yōu)點:略
6、缺點:略
7、是否會導致饑餓:不會
8、時間片太大或太小分別有什么影響?

9.5 優(yōu)先級調度算法

1、算法思想:根據任務的緊急程度來決定處理順序
2、算法規(guī)則:調度時選擇優(yōu)先級最高的作業(yè)/進程
3、適用范圍:可用于作業(yè)調度;也可用于進程調度
4、是否可搶占?:非搶占式搶占式都可
5、優(yōu)點:略
6、缺點:略
7、是否會導致饑餓:會
8、優(yōu)先級地分類:

  • 靜態(tài)優(yōu)先級:創(chuàng)建進程時確定,之后一直不變
  • 動態(tài)優(yōu)先級:創(chuàng)建進程時有一個初始值,之后會根據情況動態(tài)地調整優(yōu)先級
    9、常見優(yōu)先級:系統(tǒng)進程優(yōu)先級高于用戶進程 ; 前臺進程優(yōu)先級高于后臺進程
    10、確定進程優(yōu)先權的依據有如下三個方面:(1)進程類型;(2) 進程對資源的需求;(3) 用戶要求

9.6 多級反饋隊列調度算法

1、算法思想:對其他調度算法的折中權衡
2、算法規(guī)則:
①設置多級就緒隊列,各級隊列優(yōu)先級從高到低,時間片從小到大
②新進程到達時先進入第一級隊列,按照FCFS原則排隊等待被分配時間片,若用完時間片進程還未結束,則進程進入下一級隊列隊尾;若此時已經是在最下級的隊列,則重新放回該隊列隊尾
③只有第k級隊列為空時,才會為k+1級對頭的進程分配時間片
3、適用范圍:用于進程調度
4、是否可搶占?:搶占式算法,在k級隊列的進程運行過程中,若更上級的隊列中進入了一個新進程,該新進程便會搶占處理機,而原來運行的進程放回到k級隊列中的隊尾。
5、優(yōu)點:略
6、缺點:略
7、是否會導致饑餓:會

十、死鎖

10.1 死鎖概述

1、定義:各個進程互相等待對方手里的資源,導致各進程都阻塞,無法向前推進的現象
2、進程死鎖:一組進程中,每個進程都無限等待被該組進程中另一進程所占有的資源,因而永遠無法得到的資源,這種現象稱為進程死鎖
3、產生死鎖的原因:一、競爭資源引起的死鎖;二、進程推進順序不當引起的死鎖
4、死鎖產生的必要條件:(產生死鎖必須同時滿足以下四個條件)

  • 互斥條件:一個資源每次只能給一個進程使用
  • 不剝奪條件:一個進程在申請新的資源的同時保持對原有資源的占有
  • 請求和保持條件:資源申請者不能強行從資源占有者手中奪取資源,資源只能由占有者自愿釋放
  • 循環(huán)等待條件:在出現死鎖的系統(tǒng)中,一定存在一個進程—資源的環(huán)行鏈
    注意:發(fā)生死鎖時一定有循環(huán)等待,但是發(fā)生循環(huán)等待時未必發(fā)生死鎖

5、處理死鎖的基本方法:

  • 不讓死鎖發(fā)生
    • (1)預防死鎖。 設置限制條件,破壞產生死鎖的四個必要條件中的一個或幾個條件。
    • (2) 避免死鎖。不設置限制條件,而是在資源分配過程中,防止系統(tǒng)進入不安全狀態(tài)。
  • 讓死鎖發(fā)生
    • (1) 檢測死鎖。 允許死鎖,并檢測和清除死鎖。
    • (2) 解除死鎖。 是與檢測死鎖相配套的一種措施。

10.2 預防死鎖

做法:破壞死鎖產生的四個必要條件之一或幾個

  • 互斥條件:無法破壞
  • 不剝奪條件:規(guī)定進程逐個申請資源,當提出新的資源請求而不能立即得到滿足時,必須釋放已經保持的所有資源。待以后需要時重新申請。
  • 請求和保持條件:采用靜態(tài)分配方法,規(guī)定所有進程在開始運行之前,都必須一次性地申請其在整個運行過程中所需的全部資源。
  • 循環(huán)等待條件: 把系統(tǒng)中所有資源編號,進程在申請資源時必須按資源編號的遞增次序進行,否則操作系統(tǒng)不予分配。原因:總有一個進程占拒了較高序號的資源,則繼續(xù)申請的資源必然空閑,因此進程可以一直向前推進。

10.3 避免死鎖

1、做法:用某種方法防止系統(tǒng)進入不安全狀態(tài),從而避免死鎖
2、安全狀態(tài):如果系統(tǒng)能按某種進程順序(如P1,…,Pn, 稱為安全序列)為每個進程分配其所需的資源,直至每個進程都能順利地完成,稱系統(tǒng)處于安全狀態(tài),成這個順序為安全序列。安全序列可能有多個。
3、不安全狀態(tài):若不存在上述這樣一個安全序列稱系統(tǒng)處于不安全狀態(tài)。
4、安全狀態(tài)是一定沒有死鎖發(fā)生的。不安全狀態(tài)不一定導致死鎖發(fā)生

10.4 銀行家算法

1、銀行家算法中的數據結構

  • (1) 可利用資源向量Available:它是一個含有m個元素的數組,其中每個元素代表一類當前可利用資源的數目
  • (2) 最大需求矩陣Max。 n*m矩陣,表示n個進程的每一個對m類資源的最大需求。
  • (3) 分配矩陣Allocation 。n*m矩陣,表示每個進程已分配的資源數。
  • (4) 需求矩陣Need 。n*m矩陣,表示每個進程還需要各類資源數。

2、算法思想
1、設Requesti是進程的請求向量,Requesti[j]= K表示進程 Pi 需要 K 個 Rj 類型的資源。
2、當進程pi提出資源申請時,系統(tǒng)執(zhí)行下列步驟:

  • (1) 如果Requesti[j]≤Need[i,j],便轉向步驟(2);否則認為出錯(需要的資源數超過它所宣布的最大值)。
  • (2) 如果Requesti[j]≤Available[j],便轉向步驟(3);否則Pi須等待(無足夠資源)。
  • (3) 系統(tǒng)試著把資源分配給進程Pi,并修改下面數據結構中的數值:
    Available[j]= Available[j]-Requesti[j];
    Allocation[i,j]= Allocation[i,j]+Requesti[j];
    Need[i,j]= Need[i,j]-Requesti[j];
  • (4) 系統(tǒng)執(zhí)行安全性算法,若系統(tǒng)新狀態(tài)是安全的,則分配完成,若系統(tǒng)新狀態(tài)是不安全的,則恢復原狀態(tài),進程等待

10.5 安全性算法

算法思想:
(1) 設置兩個向量:

  • ① 工作向量Work: 表示系統(tǒng)可提供給進程繼續(xù)運行所需的各類資源數目,它含有m個元素,在執(zhí)行安全算法開始時,Work = Available;
  • ② Finish: 表示系統(tǒng)是否有足夠的資源分配給進程,使之運行完成。開始時先做Finish[i]=false; 當有足夠資源分配給進程時, 再令Finish[i]=true。

(2) 從進程集合中找到一個能滿足下述條件的進程:

  • ① Finish[i]=false; ② Need[i,j]≤Work[j]; 若找到, 執(zhí)行步驟(3), 否則,執(zhí)行步驟(4)。

(3) 當進程Pi獲得資源后,可順利執(zhí)行,直至完成,并釋放出分配給它的資源,故應執(zhí)行:

  • Work[j]∶= Work[ j ]+Allocation[i,j];
  • Finish[i]∶= true;
  • go to step 2;

(4) 如果所有進程的Finish[i]=true都滿足, 則表示系統(tǒng)處于安全狀態(tài);否則,系統(tǒng)處于不安全狀態(tài)。

10.6 死鎖的檢測與解除

1、做法:允許死鎖的發(fā)生,OS負責檢測出死鎖的發(fā)生,然后采取某種措施接觸死鎖
2、判斷死鎖的方法:①用某種數據結構來保存資源的親求和分配信息;②提供一種算法,利用上述信息來檢測系統(tǒng)是否已進入死鎖狀態(tài)
3、資源分配圖:

  • 組成:結點:進程結點(對應一個進程);資源結點(對應一類資源);邊:進程結點->資源階段(表示進程想申請幾個資源);資源節(jié)點->進程結點(表示已經為進程分配了幾個資源)
  • 檢測死鎖方法(資源分配圖化簡):
    1)找一個既不阻塞又非獨立的進程結點Pi(即找出一條有向邊與它相連,且該有向邊對應的資源的申請數量小于等于系統(tǒng)中已有空閑資源的數量)。釋放其占有的全部資源,成為孤立結點。
    2)再把相應的資源分配給一個等待該資源的進程。
    3)重復以上步驟,若所有進程成為孤立結點,稱該圖是可完全簡化的,否則稱該圖是不可完全簡化的,就說明發(fā)生了死鎖。

4、死鎖狀態(tài)的充分條件是:當且僅當資源分配圖是不可完全簡化的(死鎖定理)。
5、死鎖的解除
(1) 剝奪資源。從其它進程剝奪足夠數量的資源給死鎖進程。
(2) 撤消進程。 使全部死鎖進程都夭折掉或按某種順序逐個撤消進程,直至有足夠資源可用。

總結

以上是生活随笔為你收集整理的操作系统(OS)进程与调度的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。