一、 實驗目的:
1、掌握程序排程的任務、機制和方式。
2、熟練掌握程序程序排程的演算法的原理。
二、實驗內容:
1、 實現 短作業優先排程演算法
2、 實現 先到先服務排程演算法
3、 實現 非搶占式高響應比優先排程演算法
4、 實現 搶占式高響應比優先排程演算法
三、實驗**
實驗全部**見附件code.txt
實驗的主要**如下:
//程序結構體
struct task
task[n], tp_task[n];
//短作業優先演算法
void sjf()
putchar('\n');
//sleep(1000 * task[i].turn_time); // 程式暫停時間(單位:ms)
task[i].start_time = countt;
countt += task[i].turn_time;
task[i].end_time = countt;
}printf("\n所有程序全部執行完畢!!!\n\n");
print();//先來先服務演算法
void fcfs()
putchar('\n');
//sleep(1000 * task[i].turn_time); // 程式暫停時間(單位:ms)
task[i].start_time = countt;
countt += task[i].turn_time;
task[i].end_time = countt;
}printf("\n所有程序全部執行完畢!!!\n\n");
print();// 非搶占 高響應比 優先排程演算法
void hrrn()
putchar('\n');
//sleep(1000 * task[0].turn_time); // 程式暫停時間(單位:ms)
task[0].start_time = countt;
countt += task[0].turn_time;
task[0].end_time = countt;
}printf("\n所有程序全部執行完畢!!!\n\n");
sort(task, task + num, cmp4); // 按照開始執行的時間從小到大排序
print();// 搶占式 高響應比 優先排程演算法
void preemptivehrrn()
putchar('\n');
//sleep(1000); // 程式暫停時間(單位:ms)
countt++; //執行乙個時間片 (1 s)
task[0].turn_time--;
if (task[0].turn_time <= 0 && task[0].end_time < 0)
task[0].end_time = countt;
}printf("所有程序全部執行完畢!!!\n\n");
//恢復每個程序的服務時間
for (int i = 0; i < num; i++)
task[i].turn_time = shift[task[i].name];
sort(task, task + num, cmp5); // 按照開始執行的時間從小到大排序
print();四、實驗結果
實驗測試資料如下:
5a 0 9
b 1 3
c 2 8
d 3 2
e 4 5
資料輸入:
(1) 短作業優先排程演算法
(2) 先到先服務排程演算法
(3) 非搶占式高響應比優先排程演算法
(4) 搶占式高響應比優先排程演算法
五、實驗總結
本次實驗的內容為實現了四中程序排程的演算法:短作業排程演算法、先來先服務程序排程演算法、非搶占試高響應比優先排程演算法、搶占式高響應比優先排程演算法。通過對四中程序排程演算法的實現,熟練地掌握了排程演算法的原理,同時也對作業系統當中關於排程方面的內容有了更加深刻的了解。在演算法實現方面,覺得自己構建的那個結構體裡面的變數有些不足之處,例如程序相關的時間可能不是整數,而我卻為了簡化操作,用了整型來表示和程序相關的時間資訊
#include #include #include #include #include #include using namespace std;
const int n = 1000;
struct task
task[n], tp_task[n];
int num;//程序數目
void sleep(int n)
void getdata()
printf("程序資訊輸入完畢!!!\n");
}void backdata()
printf("程序資訊還原成功!!!\n");
}void print()
}bool cmp1(const struct task &a, const struct task &b)
//短作業優先演算法
void sjf()
putchar('\n');
//sleep(1000 * task[i].turn_time); // 程式暫停時間(單位:ms)
task[i].start_time = countt;
countt += task[i].turn_time;
task[i].end_time = countt;
}printf("\n所有程序全部執行完畢!!!\n\n");
print();
}bool cmp2(const struct task &a, const struct task &b)
//先來先服務演算法
void fcfs()
putchar('\n');
//sleep(1000 * task[i].turn_time); // 程式暫停時間(單位:ms)
task[i].start_time = countt;
countt += task[i].turn_time;
task[i].end_time = countt;
}printf("\n所有程序全部執行完畢!!!\n\n");
print();
}bool c***(const struct task &a, const struct task &b)
else
return a.end_time < b.end_time;
}bool cmp4(const struct task &a, const struct task &b)
// 非搶占 高響應比 優先排程演算法
void hrrn()
putchar('\n');
//sleep(1000 * task[0].turn_time); // 程式暫停時間(單位:ms)
task[0].start_time = countt;
countt += task[0].turn_time;
task[0].end_time = countt;
}printf("\n所有程序全部執行完畢!!!\n\n");
sort(task, task + num, cmp4); // 按照開始執行的時間從小到大排序
print();
}bool cmp5(const struct task a, const struct task b)
// 搶占式 高響應比 優先排程演算法
void preemptivehrrn()
putchar('\n');
//sleep(1000); // 程式暫停時間(單位:ms)
countt++; //執行乙個時間片 (1 s)
task[0].turn_time--;
if (task[0].turn_time <= 0 && task[0].end_time < 0)
task[0].end_time = countt;
}printf("所有程序全部執行完畢!!!\n\n");
//恢復每個程序的服務時間
for (int i = 0; i < num; i++)
task[i].turn_time = shift[task[i].name];
sort(task, task + num, cmp5); // 按照開始執行的時間從小到大排序
print();
}void menu()
int main()
backdata();
}return 0;
}
作業系統排程演算法
include include include include using namespace std const int maxnum 101 typedef struct information node struct node1 此結構體用於優先順序演算法的搶占式 int priority i...
作業系統排程演算法
在作業系統中存在多種排程演算法,其中有的排程演算法適用於作業排程,有的排程演算法適用於程序排程,有的排程演算法兩者都適用。下面介紹幾種常用的排程演算法。fcfs排程演算法是一種最簡單的排程演算法,該排程演算法既可以用於作業排程也可以用於程序排程。在作業排程中,演算法每次從後備作業佇列中選擇最先進入該...
作業系統 排程演算法
fcfs是最簡單的排程演算法,既可以用於作業排程,也可以用於程序排程,系統將按照作業到達的先後次序來進行排程。sjf演算法是以作業的長短來計算優先順序,作業越短,優先順序越高。作業的長短是以作業所要求的執行時間來衡量的。可以分別用於作業排程和程序排程。缺點 必須預知作業的執行時間 對長作業很不利,長...