Simulación C ++ para realizar la programación de tareas de la CPU (la realización de FCFS y SJF)

1. Título

Para simular la realización de la programación de tareas de la CPU, es necesario explicar el algoritmo de programación y la estructura de datos realizada.

En segundo lugar, las representaciones

  • Cuando no hay trabajos largos obvios, la diferencia de tiempo entre FCFS y SJF no es grande
    Inserte la descripción de la imagen aquí
  • Cuando aparecen trabajos obviamente largos, el tiempo de respuesta promedio de FCFS y SJF es muy diferente del tiempo de respuesta promedio ponderado
    Inserte la descripción de la imagen aquí

Tres, análisis

  • En este experimento, utilicé el método de cola de estructura para realizar las operaciones correspondientes. Solo necesito definir primero la estructura del trabajo y almacenarla en la cola al mismo tiempo. Al realizar diferentes operaciones de clasificación y pares en la cola Selección de elementos elegibles en la cola. En FCFS, podemos elegir qué trabajo ejecutar en este tiempo de acuerdo con la hora de llegada de cada trabajo. En SJF, debemos seleccionar en la cola de respaldo después de que se ejecute cada trabajo. Para el trabajo con el tiempo de ejecución más corto que se ha alcanzado, podemos ver a través del programa que cuando no hay un trabajo largo obvio en la cola de respaldo, la rotación promedio y el tiempo de respuesta promedio ponderado de FCFS y SJF no son muy diferentes, pero una vez que aparece un trabajo largo, La diferencia entre la rotación promedio y el tiempo de rotación promedio ponderado comenzó a aumentar significativamente.

Cuarto, el código

/*样例:
5
7 9
5 5
1 3
3 5
3 0

5
7 0
25 1
3 2
4 3
6 5
XMUT ZRZ 2020.6.19
*/
#include<iostream>
#include<queue>
#include<algorithm>
#include<windows.h>
#include<time.h>
#include <iomanip>
using namespace std;
#define MAX_SIZE 10
int n,max_time;
int Check[10] ;
struct Job {
    
    
    int id;
    int run_time;
    int arrive_time;
    int finish_time;
    int turnover_time;
    int level;
};
int cmp1(const Job& s1, const Job& s2) {
    
    //自己定义的排序规则 
    if (s1.arrive_time == s2.arrive_time)
        return s1.run_time < s2.run_time;
    return s1.arrive_time < s2.arrive_time;
}
int cmp2(const Job& s1, const Job& s2) {
    
    //自己定义的排序规则 
    if (s1.run_time == s2.run_time)
        return s1.arrive_time < s2.arrive_time;
    return s1.run_time < s2.run_time;


}
queue<Job> work,q,p;
Job job[MAX_SIZE];
Job temp;
void CreateJob() {
    
    
    for (int i = 0; i < MAX_SIZE; i++) {
    
    
        job[i].id = -1;
    }
    for (int i = 0; i < n; i++) {
    
    
        job[i].id = i+1;
        cout << "请输入运行时间、到达时间:";
        cin >> job[i].run_time >> job[i].arrive_time ;
    }
}

void FCFServed() {
    
    
    sort(job, job + n, cmp1);
    for (int i = 0; i < n; i++) {
    
    
        job[i].level = i + 1;
        q.push(job[i]);
    }
    double total_turnover = 0;
    double total_w_turnover = 0;
    auto t = clock();
    work = q;
    int starttime = 0;
    int finishtime = 0;
    cout << "Starting the FCFS..." << endl;
    printf("作业ID  提交时间  运行时间  开始时间  结束时间  周转时间  带权周转时间\n");
    while (!work.empty()) {
    
    
            Sleep(1000* work.front().run_time);//op
            starttime = max(finishtime, work.front().arrive_time);
            finishtime = starttime + work.front().run_time;
            printf(" %2d     %2d        %2d         %2d       %2d        %2d         %.2f\n", work.front().id, work.front().arrive_time, work.front().run_time, starttime, finishtime, finishtime - work.front().arrive_time, (double)(finishtime - (double)work.front().arrive_time) / work.front().run_time);
            total_turnover += ((double)finishtime - (double)work.front().arrive_time);
            total_w_turnover += ((double)finishtime - (double)work.front().arrive_time) / work.front().run_time;
            work.pop();
    }
    cout << "平均周转时间为:" <<setprecision(2) << (double)total_turnover / q.size() << endl;
    cout << "平均带权周转时间为:" << setprecision(2) << (double)total_w_turnover / q.size() << endl;
    cout << "经过的时间为:"<< clock() - t<<"ms"<< endl;
}
int Select1(Job job[], int n, double local) {
    
    
    int i = 0;
    for (int k = 0; k < n; k++) {
    
    
        if (Check[k] == 0) {
    
    
            i = k;
            break;
        }
    }
    for (int j = 0; j < n; j++) {
    
    
        if (job[i].run_time > job[j].run_time&& Check[j] == 0 && job[j].arrive_time <= local) {
    
    
            i = j;
        }
    }
    Check[i] = 1;
    return i;
}
void SJFServed() {
    
    
    sort(job, job + n, cmp1);
    double total_turnover = 0;
    double total_w_turnover = 0;
    auto t = clock();
    int starttime = 0;
    int finishtime = 0;
    cout << "Starting the SJF..." << endl;
    printf("作业ID  提交时间  运行时间  开始时间  结束时间  周转时间  带权周转时间\n");
    for (int i = 0; i < n; i++)
    {
    
    
        int index = Select1(job, n, finishtime);
        Sleep(1000 * job[index].run_time);//op
        starttime = max(finishtime, job[index].arrive_time);
        finishtime = starttime + job[index].run_time;
        printf(" %2d     %2d        %2d         %2d       %2d        %2d         %.2f\n", job[index].id, job[index].arrive_time, job[index].run_time, starttime, finishtime, finishtime - job[index].arrive_time, (double)(finishtime - (double)job[index].arrive_time) / job[index].run_time);
        total_turnover += ((double)finishtime - (double)job[index].arrive_time);
        total_w_turnover += ((double)finishtime - (double)job[index].arrive_time) / job[index].run_time;
    }

    
    cout << "平均周转时间为:" << setprecision(2) << (double)total_turnover / n << endl;
    cout << "平均带权周转时间为:" << setprecision(2) << (double)total_w_turnover / n << endl;
    cout << "经过的时间为:" << (clock() - t) << "ms" << endl;
}
int main()
{
    
    
    cout << "请输入作业个数:";
    cin >> n;
    CreateJob();
    FCFServed();
    cout << endl;
    SJFServed();
    system("pause");
}

Supongo que te gusta

Origin blog.csdn.net/qq_43663263/article/details/106854187
Recomendado
Clasificación