Start presentation

Slide 1: Controlando processos

Quando o usuário solicita um aplicativo, o shell informa para o sistema operacional das intenções do usuário em utilizar determinado aplicativo. Então, é solicitado ao kernel que o mesmo seja localizado no computador. O principal meio de armazenamento para os computadores são os HD's (Hard Disk). Tão logo as informações solicitadas são encontradas, o HD as repassa para a memória de acesso aleatório (RAM). De posse das informações necessárias para executar o processo, o escalonador de processos espera a vez de levar essas informações ao processador, para a sua execução. Isso é um processo, ou seja, é uma instância de um programa localizado no HD. Esses processos possuem informações tais como número referente à sua solicitação - que é diferente para cada pedido -, hora do pedido, nome do usuário solicitante, arquivos que esse processo está escrevendo ou lendo, possíveis bibliotecas que esse processo está utilizando.

As informações entre a RAM e o processador podem ser encontradas em vários estados, podendo o processo estar rodando no processador, esperando por algum dado necessário para continuar sua execução(em swap), residente na memória, parado, em depuração (por depuração entende-se o tratamento que é dado para as informações na tentativa de recuperá-las).

O conjunto de todas essas informações é chamado de tabela de processos.

Nessa tabela encontram-se todas as informações apresentadas acima, além de informar o estado do processo no computador.

Utilitários que manipulam essa tabela estão disponíveis no GNU/Linux. Dentre as possibilidades estão a suspensão dos processos em execução, a continuação de algum processo que estava suspenso ou mesmo a finalização precoce de algum processo mal comportado.

Slide 2: ps

O comando ps exibe os processos se utilizando das informações existentes na tabela de processos. Dentre as opções disponíveis, estão aquelas que controlam os tipos de processos a serem exibidos, bem como os diferentes tipos de informações presentes.

O comando ps é disponibilizado em vários sistemas da família 'UNIX' e portanto mantém várias opções compatíveis com o próprio UNIX, BSD e o GNU, afim de manter compatibilidade de scripts entre os sistemas. As opções UNIX são precedidas por um traço '-', as opções BSD são precedidas sem nenhum traço e as opções GNU são precedidas por dois traços, porém não é utilizado. Os dois exemplos a seguir são bastante utilizados, equivalentes e retornam todos os processos que rodam no sistema:

UNIX:
ps -ef

BSD:
ps aux

Sintaxe:

ps [opções]

O comando ps, quando é executado isoladamente, sem opções, é mostrado somente os processos executados a partir da console atual. Você então acrescentar opções, combinando uma ou várias. Focaremos mais nas opções UNIX, que tendem a ser mais utilizados e mais portável entre sistemas. Alguns exemplos mais úteis e comuns:

-e - mostra todos os processos que rodam no sistema

-f - apresenta os processos no formato 'full', com mais colunas e detalhes de processos

-l - formato longo, acrescenta ainda mais informações além da opção '-f'

Na prática, o comando é utilizado combinando-se várias opções, segue exemplo:

$ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 11:57 ?        00:00:01 init [2]  
root         2     0  0 11:57 ?        00:00:00 [kthreadd]
root         3     2  0 11:57 ?        00:00:02 [ksoftirqd/0]
root         6     2  0 11:57 ?        00:00:00 [watchdog/0]
...
akira     4444  4434  0 12:12 pts/0    00:00:00 bash
...
akira     5924  4444  0 17:01 pts/0    00:00:00 ps -ef

No exemplo acima foi utilizada a opção -e combinada com a opção -f, que listou todos os processos que estão rodando no sistema no formato 'full'. Note que é mostrado as colunas UID, PID, PPID, C, STIME e TTY. que são campos pertinentes à tabela de processos do usuário. Existem mais colunas, conforme apresentado abaixo:

UID - é um número único do usuário dono do processo

PID - é um número único que identifica o processo

PPID - é um número identificador do processo pai, que gerou o processo atual

C - é o percentual de utilização da CPU

STIME - horário em que o processo foi iniciado

TTY - console que originou o processo;

TIME - tempo atual de utilização do processador;

COMMAND - apresenta o nome do comando que foi solicitado;

Para maiores detalhes: man ps.

Slide 3: top

Muitas vezes somente o comando "ps" não é conveniente o bastante para se monitorar o estado dos processos de um sistema. Isto porque o "ps" lista as informações relativas ao momento de sua execução.

