Processos em Linux


Com a evolução e o desenvolvimento de novos sistemas operacionais e o surgimento da multiprogramação, foi essencial a fundamentação do conceito de processo pois é a base dos sistemas multiprogramados

Processo


O conceito de processo é fundamental para qualquer sistema operacional multiprogramado, ele é definido como uma instância de um programa em execução. Processos podem representar tanto programa do usuário quanto tarefas do sistema operacional.

Um exemplo de processo no Linux é: Quando o usuário visualiza um terminal aberto, este é um processo em execução. O terminal pode estar rodando um shell, que é um novo processo. Quando utilizada uma função do shell, o programa correspondente é executado em um novo processo.

Visualizando um processo


O sistema operacional sempre vai ter vários processos rodando, independente de um usuário estar utilizando o computador ou não. Cada programa que está sendo executado pode ter um ou mais processos.

Identificador de um processo


Cada processo no Linux é identificado por um process ID único. Não existem duas process IDs do processo com o mesmo valor, algumas vezes é referida como pid. As process IDs dos processos são números de 16-bits que são atribuídos sequencialmente pelo próprio Linux quando o processo é criado e é apagado quando o processo é encerrado. Ao executar o mesmo programa após fechá-lo, o programa terá um pid diferente do anterior.

'

Visualizando processos ativos


O conceito de processo é fundamental para qualquer sistema operacional multiprogramado, ele é definido como uma instância de um programa em execução. Processos podem representar tanto programa do usuário quanto tarefas do sistema operacional.

Um exemplo de processo no Linux é: Quando o usuário visualiza um terminal aberto, este é um processo em execução. O terminal pode estar rodando um shell, que é um novo processo. Quando utilizada uma função do shell, o programa correspondente é executado em um novo processo.

Estado de execução de um processo


Durante sua fase de execução, todo processo em Linux passa por diferentes estados

Existem 5 estados para um processo:
O estado de execução ou esperando pra ser executado é o task_running.
O task_interruptible é o estado do processo que sofre interrupção e está aguardando para voltar ao estado de execução
O uninterruptible é o processo que não pode ser interrompido até sua conclusão.
O task_stopped é o estado onde o processo recebeu um sinal e só volta sua execução quando recebe outro.
O task_zombie é o estado assume quando termina a execução e está esperando uma função wait vinda do processo pai.

Criando um processo


Existem duas maneiras de se criar um processo no Linux, usando as funções fork e exec ou utilizando o system. Ambas são chamadas do sistema, ou seja, chamam o sistema operacional para fazer algo que o usuário não pode.

Utilizando a chamada system


Uma das maneiras de se criar um processo é usando a chama de sistema system. Essa função não é tão eficiente ou segura quanto as funções fork e exec, pois ela funciona como se o usuário digitasse o comando em um shell, o Bourne shell padrão (bin/sh), portanto ela está vulnerável a todas as falhas de um shell.

Utilizando a função fork


O fork é uma chama do sistema que cria uma cópia exata do programa que a chamou, com as mesmas variáveis, registros. O programa que chamou a função fork será o processo pai e o novo programa gerado através da função será o processo filho.

A partir do momento em que a função fork é chamada e os dois processos são criados, cada processo segue um rumo diferente do mesmo lugar. Para chamar a função, não se passa nenhum argumento, o sistema operacional trabalha com o resto e retorna um pid, caso ocorra um erro, a função retorna um número negativo.

Utilizando a função exec


Exec é um grupo de funções que acabam fazendo o programa filho executar como outro programa, substituindo a execução do programa anterior. Para se utilizar a função exec necessitam só da biblioteca unistd.h. Existem vários tipos de funções dentro da família do exec, com diferentes capacidades.

O estado de task_running é quando o processo está em execução ou esperando para ser executado.

Escalonando um Processo


Em Linux, o escalonamento de processos pais e filhos são feitos de maneira independente, fazendo com que não se saiba qual ira ser executado primeiro nem sua duração até que o Linux interrompa o processo.

Sinais


Sinais são um tipo de comunicação assíncrona entre processos concorrentes. Assim que um processo recebe um sinal ele o processa imediatamente.

Finalizando um processo


Para finalizar um processo no Linux, basta usar o comando kill no terminal, informando o sinal e o pid do processo. Para a finalização de um processo podemos usar o comando kill informando o sinal e o pid do processo que se precisa “matar”. A função killall mata todos os processos possíveis.

Utilizando a chamada de sistema wait


Alguns processos podem requerir a resposta do final do processo filho, para isso utiliza-se a chamada wait. Ela trava o processo que fez o requerimento até que um processo filho termine.

Resumo


Processos são a base dos sistemas operacionais multiprogramados. Uma boa fundamentação sobre seus conceitos e habilidade de manipulá-los são essenciais para compreensão do funcionamento dos sistemas e contribuem para o aprimoramento do usuário como desenvolvedor.