Processos No Linux

Post on 18-Feb-2016

34 views 2 download

description

Processos no linux

Transcript of Processos No Linux

Processos no Linux

Agenda:

Introdução

Informações de um Processo

Comandos

Introdução

Introdução

Nos sistemas operacionais, um processo é a forma de representar um programa em execução.

É o processo que utiliza os recursos do computador - processador, memória, etc - para a realização das tarefas para as quais a máquina é destinada.

Veremos os principais conceitos relacionados a processos no Linux e as ferramentas usadas para manipulá-los e gerenciá-los

Introdução

O sistema operacional lida com uma infinidade de processos e, por isso, é necessário ter meios que permitam controlá-

los.

• Proprietário do processo;

• Estado do processo (em espera, em execução, etc);

• Prioridade de execução;

• Recursos de memória.

Para isso, os processos contam com um conjunto de características, dentre as quais:

Introdução

O trabalho de gerenciamento de processos precisa contar

com essas informações e com várias outras.

Uma das informações usadas é atribuir a cada processo um

PID.

Modos de execução

• Modo Kernel

• Modo User

Em Unix, um processo

executa em 2 modos:

• kernel ou system space: partilhada por todos os processos.

• memória privada: (pilha, bss).

• memória partilhada: código, bibliotecas partilhadas, mmap

• Privadas mas controladas pelo kernel: área-u e pilha do kernel.

Cada processo tem

memória virtual:

Execução

Um programa pode ser

executado de duas formas:

1) Primeiro Plano

Também chamado de foreground.

2) Segundo Plano

Também chamado de background.

Foreground

Quando você deve esperar o término da execução de

um programa para executar um novo comando.

Somente é mostrado o aviso de comando após o término de execução do

comando/programa.

Background

• Após iniciar um programa em background, é mostrado um número PID (identificação do Processo) e o aviso de comando é novamente mostrado, permitindo o uso normal do sistema.

• O programa executado em background continua sendo executado internamente.

• Após ser concluído, o sistema retorna uma mensagem de pronto acompanhado do número PID do processo que terminou.

Usado quando não se precisa

esperar o término da

execução de um programa para executar

um novo comando.

Informações de um Processo

Informações de um Processo

Espaço de Endereçamento

do Usuário:

texto;

dados;

pilha do usuário;

memória partilhada.

Informação de controle:

área-u;

proc;

pilha modo-kernel;

mapa de tradução de endereços.

Credenciais:

UIDs,

GIDs.

Variáveis de Ambiente

Contexto de Hardware:

PC,

SP,

PSW (processor status word),

mem regs,

FPU regs.

A Área-U PCB (process control block): armazena o contexto de hardware quando o processo não está ativo.

pointer to proc;

UID e GID real e efetivo;

argumentos e resultado da syscall corrente;

signal handlers; (manipuladores de sinais)

info sobre texto, dados e pilha, mais gestão de memória;

FD abertos (dinâmico ou estático);

nó-v do directório corrente e do terminal currentel

estatísticas (CPU, profiling, quota);

Pilha modo-kernel.

PID e PPID

Um PID (Process Identifier) é um número de identificação que o

sistema dá a cada processo.

Para cada novo processo, um novo número deve ser atribuído,

ou seja, não se pode ter um único PID para dois ou mais

processos ao mesmo tempo.

PID e PPID

Os sistemas baseados em Unix precisam que um processo já

existente se duplique para que a cópia possa ser atribuída a

uma tarefa nova.

Quando isso ocorre, o processo "copiado" recebe o

nome de "processo pai", enquanto que o novo é

denominado "processo filho".

PID e PPID

É nesse ponto que o PPID (Parent Process Identifier) passa a ser usado: o PPID de um processo nada mais

é do que o PID de seu processo pai.

UID e GID

Conforme já mencionado, cada processo precisa de um proprietário, um usuário que seja considerado seu dono.

A partir daí, o sistema saberá, através das permissões fornecidas pelo proprietário, quem pode e quem não pode executar o processo em questão.

Para lidar com os donos, o sistema usa os números UID e GID.

