300x250 AD TOP

Blogger news

AD (728x90)

Tecnologia do Blogger.

Colaboradores

Seguidores

Postagens populares

Feature Label Area

Tagged under: , ,

Como conectar o Bitbucket com o Android Studio


O Android Studio pode até trabalhar por padrão com o repositório web  GitHub, mas não com não acontece o mesmo com o BitBucket, e qual a maior vantagem de trabalhar com o BitBucket? Simples e claro, você pode deixar o seu projeto privado :D, sem precisar pagar nada por isso. Então vamos lá.
Há uma série de tutoriais na Internet que descrevem formas de trabalhar com um repositório BitBucket/Github em um projeto Android Studio, principalmente usando o Terminal Linux.
Contudo este tutorial não é sobre como trabalhar com o Git no  terminal, com todos aqueles  push, pull, commit, etc. Além do mais, uma alternativa é fazer tudo isso a partir dos menu VCS dentro do Android Studio.

Passo 1: Primeiro, você precisa baixar o BitBucket Plugin:
Não precisa descompactar o arquivo!!

Passo 2: Nessa etapa, vamos instalar o plug-in. Se o Android Studio já estiver aberto com um de seus projetos, vá para o botão de File->Settings na barra de ferramentas e escolha Plugins.
O mesmo menu também pode ser alcançado a partir da tela de boas vindas:

 Screenshot from 2015-05-09 14:54:49
Passo 3: Escolha a opção <Install plugin from disk ..> e então navegue até o local onde você baixou o arquivo .zip no passo 1, em seguida aperte <OK>

http://i2.wp.com/www.goprogramming.space/wp-content/uploads/2015/05/Screenshot-from-2015-05-09-151309.png

Passo 4: Reinicie  o Android Studio e o Plugin está pronto para usar.
Inicie um novo projeto Android Studio ou use o que você já tem aberto.
O Projeto precisará ser ativado para usar VCS. O processo de ativação consiste em escolher o seguinte item no menu, VCS->Enable Version Control Intregration...

Screenshot from 2015-05-09 15:13:09

Uma coisa legal é que o BitBucket é baseado no Git, assim como o Github, de tal forma que você poderá aproveitar todos os comandos que você aprendeu (push, pull, commit, branch, etc. ) a utilizar no Github de forma análoga no BitBucket.
Screenshot from 2015-05-09 15:13:43

Por isso, como você pode ver na imagem, essa conexão é semelhante à conexão com um repositório GitHub.

Screenshot from 2015-05-09 15:14:42

Por fim a minha funcionalidade Share Project não funcionou em meus testes. Vale a pena tentar. Talvez ele funciona com outro sistema operacional ou uma versão atualizada. Foi testado no Ubuntu 14.04 e no Mint 17

Screenshot from 2015-05-09 15:17:28

O que eu fiz em vez disso foi:
  • Criar repositório na Web no BitBucket, com exatamente o mesmo nome do projeto.

Screenshot from 2015-05-09 15:41:14
  • Pegar o mini tutorial que aparece no Bitbucket, representado a baixo:
Screenshot from 2015-05-09 15:44:52
  • E preencher o HTTP adress do Bitbucket

Screenshot from 2015-05-09 15:45:28

Depois disso, estava habilitado a utilizar o commit, pull e push. O repositório on-line não tem nenhum arquivos depois de criar. Assim, o commi e o push, levam todos os arquivos que tenho no Android Studio.
Screenshot from 2015-05-09 15:45:57

Assim acessando o site do Bitbucket, após efetuar o login é possível visualizar os arquivos do projeto que foi colocado.


Screenshot from 2015-05-09 15:48:35
Também é importante, a partir da tela de boas-vindas do Android Studio testar a opção <“Check out project from Version Control> e escolha BitBucket.

Screenshot from 2015-05-09 15:57:47


Nessa tela abaixo você deve escolher o projeto que você deseja importar.

Screenshot from 2015-05-09 15:58:33

Depois que você escolher o projeto, é esperado que ele seja aberto. Isso pode demorar dependo da sua internet e da quantidade de dependências que o Android Studio terá que baixar para fazer com que o seu projeto funcione corretamente, É isso aí.
Esse tutorial básico, é em tese uma tradução do link abaixo, dependendo do seu ponto de vista ele pode não ser, por fim espero que ele seja útil.

Referencias
http://www.goprogramming.space/connecting-android-studio-project-with-bitbucket/
Tagged under: , , , , , , ,

Algoritmos de trocas de páginas - Implementação

