Post on 17-Apr-2015
Processos no LinuxProcessos no Linux
Gerência de processoGerência de processo
No Linux, as propriedades do processo caem em três grupos: a identidade do processo, seu ambiente e seu contexto.
ID do Processo (PID) - O identificador único para o processo, usado para especificar os processos para o sistema operacional quando uma aplicação faz uma chamada ao sistema para sinalizar, modificar ou esperar por outro processo.
Credenciais - Cada processo deve ter um ID de usuário associado e um ou mais ID de grupos que determinam os direitos de acesso do processo aos recursos do sistema e aos arquivos.
Identidade do Processo Identidade do Processo
Personalidade - Não encontrado tradicionalmente nos sistemas UNIX, mas no Linux cada processo tem um identificador de personalidade associado que pode modificar ligeiramente a semântica de certas chamadas ao sistema.
Usado primeiramente por bibliotecas de emulação para requisitar que certas chamadas ao sistema sejam compatíveis com certos tipos específicos de UNIX
Contexto do ProcessoContexto do Processo
O (em mudança constante) estado de um processo em execução em qualquer ponto no tempo.
O contexto de escalonamento é a parte mais importante do contexto do processo; é a informação que o escalonador precisa para suspender e reiniciar o processo.
O kernel mantém informação de contabilidade sobre os recursos correntemente sendo consumidos por cada processo e o total de recursos consumido pelo processo em sua existência até o momento.
A tabela de arquivos é um arranjo de ponteiros para estruturas de arquivo do kernel
Quando fazendo chamadas ao sistema de E/S para arquivos, os processos se referem aos arquivos através dos indices desta tabela
Contexto do Processo (Cont.)Contexto do Processo (Cont.)
Enquanto que a tabela de arquivos lista apenas os arquivos abertos existentes, o contexto do sistema de arquivos se aplica às requisições para novos arquivos abertos
A diretório raíz corrente e o diretório default para serem usados para novas buscas por arquivos são armazenados aqui
A tabela de tratadores de sinal define a rotina no espaço de endereços do processo a ser invocada quando da chegada de um sinal específico.
O contexto de memória virtual de um processo descreve o conteúdo completo de seu espaço de endereçamento privado.
Processos e ThreadsProcessos e Threads
Linux usa a mesma representação interna para processos e threads; uma thread é simplesmente um novo processo que compartilha o espaço de endereçamento com seu pai.
A distinção é feita apenas quando uma nova thread é criada pela chamada ao sistema clone
Fork cria um novo processo com seu contexto próprio inteiramente novo
clone cria um novo processo com sua própria identidade, mas permite o compartilhamento das estruturas de dados do processo com seu pai
O uso de clone dá a uma aplicação um controle mais fino sobre o que vai exatamente ser compartilhado entre as duas threads.
Descritor de ProcessoDescritor de Processo
Processo – programa em movimento, dinâmico Estruturas de dados do kernel para manter o estado Descritor, PCB (control block), task_struct Maior do que se possa imaginar (cerca de 1K) Estrutura complexa com apontadores para outras estruturas
Tipo de informação em task_struct Registradores, estado, id, prioridades, locks, arquivos, sinais,
mapas de meórias, filas, listas de apontadores, … Alguns detalhes
Endereços dos primeiros campos codificada em assembler Atenção especial para o layout de linha do cache
Descritor de processos – localização na pilha Descritor de processos – localização na pilha de processosde processos
PILHA
Descritor do processo
0x015fbfff
0x015fb000
0x015fa878
0x015fa3cb
0x015fa000
esp
corrente
Task struct – atributos do processoTask struct – atributos do processo
Task struct – escalonamentoTask struct – escalonamento
Task struct – relação entre processosTask struct – relação entre processos
Task struct – credenciaisTask struct – credenciais
Task struct – arquivos e memóriaTask struct – arquivos e memória
Estados do ProcessoEstados do Processo
Visão tradicional Bloqueado, pronto, executando Também inicializando, terminando UNIX adiciona “suspenso” (signals, ptrace())
Linux (TASK_qualquercoisa) Executando, pronto(RUNNING) Bloqueado (INTERRUPTIBLE, UNINTERRUPTIBLE)
Interruptíveis– sinais pode tirar o processo do estado de bloqueio (EINTR)
Terminando (ZOMBIE) Morto, mas ainda com estruturas de dados – processo vivo-
morto Suspenso (STOPPED)
Estados de processos no linuxEstados de processos no linux
Alocação e armazenamento do descritorAlocação e armazenamento do descritor
Descritores armazenados no segmento de dados do kernel
Cada processo ganha 2 páginas da pilha do kernel (8K) usada enquanto no kernel (segurança)
task_struct armazenado aqui; restante para pilha
Listas e hashes do DescritorListas e hashes do Descritor
Lista de processos init_task, prev_task, next_task for_each_task(p) iterator (macro)
Processos prontos: runqueue init_task, prev_run, next_run, nr_running wake_up_process()
Invoca schedule() se preempção for necessária Pid para descritor hash: pidhash
hash_pid(), unhash_pid() find_hash_by_pid()
Estrutura da tabela PIDHASHEstrutura da tabela PIDHASH
Relações do ProcessoRelações do Processo
Processos são relacionados Pai/filho (fork()), irmãos Possibilidade para outro pai
Pai vs. pai original Pai pode esperar pela terminação do filho
Grupos de processos Possível para envio de sinais para todos os membros
Sessões Processos relacionados no login
Relação entre processosRelação entre processos
P_opptr – pai original
P_osptr – irmão mais velho
P_pptr – pai
P_ysptr – irmão mais novo
P_cptr – filho mais novo
Criação de ProcessosCriação de Processos
clone(), fork(), vfork() Fork duplica a maior parte dos recursos do pai Exec põe abaixo o espaço de endereçamento do pai e instala
um novo (correspondendo a imagem do processo no disco) A maioria dos fork são parte de uma sequencia fork-exec Desperdício a cópia de recursos quando vai haver sobreescrita
Solução velha: vfork Compartilhamento pai/filho; pai bloqueia até filho terminar
Nova solução: COW copy-on-write Compartilha página de escrita como de leitura somente até
uma escrita (falta) e então copia Solução Linux: clone()
Especifica quais recursos compartilhar ou duplicar CLONE_VM, _FS, _FILES, _SIGHAND, _PID
Linux: Processes ou Threads?Linux: Processes ou Threads?
Linux usa um termo neutro: tasks ou tarefas
Visão tradicional
Threads existem “dentro” dos processoes
Visão do Linux
Threads: processos que compartilham espaço de endereços
Threads do Linux são realmente as “threads do kernel”
Modelos de ThreadModelos de Thread
Muitas para um
Threads no nível de usuário; sem conhecimento por parte do kernel (fibras do Windows)
Uma para um
Modelo padrão do Linux; cada thread em nível de usuário corresponde a uma thread de núcleo
Muitas para muitas (m-to-n; m >= n)
Solaris, Próxima geração de threads POSIX (Light weighted process)
Grande número de threads de usuário correspondendo a um pequeno número de threads de kernel
Mais flexível, melhor utilização da UCP
clone()clone()
fork() é implementada como um envoltório sobre clone() com parâmetros específicos
__clone(fp, data, flags, stack)
"__" significa “não invoque isto diretamente"
fp é a função de início de thread, data são parâmetros
flags é ou de CLONE_ flags
stack é o endereço da pilha de usuário
clone() invoca do_fork() para fazer o trabalho
Flags para a chamada CLONE do LinuxFlags para a chamada CLONE do Linux
Threads de KernelThreads de Kernel
Linux têm um pequeno número de threads do kernel que executam continuamente em modo núcleo (daemons) Sem espaço de endereço de usuário (apenas mapeada no
kernel) Criação: kernel_thread() Processo 0: processo ocioso (idle) Processo 1
Cria várias threads de kernel antes de mudar para modo usuário como /sbin/init
kflushd (bdflush) – Descarrega buffers velhos para o disco sob pressão de falta de memória
kupdate – Descarrega periodicamente buffers velhos para o disco
kswapd – Daemon de troca