UID e GID

O Linux gerencia os usuários e os grupos através de números conhecidos como UID (User Identifier) e GID (Group Identifier). Como é possível perceber, UID são números de usuários e GID são números de grupos.

Os nomes dos usuários e dos grupos servem apenas para facilitar o uso humano do computador.

UID e GID

Cada usuário precisa pertencer a um ou mais grupos.

Como cada processo (e cada arquivo) pertence a um usuário, logo, esse processo pertence ao grupo de seu proprietário.

Assim sendo, cada processo está associado a um UID e a um GID.

UID e GID

Os números UID e GID variam de 0 a 65536.

Dependendo do sistema, o valor limite pode ser maior.

No caso do usuário root, esses valores são sempre 0 (zero).

Assim, para fazer com que um usuário tenha os mesmos privilégios que o root, é necessário que seu GID seja 0.

UID e GID

•Efetiva: usada para abrir arquivos.

•Real: usada para enviar sinais.

UID/GID real e

efetiva.

Comandos

Comandos Nice e Renice

Neste caso é necessário entender o conceito de

gentileza.

Um processo pode ter prioridade em relação a outros em sua execução.

Quando um processo é gentil, significa que ele "oferece a gentileza" de

permitir que um processo com prioridade

maior que a sua seja executado antes dele.

Os níveis de gentileza, também chamados de nice, são determinados

através de números.

Comandos Nice e Renice

Quanto mais alto for o valor nice, mais gentil é o processo.

Geralmente, o intervalo de números usados no nice são os inteiros entre -19 e 19.

Embora determinar a prioridade de um processo não seja uma prática comum, afinal, o próprio Linux faz muito bem essa tarefa, isso

pode ser necessário em alguma situação.

Para isso, utiliza-se um comando que recebe o mesmo nome do conceito: nice.

Comandos Nice e Renice

A sintaxe é: nice -n prioridade processo

• $ nice -n -5 casca

Por exemplo:

No exemplo, o processo casca recebe prioridade -5.

Trata-se de uma prioridade alta, afinal, como já dito, quanto menor o número menor sua gentileza.

Comandos Nice e Renice

Neste caso, o comando renice alterou a prioridade do processo 1000, assim como a prioridade dos processos do usuário goma.

Um exemplo:

$ renice +19 1000 -u goma

As opções do renice são:-u - a alteração ocorrerá nos processos do usuário informado;

-g - a alteração ocorrerá nos processos do grupo indicado;

-p - a alteração ocorrerá no processo cujo PID for informado.

Se um determinado processo está em execução, isso acontece com uma prioridade já definida. Para alterar um processo nessa condição, usa-se o comando renice, cuja sintaxe é:

$ renice prioridade opção processo/destino

ps

ps

O ps é um comando de extrema importância para o gerenciamento de processos.

Por ele, é possível saber quais os processos em execução atualmente, quais os UIDs e PIDs correspondentes, entre outros.

Se somente ps for digitado na linha de comando, geralmente o sistema mostra quais os processos do usuário.

É preciso usar uma combinação de opções para obter mais detalhes.

ps

ps

• a - mostra todos os processos existentes;

• e - exibe as variáveis de ambiente relacionadas aos processos;

• f - exibe a árvore de execução dos processos;

• l - exibe mais campos no resultado;

• m - mostra a quantidade de memória ocupada por cada processo;

• u - exibe o nome do usuário que iniciou determinado processo e a hora em que isso ocorreu;

• x - exibe os processos que não estão associados a terminais;

• w - se o resultado de processo não couber em uma linha, essa opção faz com que o restante seja exibido na linha seguinte.

As opções mais

importantes são os

seguintes:

ps

Das opções relacionadas, a

combinação mais usada é aux:

$ ps aux

Como exemplo, o resultado obtido

com esse comando foi o

seguinte:

ps

Usando a combinação lax, o resultado mostra

mais detalhes: $ ps lax

A seguir, vê-se a descrição dos campos mostrados anteriormente e alguns que só são mostrados com a