Quando não há espaço disponível para armazenar a nova página o sistema operacional deverá escolher, entre as páginas que estão na memória principal, uma para remover e permitir que a nova página seja trazida para a memória. Se esta página a ser removida foi modificada enquanto estava na memória, ela deverá ser salva no disco antes de poder trazer a nova página. Caso uma página que é frequentemente acessada seja removida da memória, muito provavelmente ela deverá ser trazida de volta a memória em um curto período, causando um gasto de tempo evitável.Para gerenciar a memória, são utilizados algoritmos de troca de página.

Critérios para substituição de página:

  • Idade da página: páginas muito antigas talvez sejam pouco usadas.
  • Frequência de acessos: páginas muito acessadas possivelmente ainda o serão.
  • Data do último acesso: páginas sem acesso a muito tempo não o serão mais. 
  • Prioridade: processos de alta prioridade, ou de tempo-real, podem precisar de suas páginas de memória rapidamente.
  • Conteúdo da página: páginas com  código executável exigem menos esforço enquanto páginas de dados que tenham sido alteradas precisam ser salvas.
  • Páginas especiais: páginas contendo buffers de operações de E/S causam problemas.

Para o estudo de algoritmos de substituição utiliza-se uma string de referência, que indica a sequência de páginas acessadas por um processo durante sua execução.
Exemplo: 0, 2, 1, 3, 5, 4, 6, 3, 7, 4, 7, 3, 3, 5, 5, 3, 1, 1, 1, 7, 1, 3, 4, 1 
Onde cada um dos valores é referência para uma página. Dizemos que ocorre uma falta, sempre que há substituição de uma página na memória.

Algoritmo FIFO
Baseado na idade das páginas na memória, ou seja, páginas mais antigas podem ser removidas.



Algoritmo Ótimo
“A melhor página a remover  em um dado instante é aquela que ficará mais tempo sem ser usada”, ou seja, não é implementável pois seria necessário prever o futuro da cadeia de referência.

Algoritmo LRU
O LRU (Least Recently Used, menos utilizado recentemente) escolhe preferencialmente páginas antigas e menos usadas para remoção.

Algoritmo da Segunda Chance
Implementação do FIFO que analisa o bit de referência de cada página candidata, para saber se ela foi acessada recentemente. Caso essa página tenha sido acessada recentemente (bit=1), ela recebe um "segunda chance" e volta para o fim da fila com o bit ajustado para 0.
Pode ser visualizado como uma lista circular, ou relógio.


Implementação em Java
Código em Java que simula os algoritmos de substituição de páginas FIFO, LRU e Segunda Chance. A entrada da cadeia de referências segue o formato: 1,0;1,1;2,0;1,1;2,1;3,0;1,3;0,0; que corresponde a sequência de referências à página 0 do processo 1, seguido da página 1 do processo 1, etc.


import java.util.LinkedList;
import java.util.Scanner;

public class Test {
 public static void main(String[] args) {
  Scanner scanner = new Scanner(System.in);
  String referencia = scanner.nextLine();
  String[] stringReferencia = referencia.split(";");

  // FIFO
  AlgoritmoDeSubstituicao fifo = new AlgoritmoFifo(3);

  for (int i = 0; i < (stringReferencia.length - 1); i++) {
   fifo.inserir(stringReferencia[i]);

  }
  System.out.println("Page Faults: " + fifo.getPageFaultCount());

  // LRU
  AlgoritmoDeSubstituicao lru = new AlgoritmoLRU(3);

  for (int i = 0; i < (stringReferencia.length - 1); i++) {
   lru.inserir(stringReferencia[i]);

  }
  System.out.println("Page Faults: " + lru.getPageFaultCount());

  // SEGUNDA CHANCE
  AlgoritmoDeSubstituicao sc = new AlgoritmoSegundaChance(3);

  for (int i = 0; i < (stringReferencia.length - 1); i++) {
   sc.inserir(stringReferencia[i]);
   // sc.imprimirQuadros();

  }
  System.out.println("Page Faults: " + sc.getPageFaultCount());

 }
}

abstract class AlgoritmoDeSubstituicao {
 protected int numeroDeFalhas;
 protected int numeroDeQuadros;
 LinkedList quadros;

 public AlgoritmoDeSubstituicao(int numeroDeQuadros) {
  if (numeroDeQuadros < 0)
   throw new IllegalArgumentException();
  this.numeroDeQuadros = numeroDeQuadros;
  numeroDeFalhas = 0;
 }

 public int getPageFaultCount() {
  return numeroDeFalhas;
 }

 public abstract void inserir(String pageNumber);

 public void imprimirQuadros() {
  System.out.print("Quadros:  ");
  for (int i = 0; i < quadros.size(); i++) {
   System.out.print(quadros.get(i) + " ");
  }
  System.out.println();
 }
}

