AVISO

AVISO: ESTE É MEU ANTIGO BLOG, QUE NÃO É MAIS ESCRITO DESDE 2011. O CONTEÚDO AQUI EXPRESSO PODE NÃO REPRESENTAR MEUS PENSAMENTOS E OPINIÕES DE IDADE ADULTA. PARA CONTEÚDOS NOVOS E RELEVANTES ACESSE BLOG.BRUNO.TODAY




terça-feira, 21 de outubro de 2008

Prioridade de Processos

Palavras-chave: Linux, UNIX, Sistemas Operacionais, Processos

Escalonamento de processos é um assunto que muitas pessoas desconhecem. Um administrador de sistemas normalmente não precisa ser um "expert" no assunto. Porém, existe uma parte deste assunto que todos precisam conhecer: o tratamento de prioridades.

Este é mais um modelo computacional que segue alguma coisa aplicada pela humanidade em outras áreas. O conceito, não computacionalmente falando, é extremamente simples: algumas coisas são necessárias agora, outras podem ser deixadas para depois.


Um exemplo, é que algumas pessoas dão prioridade para comprar a casa em vez de comprar um carro. Algumas dão prioridade para o trabalho e não para a família. Na computação o mesmo ocorre: temos um número fixo de processadores no hardware, e possuimos um número de processos rodando bem maior que este número de processadores.


-->



Os sistemas operacionais, em especial o Linux, possuem um scheduler responsável por gerenciar uma fila de processos e definir quem está na vez. O scheduler é extremamente complexo e utiliza uma série de fatores para definir "quem está na vez" entre os processos em execução no sistema. Mas a parte que nos interessa mesmo é a parte que está ao nosso alcance controlar: o nice.

Basicamente, um processo possui uma escala de nice de -20 até 19 atribuida a ele, indicando o quão "legal"(nice) ele é. Neste post, utilizaremos o termo "gentil" para falar disso. Podemos dizer que os processos com nice de 19 são caras extremamente "gentís". Já os processos de nice 0 não são "gentís". Os de nice negativo, por sua vez, acho que nem precisa entrar em detalhes: são os processos do tipo "sai da frente".

O funcionamento basicamente é que quanto mais gentil o processo for, mais ele espera os outros "passarem" pelo processador antes dele. Fazendo uma analogia ao trânsito, por exemplo, imagine que tenhamos basicamente 3 tipos de motorista: os normais, os apressados e os lerdos. Se em uma rotatória um motorista normal cruzar com um apressado, o apressado irá tentar "burlar a vez" do normal. O normal, por sua vez, vai pensar "vixi, que cara apressado, tá bom, passa logo".

Agora, se o normal cruzar com o lerdo, o lerdo irá deixar o normal passar. Quando dois normais se cruzam, eles simplesmente seguem a regra, que no caso do trânsito: quem veio primeiro passa. O mesmo acontece com dois lerdos e com dois apressados(a não ser que eles se choquem).

Mas claro, não pense que o motorista lerdo é "bobo", por exemplo. Chegará um momento que ele não cederá a vez, pois senão ele ficaria 2 anos na rotatória caso ela fosse movimentada.

Computacionalmente, o conceito é o mesmo. A única mudança é que não temos apenas 3 níveis de processos, mas sim uma grande escala de -20 até 19. As regras seguidas quando dois processos concorrentes possuem nível igual de gentileza são um tanto mais complexas do que simplesmente "quem veio primeiro passa", mas em condições normais elas são irrelevantes(e mesmo que não fossem, não temos como interferir nelas).

Ao iniciar, todo processo recebe por padrão, se não especificado, o nice 0(normal, nem gentil nem apressado). Este valor pode ser definido na hora de iniciar o processo e/ou
alterado durante a execução. Usuários normais podem definir valores entre 0 e 19, sendo que valores negativos são exclusivos para o root.

Agora que você já está familiarizado com o conceito, vamos ver como isso funciona na prática. Em um derivado UNIX, como o Linux, temos dois comandos que ajustam o nice dos processos: nice e renice.

Veja seus usos básicos:

$ nice -n ajuste comando
$ renice ajuste -p lista-de-pids

Basicamente, o comando nice inicia um segundo comando(passado por parâmetro na linha de comando) com prioridade definida pela opção -n. O comando renice, por sua vez, redefine a prioridade de processos já existentes listados após a opção -p.


Executando um ls com nice 10:
$ nice -n 10 lsMudando para 15 o nice de um processo já iniciado de PID 12333:
$ renice 15 -p 12333


Bom pessoal, acho que dá pra ter uma boa compreensão do assunto. Lembrem-se de que uma definição boa de prioridades pode otimizar o sistema. E lembrem-se também que, apesar de não ser bom que o sistema chegue a esse ponto, em casos de instabilidade grande e grande consumo de processamento por algum processo, vale redefinir sua prioridade como uma "gambiarra provisória" para "aliviar" a máquina até que ela possa ser parada e substituida por uma que dê conta do recado.

Só complementando, me empenharei futuramente em escrever sobre o and(auto nice daemon), um serviço que monitora processos e define automaticamente os níveis de nice. É uma coisa que muitos procuram mas não sabem como fazer.

OBS: deixo o espaço aberto para quem quiser sugerir novos temas/assuntos/questões para mim escrever sobre. Mande como comentário ou me procure ;)

Classificação do conteúdo: SÉRIO
Sobre Bruno Moreira Guedes:
Curriculum Vitae
Site Pessoal

4 comentários:

Anônimo disse...

Parabéns ótimo post, peguei bem como funciona esse lance de prioridade. :]

Anônimo disse...

legal, parabéns pela didatica :)

Unknown disse...

Olá...
gostaria de lhe parabenlizar pelo otimo artigo e pela clareza nos exemplos utilizados.
Muito bom, está recomendado.

Anônimo disse...

Parabens cara, simples e prático. Como critica construtiva, apenas acho que seria legal se você desse exemplos práticos de como usar e QUANDO usar tais comandos saca ?

Abraços
Diego

Sobre Bruno Moreira Guedes