combinação lax: USER - nome do usuário dono do processo;

ps

UID - número de identificação do usuário dono do processo;

PID - número de identificação do processo;

PPID - número de identificação do processo pai;

%CPU - porcentagem do processamento usado;

%MEM - porcentagem da memória usada;

VSZ - indica o tamanho virtual do processo;

RSS - sigla de Resident Set Size, indica a quantidade de memória usada (em KB);

TTY - indica o identificador do terminal do processo;

START - hora em que o processo foi iniciado;

ps

TIME - tempo de processamento já consumido pelo processo;

COMMAND - nome do comando que executa aquele processo;

PRI - valor da prioridade do processo;

NI - valor preciso da prioridade (geralmente igual aos valores de PRI);

WCHAN - mostra a função do kernel onde o processo se encontra em modo suspenso;

ps

• R - executável;

• D - em espera no disco;

• S - Suspenso;

• T - interrompido;

• Z - Zumbi.

STAT - indica o estado atual do processo, sendo

representado por uma letra:

• W - processo paginado em disco;

• < - processo com prioridade maior que o convencional;

• N - processo com prioridade menor que o convencional;

• L - processo com alguns recursos bloqueados no kernel.

Essas letras podem ser

combinadas e ainda acrescidas

de:

jobs

O comando jobs mostra os processos que estão parados ou rodando em segundo plano.

• Exemplo vi& Processos em segundo plano são iniciados usando o símbolo “&” no final da linha de

comando

O número de identificação de cada processo parado ou em segundo plano (job), é usado com os

comandos ‘fg’ e ‘bg’.

Um processo interrompido pode ser finalizado usando-se o comando kill %[num], onde [num] é o número do

processo obtido pelo comando jobs.

• O comando será executado em segundo plano e deixará o sistema livre para outras tarefas.

• Após o comando find terminar, será mostrada uma mensagem.

Parando um programa

• Para iniciar um programa em primeiro plano, basta digitar seu nome normalmente.

• Para iniciar um programa em segundo plano, acrescente o caracter “&” após o final do comando.

• Mesmo que um usuário execute um programa em segundo plano e saia do sistema, o programa continuará sendo executado até que seja concluído ou finalizado pelo usuário que iniciou a execução (ou pelo usuário root). – Exemplo: find / -name boot.b &

fg

• Permite fazer um programa rodando em segundo plano ou parado, rodar em primeiro plano.

• Você deve usar o comando jobs para pegar o número do processo rodando em segundo plano ou interrompida, este número será passado ao comando fg para ativa-lo em primeiro plano.

– fg [número]

– Onde número é o número obtido através do comando jobs.

bg

• Permite fazer um programa rodando em primeiro plano ou parado, rodar em segundo plano.

• Para fazer um programa em primeiro plano rodar em segundo, é necessário primeiro interromper a execução do comando com CTRL+ Z, será mostrado o número da tarefa interrompida, use este número com o comando bg para iniciar a execução do comando em segundo plano. – bg [número] – Onde: número número do programa obtido com o

pressionamento das teclas CTRL+Z ou através do comando jobs.

ps [opções] Onde:

a Mostra os processos criados por você e de outros usuários do sistema.

x Mostra processos que não são controlados pelo terminal.

u Mostra o nome de usuário que iniciou o processo e hora em que o processo foi iniciado.

m Mostra a memória ocupada por cada processo em execução.

f Mostra a árvore de execução de comandos (comandos que são chamados por outros comandos).

e Mostra variáveis de ambiente no momento da inicialização do processo.

w Mostra a continuação da linha atual na próxima linha ao invés de cortar o restante que não couber na tela.

top

Mostra os programas em execução ativos, parados, tempo usado na CPU, detalhes sobre o uso da memória RAM, Swap, disponibilidade para execução de programas no sistema, etc.

top é um programa que continua em execução mostrando continuamente os processos que estão rodando em seu computador e os recursos utilizados por eles.

Para sair do top, pressione a tecla q.

top

top [opções]

Onde:

-d [tempo ] Atualiza a tela após o [tempo] (em segundos).

