[C / C++] 戦略的な調整プロセスのシミュレーション
単独での調整アルゴリズムに関しては、この記事で提示を処理しません, 必要な場合は、ネットワーク上で読むために参照することができます (多分私は、ある美しい日にそれらについて書きます). この記事では、私はちょうど紹介したいと思います (シェアリング) あなたは計算コードで, 一人でこれらの戦略をシミュレート.
プログラムが含まれます 2 ファイルはファイルであります INPUT.TXT およびプログラムファイル dieuphoitientrinh.cpp.
GOM INPUT.TXT Trongファイル:
– 最初の行はプロセスの数であります (N)
– 最初の行 2 含めて 2 値は、戦略的調整と量子あります
1: FIFO
2: ラウンドロビン
3: 独占優先
4: 非排他的優先順位
5: 排他的SJF
6: 非排他的SJF
– nは次の行, 各ラインはで構成されてい 4 値はそれぞれのプロセス名, 準備ができて一覧表示するための時間, CPU処理時間と優先順位 (条約の優先順位 1 > 2 > 3 > … ).
VI DUファイルINPUT.TXT
4 5 2 P1 0 20 3 P2 3 6 2 P3 3 5 1 P4 7 4 0
その後, データは、 4 プロセス, 戦略的な協調が排他的SJFに選ばれました, 量子値= 2. プロセスP1準備リストする時間を持っています (timeRL) た 0, CPUの処理時間 (timeCPU) た 20, 優先順位 3, …
Kết quả chạy chương trình:

