Concorrência é a possibilidade do processador de um computador executar mais de uma instrução ao mesmo tempo. Para que isso funcione, a CPU precisa retomar a execução do programa no mesmo estado em que o deixou.
Para esclarecer um pouco sobre a diferença entre concorrência e paralelismo, vale a pena ler esse texto do Treinaweb. Pense que concorrência lida com várias coisas ao mesmo tempo, e paralelismo é fazer várias coisas ao mesmo tempo.
Na programação, concorrência é a composição de processos executando independentemente, enquanto paralelismo é a execução simultânea de computações possivelmente relacionadas.
Existem diversos mecanismos e técnicas para que a concorrência seja possível em um sistema operacional, como:
- Interrupções e exceções
- Operações de E/S (I/O)
- Buffering
- Spooling
- Reentrância
Vamos descrever cada uma delas a seguir.
Interrupções e exceções
Interrupções e exceções acontecem quando ocorre um evento inesperado durante a execução de um programa, que desvia o fluxo da sua execução.
Quando o evento é externo ao programa é chamado de interrupção. Exemplo: um dispositivo avisando ao processador que uma operação de E/S está completa.
A interrupção é a base da concorrência de sistemas multiprogramáveis e é decorrente de eventos assíncronos.
O fluxo básico é o seguinte:
- Durante a execução do programa, encontramos uma interrupção/exceção;
- O conteúdo dos registradores é salvo na pilha de controle;
- Identifica-se a origem do evento;
- Obtém-se o endereço da rotina de tratamento;
- Executa-se a rotina de tratamento;
- Restaura-se o conteúdo dos registradores;
- Retorno a execução do programa;
A exceção, por sua vez, acontece com a execução de alguma instrução do programa atual. Exemplo: divisão por zero. Aqui, lembre-se da expressão tratamento de exceções, bastante comum quando estamos programando.
Operações de E/S (I/O)
Historicamente, operações de entrada e saída sempre foram custosas para o processador, pois o mantinham ocupado.
Com o surgimento do controlador, não era mais necessário o processador se comunicar diretamente com os periféricos. Além disso, o mecanismo de interrupção foi essencial para desafogar a CPU nesse sentido.
Na E/S controlada por interrupção, a CPU fica livre para processar outras tarefas depois de iniciar um comando de escrita ou leitura. Funciona da seguinte maneira:
- Ao, por exemplo, recebe um sinal de leitura, o controlador fica encarregado de ler e armazenar blocos do disco em memória ou em seus registradores;
- O controlador sinaliza uma interrupção para o processador;
- O processador atende a interrupção;
- Inicia-se uma rotina para tratar a interrupção, pegando dados dos registradores do controlador para a memória principal;
- Terminada a transferência, o processador pode executar o programa que foi interrompido
Apesar da eficácia do controlador com as interrupções, perde-se eficiência quando estamos falando de uma grande quantidade de dados.
Para resolver isso, temos o DMA (direct memory access), uma técnica que possibilidade um bloco de dados ser transferido entre memória principal e dispositivos de E/S sem que o processador precise intervir (somente no início e no final da transferência).
Além disso, temos o canal de entrada e saída, que eliminou a necessidade dos programas de entrada e saída serem carregados na memória principal, já que o mesmo possui memória própria e executa os programas de E/S.
Buffering
O buffering é um técnica que utiliza uma área na memória principal, chamada de buffer, para transferir dados entre dispositivos de E/S e a memória do computador.
Então, enquanto o processador está manipulando um dado no buffer, o dispositivo de E/S pode realizar outra operação.
Spooling
A técnica de spooling (simultaneous peripheral operation online) utiliza uma área do disco como um buffer, liberando para que outros programas sejam executados enquanto dados são lidos/gravados em disco.
Atualmente essa técnica é usada em sistemas operacionais para impressão, por exemplo. Quando uma impressão é comandada, o dado que será impresso fica gravado em disco num arquivo de spool.
Reentrância
A reentrância é a capacidade de um código reentrante, ou seja, executável, ser compartilhado entre usuários com apenas uma cópia do programa na memória.
Em outras palavras:
Na computação, um programa ou subrotina é chamada de reentrante se puder ser invocada múltiplas vezes de forma segura e concorrente.
Para ir mais a fundo nos tópicos, recomendo o livro Arquitetura de Sistemas Operacionais, do Francis Machado e Luiz Maia.
Fontes:
MACHADO, Francis Berenger; MAIA, Luiz Paulo. Arquitetura de Sistemas Operacionais: Incluindo Exercícios com o Simulador SOSIM e Questões do ENADE. Rio de Janeiro: LTC, 2013.
Wikipedia - Reentrancy
Treinaweb
Go Blog
Esse texto não tem intenção de esgotar o tema. Acrescente nos comentários, e também aponte erros quando os identificar.
Top comments (2)
Eu olvido, por favor, taggea seus artigos com a tag "portugues". Dessa forma eu puedo achar-los mais facilmente
Boãs definições e mui bons exemplos para um tema tão um poco complicado.