class AlgoritmoSegundaChance extends AlgoritmoDeSubstituicao {
 LinkedList bits;
 private static int PONTEIRO = 0;

 public AlgoritmoSegundaChance(int numeroDeQuadros) {
  super(numeroDeQuadros);
  this.quadros = new LinkedList();
  this.bits = new LinkedList();

 }

 @Override
 public void inserir(String pageNumber) {
  int tmp = quadros.indexOf(pageNumber);

  // caso a pagina ainda nao esteja na memoria
  if (tmp == -1) {
   if (quadros.size() < numeroDeQuadros) {
    quadros.add(pageNumber);
    bits.add(0);
   } else {
    while (bits.get(PONTEIRO) == 1) {
     bits.set(PONTEIRO, 0);
     PONTEIRO++;
     // ponteiro voltando ao inicio
     if (PONTEIRO == numeroDeQuadros) {
      PONTEIRO = 0;
     }
    }
    // substituicao
    quadros.remove(PONTEIRO);
    bits.remove(PONTEIRO);
    quadros.add(PONTEIRO, pageNumber);
    bits.add(PONTEIRO, 0);

    PONTEIRO++;
    // ponteiro voltando ao inicio
    if (PONTEIRO == numeroDeQuadros) {
     PONTEIRO = 0;
    }
   }
   numeroDeFalhas++;
  } else { // se a pagina ja esta na memoria
   bits.set(tmp, 1);

  }
 }

 @Override
 public void imprimirQuadros() {
  System.out.print("Quadros:  ");
  for (int i = 0; i < quadros.size(); i++) {
   System.out.print(quadros.get(i) + " bit: " + bits.get(i) + " ");
  }
  System.out.println();
 }
}

class AlgoritmoFifo extends AlgoritmoDeSubstituicao {
 private static int INSERCAO = 0;

 public AlgoritmoFifo(int numeroDeQuadros) {

  super(numeroDeQuadros);
  this.quadros = new LinkedList();
 }

 @Override
 public void inserir(String pageNumber) {
  // antes de inserir, checar se a pagina ja esta na lista
  if (!quadros.contains(pageNumber)) {

   // se a quantidade de paginas na memoria for menor que o numero de
   // quadros
   // ou seja, ainda ha espaco
   if (quadros.size() < numeroDeQuadros) {
    quadros.add(pageNumber);
   } else {
    quadros.remove(INSERCAO);
    quadros.add(INSERCAO, pageNumber);
    INSERCAO++;
    if (INSERCAO == numeroDeQuadros) {
     INSERCAO = 0;
    }
   }
   numeroDeFalhas++;

  }
 }
}

class AlgoritmoLRU extends AlgoritmoDeSubstituicao {

 public AlgoritmoLRU(int numeroDeQuadros) {
  super(numeroDeQuadros);
  // TODO Auto-generated constructor stub
  this.quadros = new LinkedList();

 }

 @Override
 public void inserir(String pageNumber) {
  // TODO Auto-generated method stub
  int tmp = quadros.indexOf(pageNumber);
  if (tmp == -1) {

   if (quadros.size() < numeroDeQuadros) {
    quadros.add(pageNumber);
   } else {

    quadros.remove(0);
    quadros.add(pageNumber);
   }
   numeroDeFalhas++;

  } else {
   quadros.remove(tmp);
   quadros.add(pageNumber);
  }
 }

}
Referências:
Sistemas Operacionais: Conceitos e Mecanismos – Carlos Maziero disponível em:
http://wiki.inf.ufpr.br/maziero/doku.php?id=so:livro_de_sistemas_operacionais





Tagged under: , , , , , ,