Dưới đây là code chương trình hoặc bạn có thể ここからダウンロード. すべてのお問い合わせ, 提案をしてください 接続 qua Email hoặc facebook với mình.
/*
* --------------- @author: nguyenvanquan7826 ---------------
* ------------ cachhoc.net -------------
*/
#include <cstdlib>
#include <cstdio>
#include <fstream>
#include <iostream>
#include <iomanip>
#include <queue>
#define INP "input.txt"
using namespace std;
struct process {
char name[10];
int timeRL, timeCPU, priority;
int timeOUT, timeIN, timewait, timesave;
int index; //the index of pr[i]
};
typedef process *ListP;
int quantum;
int set;
void input(ListP &pr, int &n, int &timeOUT);
void output_input(ListP pr, int n);
void output_FIFO(ListP pr, int n, int timeOUT);
void output_RR(ListP pr, ListP RL, int n, int m, int timeOUT);
void output_PRIORITY_preemptive(ListP pr, int n, int timeOUT);
void output_PRIORITY_nopreemptive(ListP pr, ListP RL, int n, int m, int timeOUT);
void output_SJF_preemptive(ListP pr, int n, int timeOUT);
void output_SJF_nopreemptive(ListP pr, ListP RL, int n, int m, int timeOUT);
void OUTPUT(ListP pr, ListP RL, int n, int m, int timeOUT, int set);
void process_FIFO(ListP &pr, int n, int timeOUT);
void process_RR(ListP &pr, ListP &RL, int n, int &m, int timeOUT, int quantum);
void process_PRIORITY_preemptive(ListP &pr, int n, int timeOUT);
void process_PRIORITY_nopreemptive(ListP &pr, ListP &RL, int n, int &m, int timeOUT);
void process_SJF_preemptive(ListP &pr, int n, int timeOUT);
void process_SJF_nopreemptive(ListP &pr, ListP &RL, int n, int &m, int timeOUT);
void PROCESS(ListP &pr, ListP &RL, int n, int &m, int timeOUT, int set);
void input(ListP &pr, int &n, int &timeOUT) {
timeOUT = 0;
ifstream in(INP);
if (in == NULL) {
cout << "Not input file !";
return;
}
in >> n;
in >> set;
in >> quantum;
pr = new process[n];
for (int i = 0; i < n; i++) {
in >> pr[i].name;
in >> pr[i].timeRL;
in >> pr[i].timeCPU;
in >> pr[i].priority;
if (timeOUT < pr[i].timeRL)
timeOUT = pr[i].timeRL + pr[i].timeCPU;
else
timeOUT += pr[i].timeCPU;
pr[i].index = i;
}
}
void output_input(ListP pr, int n) {
cout << endl << "---------------INPUT---------------" << endl << endl;
cout << "Name" << setw(10) << "TimeRL" << setw(10) << "TimeCPU" << setw(10)
<< "Priority" << endl;
for (int i = 0; i < n; i++)
cout << pr[i].name << setw(10) << pr[i].timeRL << setw(10)
<< pr[i].timeCPU << setw(10) << pr[i].priority << endl;
cout << "quantum = " << quantum << endl;
cout << endl << "---------------OUTPUT---------------" << endl << endl;
}
void output_FIFO(ListP pr, int n, int timeOUT) {
cout << "FIFO" << endl << endl << "PROCESS" << endl << endl;
cout << "Name" << setw(10) << "TimeRL" << setw(10) << "TimeCPU" << setw(10)
<< "Priority" << setw(10) << "TimeIN" << setw(10) << "TimeOUT"
<< setw(10) << "Timewait" << setw(10) << "Timesave" << endl;
for (int i = 0; i < n; i++)
cout << pr[i].name << setw(10) << pr[i].timeRL << setw(10)
<< pr[i].timeCPU << setw(10) << pr[i].priority << setw(10)
<< pr[i].timeIN << setw(10) << pr[i].timeOUT << setw(10)
<< pr[i].timewait << setw(10) << pr[i].timesave << endl;
}
void output_RR(ListP pr, ListP RL, int n, int m, int timeOUT) {
cout << "ROUND ROBIN" << endl << endl << "OUTPUT" << endl << endl;
cout << "Name" << setw(10) << "TimeOUT" << setw(10) << "Timewait"
<< setw(10) << "Timesave" << endl;
for (int i = 0; i < n; i++)
cout << pr[i].name << setw(10) << pr[i].timeOUT << setw(10)
<< pr[i].timewait << setw(10) << pr[i].timesave << endl;
cout << endl << endl << "---PROCESS---" << endl << endl;
cout << "Name" << setw(10) << "TimeRL" << setw(10) << "TimeCPU" << setw(10)
<< "Priority" << setw(10) << "TimeIN" << setw(10) << "TimeOUT"
<< endl;
for (int i = 0; i < m; i++)
cout << RL[i].name << setw(10) << RL[i].timeRL << setw(10)
<< RL[i].timeCPU << setw(10) << RL[i].priority << setw(10)
<< RL[i].timeIN << setw(10) << RL[i].timeOUT << endl;
}
void output_PRIORITY_preemptive(ListP pr, int n, int timeOUT) {
cout << "PRIORITY preemptive" << endl << endl << "PROCESS" << endl << endl;
cout << "Name" << setw(10) << "TimeRL" << setw(10) << "TimeCPU" << setw(10)
<< "Priority" << setw(10) << "TimeIN" << setw(10) << "TimeOUT"
<< setw(10) << "Timewait" << setw(10) << "Timesave" << endl;
for (int i = 0; i < n; i++)
cout << pr[i].name << setw(10) << pr[i].timeRL << setw(10)
<< pr[i].timeCPU << setw(10) << pr[i].priority << setw(10)
<< pr[i].timeIN << setw(10) << pr[i].timeOUT << setw(10)
<< pr[i].timewait << setw(10) << pr[i].timesave << endl;
}
void output_SJF_preemptive(ListP pr, int n, int timeOUT) {
cout << "SJF preemptive" << endl << endl << "PROCESS" << endl << endl;
cout << "Name" << setw(10) << "TimeRL" << setw(10) << "TimeCPU" << setw(10)
<< "Priority" << setw(10) << "TimeIN" << setw(10) << "TimeOUT"
<< setw(10) << "Timewait" << setw(10) << "Timesave" << endl;
for (int i = 0; i < n; i++)
cout << pr[i].name << setw(10) << pr[i].timeRL << setw(10)
<< pr[i].timeCPU << setw(10) << pr[i].priority << setw(10)
<< pr[i].timeIN << setw(10) << pr[i].timeOUT << setw(10)
<< pr[i].timewait << setw(10) << pr[i].timesave << endl;
}
void output_PRIORITY_nopreemptive(ListP pr, ListP RL, int n, int m,
int timeOUT) {
cout << "PRIORITY nopreemptive" << endl << endl << "OUTPUT" << endl << endl;
cout << "Name" << setw(10) << "TimeOUT" << setw(10) << "Timewait"
<< setw(10) << "Timesave" << endl;
for (int i = 0; i < n; i++)
cout << pr[i].name << setw(10) << pr[i].timeOUT << setw(10)
<< pr[i].timewait << setw(10) << pr[i].timesave << endl;
cout << endl << endl << "---PROCESS---" << endl << endl;
cout << "Name" << setw(10) << "TimeRL" << setw(10) << "TimeCPU" << setw(10)
<< "Priority" << setw(10) << "TimeIN" << setw(10) << "TimeOUT" << endl;
for (int i = 0; i < m; i++)
cout << RL[i].name << setw(10) << RL[i].timeRL << setw(10)
<< RL[i].timeCPU << setw(10) << RL[i].priority << setw(10)
<< RL[i].timeIN << setw(10) << RL[i].timeOUT << endl;
}
void output_SJF_nopreemptive(ListP pr, ListP RL, int n, int m, int timeOUT) {
cout << "SJF nopreemptive" << endl << endl << "OUTPUT" << endl << endl;
cout << "Name" << setw(10) << "TimeOUT" << setw(10) << "Timewait"
<< setw(10) << "Timesave" << endl;
for (int i = 0; i < n; i++)
cout << pr[i].name << setw(10) << pr[i].timeOUT << setw(10)
<< pr[i].timewait << setw(10) << pr[i].timesave << endl;
cout << endl << endl << "---PROCESS---" << endl << endl;
cout << "Name" << setw(10) << "TimeRL" << setw(10) << "TimeCPU" << setw(10)
<< "Priority" << setw(10) << "TimeIN" << setw(10) << "TimeOUT" << endl;
for (int i = 0; i < m; i++)
cout << RL[i].name << setw(10) << RL[i].timeRL << setw(10)
<< RL[i].timeCPU << setw(10) << RL[i].priority << setw(10)
<< RL[i].timeIN << setw(10) << RL[i].timeOUT << endl;
}
void process_FIFO(ListP &pr, int n, int timeOUT) {
ListP RL = new process[n];
int m = -1;
for (int t = 0; t < timeOUT; t++) {
for (int i = 0; i < n; i++)
if (t == pr[i].timeRL)
RL[++m] = pr[i];
}
timeOUT = 0;
for (int i = 0; i <= m; i++) {
if (timeOUT <= RL[i].timeRL) {
timeOUT = RL[i].timeRL + RL[i].timeCPU;
RL[i].timeIN = RL[i].timeRL;
} else {
timeOUT += RL[i].timeCPU;
RL[i].timeIN = RL[i - 1].timeOUT;
}
RL[i].timeOUT = timeOUT;
RL[i].timewait = RL[i].timeOUT - (RL[i].timeRL + RL[i].timeCPU);
RL[i].timesave = RL[i].timeOUT - RL[i].timeRL;
}
pr = RL;
}
void process_RR(ListP &pr, ListP &RL, int n, int &m, int timeOUT, int quantum) //Round Robin
{
RL = new process;
ListP pr1 = pr; //list temp of pr
m = 0; // the number of element in RL
int count = 0; //count time quantum
int j = 0;
int temptime = 0;
for (int t = 0; t <= timeOUT; t++) {
if (m > 0 && j < m) {
count++;
if (count <= quantum && RL[j].timeCPU - temptime > 0)
temptime++;
if (count == quantum && RL[j].timeCPU - temptime > 0) {
m++;
RL = (process *) realloc(RL, m * sizeof(process));
RL[m - 1] = RL[j];
RL[m - 1].timeCPU -= temptime;
}
if (RL[j].timeCPU - temptime == 0) {
pr1[RL[j].index].timeOUT = t;
pr1[RL[j].index].timewait = pr1[RL[j].index].timeOUT
- (pr1[RL[j].index].timeRL + pr1[RL[j].index].timeCPU);
pr1[RL[j].index].timesave = pr1[RL[j].index].timeOUT - pr1[RL[j].index].timeRL;
}
if (count == quantum || RL[j].timeCPU - temptime == 0) {
RL[j].timeOUT = t;
RL[j].timeCPU = temptime;
RL[j].timeIN = t - RL[j].timeCPU;
j++;
temptime = 0;
count = 0;
}
}
for (int i = 0; i < n; i++)
if (t == pr1[i].timeRL) {
m++;
RL = (process *) realloc(RL, m * sizeof(process));
RL[m - 1] = pr1[i];
}
}
}
void process_PRIORITY_preemptive(ListP &pr, int n, int timeOUT) {
ListP RL = new process[n];
ListP pr1 = pr; //list temp of pr
int j = 0, m = 0;
int temptime = 0;
for (int t = 0; t <= timeOUT; t++) {
if (m > 0 && j < m) {
if (temptime < RL[j].timeCPU)
temptime++;
if (temptime == RL[j].timeCPU) {
RL[j].timeIN = t - RL[j].timeCPU;
RL[j].timeOUT = RL[j].timeIN + RL[j].timeCPU;
RL[j].timewait = RL[j].timeOUT - (RL[j].timeRL + RL[j].timeCPU);
RL[j].timesave = RL[j].timeOUT - RL[j].timeRL;
temptime = 0;
j++;
}
}
for (int i = 0; i < n; i++)
if (t == pr1[i].timeRL) {
int k = m;
while (k > j + 1 && pr1[i].priority < RL[k - 1].priority) {
RL[k] = RL[k - 1];
k--;
}
RL[k] = pr1[i];
m++;
}
}
pr = RL;
}
void process_PRIORITY_nopreemptive(ListP &pr, ListP &RL, int n, int &m,
int timeOUT) {
RL = new process;
ListP pr1 = pr; //list temp of pr
process temp;
int j = 0;
m = 0;
int temptime = 0;
for (int t = 0; t <= timeOUT; t++) {
if (m > 0 && j < m) {
if (temptime < RL[j].timeCPU)
temptime++;
if (temptime == RL[j].timeCPU) {
RL[j].timeIN = t - RL[j].timeCPU;
RL[j].timeOUT = RL[j].timeIN + RL[j].timeCPU;
RL[j].timewait = RL[j].timeOUT - (RL[j].timeRL + RL[j].timeCPU);
RL[j].timesave = RL[j].timeOUT - RL[j].timeRL;
pr1[RL[j].index].timeOUT = t;
pr1[RL[j].index].timewait = pr1[RL[j].index].timeOUT
- (pr1[RL[j].index].timeRL + pr1[RL[j].index].timeCPU);
pr1[RL[j].index].timesave = pr1[RL[j].index].timeOUT - pr1[RL[j].index].timeRL;
temptime = 0;
j++;
}
}
for (int i = 0; i < n; i++)
if (t == pr1[i].timeRL) {
m++;
int k = m - 1;
RL = (process *) realloc(RL, m * sizeof(process));
if (temptime > 0 && pr1[i].priority < RL[j].priority) {
m++;
k = m - 1;
RL = (process *) realloc(RL, m * sizeof(process));
for (k = m - 1; k > j + 1; k--)
RL[k] = RL[k - 2];
RL[j + 1] = pr1[i];
RL[j + 2] = RL[j];
RL[j + 2].timeCPU -= temptime;
RL[j].timeIN = t - temptime;
RL[j].timeOUT = t;
RL[j].timeCPU = temptime;
temptime = 0;
j++;
} else {
while (k > j && pr1[i].priority < RL[k - 1].priority) {
RL[k] = RL[k - 1];
k--;
}
RL[k] = pr1[i];
}
}
}
}
void process_SJF_preemptive(ListP &pr, int n, int timeOUT) {
ListP RL = new process[n];
ListP pr1 = pr; //list temp of pr
int j = 0, m = 0;
int temptime = 0;
for (int t = 0; t <= timeOUT; t++) {
if (m > 0 && j < m) {
if (temptime < RL[j].timeCPU)
temptime++;
if (temptime == RL[j].timeCPU) {
RL[j].timeIN = t - RL[j].timeCPU;
RL[j].timeOUT = RL[j].timeIN + RL[j].timeCPU;
RL[j].timewait = RL[j].timeOUT - (RL[j].timeRL + RL[j].timeCPU);
RL[j].timesave = RL[j].timeOUT - RL[j].timeRL;
temptime = 0;
j++;
}
}
for (int i = 0; i < n; i++)
if (t == pr1[i].timeRL) {
int k = m;
while (k > j + 1 && pr1[i].timeCPU < RL[k - 1].timeCPU) {
RL[k] = RL[k - 1];
k--;
}
RL[k] = pr1[i];
m++;
}
}
pr = RL;
}
void process_SJF_nopreemptive(ListP &pr, ListP &RL, int n, int &m,
int timeOUT) {
RL = new process;
ListP pr1 = pr; //list temp of pr
process temp;
int j = 0;
m = 0;
int temptime = 0;
for (int t = 0; t <= timeOUT; t++) {
if (m > 0 && j < m) {
if (temptime < RL[j].timeCPU)
temptime++;
if (temptime == RL[j].timeCPU) {
RL[j].timeIN = t - RL[j].timeCPU;
RL[j].timeOUT = RL[j].timeIN + RL[j].timeCPU;
RL[j].timewait = RL[j].timeOUT - (RL[j].timeRL + RL[j].timeCPU);
RL[j].timesave = RL[j].timeOUT - RL[j].timeRL;
pr1[RL[j].index].timeOUT = t;
pr1[RL[j].index].timewait = pr1[RL[j].index].timeOUT
- (pr1[RL[j].index].timeRL + pr1[RL[j].index].timeCPU);
pr1[RL[j].index].timesave = pr1[RL[j].index].timeOUT - pr1[RL[j].index].timeRL;
temptime = 0;
j++;
}
}
for (int i = 0; i < n; i++)
if (t == pr1[i].timeRL) {
m++;
int k = m - 1;
RL = (process *) realloc(RL, m * sizeof(process));
if (temptime > 0 && pr1[i].timeCPU < RL[j].timeCPU - temptime) {
m++;
k = m - 1;
RL = (process *) realloc(RL, m * sizeof(process));
for (k = m - 1; k > j + 1; k--)
RL[k] = RL[k - 2];
RL[j + 1] = pr1[i];
RL[j + 2] = RL[j];
RL[j + 2].timeCPU -= temptime;
RL[j].timeIN = t - temptime;
RL[j].timeOUT = t;
RL[j].timeCPU = temptime;
temptime = 0;
j++;
} else {
while (k > j + 1 && pr1[i].timeCPU < RL[k - 1].timeCPU) {
RL[k] = RL[k - 1];
k--;
if (k == j + 1
&& pr1[i].timeCPU < RL[k - 1].timeCPU - temptime) {
RL[k] = RL[k - 1];
k--;
}
}
RL[k] = pr1[i];
}
}
}
}
void PROCESS(ListP &pr, ListP &RL, int n, int &m, int timeOUT, int select) {
switch (select) {
case 1:
process_FIFO(pr, n, timeOUT);
break;
case 2:
process_RR(pr, RL, n, m, timeOUT, quantum);
break;
case 3:
process_PRIORITY_preemptive(pr, n, timeOUT);
break;
case 4:
process_PRIORITY_nopreemptive(pr, RL, n, m, timeOUT);
break;
case 5:
process_SJF_preemptive(pr, n, timeOUT);
break;
case 6:
process_SJF_nopreemptive(pr, RL, n, m, timeOUT);
break;
}
}
void OUTPUT(ListP pr, ListP RL, int n, int m, int timeOUT, int select) {
switch (select) {
case 1:
output_FIFO(pr, n, timeOUT);
break;
case 2:
output_RR(pr, RL, n, m, timeOUT);
break;
case 3:
output_PRIORITY_preemptive(pr, n, timeOUT);
break;
case 4:
output_PRIORITY_nopreemptive(pr, RL, n, m, timeOUT);
break;
case 5:
output_SJF_preemptive(pr, n, timeOUT);
break;
case 6:
output_SJF_nopreemptive(pr, RL, n, m, timeOUT);
break;
}
cout << endl << "-----------------END-----------------" << endl << endl;
}
int main() {
ListP pr, RL;
int n, m, timeOUT;
input(pr, n, timeOUT);
output_input(pr, n);
PROCESS(pr, RL, n, m, timeOUT, set);
OUTPUT(pr, RL, n, m, timeOUT, set);
return 0;
}
続きを読む:
シミュレーション戦略コーディネーション排他的SJF
ラウンドロビンシミュレーション戦略管理プロセス



Cảm ơn anh rất nhiều về bài rất hay. Em xin được phép tải về để tham khảo.
Bạn cứ download thoải mái 🙂
.Bác cho em hỏi hôm trước em gõ lại thuật toán FIFO nhưng khi chạy nó lại báo lỗi debug , nếu bác có thời gian hướng dẫn em được không ạ , ありがとう ,
Giờ mình cũng không nhớ code từ mấy năm trước nữa. Chắc bạn phải tự mò thôi. 😉
em tải về sao nó không chạy được vậy anh. em chạy trên dev c++
Chu y file input va output nha
オファー, bài viết của a rất hay, nhưng không biết a có thể chuyển code này sang Pascal có được k vậy ạ. E cám ơn a rất nhiều.