-s Diz ao top para ser executado em modo seguro.

-i Inicia o top ignorando o tempo de processos zumbis.

-c Mostra a linha de comando ao invés do nome do programa.

A ajuda sobre o top pode ser obtida dentro do programa pressionando a tecla h ou pela página de manual (man top).

Lembre-se do man top...

top

É possível manipular alguns recursos do comando top através das teclas do teclado.

Por exemplo, para atualizar imediatamente o resultado exibido, basta pressionar a tecla de

espaço.

Pressione a tecla h enquanto estiver utilizando o top para ver a lista completa de

opções e teclas de atalho.

Fuser

• Sua sintaxe é:

• fuser -opção caminho (do arquivo ou diretório)

O comando fuser mostra qual

processo faz uso de um determinado

arquivo ou diretório.

• k - finaliza o processo que utiliza o arquivo/diretório em questão;

• -i - deve ser usada em conjunto com a opção k e serve para perguntar se a finalização do processo deve ser feita;

• -u - mostra o proprietário do processo;

• -v - o resultado é mostrado em um padrão de exibição semelhante ao comando ps.

Entre as opções, tem-se:

pstree

• Sua sintaxe é:

• pstree -opção PID

Esse comando mostra processos relacionados em formato de árvore.

• u - mostra o proprietário do processo;

• -p - exibe o PID após o nome do processo;

• -c - mostra a relação de processos ativos;

• -G - usa determinados caracteres para exibir o resultado em um formato gráfico.

Entre as opções, tem-se:

Se ao digitar o comando pstree o PID não for informado, todos os processos serão listados.

NOHUP

O comando nohup possibilita ao processo ficar ativo mesmo quando o usuário faz logout.

É da natureza dos sistemas baseados em Unix interromper processos caso seu proprietário não esteja mais ativo, por isso, o nohup pode ser muito útil.

Sua sintaxe é:

nohup comando

ls

• Lista os arquivos de um diretório. – 3

• onde:

– caminho/arquivo Diretório/arquivo que será listado.

– caminho1/arquivo1 Outro Diretório/arquivo que será listado. Podem ser feitas várias listagens de uma só vez.

ls

• opções – -a, –all Lista todos os arquivos (inclusive os ocultos) de um

diretório. – -A, –almost-all Lista todos os arquivos (inclusive os ocultos) de

um diretório, exceto o diretório atual e o de nível anterior. – -B, –ignore-backups Não lista arquivos que terminam com ~

(Backup). – –color=PARAM Mostra os arquivos em cores diferentes,

conforme o tipo de arquivo. PARAM – pode ser:

• never - Nunca lista em cores (mesma coisa de não usar o parâmetro –color).

• always - Sempre lista em cores conforme o tipo de arquivo. • auto - Somente colore a listagem se estiver em um terminal.

– -d, –directory Lista os nomes dos diretórios ao invés do conteúdo.

– -f Não classifica a listagem.

– -F Insere um caracter após arquivos executáveis (’*’), diretórios (’/’), soquete (’=’), link simbólico

– (’@’) e pipe (’|’). Seu uso é útil para identificar de forma fácil tipos de arquivos nas listagens de diretórios.

– -G, –no-group Oculta a coluna de grupo do arquivo.

– -h, –human-readable Mostra o tamanho dos arquivos em Kbytes, Mbytes, Gbytes.

la

ls -la

-rwxr-xr-- 1 traina traina 8192 2012-02-15 16:00 teste

• -rwxr-xr-- São as permissões de acesso ao arquivo teste.

• A primeira letra (da esquerda) identifica o tipo do arquivo, se tiver um d é um diretório, se tiver um “-” é um arquivo normal.

• As permissões de acesso serão explicadas em detalhes futuramente.

• 1 Se for um diretório, mostra a quantidade de sub-diretórios existentes dentro dele. Caso for um arquivo, será 1.

