Uma das fundamentais abstrações em sistemas operacionais Unix-like.
Esse artigo é destinado àqueles que gostariam de obter um simples
entendimento do assunto, ou àqueles que desejam aprender por simples
curiosidade.
Neste artigo, quando eu falar Linux, eu estarei referindo ao Linux
Kernel. Estritamente dizendo, o termo Linux faz referência apenas ao
Kernel.
- Definição
------------------------------------------------
O processo é um programa (código objeto armazenado em alguma mídia) no meio da execução.
É interessante mencionar que os processos são mais que códigos de um programa em execução (também conhecido como text section).
Além do código, os processos também possuem vários recursos que
possibilita a transparência e eficácia do gerenciamento realizado pelo
Kernel.
Alguns deles são:
o Arquivos abertos pelo processo (Open Files).
o Sinais Pendentes (Pending Signals).
o Estado do processo (Processor state).
o Internal Kernel Data.
o Espaço de memória (Com um ou mais mapeamentos).
o Um ou mais threads de execução.
o Data section contendo variáveis globais.
Definitivamente, processos podem ser definidos como o resultado final do código de programa em execução.
- Threads de execução
------------------------------------------------
Threads de execução (frequentemente referenciada como Threads), são
objetos de atividade dentro de um processo. Cada thread contém um
exclusivo program counter (registrador), stack, e um conjunto de
registradores do processador (virtuais).
É muito interessante dizer que o Linux tem uma única implementação de
threads. O Linux não diferencia entre processos e threads. Para ele, as
threads são apenas um tipo especial de processo.
- Virtualizações
------------------------------------------------
Os sistemas operacionais modernos fornecem duas virtualizações:
o processador virtualizado e a memória virtual.
O processador virtual fornece ao processo a impressão que ele sozinho
monopoliza o sistema. Na realidade, ele irá compartilhar o processador
físico com um número mais elevado de processos.
Memória virtual segue o mesmo conceito, ela deixa o processo alocar e
gerenciar a memória como se o processo fosse o único utilizador da
memória do sistema (física).
Interessantemente, vale a pena notar que thread compartilha a abstração
de memória virtual, porém cada uma possui seu próprio processador
virtualizado.
- Note que...
------------------------------------------------
Um programa não é um processo, um processo é um programa em execução e
seus respectivos recursos (tais recursos foram abordados acima).
De fato, dois ou mais processos podem existir executando o mesmo
programa. Processos também podem compartilhar recursos entre si
(arquivos abertos, espaço de memória, etc...).
- Criação de processos
------------------------------------------------
Um processo inicia sua vida quando, não surpresamente, ele é criado.
O Linux faz isso por meio da fork() system call (chamadas de sistema).
Essa chamada de sistema cria um novo processo duplicando o existente, ou seja, o caller(o chamador).
O processo que chama fork() é o parent(pai), enquanto o novo processo é o child(filho).
Dessa forma, o processo parent retoma a execução e o filho inicia a execução apartir do mesmo lugar (onde o fork retorna).
É muito interessante saber que a chamada de sistema fork() recebe dois
valores do kernel, um é destinado ao pai e outro ao recém-nascido filho.
Término de um processo
------------------------------------------------
Um programa é finalizado via chamada de sistema exit().
Além de terminar um processo, ela libera todos os seus recursos.
Um processo pai pode indagar a respeito do status de um processo filho
finalizado via chamada de sistema wait(), a qual ativa um processo para
esperar pelo término de um processo específico.
Quando tal processo é finalizado, ele é colocado em um estado especial
chamado estado zombie. Eles representam processos finalizados, a única
forma de removê-los é o processo pai chamar wait().
Note: Outro nome para um processo é 'task'. Internamente, o Linux refere aos processos dessa forma.
Conclusão
------------------------------------------------
Eu tentei abordar de forma simples os conceitos necessários para
seguirmos em frente. Abstraindo tais informações você será capaz de
acompanhar o próximo artigo. Estaremos utilizando a árvore do Linux e
criando módulos para obter um conhecimento profundo desse assunto.
Att,
Raphael S.Carvalho
Raphael S.Carvalho's Programming Blographael.scarv@gmail.com"A programmer that cannot debug effectively is blind." |
No comments:
Post a Comment