Como Processos e Threads Funcionam?

Como Processos e Threads Funcionam?

Edilson Rogério Cuambe

Edilson Rogério Cuambe

19 de abril de 2024

No mundo do desenvolvimento de sistemas, especialmente ao trabalhar com sistemas operacionais de baixo nível, entender a diferença entre processos e threads e saber como manipulá-los é fundamental. Este blog destina-se a explorar o conceito de processos e threads, utilizando a linguagem C para exemplos práticos. Vamos abordar a teoria básica, bem como fornecer exemplos de código que ajudam a ilustrar esses conceitos em sistemas operacionais como Linux e Windows.

O que são Processos?

Um processo é basicamente um programa em execução que possui seu próprio espaço de memória isolado. No sistema operacional, cada processo tem um estado independente e contém informações sobre o programa em execução e seus dados. Processos são a unidade básica de alocação em um sistema operacional e cada processo é executado em seu próprio contexto.

Exemplo de Criação de Processo em C no Linux

Em sistemas baseados em Unix, como Linux, os processos podem ser criados usando a chamada de sistema fork(). O método fork() bifurca o processo atual, criando um novo processo filho. Aqui está um exemplo simples:

1#include <stdio.h> 2#include <unistd.h> 3 4int main() { 5 pid_t pid = fork(); 6 7 if (pid == 0) { 8 // Processo filho 9 printf("Este é o processo filho com PID %d\n", getpid()); 10 } else if (pid > 0) { 11 // Processo pai 12 printf("Este é o processo pai com PID %d\n", getpid()); 13 } else { 14 // Falha ao bifurcar 15 fprintf(stderr, "Falha na bifurcação"); 16 } 17 18 return 0; 19}

O que são Threads?

Threads são as unidades menores de processamento que podem ser executadas no contexto de um processo. Ao contrário dos processos, as threads compartilham o mesmo espaço de memória e recursos do processo ao qual pertencem, permitindo uma comunicação mais rápida e menos onerosa entre elas.

Exemplo de Criação de Thread em C no Linux

Threads em C podem ser criadas usando a biblioteca pthread. Aqui está como você pode criar threads:

1#include <stdio.h> 2#include <pthread.h> 3 4void* myThreadFun(void* v) { 5 printf("Thread em execução\n"); 6 return NULL; 7} 8 9int main() { 10 pthread_t thread_id; 11 printf("Antes da criação da thread\n"); 12 pthread_create(&thread_id, NULL, myThreadFun, NULL); 13 pthread_join(thread_id, NULL); 14 printf("Após a execução da thread\n"); 15 return 0; 16}

Diferenças entre Processos e Threads

  • Espaço de Memória: Processos têm espaços de memória isolados, enquanto threads compartilham o mesmo espaço de memória dentro de um processo.

  • Custo: A criação de processos é mais custosa em termos de recursos e tempo do que a criação de threads.

  • Comunicação: A comunicação entre processos requer técnicas específicas como pipes ou sockets, enquanto threads podem comunicar-se diretamente através de variáveis globais.

  • Processos: Um processo, nos termos mais simples, é um programa em execução. Podemos chamar de processo a execução (ou processamento) de um conjunto de instruções de um programa. Normalmente, um computador tem vários processos sendo executados ao mesmo tempo. No caso de programas executados pelo Node.js, os processos são responsáveis por “escutar” eventos e responder de acordo.

  • Threads: Thread é uma sequência de instruções que faz parte de um processo principal. As chamadas threads de execução são a menor unidade de processamento de um programa. Uma tradução literal para thread seria “linha”, de acordo com o Dicionário Cambrigde. A quantidade de threads disponíveis para serem utilizadas por um programa depende de alguns fatores: a forma como o programa é escrito, a forma como é processado e também da capacidade da CPU do computador de processar (ou não) uma determinada quantidade de threads ao mesmo tempo.

  • Relação entre Processos e Threads: Um ou mais threads são executados no contexto do processo⁴. Cada processo é uma sequência de instruções que está ligada a um software. Os threads formam conjuntos menores de instruções dentro de uma tarefa maior. As threads podem funcionar como componentes de um processo (o chamado parent process ou “processo pai”) e compartilhar espaços de memória entre si.

  • Multithreading: CPUs modernas suportam multithread (ou multithreading), conceito em que dois ou mais threads são executados simultaneamente para aumentar a eficiência do sistema. Para isso, cada thread é direcionado a um núcleo do processador. Os núcleos físicos da CPU podem ainda ser divididos em núcleos virtuais por meio da técnica de SMT.

Conclusão

Processos e threads são fundamentais para aproveitar ao máximo a capacidade de multitarefa dos modernos sistemas operacionais. Com o entendimento desses conceitos e a habilidade de implementá-los em C, desenvolvedores podem criar aplicações mais eficientes e responsivas.

Nos usamos cookies em nosso site para melhorar a sua experiência.