• traina Nome do dono do arquivo teste. • user Nome do grupo que o arquivo teste pertence. • 8192 Tamanho do arquivo (em bytes). • 02 Mês da criação/ última modificação do arquivo. • 15 Dia que o arquivo foi criado. • 16:00 Hora em que o arquivo foi criado/modificado. Se o

arquivo foi criado há mais de um ano, em seu lugar é mostrado o ano da criação do arquivo.

• teste Nome do arquivo.

-rwxr-xr-- 1 traina user 8192 2012-02-15 16:00 teste

free

time ls

Sinais de Processos

Sinais de Processos

Os sinais são meios usados para que os processos possam se

comunicar e para que o sistema possa interferir em seu

funcionamento.

Por exemplo, se o usuário executar o comando kill para

interromper um processo, isso será feito por meio de um sinal.

Quando um processo recebe um determinado sinal e conta com

instruções sobre o que fazer com ele, tal ação é colocada em prática.

Se não houver instruções pré-programadas, o próprio Linux pode executar a ação de acordo com suas

rotinas.

Entre os sinais existentes, tem-se os seguintes exemplos:

STOP - esse sinal tem a função de interromper a execução de um processo e só reativá-lo após o recebimento do sinal CONT;

CONT - esse sinal tem a função de instruir a execução de um processo após este ter sido interrompido;

SEGV - esse sinal informa erros de endereços de memória;

TERM - esse sinal tem a função de terminar completamente o processo, ou seja, este deixa de existir após a finalização;

ILL - esse sinal informa erros de instrução ilegal, por exemplo, quando ocorre divisão por zero;

KILL - esse sinal tem a função de "matar" um processo e é usado em momentos de criticidade.

Estado dos processos

Estado dos processos

• Quando um processo é criado, isso não significa que ele será imediatamente executado.

• Além disso, determinados processos podem ser temporariamente paralisados para que o processador possa executar um processo prioritário. Isso quer dizer que os processos, em certos momentos, podem estar em situações de execução diferentes.

Estado dos processos

O Linux trabalha, essencialmente, com quatro tipos de situação, isto é, estados: – Executável: o processo pode ser executado

imediatamente;

– Dormente: o processo precisa aguardar alguma coisa para ser executado. Só depois dessa "coisa" acontecer é que ele passa para o estado executável;

– Zumbi: o processo é considerado "morto", mas, por alguma razão, ainda existe;

– Parado: o processo está "congelado", ou seja, não pode ser executado.

Estado dos processos

Estado dos processos

• TASK_RUNNING: O processo está em execução na CPU ou aguardando em uma fila de execução para ser planejado.

• TASK_INTERRUPTIBLE: O processo está inativo, aguardando algum evento ocorrer.

• O processo está aberto para ser interrompido por sinais. Uma vez sinalizado ou ativado pela chamada de ativação explícita, o processo faz transição para TASK_RUNNING.

Estado dos processos

• TASK_UNINTERRUPTIBLE: O estado do processo é semelhante a TASK_INTERRUPTIBLE exceto que nesse estado ele não processa sinais.

• Pode até não ser desejável interromper o processo enquanto nesse estado, pois ele pode estar no meio da conclusão de alguma tarefa importante.

• Quando o evento que ele está aguardando ocorre, o processo é ativado pela chamada de ativação explícita.

Estado dos processos

• TASK_STOPPED: A execução do processo está parada, ele não está em execução e não está apto para ser executado.

• No recebimento de sinais como SIGSTOP, SIGTSTP, e assim por diante, o processo chega nesse estado. O processo seria executável novamente após o recebimento do sinal SIGCONT.

• TASK_TRACED: Um processo chega nesse estado enquanto está sendo monitorado por outros processos, como depuradores.

Estado dos processos

• EXIT_ZOMBIE: O processo foi finalizado. Ele está demorando simplesmente para seu pai coletar algumas informações estatísticas sobre ele.

• EXIT_DEAD: O estado final (exatamente como parece). O processo atinge esse estado quando estiver sendo removido do sistema, pois seu pai acaba de coletar todas as informações estatísticas emitindo a chamada do sistema wait4() ou waitpid()

Voltaremos a esse assunto em breve…