O que é concorrência em um sistema operacional?
Tags: sistemasoperacionais, windows, unix, portugues
Published: 2020-10-14 19:36:40

---
title: O que é concorrência em um sistema operacional?
published: true
description: Descrevendo sobre concorrência, interrupções, exceções, buffering, spooling e reentrância, utilizando o livro do Francis Machado e do Luiz Paulo Maia
tags: sistemasoperacionais, windows, unix, portugues 
cover_image: https://images.unsplash.com/photo-1533749047139-189de3cf06d3?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=676&q=80
---
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](https://www.treinaweb.com.br/blog/concorrencia-paralelismo-processos-threads-programacao-sincrona-e-assincrona/#:~:text=Concorr%C3%AAncia%20%C3%A9%20sobre%20a%20execu%C3%A7%C3%A3o,%C3%A9%20o%20escalonador%20de%20processos). 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: 

1. Durante a execução do programa, encontramos uma interrupção/exceção;
2. O conteúdo dos registradores é salvo na pilha de controle;
3. Identifica-se a origem do evento;
4. Obtém-se o endereço da rotina de tratamento;
5. Executa-se a rotina de tratamento;
6. Restaura-se o conteúdo dos registradores;
7. 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:

1. 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;
2. O controlador sinaliza uma interrupção para o processador;
3. O processador atende a interrupção;
4. Inicia-se uma rotina para tratar a interrupção, pegando dados dos registradores do controlador para a memória principal;
5. 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](https://www.amazon.com.br/Arquitetura-Sistemas-Operacionais-Francis-Machado-ebook/dp/B073DPFGTM/ref=sr_1_2?__mk_pt_BR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=D4RNO51KLDJK&dchild=1&keywords=sistemas+operacionais&qid=1598714750&sprefix=sistemas+o%2Caps%2C257&sr=8-2), 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](https://en.wikipedia.org/wiki/Reentrancy_(computing))
[Treinaweb](https://www.treinaweb.com.br/blog/concorrencia-paralelismo-processos-threads-programacao-sincrona-e-assincrona/#:~:text=Concorr%C3%AAncia%20%C3%A9%20sobre%20a%20execu%C3%A7%C3%A3o,%C3%A9%20o%20escalonador%20de%20processos)
[Go Blog](https://blog.golang.org/waza-talk)

---
_Esse texto não tem intenção de esgotar o tema. Acrescente nos comentários, e também aponte erros quando os identificar._