日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

操作系统进程调度算法(先来先服务,短作业优先算法(SJF))linux下(附源码)

發(fā)布時(shí)間:2025/3/19 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 操作系统进程调度算法(先来先服务,短作业优先算法(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;//到達(dá)時(shí)間int Tservice;//服務(wù)時(shí)間int Tsurplus;//剩余時(shí)間int Tstart;//開(kāi)始時(shí)間int Taccomplish;//完成時(shí)間int prio;//優(yōu)先級(jí)---數(shù)字越大優(yōu)先級(jí)越高int if_finish;//進(jìn)程是否完成int num;//進(jìn)程個(gè)數(shù) }job[10]; //按到達(dá)時(shí)間排序 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;}}} } //按服務(wù)時(shí)間排序 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;}}} } //按優(yōu)先級(jí)排序 void Priority_sort(int num)//按優(yōu)先級(jí)減小排序 {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;}}} } //如果到達(dá)時(shí)間相等,服務(wù)時(shí)間按從小到大排序 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)//先來(lái)先服務(wù) {for (int i = 0; i < num; i++){job[i].Tstart = job[i - 1].Taccomplish;//上一個(gè)作業(yè)結(jié)束時(shí)間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)//短作業(yè)優(yōu)先 {Service_sort(num);for (int i = 0; i < num; i++){job[i].Tstart = job[i - 1].Taccomplish;//上一個(gè)作業(yè)結(jié)束時(shí)間if (job[i].Tstart < job[i].Tarrive)//該作業(yè)的開(kāi)始時(shí)間小于到達(dá)時(shí)間{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)//RR算法 {int q;cout << "請(qǐng)輸入時(shí)間片長(zhǎng)度:" << endl;cin >> q;int flag = 1;//標(biāo)志隊(duì)列中是否還有進(jìn)程int finish_pro = 0;//完成的進(jìn)程數(shù)cout << "進(jìn)程名稱\t" << "開(kāi)始時(shí)間\t" << "運(yùn)行時(shí)間\t" << "剩余服務(wù)時(shí)間\t" << "結(jié)束時(shí)間\t" << endl;int time;//記錄當(dāng)前時(shí)刻時(shí)間int c = 0;while (finish_pro < num){flag = 0;//就緒隊(duì)列里沒(méi)進(jìn)程for (int i = c; i < num; i++){Arrive_sort(num);job[i].Tsurplus = job[i].Tservice;job[i].Tstart = job[i - 1].Taccomplish;//上一個(gè)作業(yè)結(jié)束時(shí)間if (job[i].Tstart < job[i].Tarrive)//該作業(yè)的開(kāi)始時(shí)間小于到達(dá)時(shí)間{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;//該進(jìn)程已完成else{if (job[i].Tsurplus <= q && time >= job[i].Tarrive)//未完成且少于一個(gè)時(shí)間片{flag = 1;time = time + job[i].Tsurplus;job[i].if_finish = 1;//該進(jìn)程完成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++;//一個(gè)進(jìn)程完成加一}c++;}break;if (flag == 0 && finish_pro < num)//沒(méi)執(zhí)行完且沒(méi)進(jìn)入就緒隊(duì)列{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://Arrive_Short_sort(num);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ò),歡迎將生活随笔推薦給好友。