linknaka

Real final

Sep 30th, 2017
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.91 KB | None | 0 0
  1. import java.io.File;
  2. import java.io.FileNotFoundException;
  3. import java.io.FileReader;
  4. import java.io.FileWriter;
  5. import java.io.IOException;
  6. import java.util.Scanner;
  7. import java.io.BufferedReader;
  8. import java.io.BufferedWriter;
  9.  
  10. public class Escalonador {
  11. //Estruturas
  12.     public static class Fila{
  13.         int Process;
  14.         Fila prox;
  15.         Fila ant;
  16.     }
  17.    
  18.     public static class Processo{
  19.         int numero;
  20.         String nome;
  21.         int[] bcp={0,0,0,0,0};
  22.         /*BCP, um array que vai numeros
  23.          * Posições:
  24.          * [0]=Program counter
  25.          * [1]=Estado atual (0=pronto, 1=executando, 2=bloqueado)
  26.          * [2]=Prioridade
  27.          * [3]=Registrador de uso geral X
  28.          * [4]=Registrador de uso geral Y
  29.          ** */
  30.         //Se possivel tirar essa linha pra ler direto do arquivo de texto: (Pagina 2), trocar por "referencia a memoria"
  31.         String[] linhas=new String[22];
  32.         //Flag de terminado
  33.         boolean terminado;
  34.        
  35.     }  
  36.    
  37.     public static void main(String[] args) throws NumberFormatException, IOException {
  38.         Escalonador esc=new Escalonador();
  39.         //Criar estrutura de fila
  40.         Fila prontos=new Fila();
  41.         Fila firstPronto;
  42.         int Quantidade=0;
  43.        
  44.        
  45.         int[][] bloqueados=new int[3][2];
  46.         Processo[] tabela=null;
  47.         int[] creditos=carregaPrioridades();
  48.         //Ler dos arquivos
  49.         tabela=carregaProcessos();
  50.         //Quantum lido do arquivo
  51.          
  52.             BufferedReader sq = new BufferedReader(new FileReader("processos/quantum.txt"));
  53.             int Quantum=Integer.parseInt(sq.readLine());    
  54.             sq.close();
  55.          
  56.          //jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
  57.         String nome;
  58.         if (Quantum > 9) {
  59.             nome = Integer.toString(Quantum);
  60.         } else {
  61.             nome = "0" + Quantum;
  62.         }
  63.         File arquivo = new File("log" + nome + ".txt");
  64.         FileWriter fw = new FileWriter(arquivo, true);
  65.         BufferedWriter bw = new BufferedWriter(fw);
  66.         //cria o log e os writers
  67.         //kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
  68.        
  69.          
  70.          
  71.        
  72.        
  73.        
  74.        
  75.          
  76.         //Adiciona toda tabela na fila de prontos
  77.             int x=0;
  78.             firstPronto=null;
  79.             ResetCreditos(tabela, creditos);
  80.             firstPronto=OrdenaFila(creditos,tabela);
  81.            
  82.         //jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
  83.         //Varrendo a fila de prontos
  84.         Fila auxiliarLeitura=firstPronto;
  85.         while(true){
  86.         //Le da forma
  87.         bw.write("Carregando: "+tabela[auxiliarLeitura.Process].nome);
  88.         bw.newLine();
  89.         if(auxiliarLeitura.prox!=null){
  90.         auxiliarLeitura=auxiliarLeitura.prox;
  91.         }
  92.         else{
  93.         break;
  94.         }
  95.         }
  96.         //kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
  97.        
  98.        
  99.        
  100.        
  101.        
  102.        
  103.         while(true){
  104.         //Check de saida: Não tem ninguem na tabela de processos
  105.        boolean saida=true;
  106.        for(int i=0;i<11;i++){
  107.            if(!tabela[i].terminado){
  108.                saida=false;
  109.            }
  110.        }
  111.        if(saida==true){
  112.            break;
  113.        }
  114.        //Se não possui um pronto, então deve ter na fila de bloqueados
  115.        if(firstPronto==null){
  116.            DaemonDeFila(bloqueados, firstPronto, Quantidade, tabela,creditos);
  117.        }
  118.        
  119.        //Seleciona o processo atual
  120.        int atual=firstPronto.Process;
  121.        
  122.         //Rodar  Quantum
  123.        int q=Quantum;
  124.          while(q>0){
  125.            q--;
  126.            tabela[atual].bcp[1]=1;  //Seta que está executando
  127.            //PC=PC+1
  128.            tabela[atual].bcp[0]++;  
  129.            //Verifica o que está escrito na linha e chama o metodo que o trata
  130.            if(tabela[atual].linhas[tabela[atual].bcp[0]].equals("SAIDA")){
  131.                SAIDA(tabela, atual);
  132.                DaemonDeFila(bloqueados, firstPronto, Quantidade, tabela,creditos); //Roda o daemon de fila antes, pois não passara por ele após o break
  133.                break; //Sai do while pois o processo foi removido a força
  134.            }
  135.            if(tabela[atual].linhas[tabela[atual].bcp[0]].equals("E/S")){
  136.                ES(tabela, atual, bloqueados,bw);
  137.            }
  138.            if(tabela[atual].linhas[tabela[atual].bcp[0]].equals("COM")){
  139.                Comando(tabela, atual,bw);
  140.            }
  141.           if(tabela[atual].linhas[tabela[atual].bcp[0]].contains("X")){
  142.             //Após ler que a linha possui x ou Y, copia o valor da linha para K
  143.            String K=tabela[atual].linhas[tabela[atual].bcp[0]];
  144.            //E de K é pego o valor alteravel
  145.            int valor=Integer.valueOf(K.replaceAll("[^0-9]", ""));
  146.                changeX(tabela, atual, valor,bw);
  147.            }
  148.            if(tabela[atual].linhas[tabela[atual].bcp[0]].contains("Y")){
  149.                //Após ler que a linha possui x ou Y, copia o valor da linha para K
  150.                String K=tabela[atual].linhas[tabela[atual].bcp[0]];
  151.                //E de K é pego o valor que deve alterar
  152.                int valor=Integer.valueOf(K.replaceAll("[^0-9]", ""));
  153.                changeY(tabela, atual, valor, bw);
  154.            }
  155.            //Após ação, andar a fila de bloqueados
  156.            DaemonDeFila(bloqueados, firstPronto, Quantidade, tabela,creditos);
  157.        
  158.        }        
  159.        
  160.        
  161.         //Remover credito
  162.          creditos[atual]--;
  163.         if(creditos[atual]==0){
  164.             //Caso o credito acabe e esteja no final da fila
  165.             if(firstPronto.prox==null){        
  166.             ResetCreditos(tabela, creditos);
  167.             firstPronto=OrdenaFila(creditos,tabela);
  168.             }
  169.             else{
  170.             //Apenas anda a fila e vai para o prox
  171.             atual=firstPronto.prox.Process;        
  172.             firstPronto=firstPronto.prox;
  173.             firstPronto.ant=null;
  174.             }
  175.         }
  176.         //Condição de andar          
  177.         else if(creditos[atual]>creditos[firstPronto.prox.Process]){    
  178.            
  179.  
  180.            
  181.             atual=firstPronto.prox.Process;
  182.             //Remove da fila e coloca novamente
  183.             int numAux=firstPronto.Process;
  184.             firstPronto=firstPronto.prox;
  185.             firstPronto.ant=null;
  186.             firstPronto=AdicionaProntos(numAux, firstPronto, creditos);
  187.         }
  188.        
  189.        
  190.      
  191.        
  192.        
  193.     }      
  194.        
  195.        
  196.         //Fim do while e log de finalização
  197.        
  198.     }
  199.    
  200.     public static void SAIDA(Processo[] p,int processo){
  201.         p[processo].terminado=true; //Termina o processo
  202.          p[processo].bcp[1]=-1; //Seta o estado como -1
  203.          /* Escreve no log*/
  204.          
  205.     }
  206.    
  207.     public static void changeX(Processo[] p,int processo,int valor, BufferedWriter bw){
  208.         p[processo].bcp[3]=valor; //Atualiza valor X
  209.         p[processo].bcp[1]=0; //Seta o estado como pronto
  210.         /* Escreve no log*/
  211.        
  212.     }
  213.     public static void changeY(Processo[] p,int processo,int valor, BufferedWriter bw){
  214.         p[processo].bcp[4]=valor; //Atualiza valor Y
  215.         p[processo].bcp[1]=0; //Seta o estado como pronto
  216.         /* Escreve no log*/
  217.     }
  218.     public static void ES(Processo[] p,int processo,int[][] bloqueados, BufferedWriter bw){
  219.         //Encontra espaço da fila
  220.         int i=0;
  221.         while(true){
  222.         if(bloqueados[i][0]!=0){
  223.         i++;  
  224.         }
  225.         else{
  226.             break;
  227.         }      
  228.         }
  229.         //Adiciona na fila de espera
  230.         bloqueados[i][0]=processo;
  231.         bloqueados[i][1]=2;//Tempo de espera
  232.         p[processo].bcp[1]=2; //Seta o estado como bloqueado
  233.        
  234.         /* Escreve no log*/
  235.        
  236.     }
  237.     public static void Comando(Processo[] p,int processo, BufferedWriter bw){
  238.          p[processo].bcp[1]=0;
  239.         /* Escreve no log*/
  240.        
  241.        
  242.         //for(Programa programa: bcp.programas){
  243.         //  bw.write("Carregando: "+programa.nome);
  244.         //  bw.newLine();
  245.         //}
  246.        
  247.        
  248.     }
  249.     public static void DaemonDeFila(int[][] bloqueados, Fila FirstPronto, int quantidade, Processo[] tabela, int[] creditos){  
  250.        
  251.         //Remove 1 tempo de cada processo na fila de bloqueados
  252.         if(bloqueados[0][0]!=0){
  253.             bloqueados[0][1]--;
  254.             if(bloqueados[0][1]==0){
  255.                 FirstPronto=AdicionaProntos(bloqueados[0][0], FirstPronto,creditos);
  256.                 tabela[bloqueados[0][0]].bcp[1]=0;
  257.                
  258.           }
  259.         }
  260.         if(bloqueados[1][0]!=0){
  261.             bloqueados[1][1]--;
  262.             if(bloqueados[1][1]==0){
  263.                 FirstPronto=AdicionaProntos(bloqueados[1][0], FirstPronto,creditos);
  264.                 tabela[bloqueados[1][0]].bcp[1]=0;
  265.                
  266.             }
  267.         }
  268.         if(bloqueados[2][0]!=0){
  269.             bloqueados[2][1]--;
  270.             if(bloqueados[0][1]==0){
  271.                 FirstPronto=AdicionaProntos(bloqueados[2][0], FirstPronto,creditos);
  272.                 tabela[bloqueados[2][0]].bcp[1]=0;
  273.                
  274.             }
  275.         }
  276.      
  277.     }
  278.     private static Fila AdicionaProntos(int processo, Fila FirstPronto,int[] creditos) {
  279.         //Adiciona na fila e retorna o primeiro processo da fila
  280.         if(FirstPronto==null){
  281.             //Adiciona o primeiro
  282.             FirstPronto=new Fila();
  283.             FirstPronto.ant=null;
  284.             FirstPronto.prox=null;
  285.             FirstPronto.Process=processo;
  286.             return FirstPronto;
  287.         }
  288.         else{
  289.             //Verificação 1: Se o processo adicionado tem maior prioridade e então vira o novo FirstPronto
  290.             if(creditos[processo]>creditos[FirstPronto.Process]){
  291.                 Fila aux=new Fila();
  292.                 aux.ant=null;
  293.                 aux.prox=FirstPronto;
  294.                 FirstPronto.ant=aux;
  295.                 return aux;
  296.             }
  297.             Fila atual=FirstPronto;
  298.             while(true){
  299.             if(creditos[atual.Process]>=creditos[processo]){
  300.                 //Se o processo adicionado for menor que o atual, então anda pro proximo
  301.                 if(atual.prox==null){
  302.                     //Se o proximo for nulo, então adiciona aqui de qualquer jeito
  303.                     Fila aux=new Fila();
  304.                     aux.ant=atual;
  305.                     aux.prox=null;
  306.                     return FirstPronto;
  307.                 }
  308.                 else{
  309.                     atual=atual.prox;
  310.                 }
  311.             }
  312.             else{ //Processo adicionado é maior que o atual
  313.                 Fila aux=new Fila();
  314.                 aux.prox=atual;
  315.                 aux.ant=atual.ant;
  316.                 atual.ant=aux;
  317.                 return FirstPronto;
  318.             }
  319.            
  320.            
  321.             }
  322.  
  323.         }
  324.        
  325.        
  326.     }
  327.    
  328.     private static Fila OrdenaFila(int[] creditos,Processo[] tabela){
  329.        //Adiciona todo mundo e retorna o first pronto
  330.         Fila FirstPronto=null;
  331.         for(int i=0;i<11;i++){
  332.             if(!tabela[i].terminado){
  333.                 //Se o processo está pronto pra ser usado, então adiciona ele na fila
  334.                 FirstPronto=AdicionaProntos(i, FirstPronto,creditos);
  335.             }
  336.         }
  337.        
  338.        
  339.        
  340.        
  341.         return FirstPronto;
  342.                
  343.     }
  344.    
  345.     private static void ResetCreditos(Processo[] p, int[] creditos){
  346.         //Restaura o valor de creditos baseado no valor salvo no bcp
  347.         for(int i=0;i<10;i++){
  348.             if(!p[i].terminado){
  349.                 creditos[i]=p[i].bcp[2];
  350.             }
  351.         }
  352.     }
  353.     private static Processo[] carregaProcessos() {
  354.         Processo[] processos = new Processo[10];
  355.  
  356.         for (int i = 1; i < 11; i++) {
  357.             try {
  358.                 BufferedReader br = new BufferedReader(new FileReader("processos/" + (i == 10 ? i : "0" + i) + ".txt"));
  359.                
  360.                
  361.                 Processo processo = new Processo();
  362.                 int contador = 0;
  363.  
  364.                 processo.nome = br.readLine();
  365.                 while (contador < 22) {
  366.                     String linha = br.readLine();
  367.                     if (linha != null) {
  368.                         processo.linhas[contador++] = linha;
  369.                         break;
  370.                     }
  371.                 }
  372.  
  373.                 processos[i - 1] = processo;
  374.                 br.close();
  375.             } catch (Exception e) {
  376.                 e.printStackTrace();
  377.             }
  378.         }
  379.  
  380.         return processos;
  381. }
  382.   private static int[] carregaPrioridades() {
  383.         int[] prioridades = new int[10];
  384.  
  385.         try (BufferedReader br = new BufferedReader(new FileReader("processos/prioridades.txt"))) {
  386.             for (int i = 0; i < 10; i++) {
  387.                 prioridades[i] = Integer.parseInt(br.readLine());
  388.             }
  389.         } catch (Exception e) {
  390.             e.printStackTrace();
  391.         }
  392.  
  393.         return prioridades;
  394.     }
  395.    
  396.    
  397.    
  398. }
Add Comment
Please, Sign In to add comment