O comando "top" funciona de modo interativo, atualizando as informações em tempo real. O intervalo padrão de atualização das informações é de 5 segundos. As atualizações incluem novos processos que são finalizados, ou seja, que deixam de ser listados, e também as mudanças na quantidade utilizada de processador e memória.

Sintaxe:
top

Slide 4: kill

Um programa pode sofrer vários tipos de intervenções, quando solicitado pelo usuário. Entre as principais destacam-se a atualização e retirada do processo.

Quando o usuário decide intervir na tabela de processos é o comando "kill" que deverá ser utilizado, ou seja, se um determinado programa demorar dar uma resposta o próprio usuário poderá solicitar a sua parada e retirada do processador.

À essa solicitação é dada o nome de sinal, que varia entre 64 opções para o usuário. Para listá-los basta utilizar o comando 'kill -l'. Por padrão o comando kill utiliza o sinal TERM (15) quando não especificado.

kill-l.png

Sintaxe:

kill [opção] [pid]

Opção:

-l - lista todas as opções de sinais - tanto o nome do sinal quanto o seu valor numérico

-s - especifica o sinal a ser enviado de acordo com as opções listadas pelo comando -l

pid - número de identificação do processo, a qual é desejado enviar o sinal.

Comandos mais comuns listados com a opção -l:

matar o processo: -9

atualizar o processo: -1

Exemplo:

- antes de se utilizar o "kill" é necessário saber qual a identificação do processo em questão:
$ps auxc

USER    PID  %CPU %MEM VSZ   RSS  TTY STAT START  TIME COMMAND
...
aluno   1420 14.2 10.7 23088 14032 ?    S  0:00   0:02 firefox
...             

Para este exemplo será encerrado o browser firefox a partir da sua identificação de processo.

Observação: veja detalhes das opções do comando "ps" no capítulo referente.

$kill -9 1420

logo após esse comando o firefox será fechado.

Slide 5: job

Jobs, ou tarefas, são processos que estão rodando no console atual, disparados pelo usuário atual. As tarefas, além de seus números de processo, também possuem um número próprio, utilizado como índice nos comandos de manipulação de tarefas, mencionados a seguir. O comando "job" limita-se a listar as tarefas existentes.

Sintaxe:
jobs [opção]

Opção:

-l - apresenta junto com o valor do "job" o valor de identificação do processo, que foi dado na chamada do programa para ser rodado em segundo plano.

Exemplo:

$jobs -l

[1]     1765 Running            firefox &

No exemplo dado, o valor do job foi apresentado entre colchetes. A coluna a seguir representa o valor do PID, A terceira coluna informa o estado do programa dentro do processador e a última, o nome do programa.

Controle de tarefas

Suponha que um usuário, logado em um console serial, esteja depurando uma determinada aplicação. Para isso, ele precisa fazer uso de um editor de texto e de um interpretador de comandos, a partir de onde a aplicação será executada e re-compilada.

Utilizando os recursos e comandos de tarefas, o usuário consegue colocar o editor de texto em segundo plano (geralmente através da combinação de teclas Ctrl+Z), para então recompilar a aplicação, e em seguida executá-la para testar as alterações feitas. Depois dessa primeira fase de testes, o usuário retorna ao editor de texto, faz novas alterações na aplicação e retorna ao interpretador de comandos para novos testes.

Sem os recursos de controle de tarefas, o usuário teria que fechar o editor de texto, junto com todos os arquivos em edição para proceder com a recompilação e testes. Em uma sessão de desenvolvimento, o tempo gasto seria múltiplas vezes superior ao tempo gasto com a utilização dos comandos de tarefa.

Para esse controle de tarefas são utilizados os comandos "bg" e "fg".

Slide 6: bg

bg é a abreviação para background , e a função principal deste comando é de colocar os programas para rodarem em segundo plano.

Sintaxe:
bg %identificação_trabalho

onde identificação_trabalho é o valor apresentado pelo comando jobs ou quando bg é acionado para trazer o comando para foreground.

Exemplo:
bg %2

O exemplo acima coloca o trabalho de número 2 em segundo plano.

Ao executar um programa, pode ser desejável colocá-lo imediatamente em segundo plano. Isso é obtido através da seguinte sintaxe:

Sintaxe:

