生活随笔
收集整理的這篇文章主要介紹了
操作系统进程调度算法(先来先服务,短作业优先算法(SJF))linux下(附源码)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
先來(lái)先服務(wù)算法(FCFS)
FCFS是最簡(jiǎn)單的調(diào)度算法,既可以用作作業(yè)調(diào)度,也可以用作進(jìn)程調(diào)度
這種算法優(yōu)先考慮系統(tǒng)中等待時(shí)間最長(zhǎng)的作業(yè)(進(jìn)程),而不管作業(yè)所需執(zhí)行時(shí)間長(zhǎng)短,
做法是從后備隊(duì)列中選擇幾個(gè)最先進(jìn)入該隊(duì)列的作業(yè),將它們調(diào)入內(nèi)存,為它們分配資源和創(chuàng)建進(jìn)程,然后放入就緒隊(duì)列
進(jìn)程調(diào)度中使用此算法時(shí),每次都從就緒的進(jìn)程隊(duì)列中選擇一個(gè)最先進(jìn)入該隊(duì)列的進(jìn)程,為之分配處理機(jī),使之投入運(yùn)行,該進(jìn)程會(huì)一直運(yùn)行到完成或者因發(fā)生某事件而阻塞后,進(jìn)程調(diào)度程序才會(huì)把處理機(jī)分配給其他進(jìn)程
先來(lái)先服務(wù)(FCFS)調(diào)度算法是一種最簡(jiǎn)單的調(diào)度算法,該算法既可用于作業(yè)調(diào)度,也可用于進(jìn)程調(diào)度。當(dāng)在作業(yè)調(diào)度中采用該算法時(shí),每次調(diào)度都是從后備作業(yè)隊(duì)列中選擇一個(gè)或多個(gè)最先進(jìn)入該隊(duì)列的作業(yè),將它們調(diào)入內(nèi)存,為它們分配資源、創(chuàng)建進(jìn)程,然后放入就緒隊(duì)列。在進(jìn)程調(diào)度中采用FCFS算法時(shí),則每次調(diào)度是從就緒隊(duì)列中選擇一個(gè)最先進(jìn)入該隊(duì)列的進(jìn)程,為之分配處理機(jī),使之投入運(yùn)行。該進(jìn)程一直運(yùn)行到完成或發(fā)生某事件而阻塞后才放棄處理機(jī)。
----短作業(yè)優(yōu)先算法(SJF),
由于在實(shí)際情況中短作業(yè)(進(jìn)程)所占比例很大,為了讓它們比長(zhǎng)作業(yè)優(yōu)先執(zhí)行,就有了此算法。
SJF顧名思義以作業(yè)長(zhǎng)短來(lái)確定優(yōu)先級(jí),作業(yè)越短優(yōu)先級(jí)越高,作業(yè)的長(zhǎng)短用作業(yè)所需的運(yùn)行時(shí)間來(lái)衡量,此算法一樣也可以用做進(jìn)程調(diào)度,它將從外存的作業(yè)后備隊(duì)列中選擇若干個(gè)估計(jì)運(yùn)行時(shí)間最短的作業(yè),優(yōu)先將它們調(diào)入內(nèi)存運(yùn)行。
SJF調(diào)度算法也存在不容忽視的缺點(diǎn):該算法對(duì)長(zhǎng)作業(yè)不利,如作業(yè)C的周轉(zhuǎn)時(shí)間由10增至16,其帶權(quán)周轉(zhuǎn)時(shí)間由2增至3.1。更嚴(yán)重的是,如果有一長(zhǎng)作業(yè)(進(jìn)程)進(jìn)入系統(tǒng)的后備隊(duì)列(就緒隊(duì)列),由于調(diào)度程序總是優(yōu)先調(diào)度那些(即使是后進(jìn)來(lái)的)短作業(yè)(進(jìn)程),將導(dǎo)致長(zhǎng)作業(yè)(進(jìn)程)長(zhǎng)期不被調(diào)度。該算法完全未考慮作業(yè)的緊迫程度,因而不能保證緊迫性作業(yè)(進(jìn)程)會(huì)被及時(shí)處理。由于作業(yè)(進(jìn)程)的長(zhǎng)短只是根據(jù)用戶所提供的估計(jì)執(zhí)行時(shí)間而定的,而用戶又可能會(huì)有意或無(wú)意地縮短其作業(yè)的估計(jì)運(yùn)行時(shí)間,致使該算法不一定能真正做到短作業(yè)優(yōu)先調(diào)度。
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std
;
struct Node
{char name
;int Tarrive
;int Tservice
;int Tsurplus
;int Tstart
;int Taccomplish
;int prio
;int if_finish
;int num
;
}job
[10];
void Arrive_sort(int num
)
{int temp1
, temp2
, temp3
;for (int i
= 0; i
< num
; i
++){for (int j
= i
+ 1; j
< num
; j
++){if (job
[i
].Tarrive
> job
[j
].Tarrive
){temp1
= job
[j
].name
;job
[j
].name
= job
[i
].name
;job
[i
].name
= temp1
;temp2
= job
[j
].Tarrive
;job
[j
].Tarrive
= job
[i
].Tarrive
;job
[i
].Tarrive
= temp2
;temp3
= job
[j
].Tservice
;job
[j
].Tservice
= job
[i
].Tservice
;job
[i
].Tservice
= temp3
;}}}
}
void Service_sort(int num
)
{int temp1
, temp2
, temp3
;for (int i
= 1; i
< num
; i
++){for (int j
= i
+ 1; j
< num
; j
++){if (job
[i
].Tservice
> job
[j
].Tservice
){temp1
= job
[j
].name
;job
[j
].name
= job
[i
].name
;job
[i
].name
= temp1
;temp2
= job
[j
].Tarrive
;job
[j
].Tarrive
= job
[i
].Tarrive
;job
[i
].Tarrive
= temp2
;temp3
= job
[j
].Tservice
;job
[j
].Tservice
= job
[i
].Tservice
;job
[i
].Tservice
= temp3
;}}}
}
void Priority_sort(int num
)
{int temp1
, temp2
, temp3
, temp4
;for (int i
= 1; i
< num
; i
++){for (int j
= i
+ 1; j
< num
; j
++){if (job
[i
].prio
< job
[j
].prio
){temp1
= job
[j
].name
;job
[j
].name
= job
[i
].name
;job
[i
].name
= temp1
;temp2
= job
[j
].Tarrive
;job
[j
].Tarrive
= job
[i
].Tarrive
;job
[i
].Tarrive
= temp2
;temp3
= job
[j
].Tservice
;job
[j
].Tservice
= job
[i
].Tservice
;job
[i
].Tservice
= temp3
;temp4
= job
[j
].prio
;job
[j
].prio
= job
[i
].prio
;job
[i
].prio
= temp3
;}}}
}
void Arrive_Short_sort(int num
)
{int temp1
, temp2
, temp3
;for (int i
= 0; i
< num
; i
++){for (int j
= i
+ 1; j
< num
; j
++){if (job
[i
].Tarrive
>= job
[j
].Tarrive
){if (job
[i
].Tarrive
> job
[j
].Tarrive
){temp1
= job
[j
].name
;job
[j
].name
= job
[i
].name
;job
[i
].name
= temp1
;temp2
= job
[j
].Tarrive
;job
[j
].Tarrive
= job
[i
].Tarrive
;job
[i
].Tarrive
= temp2
;temp3
= job
[j
].Tservice
;job
[j
].Tservice
= job
[i
].Tservice
;job
[i
].Tservice
= temp3
;}else{if (job
[i
].Tservice
> job
[j
].Tservice
){temp1
= job
[j
].name
;job
[j
].name
= job
[i
].name
;job
[i
].name
= temp1
;temp2
= job
[j
].Tarrive
;job
[j
].Tarrive
= job
[i
].Tarrive
;job
[i
].Tarrive
= temp2
;temp3
= job
[j
].Tservice
;job
[j
].Tservice
= job
[i
].Tservice
;job
[i
].Tservice
= temp3
;}}}}}
}
void fcfs(int num
)
{for (int i
= 0; i
< num
; i
++){job
[i
].Tstart
= job
[i
- 1].Taccomplish
;if (job
[i
].Tstart
< job
[i
].Tarrive
){job
[i
].Tstart
= job
[i
].Tarrive
;}else{job
[i
].Tstart
= job
[i
- 1].Taccomplish
;}job
[i
].Taccomplish
= job
[i
].Tstart
+ job
[i
].Tservice
;}
}
void sjf(int num
)
{Service_sort(num
);for (int i
= 0; i
< num
; i
++){job
[i
].Tstart
= job
[i
- 1].Taccomplish
;if (job
[i
].Tstart
< job
[i
].Tarrive
){job
[i
].Tstart
= job
[i
].Tarrive
;}else{job
[i
].Tstart
= job
[i
- 1].Taccomplish
;}job
[i
].Taccomplish
= job
[i
].Tstart
+ job
[i
].Tservice
;}
}
void RR(int num
)
{int q
;cout
<< "請(qǐng)輸入時(shí)間片長(zhǎng)度:" << endl
;cin
>> q
;int flag
= 1;int finish_pro
= 0;cout
<< "進(jìn)程名稱\t" << "開(kāi)始時(shí)間\t" << "運(yùn)行時(shí)間\t" << "剩余服務(wù)時(shí)間\t" << "結(jié)束時(shí)間\t" << endl
;int time
;int c
= 0;while (finish_pro
< num
){flag
= 0;for (int i
= c
; i
< num
; i
++){Arrive_sort(num
);job
[i
].Tsurplus
= job
[i
].Tservice
;job
[i
].Tstart
= job
[i
- 1].Taccomplish
;if (job
[i
].Tstart
< job
[i
].Tarrive
){job
[i
].Tstart
= job
[i
].Tarrive
;}else{job
[i
].Tstart
= job
[i
- 1].Taccomplish
;}time
= job
[i
].Tstart
;if (job
[i
].if_finish
== 1) continue;else{if (job
[i
].Tsurplus
<= q
&& time
>= job
[i
].Tarrive
){flag
= 1;time
= time
+ job
[i
].Tsurplus
;job
[i
].if_finish
= 1;job
[i
].Taccomplish
= time
;cout
<< job
[i
].name
<< "\t\t" << job
[i
].Taccomplish
- job
[i
].Tsurplus
<< "\t\t" << job
[i
].Tsurplus
<< "\t\t" << 0 << "\t\t" << job
[i
].Taccomplish
<< endl
;job
[i
].Tsurplus
= 0;}else if (job
[i
].Tsurplus
> q
&& time
>= job
[i
].Tarrive
){flag
= 1;time
= time
+ q
;job
[i
].Tsurplus
-= q
;job
[i
].Taccomplish
= time
;cout
<< job
[i
].name
<< "\t\t" << time
- q
<< "\t\t" << q
<< "\t\t" << job
[i
].Tsurplus
<< "\t\t" << job
[i
].Taccomplish
<< endl
;job
[num
].name
= job
[i
].name
;job
[num
].Tarrive
= time
;job
[num
].Tservice
= job
[i
].Tsurplus
;num
++;}if (job
[i
].if_finish
== 1) finish_pro
++;}c
++;}break;if (flag
== 0 && finish_pro
< num
){for (int i
= 0; i
< num
; i
++){if (job
[i
].if_finish
== 0){time
= job
[i
].Tarrive
;break;}}}}
}
void print(int num
)
{cout
<< "進(jìn)程名" << "\t" << "到達(dá)時(shí)間" << "\t" << "服務(wù)時(shí)間" << "\t" << "完成時(shí)間" << endl
;for (int i
= 0; i
< num
; i
++){cout
<< job
[i
].name
<< "\t" << job
[i
].Tarrive
<< "\t\t" << job
[i
].Tservice
<< "\t\t" << job
[i
].Taccomplish
<< endl
;}
}
void display(int num
)
{int ch
= 0;cout
<< "—————————————————————————" << endl
;cout
<< "——————————1、FCFS算法 —————————" << endl
;cout
<< "——————————2、SJF算法——————————" << endl
;cout
<< "——————————3、RR算法 ——————————" << endl
;cout
<< "——————————4、優(yōu)先級(jí)算法 ————————" << endl
;cout
<< "——————————5、退出 ———————————" << endl
;cout
<< "—————————————————————————" << endl
;do {cout
<< "請(qǐng)選擇你想要的算法:" << endl
;cin
>> ch
;switch (ch
) {case 1:Arrive_sort(num
);fcfs(num
);print(num
);break;case 2:sjf(num
);print(num
);break;case 3:RR(num
);break;case 4:print(num
);break;case 5:exit
;default:cout
<< "輸入錯(cuò)誤,請(qǐng)重新輸入!" << endl
;break;}} while (ch
!= 5);
}
int main()
{int num
;char jname
;int arrive
;int service
;int accomplish
;cout
<< "請(qǐng)輸入進(jìn)程個(gè)數(shù):" << endl
;cin
>> num
;for (int i
= 0; i
< num
; i
++){cout
<< "請(qǐng)輸入進(jìn)程名、到達(dá)時(shí)間、服務(wù)時(shí)間" << endl
;cin
>> jname
;job
[i
].name
= jname
;cin
>> arrive
;job
[i
].Tarrive
= arrive
;cin
>> service
;job
[i
].Tservice
= service
;}display(num
);return 0;
}
總結(jié)
以上是生活随笔為你收集整理的操作系统进程调度算法(先来先服务,短作业优先算法(SJF))linux下(附源码)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。