Algoritmos de escalonamento de processos

    O escalonador é responsável por decidir a ordem de execução dos processos prontos, ou seja, que escalona os processos. O escalonamento de processos é realizado por um algoritmo que visa tratar de forma eficiente e rápida os processos a serem tratados. Vários critérios podem ser definidos para a avaliação dos escalonadores. Os mais frequentes são:
    • tempo de execução (turnaround) → mede o tempo decorrido entre a criação e o encerramento da tarefa, computando todos os tempos de processamento e de espera.
    • tempo de espera (waiting time) → tempo total perdido pela tarefa na fila de prontos, aguardando o processador.
    • tempo de resposta → tempo decorrido entre a chegada de um evento ao sistema e o resultado imediato de seu processamento.   
    • Eficiência → Indica o grau de utilização do processador na execução das tarefas do usuário.
    • Justiça → Distribuição do processador entre as tarefas prontas.


    Cálculo do tempo médio de execução

    Ou seja, a soma dos tempos de execução de cada processo (tempo final – tempo de ingresso) dividido pela quantidade de processos.



    Cálculo do tempo médio de espera


    Ou seja, a soma dos tempos de espera de cada processo (tempo de inicio da execução – tempo de ingresso) dividida pela quantidade de processos.


    Preempção

    O escalonamento de um SO pode ser preemptivo ou não preemptivo.
    Em escalonadores preemptivos, uma tarefa pode perder o processador caso acabe seu quantum, execute uma chamada de sistema ou ocorra uma interrupção que acorde uma tarefa mais prioritária.
    Em escalonadores não-preemptivos, a tarefa permanece no processador tanto quanto possível, só abandonando caso termine de executar, solicite uma operação de E/S ou libere o processador.


    Escalonamento FCFC(First-Come, First Served)

    É a forma mais elementar de escalonamento. Utiliza um algoritmo simples que atende as tarefas em sequência assim que ficam prontas. Ou seja, de acordo com sua chegada na fila de prontos (FIFO). Não utiliza preempção.

    Exemplo:



    Implementação em Java

    import java.text.DecimalFormat;
    import java.util.ArrayList;
    import java.util.Scanner;
    
    public class fcfs {
     public static void main(String[] args) {
      // declaracao de variaveis
      Scanner scanner = new Scanner(System.in);
      int N, entrada, tempoAtual;
      double tempoExecucao, tempoEspera;
      ArrayList processos, ingressos, duracoes, temposFinais, temposIniciais;
      int contTeste = 0;
      N = scanner.nextInt();
      String formato, saida;
      DecimalFormat nf = new DecimalFormat("0.00");
    
      while (N != 0) {
       contTeste++;
       // inicializacao de variaveis
       processos = new ArrayList();
       ingressos = new ArrayList();
       duracoes = new ArrayList();
       temposFinais = new ArrayList();
       temposIniciais = new ArrayList();
       tempoEspera = 0;
       tempoExecucao = 0;
    
       for (int i = 1; i <= N; i++) {
        // adiciona processo a lista de processos
        processos.add(i);
    
        // le e adiciona ingresso no processo i
        entrada = scanner.nextInt();
        ingressos.add(entrada);
    
        // le e adiciona duracao do processo i
        entrada = scanner.nextInt();
        duracoes.add(entrada);
       }
    
       // tempo inicial = tempo de ingresso do primeiro processo
       tempoAtual = ingressos.get(0);
    
       // adicionando tempos de inicio e termino dos processos
       for (int i = 0; i < N; i++) {
        if (ingressos.get(i) > tempoAtual) {
         tempoAtual = ingressos.get(i);
        }
        temposIniciais.add(tempoAtual);
        tempoAtual += duracoes.get(i);
        temposFinais.add(tempoAtual);
       }
    
       // calculo dos tempos medios de espera e execucao
       for (int i = 0; i < N; i++) {
        tempoExecucao += temposFinais.get(i) - ingressos.get(i);
        tempoEspera += temposIniciais.get(i) - ingressos.get(i);
       }
       tempoExecucao = tempoExecucao / N;
       tempoEspera = tempoEspera / N;
       System.out.println("Teste " + contTeste);
    
       formato = nf.format(tempoExecucao);
       saida = "Tempo medio de execucao: " + formato + "s";
       saida = saida.replace(".", ",");
       System.out.println(saida);
    
       formato = nf.format(tempoEspera);
       saida = "Tempo medio de espera: " + formato + "s";
       saida = saida.replace(".", ",");
       System.out.println(saida);
    
       // ordem dos processos = em tempo de entrada
       for (int i = 0; i < N; i++) {
        System.out.print("P" + processos.get(i) + " ");
       }
       System.out.println();
       System.out.println();
       N = scanner.nextInt();
      }
     }
    }
    

    Escalonamento Round-Robin


    O FCFS não leva em conta a importância das tarefas nem seu comportamento em relação aos recursos. É o algoritmo FCFS com a adição de preempção por tempo ao escalonamento. Define um tempo de quantum.

    Exemplo:

    tempo de quantum = 2



    Implementação em Java
    import java.text.DecimalFormat;
    import java.util.ArrayList;
    import java.util.Scanner;
    
    public class round {
    
     @SuppressWarnings("unchecked")
     public static void main(String[] args) {
      Scanner scanner = new Scanner(System.in);
    
      // declaracao de variaveis
      int quantum, N, entrada, tempoAtual, execucao, q, temposFinais[], qteprocessos, novaDuracao, temposExecucao[];
      ArrayList ingressos, duracoes, processos, cpingressos, cpduracoes;
      String ordem;
      double tempoMedioExecucao, tempoMedioEspera;
      int contTeste = 0;
      String formato, saida;
      DecimalFormat nf = new DecimalFormat("0.00");
    
      quantum = scanner.nextInt();
      N = scanner.nextInt();
      while (N != 0) {
       contTeste++;
       processos = new ArrayList();
       ingressos = new ArrayList();
       duracoes = new ArrayList();
       ordem = "";
       qteprocessos = N;
       temposFinais = new int[N];
       temposExecucao = new int[N];
    
       // lendo os processos
       for (int i = 0; i < N; i++) {
        entrada = scanner.nextInt();
        ingressos.add(entrada);
        entrada = scanner.nextInt();
        duracoes.add(entrada);
       }
    
       
       cpingressos = (ArrayList) ingressos.clone();
       cpduracoes = (ArrayList) duracoes.clone();
    
       // int tmpInicial = ingressos.get(0);
       tempoAtual = ingressos.get(0);
       processos = new ArrayList();
    
       processos = new ArrayList();
    
       while (qteprocessos > 0) {
    
        // verifica antes de iniciar a execucao de um processo
        for (int i = 0; i < N; i++) {
         if (ingressos.get(i) != -1
           && ingressos.get(i) <= tempoAtual) {
          processos.add(i);
          ingressos.set(i, -1);
    
         }
        }
    
        if (processos.isEmpty()) {
         tempoAtual++;
        } else {
         execucao = processos.remove(0);
         ordem += "P" + (execucao + 1) + " ";
         q = quantum;
         while (q > 0 && duracoes.get(execucao) > 0) {
          tempoAtual++;
          q--;
          novaDuracao = duracoes.get(execucao) - 1;
          duracoes.set(execucao, novaDuracao);
         }
         if (duracoes.get(execucao) > 0) {
          // verificar primeiramente se algum processo entrou
          // durante
          // o
          // tempo de execucao
          for (int i = 0; i < N; i++) {
           if (ingressos.get(i) != -1
             && ingressos.get(i) <= tempoAtual) {
            processos.add(i);
            ingressos.set(i, -1);
    
           }
          }
          processos.add(execucao);
         } else {
          // processo acabou
          temposFinais[execucao] = tempoAtual;
          qteprocessos--;
    
         }
        }
       }
    
       // calculo de tempo medio de espera e execucao;
       tempoMedioExecucao = 0;
       tempoMedioEspera = 0;
       for (int i = 0; i < N; i++) {
        temposExecucao[i] = temposFinais[i] - cpingressos.get(i);
        tempoMedioExecucao += temposExecucao[i];
        tempoMedioEspera += temposExecucao[i] - cpduracoes.get(i);
       }
    
       tempoMedioExecucao = tempoMedioExecucao / N;
       tempoMedioEspera = tempoMedioEspera / N;
       System.out.println("Teste " + contTeste);
    
       formato = nf.format(tempoMedioExecucao);
       saida = "Tempo medio de execucao: " + formato + "s";
       saida = saida.replace(".", ",");
       System.out.println(saida);
    
       formato = nf.format(tempoMedioEspera);
       saida = "Tempo medio de espera: " + formato + "s";
       saida = saida.replace(".", ",");
       System.out.println(saida);
    
       System.out.println(ordem);
       System.out.println();
       N = scanner.nextInt();
    
      }
     }
    }
    



    Escalonamento SJF

    O algoritmo de escalonamento que proporciona os menores tempos médios de execução e de espera é conhecido como menor tarefa primeiro, ou SJF (Shortest Job First). Consiste em atribuir o processador à menor (mais curta) tarefa da fila de tarefas prontas.


    Exemplo:



    Implementação em Java
    import java.text.DecimalFormat;
    import java.text.NumberFormat;
    import java.util.ArrayList;
    import java.util.Locale;
    import java.util.Scanner;
    
    public class sjf {
    
     // versao 2
    
     @SuppressWarnings("unchecked")
     public static void main(String[] args) {
      Scanner scanner = new Scanner(System.in);
    
      // declaracao de variaveis
      int N, entrada;
      ArrayList processos, ingressos, cpingressos = new ArrayList(), duracoes;
      int[] temposFinais = new int[1], temposIniciais = new int[1];
      int idProcessoAtual;
      String ordemExecucao = "", formato, saida;
      double tempoEspera, tempoExecucao;
      int contTeste = 0;
      DecimalFormat nf = new DecimalFormat("0.00");
    
      N = scanner.nextInt();
    
      while (N != 0) {
       contTeste++;
    
       ordemExecucao = "";
       processos = new ArrayList();
       ingressos = new ArrayList();
       duracoes = new ArrayList();
    
       temposFinais = new int[N];
       temposIniciais = new int[N];
       for (int i = 0; i < N; i++) {
        // le e adiciona tempo de ingresso do processo
        entrada = scanner.nextInt();
        ingressos.add(entrada);
        // le e adiciona tempo de duracao do processo
        entrada = scanner.nextInt();
        duracoes.add(entrada);
       }
       // cria copia da lista de tempos de ingressos devido a modificacoes
       cpingressos = (ArrayList) ingressos.clone();
    
       int execucao;
       int qteprocessos = N;
       // tempo inicial = primeiro tempo da lista de ingressos
       int tempoAtual = ingressos.get(0);
       while (qteprocessos > 0) {
        // percorre ingressos para achar processos que ingressam nesse
        // tempo
        processos = new ArrayList();
        for (int i = 0; i < N; i++) {
         if (ingressos.get(i) != -1
           && ingressos.get(i) <= tempoAtual) {
          // adicionar na lista de processos
          processos.add(i);
         }
        }
    
        // assumindo que o primeiro da lista eh o de menor duracao
        if (processos.isEmpty()) {
         tempoAtual++;
        } else {
         execucao = processos.get(0);
         for (int i = 0; i < processos.size(); i++) {
          idProcessoAtual = processos.get(i);
          // se a duracao do processo atual for menor do que a
          // menor
          // duracao
          // ja encontrada
          if (duracoes.get(idProcessoAtual) < duracoes
            .get(execucao)) {
           // entao alteramos o processo que vai executar
           execucao = processos.get(i);
          }
         }
    
         temposIniciais[execucao] = tempoAtual;
         tempoAtual += duracoes.get(execucao);
         temposFinais[execucao] = tempoAtual;
         ingressos.set(execucao, -1);
    
         // define ordem de execucao
         ordemExecucao += "P" + (execucao + 1) + " ";
         qteprocessos--;
        }
       }
    
       // calculo tempo de execucao e tempo de espera
       tempoExecucao = 0;
       tempoEspera = 0;
       for (int i = 0; i < N; i++) {
        tempoExecucao += temposFinais[i] - cpingressos.get(i);
        tempoEspera += temposIniciais[i] - cpingressos.get(i);
       }
       tempoExecucao = tempoExecucao / N;
       tempoEspera = tempoEspera / N;
    
       // DecimalFormat f = (DecimalFormat) DecimalFormat
       // .getInstance(new Locale("pt", "BR"));
       // String saida = "Tempo medio de execucao: "
       // + f.format(tempoExecucao) + "s";
    
       System.out.println("Teste " + contTeste);
    
       formato = nf.format(tempoExecucao);
       saida = "Tempo medio de execucao: " + formato + "s";
       saida = saida.replace(".", ",");
       System.out.println(saida);
    
       formato = nf.format(tempoEspera);
       saida = "Tempo medio de espera: " + formato + "s";
       saida = saida.replace(".", ",");
       System.out.println(saida);
    
       System.out.println(ordemExecucao);
       System.out.println();
       N = scanner.nextInt();
      }
     }
    }
    

    Escalonamento por Prioridades

    No escalonamento por prioridades, a cada tarefa é associada uma prioridade (número inteiro) usada para escolher a próxima tarefa a receber o processador, a cada troca de contexto.

    Exemplo:







    Implementação em Java

    import java.text.DecimalFormat;
    import java.util.ArrayList;
    import java.util.Scanner;
    
    public class prio {
    
     public static void main(String[] args) {
      Scanner scanner = new Scanner(System.in);
    
      // declaracao de variaveis
      int N, entrada, tempoAtual, execucao, idProcessoAtual, qteprocessos;
      ArrayList ingressos, duracoes, prioridades, processos, cpingressos;
      int[] temposFinais, temposIniciais;
      String ordemExecucao;
      int contTeste = 0;
      String formato, saida;
      DecimalFormat nf = new DecimalFormat("0.00");
    
      N = scanner.nextInt();
    
      while (N != 0) {
       contTeste++;
       processos = new ArrayList();
       ingressos = new ArrayList();
       duracoes = new ArrayList();
       prioridades = new ArrayList();
    
       // lendo os processos
       for (int i = 0; i < N; i++) {
        // le e adiciona dados dos processos em suas respectivas listas
        entrada = scanner.nextInt();
        ingressos.add(entrada);
        entrada = scanner.nextInt();
        duracoes.add(entrada);
        entrada = scanner.nextInt();
        prioridades.add(entrada);
       }
       temposIniciais = new int[N];
       temposFinais = new int[N];
       // cria copia da lista de tempos de ingressos devido a modificacoes
       cpingressos = (ArrayList) ingressos.clone();
    
       ordemExecucao = "";
    
       // tempo comeca do primeiro processo a ingressar
       tempoAtual = ingressos.get(0);
    
       qteprocessos = N;
       while (qteprocessos > 0) {
        // percorrendo ingressos para descobrir processos que entram no
        // tempo
        // atual
        processos = new ArrayList();
        for (int i = 0; i < N; i++) {
         if (ingressos.get(i) != -1
           && ingressos.get(i) <= tempoAtual) {
          // adicionar na lista de processos
          processos.add(i);
         }
        }
    
        if (processos.isEmpty()) {
         tempoAtual++;
        } else {
         // assumindo que o primeiro da lista eh o de menor
         // prioridade
         execucao = processos.get(0);
         for (int i = 0; i < processos.size(); i++) {
          idProcessoAtual = processos.get(i);
          // se a prioridade do processo atual for menor do que a
          // menor
          // prioridade
          // ja encontrada
          if (prioridades.get(idProcessoAtual) < prioridades
            .get(execucao)) {
           // entao alteramos o processo que vai executar
           execucao = processos.get(i);
          }
         }
         // System.out.println("vou executar o P" + (execucao + 1) +
         // " de prioridade " + prioridades.get(execucao));
         // tempo que o processo comeca a executar
         temposIniciais[execucao] = tempoAtual;
    
         tempoAtual += duracoes.get(execucao);
    
         // tempo que o processo termina de executar
         temposFinais[execucao] = tempoAtual;
         ingressos.set(execucao, -1);
    
         // define ordem de execucao
         ordemExecucao += "P" + (execucao + 1) + " ";
    
         qteprocessos--;
        }
       }
    
       // calculo tempo de execucao e tempo de espera
       double tempoExecucao = 0, tempoEspera = 0;
       for (int i = 0; i < N; i++) {
        tempoExecucao += temposFinais[i] - cpingressos.get(i);
        tempoEspera += temposIniciais[i] - cpingressos.get(i);
       }
       tempoExecucao = tempoExecucao / N;
       tempoEspera = tempoEspera / N;
       System.out.println("Teste " + contTeste);
    
       formato = nf.format(tempoExecucao);
       saida = "Tempo medio de execucao: " + formato + "s";
       saida = saida.replace(".", ",");
       System.out.println(saida);
    
       formato = nf.format(tempoEspera);
       saida = "Tempo medio de espera: " + formato + "s";
       saida = saida.replace(".", ",");
       System.out.println(saida);
    
       System.out.println(ordemExecucao);
       System.out.println();
       N = scanner.nextInt();
      }
     }
    }
    

    Referências:
    Sistemas Operacionais: Conceitos e Mecanismos – Carlos Maziero disponível em: http://wiki.inf.ufpr.br/maziero/doku.php?id=so:livro_de_sistemas_operacionais

    Tagged under:

    Como adicionar o syntax highlighting no Blogger

    Passo 1: Entre no dashBoard do administrador no blogger, e através dele, selecione a opção “Template”.
    Passo 2:Clique em “Edit Html”.
    Passo 3: Pode ser que apareça um aviso pedindo para confirmar a ação, caso apareça aceite e prossiga, uma tela parecida como essa ira aparecer.
    Passo 4: Procure pelo final da tag <b:skin> e adione  esse CSS .


    Passo 5: Procure pela tag </head>  e adicione o seguinte código
      
    
     
    Passo 6 : Procure pela tag </body>.
      
    
    
    
    
    
    
    
    
    
    
    
    
    Passo 7 : Por fim adicione o seguinte trecho de código em uma de suas postagem e veja o resultado.
      
    
      
     for x in [1, 2, 3]:
      print x
    
    Tagged under: ,

    Acessando SSH em modo gráfico via Windows

    Para acessar via Windows é necessária a instalação de 2 programas, um que vai logar na máquina remota, e outro que vai exibir as aplicações gráficas de ambiente Linux.  

    Os programas são:

    O PuTTY é um interface simplificada de conexão com servidores Linux, pois ele não precisa sequer ser instalado. Basta baixar o arquivo .exe e executá-lo. 

    O Xming é uma implementação do X Window System para sistemas  operacionais Microsoft Windows, incluindo Windows XP, Server 2003, Windows Vista e Windows 7, 8, 10

    Passo 1:
    Instale e execute o Xming, feito isso note que um ícone aparecerá no systray. Enquanto este ícone estiver lá, um servidor X estará funcionando localmente e isso permitirá que você execute aplicações dentro da interface do Windows.





    Passo 2: Execute PuTTY , procure pelo campo Host Name, o host do seu servidor.

    Passo 3: Conecte o PuTTY com o Xming,  para efetuar essa conexão, configure a primeiro na seção Connection -> SSH -> X11, habilitando a opção “Enable X11 forwarding”.


    Passo 4: Clique em Open, ao executar qualquer programa com interface GUI abrirá uma janela do Xming no Windows executando sua aplicação 











    Tagged under: , ,

    Como Utilizar o acelerômetro MM7361 no Arduino



    O que são acelerômetros?

    Sendo a Wikipédia, o acelerômetro é um dispositivo usado para medir a aceleração própria, e por essa característica os Acelerômetros são dispositivos que podem funcionar a partir de diversos efeitos físicos e tem, portanto, uma ampla faixa de valores de aceleração que são capazes de medir, logo tem uma gama de aplicações bastante elevada. Esses dispositivos são usados principalmente em sistemas de posicionamento, sensores de inclinação, bem como sensores de vibração. Uma aplicação bastante conhecida de acelerômetros são as telas de aparelhos celulares que se ajustam de acordo com o ângulo que fazem em relação à aceleração da gravidade.

    Agora que você já sabe o que é um acelerômetro, vamos ao que interessa 3:)


    Esse módulo é bem prático e já vem pronto para uso, com os pinos já soldados. É um módulo de 3 eixos (X, Y e Z), que gera uma variação de tensão para cada eixo, variação esta que por sua vez é tratada pelas portas analógicas do Arduino. Onde as suas característica básicas são:
    • Operação com 5v ou 3.3v DC
    • 2 níveis de sensibilidade : 1,5G ou 6G
    • Modo sleep, ideal para uso em configurações que necessitem do uso de uma bateria
    Antes de ligar tome muito cuidado, pois uma ligação errada pode danificar o componente, as funções de cada entrada serão mostradas na  tabela abaixo :


    Pino do MMA7361
    Função
    Pina do Arduino
    X
    Voltagem de saída eixo X
    A0
    Y
    Voltagem de saída eixo Y
    A1
    Z
    Voltagem de saída eixo z
    A2
    3V3
    Alimentação 3.3 Volts
    -
    5V
    Alimentação 5 Volts
    5V
    ST
    Self Test
    Pino 12
    GS
    Seleção do modo de sensibilidade
    Pino 10
    0G
    Detecção de queda livre linear
    Pino 11
    SL
    Habilita o modo sleep
    Pino 13
    GND
    Ground
    GND
     

    Seguindo essas instruções o circuito deve ficar semelhante à figura abaixo. 



    Note que na imagem foi necessário ligar o pino 3.3 Volts do Arduino ao pino AREF, para que tenhamos uma tensão de referência. Isso foi feito, pois sem ele a leitura dos dados fica totalmente prejudicada:
    §  Implementando no Arduino
    Para ler os valores vindos do acelerômetro vou utilizar o seguinte código:





    //Programa : Lendo dados do Acelerometro MMA7361  
    //Alterações e comentários : nasemanadaprova.blogspot.com   
     #include  //Carrega a biblioteca do MMA7361  
       
     AcceleroMMA7361 accelero;  
     int x;  
     int y;  
     int z;  
       
     void setup()  
     {  
      Serial.begin(9600);  
      accelero.begin(13, 12, 11, 10, A0, A1, A2);  
      //Seta a voltagem de referencia AREF como 3.3V
      accelero.setARefVoltage(3.3);
      //Seta a sensibilidade (Pino GS) para +/-6G    
      accelero.setSensitivity(LOW);    
      accelero.calibrate();  
     }  
       
     void loop()  
     {  
      x = accelero.getXAccel(); //Obtem o valor do eixo X  
      y = accelero.getYAccel(); //Obtem o valor do eixo Y  
      z = accelero.getZAccel(); //Obtem o valor do eixo Z  
      Serial.print("\nx: ");   //Mostra os valores no serial monitor  
      Serial.print(x);  
      Serial.print(" \ty: ");  
      Serial.print(y);  
      Serial.print(" \tz: ");  
      Serial.print(z);  
      Serial.print("\tG*10^-2");  
      delay(500);                     
     } 



    Esse e mais outros dois exemplo podem ser encontrados na própria biblioteca do MMA7361, na biblioteca esse código chama-se  G_FORCE.

    Para encontra-lo, vá em File->Examples->MMA7361.
    Por fim, carregue o programa no Arduino, movimente o sensor e veja no serial monitor como se comportam as variações dos eixos X, Y, Z, e a gravidade (G).