programa &

Exemplo:
$xterm &
[1] 1317

Nesse exemplo foi solicitado a abertura do xterm em background. Logo após a solicitação apareceram dois valores e por último foi devolvido o prompt de comando para o usuário.

Os valores apresentados são um entre colchetes e outro sem colchetes.

O valor entre colchetes representa o job (trabalho) ao qual esse programa está associado. Esse valor é auto-incrementável, e único em uma determinada sessão em um determinado console. Esse é o valor a ser utilizado em uma possível chamada ao comando "fg".

O segundo valor apresentado é a identificação do processo ao qual esse programa pertence.

O kill -9 pode enviar um sinal de parada do processo, e com isso terminar um programa. Com o segundo valor é possível parar o trabalho de processo em background. Mas atenção! O valor apresentado sem colchetes é o "pid" para o background, assim que este terminar de processar, morrerá automaticamente o processo e o programa solicitado poderá ter um valor diferente do apresentado.

Slide 7: fg

Para trazer de volta a interatividade ao nosso editor de texto do exemplo anterior, utilizaríamos o comando "fg", abreviação de foreground (visão superior, à frente). Note que um programa em segundo plano pode até continuar gerando mensagens na tela, mas não consegue receber entrada de dados do usuário.

O número de identificação da tarefa é usada como argumento no comando "fg". Para ver as tarefas existentes em sua sessão, lembre-se do comando jobs.

Sintaxe:
fg %x   

ou

fg pid   

onde pid é o número identificador do processo.

Exemplo:
$firefox &
[1] 1738
[aluno@lab20 aluno]$fg %1
firefox

ou
$firefox &
[1] 1738
$fg 1738
firefox

Em ambos os exemplos foi solicitado o netscape em background (com a utilização do "&"), com os valores [1] (jobs) e o 1738 (pid).

No exemplo acima, o programa firefox foi colocado para rodar em foreground com o seu número identificador de tarefa.

No segundo exemplo foi colocado para rodar com o pid dado para o background, lembrando-se que o pid apresentado ao colocar um programa para ser aberto em background poderá ser diferente do pid dado ao mesmo programa depois de aberto.

Slide 8: Prioridade de processos

Ao solicitar a abertura de um programa, é criado uma tabela sobre o processo gerado, ficando armazenado todos os dados do mesmo. Quando um programa é posto para processar, ele irá esperar, em uma fila, por sua hora de execução no processador, porém é possível colocar prioridade sobre este programa no tempo do processador. Ao modificar a prioridade de um processo ele é colocado em uma posição mais a frente na fila de processos sendo executado antes de outros com menor prioridade.

Os níveis de prioridade pode variar entre -19 até 20, sendo que o nível mais alto está em -19 variando sua importância até o nível mais baixo em 20. Os programas ao serem gerados têm inserido em sua tabela de processo o nível 10, até mesmo para o superusuário, isso porque todos os usuários serão tratados iguais. Porém existe uma diferenciação quanto aos valores, pois os usuários comuns podem variar o nível de prioridade dentro dos valores positivos (até 0) enquanto que o superusuário poderá alcançar os valores negativos.

O comando que realiza o controle destes níveis são o nice e o renice. A diferença entre esses dois comandos está no momento da passagem do valor de prioridade. Enquanto o nice deverá passar o valor antes do processo ser inicializado, o renice pode alterar o valor do mesmo com o programa já em execução.

Slide 9: nice

Sintaxe para o nice:

nice [prioridade] comando

Prioridade:

-n - sendo que n é o valor da prioridade a ser passada junto com o comando a ser executado

Slide 10: renice

Sintaxe para o renice:

renice [prioridade] [-p pid] [-g grupo] [-u usuário]

Prioridade:

[+][-]n - sendo que n é o valor da prioridade a ser passada

O valor da prioridade do renice pode variar entre -19 e 20, sendo que quanto menor o valor maior será a sua prioridade.

Pid - é o valor identificador do processo

Grupo - utilize esta opção para alterar a prioridade de todos os processos executados por determinado grupo

Usuário - utilize esta opção para alterar a prioridade de todos os processos executados por determinado usuário

Slide 11: Finalizando

Topic revision: r10 - 20 Oct 2016, MarceloAkiraInuzuka
This site is powered by FoswikiCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding Foswiki? Send feedback