演算法的優先順序
① 比較演算法優缺點:
作業調度演算法 .
1.先來先服務(FCFS, First Come First Serve)是最簡單的調度演算法,按先後順序進行調度。
定義:
按照作業提交或進程變為就緒狀態的先後次序,分派CPU;
當前作業或進程佔用CPU,直到執行完或阻塞,才出讓CPU(非搶占方式)。
在作業或進程喚醒後(如I/O完成),並不立即恢復執行,通常等到當前作業或進程出讓CPU。
適用場景:
比較有利於長作業,而不利於短作業。因為長作業會長時間占據處理機。
有利於CPU繁忙的作業,而不利於I/O繁忙的作業。
演算法實現原理圖:
2. 輪轉法(Round Robin)
輪轉法是讓每個進程在就緒隊列中的等待時間與享受服務的時間成正比例。
定義:
將系統中所有的就緒進程按照FCFS原則,排成一個隊列。
每次調度時將CPU分派給隊首進程,讓其執行一個時間片。時間片的長度從幾個ms到幾百ms。
在一個時間片結束時,發生時鍾中斷。
調度程序據此暫停當前進程的執行,將其送到就緒隊列的末尾,並通過上下文切換執行當前的隊首進程。
進程可以未使用完一個時間片,就出讓CPU(如阻塞)。
時間片長度的確定:
時間片長度變化的影響
過長->退化為FCFS演算法,進程在一個時間片內都執行完,響應時間長。
過短->用戶的一次請求需要多個時間片才能處理完,上下文切換次數增加,響應時間長。
對響應時間的要求:T(響應時間)=N(進程數目)*q(時間片)
就緒進程的數目:數目越多,時間片越小
系統的處理能力:應當使用戶輸入通常在一個時間片內能處理完,否則使響應時間,平均周轉時間和平均帶權周轉時間延長。
演算法實現原理圖:
3. 多級反饋隊列演算法(Round Robin with Multiple Feedback)
多級反饋隊列演算法是輪轉演算法和優先順序演算法的綜合和發展。
定義:
設置多個就緒隊列,分別賦予不同的優先順序,如逐級降低,隊列1的優先順序最高。每個隊列執行時間片的長度也不同,規定優先順序越低則時間片越長,如逐級加倍。
新進程進入內存後,先投入隊列1的末尾,按FCFS演算法調度;若按隊列1一個時間片未能執行完,則降低投入到隊列2的末尾,同樣按FCFS演算法調度;如此下去,降低到最後的隊列,則按「時間片輪轉」演算法調度直到完成。
僅當較高優先順序的隊列為空,才調度較低優先順序的隊列中的進程執行。如果進程執行時有新進程進入較高優先順序的隊列,則搶先執行新進程,並把被搶先的進程投入原隊列的末尾。
優點:
為提高系統吞吐量和縮短平均周轉時間而照顧短進程。
為獲得較好的I/O設備利用率和縮短響應時間而照顧I/O型進程。
不必估計進程的執行時間,動態調節
幾點說明:
I/O型進程:讓其進入最高優先順序隊列,以及時響應I/O交互。通常執行一個小時間片,要求可處理完一次I/O請求的數據,然後轉入到阻塞隊列。
計算型進程:每次都執行完時間片,進入更低級隊列。最終採用最大時間片來執行,減少調度次數。
I/O次數不多,而主要是CPU處理的進程。在I/O完成後,放回優先I/O請求時離開的隊列,以免每次都回到最高優先順序隊列後再逐次下降。
為適應一個進程在不同時間段的運行特點,I/O完成時,提高優先順序;時間片用完時,降低優先順序。
演算法實現原理圖:
4. 優先順序法(Priority Scheling)
優先順序演算法是多級隊列演算法的改進,平衡各進程對響應時間的要求。適用於作業調度和進程調度,可分成搶先式和非搶先式。
靜態優先順序:
作業調度中的靜態優先順序大多按以下原則確定:
由用戶自己根據作業的緊急程度輸入一個適當的優先順序。
由系統或操作員根據作業類型指定優先順序。
系統根據作業要求資源情況確定優先順序。
進程的靜態優先順序的確定原則:
按進程的類型給予不同的優先順序。
將作業的情態優先順序作為它所屬進程的優先順序。
動態優先順序:
進程的動態優先順序一般根據以下原則確定:
根據進程佔用有CPU時間的長短來決定。
根據就緒進程等待CPU的時間長短來決定。
5.短作業優先法(SJF, Shortest Job First)
短作業優先又稱為「短進程優先」SPN(Shortest Process Next);這是對FCFS演算法的改進,其目標是減少平均周轉時間。
定義:
對預計執行時間短的作業(進程)優先分派處理機。通常後來的短作業不搶先正在執行的作業。
SJF的特點:
(1) 優點:
比FCFS改善平均周轉時間和平均帶權周轉時間,縮短作業的等待時間;
提高系統的吞吐量;
(2) 缺點:
對長作業非常不利,可能長時間得不到執行;
未能依據作業的緊迫程度來劃分執行的優先順序;
難以准確估計作業(進程)的執行時間,從而影響調度性能。
SJF的變型:
「最短剩餘時間優先」SRT(Shortest Remaining Time)(允許比當前進程剩餘時間更短的進程來搶占)
「最高響應比優先」HRRN(Highest Response Ratio Next)(響應比R = (等待時間 + 要求執行時間) / 要求執行時間,是FCFS和SJF的折衷)
6. 最高響應比優先法(HRN,Highest Response_ratio Next)
最高響應比優先法是對FCFS方式和SJF方式的一種綜合平衡。FCFS方式只考慮每個作業的等待時間而未考慮執行時間的長短,而SJF方式只考慮執行時間而未考慮等待時間的長短。因此,這兩種調度演算法在某些極端情況下會帶來某些不便。HRN調度策略同時考慮每個作業的等待時間長短和估計需要的執行時間長短,從中選出響應比最高的作業投入執行。
響應比R定義如下: R =(W+T)/T = 1+W/T
其中T為該作業估計需要的執行時間,W為作業在後備狀態隊列中的等待時間。每當要進行作業調度時,系統計算每個作業的響應比,選擇其中R最大者投入執行。這樣,即使是長作業,隨著它等待時間的增加,W / T也就隨著增加,也就有機會獲得調度執行。這種演算法是介於FCFS和SJF之間的一種折中演算法。由於長作業也有機會投入運行,在同一時間內處理的作業數顯然要少於SJF法,從而採用HRN方式時其吞吐量將小於採用SJF 法時的吞吐量。另外,由於每次調度前要計算響應比,系統開銷也要相應增加。
② 作業調度演算法的優先順序法
優先順序演算法(Priority Scheling)是多級隊列演算法的改進,平衡各進程對響應時間的要求。適用於作業調度和進程調度,可分成搶先式和非搶先式。 作業調度中的靜態優先順序大多按以下原則確定:
由用戶自己根據作業的緊急程度輸入一個適當的優先順序。
由系統或操作員根據作業類型指定優先順序。
系統根據作業要求資源情況確定優先順序。
進程的靜態優先順序的確定原則:
按進程的類型給予不同的優先順序。
將作業的情態優先順序作為它所屬進程的優先順序。 進程的動態優先順序一般根據以下原則確定:
根據進程佔用有CPU時間的長短來決定。
根據就緒進程等待CPU的時間長短來決定。
③ c語言演算法優先順序口訣
不要記這個,沒用,主要的幾個記住就行,自己寫代碼一定要用括弧標注。
④ 非搶占式優先順序演算法優先順序怎麼看
非搶占式優先權演算法:系統一旦把處理機分配給就緒隊列中優先權最高的進程後,該進程便一直執行下去,直至完成。
⑤ C語言中運算順序有哪些規律
優先順序是對多個函數並列時候優先演算法的特權,沒有注意優先順序的順序就會把演算法出錯,這些優先順序是必須記住的。下面的是我自己總結的關於C優先順序的口訣.當然,應用這個口訣的前提是你必須認識所有的C語言的運算符。優先決括弧成員第一; //括弧運算符[]() 成員運算符. -全體單目第二; //所有的單目運算符比如++ -- +(正) -(負) 指針運算*&乘除餘三,加減四; //這個"余"是指取余運算即%移位五,關系六; //移位運算符:<< ,關系: < = <= 等等於(與)不等排第七; //即== !=位與異或和位或; //這幾個都是位運算: 位與(&)異或(^)位或(|)"三分天下"八九十;邏輯或跟與; //邏輯運算符:|| 和 &&十二和十一; //注意順序:優先順序(||) 底於 優先順序(&&)條件高於賦值
⑥ 作業調度演算法中HPF演算法的動態優先順序如何設定優先順序標准
方法如下:
php">#include"stdio.h"
#include<STDLIB.H>
#include<CONIO.H>
#definegetpch(type)(type*)malloc(sizeof(type))
#defineNULL0
structpcb{/*定義進程式控制制塊PCB*/
charname[10];
charstate;
intsuper;
intntime;
intrtime;
structpcb*link;
}*ready=NULL,*p;
typedefstructpcbPCB;
sort()/*建立對進程進行優先順序排列函數*/
{
PCB*first,*second;
intinsert=0;
if((ready==NULL)||((p->super)>(ready->super)))/*優先順序最大者,插入隊首*/
{
p->link=ready;
ready=p;
}
else/*進程比較優先順序,插入適當的位置中*/
{
first=ready;
second=first->link;
while(second!=NULL)
{
if((p->super)>(second->super))/*若插入進程比當前進程優先數大,*/
{/*插入到當前進程前面*/
p->link=second;
first->link=p;
second=NULL;
insert=1;
}
else/*插入進程優先數最低,則插入到隊尾*/
{
first=first->link;
second=second->link;
}
}
if(insert==0)first->link=p;
}
}
input()/*建立進程式控制制塊函數*/
{
inti,num;
//clrscr();/*清屏*/
printf(" 請輸入進程號?");
scanf("%d",&num);
for(i=0;i<NUM;I++)scanf(?%s?,p-輸入進程名:?);printf(? p="getpch(PCB);"進程號No.%d: ?,i);{>name);
printf(" 輸入進程優先數:");
scanf("%d",&p->super);
printf(" 輸入進程運行時間:");
scanf("%d",&p->ntime);
printf(" ");
p->rtime=0;p->state='w';
p->link=NULL;
sort();/*調用sort函數*/
}
}
intspace()
{
intl=0;PCB*pr=ready;
while(pr!=NULL)
{
l++;
pr=pr->link;
}
return(l);
}
disp(PCB*pr)/*建立進程顯示函數,用於顯示當前進程*/
{
printf(" qname state super ndtime runtime ");
printf("|%s ",pr->name);
printf("|%c ",pr->state);
printf("|%d ",pr->super);
printf("|%d ",pr->ntime);
printf("|%d ",pr->rtime);
printf(" ");
}
check()/*建立進程查看函數*/
{
PCB*pr;
printf(" ****當前正在運行的進程是:%s",p->name);/*顯示當前運行進程*/
disp(p);
pr=ready;
printf(" ****當前就緒隊列狀態為: ");/*顯示就緒隊列狀態*/
while(pr!=NULL)
{
disp(pr);
pr=pr->link;
}
}
destroy()/*建立進程撤消函數(進程運行結束,撤消進程)*/
{
printf(" 進程[%s]已完成. ",p->name);
free(p);
}
running()/*建立進程就緒函數(進程運行時間到,置就緒狀態*/
{
(p->rtime)++;
if(p->rtime==p->ntime)
destroy();/*調用destroy函數*/
else
{
(p->super)--;
p->state='w';
sort();/*調用sort函數*/
}
}
main()/*主函數*/
{
intlen,h=0;
charch;
input();
len=space();
while((len!=0)&&(ready!=NULL))
{
ch=getchar();
h++;
printf(" Theexecutenumber:%d ",h);
p=ready;
ready=p->link;
p->link=NULL;
p->state='R';
check();
running();
printf(" 按任一鍵繼續......");
ch=getchar();
}
printf(" 進程已經完成. ");
ch=getchar();
}
⑦ c語言運算符優先順序從高到低的順序依次為
c語言運算符優先順序從高到低的順序依次如下:
優先順序從上到下依次遞減,最上面具有最高的優先順序,逗號操作符具有最低的優先順序。表達式的結合次序取決於表達式中各種運算符的優先順序。優先順序高的運算符先結合,優先順序低的運算符後結合,同一行中的運算符的優先順序相同。
不同類型的運算符之間也有相應的優先順序順序。
一個表達式中既可以包括相同類型的運算符,也可以包括不同類型的運算符或者函數。當多種運算符出現在同一個表達式中時,應該先按照不同類型運算符間的優先順序進行運算。
各種運算符間的優先順序如下:數值運算符、字元串運算符、關系運算符、邏輯運算符。可以用括弧改變優先順序順序,使得括弧內的運算優先於括弧外的運算。對於多重括弧,總是由內到外強製表達式的某些部分優先運行。括弧內的運算總是最優先計算。
⑧ c語言中運算符有哪幾種,優先順序順序是怎樣
C語言中,運算符除了常見的三大類,算術運算符、關系運算符與邏輯運算符之外,還有一些用於完成特殊任務的運算符。
運算符的運算優先順序共分為15 級,1 級最高,15 級最低。 在表達式中,優先順序較高的先於優先順序較低的進行運算。而在一個運算量兩側的運算符 優先順序相同時,則按運算符的結合性所規定的結合方向處理。
一級運算符:標識,常量,字元串文字量,優先順序提升表達式最優先執行。
二級運算符:數組下標運算(expression)、函數調用(argument-expression-list)、成員訪問(identifier、-> identifier)、後綴自增(i++)、後綴自減(i--)、復合初始化(initializer-list)。
三級運算符:前綴自增(++i)、前綴自減(--i)、單目轉型表式式(取地址& ,提領 * , 正號+ ,負號-、位反~ 邏輯否!)、求類型長度(sizeof unary-expression)。
四級運算符:強製表達式成為type-name指定的類型( type-name ) cast-expression。
五級運算符:「 * 」 乘法運算符。
六級運算符:「 + 」加法運算符。
七級運算符:<< 左移運算符;>> 右移運算符。
八級運算符:<、<=、>、>=關系運算符。
九級運算符:「 == 」等於運算符;「 != 」不等於運算符。
十級運算符:「 & 」按位與運算符。
十一級運算符:「 ∧ 」按位異或運算符。
十二級運算符:「 | 」按位或運算符。
十三級運算符:「&&」邏輯與運算符。
十四級運算符:「 || 」邏輯或運算符。
十五級運算符:? :條件運算符。
(8)演算法的優先順序擴展閱讀
C語言中各運算符的結合性:
1、左結合性(自左至右):
例如算術運算符的結合性是自左至右,即先左後右。如有表達式x-y+z 則y 應先與「-」號結合,執行x-y 運算,然後再執行+z 的運算。這種自左至右的結合方向就稱為「左結合性」。
2、右結合性(自右至左)
自右至左的結合方向稱為「右結合性」。最典型的右結合 性運算符是賦值運算符。如x=y=z,由於「=」的右結合性,應先執行y=z 再執行x=(y=z)運算。C語言運算符中有不少為右結合性,應注意區別,以避免理解錯誤。
⑨ 優先順序調度演算法是什麼
優先順序演算法是指在進程創建時先確定一個初始優先數,以後在進程運行中隨著進程特性的改變不斷修改優先數,這樣,由於開始優先數很低而得不到CPU的進程,就能因為等待時間的增長而優先數變為最高而得到CPU運行。
⑩ C語言運算符優先順序順序
C語言運算符優先順序順序如下所示:
(10)演算法的優先順序擴展閱讀
一個表達式可以包含多個運算符。在這種情況下,運算符的優先順序決定表達式的哪部分被處理為每個運算符的操作數。例如,按照運算規則,表達式中*、/、以及 % 的優先順序比 + 和 - 高。如下列表達式:
a - b * c
相當於 a-(b*c)。如果想讓操作數以不同的方式組合在一起,則必須使用括弧:
(a - b) * c
如果一個表達式中的兩個操作數具有相同的優先順序,那麼它們的結合律(associativity)決定它們的組合方式是從左到右或是從右到左。例如,算術運算符和操作數的組合方式是從左到右,賦值運算符則是從右到左。