Processos no linux
Um processo pode ser usualmente definido como uma instância de um programa em execução, podendo haver vários processos de um mesmo programa rodando ao mesmo tempo. O Linux diferencia claramente um processo de um programa: um processo é criado através da função do_fork() do kernel, a qual pode ser acionada pelo usuário através da chamada de sistema fork(), enquanto que um programa é carregado através da família de chamadas de sistema exex().
Inicialmente o kernel Linux não oferecia suporte a aplicações com múltiplas threads, sendo que elas deviam ser implementadas em modo usuário, isso causava problemas, pois quaisquer chamadas que levassem ao bloqueio de uma das threads do processo em nível de kernel fazia com que todas as outras threads daquele processo acabassem bloqueadas. Mas atualmente o Linux oferece esse suporte no kernel, sendo que tanto processos como threads são implementados utilizando a ideia de processos leves (lightweight process). Dois processos leves podem compartilhar alguns recursos, como espaço de endereçamento e arquivos abertos, de tal forma que sempre que um dos processos modifica um dos recursos, o outro pode imediatamente perceber a alteração.
[pic]
Representação de um processo no kernel.
No kernel cada processo leve é representado por uma estrutura chamada task_stucu. Esta estrutura armazena informações completas sobre a execução de processo, como identificadores, prioridades de execução, estado da execução da tarefa, processos relacionados (pais e filhos), apontador para a pilha de execução e o estado da tarefa (dependente de arquitetura), utilizado para permitir a troca de tarefas em execução. Cada processo leve possui um identificador único, chamado pid, sendo que threads de um mesmo processo formam um grupo, identificado pelo valor de tgid, igual ao pid da primeira tarefa no grupo.
Criação de processos: Exceto pelo init, criado na inicialização e que existe durante toda a execução do