Diferenças Fundamentais entre Processos e Threads e Métodos de Comunicação

Diferenças Essenciais entre Processos e Threads

Critério Processo Thread
Definição Unidade básica de alocação de recursos Unidade básica de execução dentro de um processo
Espaço de memória Isolado (espaço de endereçamento próprio) Compartilhado com o processo pai
Criação Alto custo (alocação de recursos) Baixo custo (reutilização de recursos)
Comunicação Complexa (requer IPC) Simplificada (memória compartilhada)
Impacto de falhas Isolado (não afeta outros processos) Global (encerra todo o processo)

Comunicação entre Processos (IPC)

1. Tubos Anônimos

// Exemplo em C (Linux)
int descritores[2];
pipe(descritores);  // descritores[0]=leitura, descritores[1]=escrita
if (fork() == 0) {
    write(descritores[1], "dados", 5);
} else {
    char buffer[10];
    read(descritores[0], buffer, 10);
}

Características: Comunicação unidirecional, limitada a processos relacionados.

2. Memória Compartilhada

// Criação de segmento
int segmento = shmget(IPC_PRIVATE, 2048, 0666);
// Anexação
char *mem = shmat(segmento, NULL, 0);
// Escrita
strcpy(mem, "Informações compartilhadas");

Características: Máximo desempenho, requer sincronização explícita.

3. Filas de Mensagens

// Envio/recebimento
struct mensagem {
    long tipo;
    char conteudo[50];
};
msgsnd(idFila, &msg, sizeof(msg.conteudo), 0);
msgrcv(idFila, &msg, sizeof(msg.conteudo), 1, 0);

Características: Comunicação estruturada por tipos de mensaegm.

4. Sockets

# Python (TCP)
# Servidor
sock = socket.socket()
sock.bind(('localhost', 8080))
sock.listen()
conn, addr = sock.accept()
conn.send(b"Mensagem")

# Cliente
sock = socket.socket()
sock.connect(('localhost', 8080))
dados = sock.recv(1024)

Características: Suporte a comunicação em rede, bidirecional.

Comunicação entre Threads

1. Variáveis Compartilhadas

// Java
class Dados {
    static int contador;
}
// Thread 1
synchronized(this) { Dados.contador++; }

2. Mecanismos de Sincronização

# Python (Lock)
trava = threading.Lock()
def funcao():
    with trava:
        # Região crítica

3. Variáveis de Condição

// C++
std::mutex mux;
std::condition_variable cv;
bool pronto = false;

// Espera
std::unique_lock<std::mutex> lk(mux);
cv.wait(lk, []{return pronto;});

// Notificação
{
    std::lock_guard<std::mutex> lg(mux);
    pronto = true;
}
cv.notify_one();

Recomendações de Uso

Cenário Solução Vantagem
Transferência rápida de dados Memória compartilhada + semáforos Desempenho máximo
Coordenação simples Variáveis de condição Controle preciso de execução
Sistemas distribuídos Sockets/RPC Comunicação entre máquinas

Tags: processos threads IPC Memória Compartilhada sockets

Publicado em 7-20 11:43