Espera ativa

Origem: Wikipédia, a enciclopédia livre.

Em engenharia de software, espera ativa, espera ocupada ou espera ociosa[1] é uma técnica em que um processo verifica uma condição repetidamente até que ela seja verdadeira, como esperar o pressionamento da tecla de um teclado ou a espera da liberação de recurso em exclusão mútua. Também pode ser usada para gerar atrasos na execução do sistema por um período determinado de tempo. Ela pode ser uma estratégia válida em certas circunstâncias, mas no geral é considerada um anti-padrão e deve ser evitada, já que o tempo de CPU gasto poderia ser usado noutra tarefa.[2]

Exemplo[editar | editar código-fonte]

O código C abaixo demonstra duas tarefas que compartilham o recurso global i. A primeira tarefa usa espera ativa para verificar mudanças no valor do recurso.

# include <stdio.h>
# include <pthread.h>
# include <unistd.h>

volatile int i = 0; /* marcação de volatile pois a variável será modificada duma forma
                        imprevisível para o compilador, duma tarefa diferente */

static void *f1()
{
    while (i==0) {
        /* '''espera ativa''': faça nada, somente verifique o recurso repetidamente */
    }
    printf("valor de i mudou para %d.\n", i);
    return NULL;
}

static void *f2()
{
    sleep(60);
    i = 99;
    printf("i foi mudado para %d.\n", i);
    return NULL;
}

int main()
{
    int rc;
    pthread_t t1, t2;

    rc = pthread_create(&t1, NULL, f1, NULL);
    if (rc != 0)
        puts("pthread 1 falhou.");

    rc = pthread_create(&t2, NULL, f2, NULL);
    if (rc != 0)
        puts("pthread 2 falhou.");

    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    puts("pthreads finalizadas.");
    return 0;
}

Alternativas[editar | editar código-fonte]

A maioria dos sistemas operacionais e bibliotecas de multitarefa provêm um conjunto vasto de chamadas de sistema que bloqueiam o processo num evento, como a aquisição dum recurso, a disponibilidade de um recurso de entrada/saída ou para sinais. Por exemplo, o Java oferece wait(), notify() e notifyAll(), monitores que não utilizam espera ativa. Isso é considerado uma forma mais simples e eficiente de espera. Quando necessária, a espera ativa pode ser otimizada através de funções de atraso fornecidas pela maioria de sistemas operacionais, que desativam a tarefa por um período determinado de tempo.

Notas

  1. Termo usado na tradução para o português do livro Sistemas Operacionais Modernos, ISBN 0-13-031358-0
  2. Cordeiro, p. 10

Referências[editar | editar código-fonte]

Ver também[editar | editar código-fonte]