> For the complete documentation index, see [llms.txt](https://concorrencia101.leandronsp.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://concorrencia101.leandronsp.com/parte-i-concorrencia-no-sistema-operacional/o-que-e-o-programa-no-sistema-operacional.md).

# O que é o programa no sistema operacional

No sistema operacional, cada programa é encapsulado dentro de uma estrutura chamada **processo**. Um processo é uma entidade independente, isolada dos demais processos. Essa separação permite que o SO gerencie **múltiplos processos simultaneamente**, atribuindo recursos como a CPU ou a memória de forma controlada. Sem o isolamento, teríamos enormes problemas com corrupção de dados pois diferentes processos iriam escrever na mesma *região na memória*.

<figure><img src="/files/dpSKMOniv6vuHcBHfGGr" alt="" width="317"><figcaption></figcaption></figure>

Repare na imagem de exemplo acima que a memória do computador é vista como uma "grande fita". Sendo o papel do sistema operacional alocar para cada processo uma área reservada nesta "fita", como podemos ver nas áreas verdes.

Esta organização em processos é que torna possível a *concorrência* no sistema operacional. E aqui temos então o início do conceito.

> Esqueça tudo sobre threads e outras palavras que fazem você se sentir mais sênior

Foca no *processo.*

Enquanto um processo utiliza a CPU para realizar cálculos ou executar instruções, outro pode estar aguardando uma operação de I/O, como a leitura de um arquivo ou o recebimento de dados da rede.

<figure><img src="/files/sHc1cOmOKlMu2r0GxnH8" alt=""><figcaption></figcaption></figure>

Essa alternância (também chamada de *troca de contexto*), gerenciada pelo sistema operacional, garante que o tempo da CPU seja aproveitado ao máximo, mantendo todos os processos "em movimento", mesmo que não estejam sendo executados simultaneamente.

Para entender melhor como o sistema operacional gerencia processos, podemos utilizar um comando muito sinistro que certamente muita gente já viu ao menos uma vez na vida: o comando **ps** que, de acordo com o manual - leiam o manual, sempre - , lista todos os processos ativos no sistema operacional:

```bash
$ ps

PID TTY          TIME CMD
31504 pts/0    00:00:00 bash
85358 pts/0    00:00:00 ps
```

Mas para listar todos os processos do usuário e expandidos, é preciso passar as opções *aux*:

```bash
$ ps aux

USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND       
root           1  0.2  0.3 167672 13156 ?        Ss   Nov24   7:05 /sbin/init    
root           2  0.0  0.0      0     0 ?        S    Nov24   0:00 [kthreadd]    
root           3  0.0  0.0      0     0 ?        I<   Nov24   0:00 [rcu_gp]      
root           4  0.0  0.0      0     0 ?        I<   Nov24   0:00 [rcu_par_gp]  
root           5  0.0  0.0      0     0 ?        I<   Nov24   0:00 [slub_flushwq]                                                       
root           6  0.0  0.0      0     0 ?        I<   Nov24   0:00 [netns]       
root           8  0.0  0.0      0     0 ?        I<   Nov24   0:00 [kworker/0:0H-events_highpri]
root          10  0.0  0.0      0     0 ?        I<   Nov24   0:00 [mm_percpu_wq]

.
.
.
.
```

> Dica: use o comando "man" para ler o manual de um determinado programa. Por exemplo, *man ls*. Inclusive, é possível ler o manual do manual, com *man man*, assim podemos aprender a interpretar o manual de forma geral

A lista é grande, pois existem centenas de processos **em execução** no meu sistema operacional.

Experimente também rodar o comando `htop`, que basicamente traz todos os processos do sistema com com uma visualização melhor e interativa:

<figure><img src="/files/xGj5pETRGaVdsnoq41qA" alt=""><figcaption></figcaption></figure>

Se reparar bem, o *htop* fica sempre atualizando a lista de processos que está "mais acima". Não importa agora para nós sabermos a prioridade de cada processo, mas é importante notarmos que há sempre uma **alternância**, feita pelo **escalonador de tarefas** do sistema operacional.
