entendendo melhor o conceito de processos em sistemas operacionais
🔶 conceito de processo: Um processo em sistemas operacionais pode ser entendido como uma instância em execução de um programa. Quando um processo é criado, o sistema operacional aloca recursos para ele, como memória, contador de programa, variáveis e outros dados necessários para sua execução. O processo herda as características do programa do qual foi criado, mas também pode ter seu próprio estado e recursos exclusivos, como seu próprio espaço de endereçamento de memória.
🔶 diferença entre Processo x Programa: Um programa é um conjunto de instruções armazenadas em disco que realiza um procedimento específico, enquanto um processo é uma instância em execução desse programa, com seus próprios recursos alocados, como CPU, memória e pilha de execução.
⌨ o comando
ps
no linux lista os processos que estão atualmente em execução em sua máquina.
Process id (PID) é um id que um processo recebe quando ele é criado pelo sistema operacional ou pelo usuario. podemos obter o pid de um processo usando alguns métodos do tipo pid_t
na linguagen C:
#include <unistd.h>
pid_t getpid(); -> retorna o id do processo filho.
pid_t getppid(); -> retorna o id do processo pai
Um processo pode está em um dos três estados definidos abaixo:
- Em execução: nesse estado o processo está usando a CPU naquele instante.
- Pronto: o processo está executável porém no momento parado para que outro processo seja executado.
- Bloqueado: O processo não pode ser executado, mesmo que a CPU estiver ociosa. isso geralmente ocorre quando o processo nescessita de uma entrada que esta indisponivel ou quando o sistema operacional decide naquele momento usar a CPU para executar outro processo.
🔶 criar um novo processo: Nos sistemas UNIX, temos apenas uma chamada de sistema para a criação de processos: fork. Com essa chamada realizada, um processo filho é criado, sendo um clone exato do processo pai onde possuirá a mesma imagem de memória, as mesmas variáves de ambiente e os mesmos arquivos abertos.
🔶 finalizar um processo: A chamada para finalizar um processo é a exit. Quando chamada, ela encerra imediatamente o processo, incluindo todos os seus processos filhos. Portanto, é importante ter cuidado ao usá-la, especialmente em processos pai que possuem vários processos filhos em execução ou a serem executados. Se a intenção não for encerrar todo o conjunto de processos (pai e filhos), deve-se tomar cuidado para chamar exit() apenas no processo desejado e tomar as medidas necessárias para garantir que os outros processos continuem a ser executados corretamente. Caso contrário, a execução dos processos restantes pode ser interrompida de forma inesperada.
Vamos aplicar os conhecimentos adquiridos nesse readme e fazer um exemplo simples para entendermos os processos na prática.
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(void){
printf("(fora) PID do processo pai = %d\n", getpid());
int pid = fork();
if(pid < 0){
printf("erro ao criar o processo filho!");
}else if(pid == 0){
printf("(dentro) PID do processo pai = %d\n", getppid());
printf("processo filho criado com sucesso!\n");
printf("PID do processo filho = %d", getpid());
exit();
}
return 0;
}
OUTPUT:
(fora) PID do processo pai = 16370
(dentro) PID do processo pai = 16370
processo filho criado com sucesso!
Neste exemplo, mostramos o PID do processo pai e criamos um processo filho com o uso da diretiva fork
. quando usamos o fork, ele retorna o valor inteiro 0 se o processo filho for criado com sucesso ou retorna -1 caso contrario. dentro do else if(pid == 0)
irá conter o programa que o processo filho executará. Dentro do programa do processo filho, printamos novamento o PID do processo pai e o PID do processo filho. O processo filho é encerrado ao exercutarmos a chamada da diretiva exit()
.
alguns exemplos mais elaborados serão abordados em assuntos mais a frete do curso.
Os processos são elementos fundamentais em sistemas operacionais e podemos alencar alguns pontos positivos e negativos de se usa-ló:
- Concorrência: Os processos permitem a execução simultânea de várias tarefas, melhorando a eficiência do sistema operacional.
- Isolamento: Cada processo é isolado dos outros, o que aumenta a segurança e a estabilidade do sistema, já que um processo não pode interferir diretamente no funcionamento de outro.
- Compartilhamento de recursos: Apesar do isolamento, os processos podem compartilhar recursos, como arquivos e dispositivos de entrada/saída, por meio de mecanismos de comunicação entre processos.
- Facilidade de programação: O uso de processos simplifica a programação, pois cada processo pode ser desenvolvido e testado separadamente, facilitando a manutenção e a depuração do código.
- Overhead: Cada processo requer recursos do sistema, como memória e tempo de CPU, o que pode resultar em um overhead significativo em sistemas com muitos processos.
- Comutação de contexto: A troca entre processos (comutação de contexto) tem um custo em termos de tempo e recursos do sistema, o que pode impactar a eficiência em sistemas com muitas trocas de contexto.
- Sincronização: Em sistemas com múltiplos processos, a sincronização entre processos pode ser complexa e propensa a erros, especialmente em casos de acesso concorrente a recursos compartilhados.
- Complexidade de gerenciamento: Gerenciar muitos processos pode ser complexo, requerendo algoritmos de escalonamento e gerenciamento de memória eficientes para garantir um desempenho adequado do sistema.