Advertisement
KDOXG

Escalonador

Nov 10th, 2019
477
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.54 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <list>
  4. #include <string>
  5. #include <fstream>
  6. #include <ostream>
  7. #include <cstring>
  8. #include <cstdlib>
  9. #include <cstdbool>
  10. #include "Process.hpp"
  11.  
  12. int error(const char* arg);
  13.  
  14. int main(int argc, char* argv[])
  15. {
  16.     if (argc < 4) return error("Erro: parĂ¢metros insuficientes! Desligando...\n");
  17.  
  18.     unsigned time = 0;                  //Contador global de slices percorridos
  19.     unsigned memory = 0;                //Contador global de memoria ocupada
  20.  
  21.     unsigned CPU = strtoul(argv[1],NULL,0);
  22.     unsigned slice = strtoul(argv[2],NULL,0);
  23.     unsigned totalMemory = strtoul(argv[3],NULL,0);
  24.     std::string fileName;
  25.     fileName.append(argv[4]);
  26.  
  27.     std::ifstream file;
  28.     file.open(fileName,std::ifstream::in);
  29.  
  30.     std::vector<Process> processList;       //Lista de todos os processos
  31.     unsigned n = 0;                         //Quantidade de processos lidos do arquivo
  32.     {
  33.         Process* p;                         //Objeto auxiliar
  34.         std::string param = std::string();  //String para guardar cada linha de arquivo
  35.         std::string aux = std::string();    //Auxiliar para a string "param"
  36.         unsigned time, slice, memory;       //Parametros temporarios para a instancia de cada objeto de processo
  37.         byte level;                         //Outro parametro temporario para a instancia do objeto de processo
  38.         byte i = 0, j, k;                   //Variaveis auxiliares para guardar indices intermediarios
  39.         while (!file.fail())
  40.         {
  41.             param.erase(param.begin(), param.end());
  42.             aux.erase(aux.begin(), aux.end());
  43.             getline(file, param);
  44.  
  45.             i = 0;
  46.             i = (byte)param.find(',', i);
  47.             aux = param.substr(0, i - 1);
  48.             time = std::stoul(aux, NULL, 0);
  49.             i += 2;
  50.  
  51.             j = (byte)param.find(',', i);
  52.             aux = param.substr(i, j - 1);
  53.             slice = std::stoul(aux, NULL, 0);
  54.             j += 2;
  55.  
  56.             k = (byte)param.find(',', j);
  57.             aux = param.substr(j, k - 1);
  58.             memory = std::stoul(aux, NULL, 0);
  59.             k += 2;
  60.  
  61.             aux = param.substr(k, param.size() - 1);
  62.             level = (byte)std::stoul(aux, NULL, 0);
  63.  
  64.             p = new Process(time, slice, memory, level);
  65.             processList.push_back(*p);
  66.             delete(p);
  67.             n++;
  68.  
  69.         }   //No final, a lista processList tem todos os processos previstos para a CPU usar para escalonar
  70.     }
  71.     file.close();
  72.     for (unsigned i = 0; i < processList.size(); i++)
  73.         if (processList[i].getMemory() > totalMemory)
  74.             return error("Erro: um ou mais processos nao possuem memoria o suficiente! Desligando...\n");
  75.  
  76.     //Existem cinco filas de processos pois existe uma para cada prioridade
  77.     std::list<Process*> processes[5];
  78.     //Existe tambem uma fila de processos esperando por memoria disponivel
  79.     std::list<Process*> memoryWait;
  80.    
  81.     //Loop principal    ***********************
  82.  
  83.     //Variavel auxiliar para comparar o nivel do processo que esta esperando na lista de espera com o lido atualmente
  84.     byte waiter = 5;
  85.     unsigned k;         //Contador de loop para achar a primeira lista de prioridades valida
  86.     unsigned j;         //Contador de loop para preencher todas as CPUs declaradas
  87.     while (n > 0)
  88.     {
  89.         k = 0;
  90.         j = 0;
  91.  
  92.         //Insercao na lista pelo tempo
  93.         for (unsigned i = 0; i < processList.size(); i++)
  94.         {
  95.             if (processList[i].getTime() == time && !processList[i].end())
  96.                 processes[processList[i].getLevel()].push_back(&processList[i]);
  97.         }
  98.  
  99.         //Remocao geral na lista    ***********************
  100.         while (j < CPU)
  101.         {
  102.             // Analisando os processos da lista de espera
  103.             if (memoryWait.size() != 0)
  104.             {
  105.                 waiter = memoryWait.front()->getLevel();
  106.                 for (std::list<Process*>::iterator it = memoryWait.begin(); it != memoryWait.end(); it++)
  107.                 {
  108.                     if ((*it)->getStatus() != PRONTO)
  109.                         waiter = (*it)->getLevel() < waiter ? (*it)->getLevel() : waiter;
  110.                     else
  111.                         processes[(*it)->getLevel()].push_back(*it);
  112.                 }
  113.             }
  114.  
  115.             while (k < 5 && (processes[k].size() == 0 || k < waiter))
  116.                 k++;
  117.             if (k == 5)
  118.                 break;
  119.  
  120.             // Tirando processo da lista de processos a executar caso ja tenha terminado
  121.             if (processes[k].front()->getStatus() == FINISH)
  122.             {
  123.                 processes[k].pop_front();
  124.             }
  125.  
  126.             // Processo pronto para processar
  127.             if ((   processes[k].front()->getStatus() == EM_ESPERA
  128.                     ||  processes[k].front()->getStatus() == PRONTO)
  129.                     && processes[k].front()->getMemory() + memory <= totalMemory)
  130.             {
  131.                 processes[k].front()->setSlice(time);
  132.                 processes[k].front()->setLevel();
  133.                 processes[processes[k].front()->getLevel()].push_back(processes[k].front());
  134.                 processes[k].pop_front();
  135.             }
  136.             // Memoria faltando
  137.             else if (processes[k].front()->getStatus() != EM_EXECUCAO)
  138.             {
  139.                 processes[k].front()->setChange(memory, totalMemory);
  140.                 if (processes[k].front()->getStatus() == BLOQUEADO)
  141.                     memoryWait.push_back(processes[k].front());
  142.                 else
  143.                     processes[k].push_back(processes[k].front());
  144.                 processes[k].pop_front();
  145.             }
  146.             j++;
  147.         }
  148.  
  149.         //Atualizacao na lista
  150.         for (unsigned i = 0; i < processList.size(); i++)
  151.         {
  152.             if (processList[i].end())
  153.                 n--;
  154.             processList[i].setDuration();
  155.             processList[i].setChange(memory,totalMemory);
  156.         }
  157.  
  158.         //Avanco no tempo
  159.         time++;
  160.     }
  161.  
  162.     //Escrita dos resultados no arquivo *************
  163.  
  164.     unsigned i = 0;
  165.     std::ofstream file_out;
  166.     file_out.open("data.txt", std::ios::app);
  167.     while (!file_out.fail() && i < processList.size())
  168.     {
  169.         file_out << processList[i].getTime() << ", ";
  170.         file_out << processList[i].getRead() << ", ";
  171.         file_out << processList[i].getTotal() << ", ";
  172.         file_out << processList[i].getDuration() << "\n";
  173.         i++;
  174.     }
  175.     file_out.close();
  176.  
  177.     return 0;
  178. }
  179.  
  180. int error(const char* arg)
  181. {
  182.     std::cout << arg;
  183.     return -1;
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement