Processos em Linux Aluno: Raphael Franklin Professor: Hugo Vieira L. de Souza Disciplina: Sistemas Operacionais Relembrando... O que são processos? • A seguinte definição de processo foi apresentada por Tanenbaum em "Sistemas Operacionais Projeto e Implementação": A ideia-chave aqui é que um processo é um tipo de atividade. Ele tem um programa, entrada, saída e um estado. Um único processador pode ser compartilhado entre vários processos, com algum algoritmo de agendamento sendo utilizado para determinar quando parar de trabalhar em um processo e servir a um diferente. Estados de um processo • executando - o processo está utilizando a CPU; • pronto - o processo está temporariamente parado para permitir que outro processo execute; • bloqueado - o processo é incapaz de executar até que um evento aconteça. Estados de um processo Observações: um processo pode criar outro processo, dizemos então que é o pai dos processos que ele criou. Mas apesar disso processos-filhos podem também criar novos processos, formando então uma árvore hierárquica de processos. Processamento em Linux Processamento em Linux • Na etapa de inicialização do Linux é iniciada uma função chamada start_kernel, sendo ela responsável por criar uma thread, o processo de número zero, o primeiro e o ascendente de todos os outro processos. • Assim que são carregadas toda estrutura de dados, está mesma função é responsável por chamar a função init que através da chamada execve, cria o processos número de número 1 , mais conhecido como init. Processamento em Linux • O init é o primeiro processo inicializado no Linux e é o pai de todos os outros processos. Se um processo termina e deixa processos-filho ainda executando, o processo init assume a paternidade destes processos. 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, não podendo desta forma existir dois números iguais com mesma identificação. • O PPID (Parent Process Identifier) é utilizado por que sistemas baseados em Unix que precisam duplicar um processo para realização de uma nova tarefa, sendo assim o processo “copiado” recebe o nome de “processo pai” e o novo recebe o nome de “processo filho”. Sendo assim o PPID de um processo nada mais é do que o PID de seu processo pai. PID e PPID Background e Foreground • No Linux, um processo pode estar em foreground ou em background, ou seja, em primeiro plano ou em segundo plano. • Ao digitar o comando “ls -R /etc > teste”, o sistema criará o arquivo teste com conteúdo de todos os diretórios e arquivos que se encontram abaixo do diretório /etc. Durante a execução nenhum outro comando poderá ser digitado, significando estar em primeiro plano ou em foreground. Background e Foreground • Para coloca-lo em background é necessário a utilização do comando : “ls -R /etc > teste &”. • O símbolo & indica que o comando deve ser executado em background; Modelo Cliente-Servidor • O Linux implementa muitas das suas funções usando o modelo cliente-servidor. Isto significa que existem processos que são criados especificamente para executar determinadas tarefas. Estas tarefas especiais são oferecidas aos outros processos do sistema na forma de serviços. • O processo responsável pela execução de determinado serviço no sistema é chamado servidor, é o que solicita e chamado cliente. Modelo Cliente-Servidor • Normalmente, as aplicações servidoras (daemons) são executadas em background, enquanto as aplicações clientes são executadas em foreground. • A grande vantagem de implementar funções dessa forma é tornar o Kernel mais leve, pois seu trabalho e só gerenciar a comunicação entre clientes e servidores. Modelo Cliente-Servidor • São exemplos de daemons no Linux: at daemon - servidor que executa serviços agendados pelo comando at. cron daemon - servidor que executa serviços agendados pelo comando crontab. lpd (printer daemon) - servidor de impressão de arquivos. Estados • O Linux trabalha, essencialmente, com cinco tipos de situação, isto é, estados: Executável – o processo está em execução ou aguardando para ser executado: TASK_RUNNING; Dormente - o processo está suspenso até que determinada condição se torne verdadeira: TASK_INTERRUPTIBLE; Ininterrupto - como o estado anterior, exceto pelo fato de que o seu estado não será modificado quando receber um sinal: TASK_UNINTERRUPTIBLE; Estados • Zumbi - o processo é considerado “morto”, mas, por alguma razão, ainda existe: TASK_ZOMBIE ; • Parado - o processo está “congelado”, ou seja, não pode ser executado: TASK_STOPPED. Limite de Recursos • Por padrão o Linux limita os recursos que cada processo deve ter. Isso acontece para proteger e manter a estabilidade do sistema caso o usuário faça algo de errado. Esse limites são: RLIMIT_AS: o tamanho máximo que um processo pode ter em bytes. RLIMIT_CORE: quando um processo é abortado, o kernel pode gerar um arquivo core contendo as informações desse aborto. Limite de Recursos RLIMIT_CPU: o tempo máximo em segundos que um processo pode ser executado. RLIMIT_DATA: o tamanho máximo do heap ou memória de dados em bytes. RLIMIT_FSIZE: o tamanho máximo em bytes permitido para um arquivo. RLIMIT_LOCKS: o número máximo de arquivos que um processo pode dar lock. RLIMIT_MEMLOCK: o tamanho máximo em bytes de memória que não permite swap. Limite de Recursos RLIMIT_NOFILE: o número máximo de descritores de arquivos abertos. RLIMIT_NPROC: o número máximo de processos que um usuário pode ter. RLIMIT_RSS: a quantidade máxima de memória física que um processo pode ter. RLIMIT_STACK o tamanho máximo em bytes da stack. Processo Preemptivos • Os processos do Linux são preemptivos, isso que dizer que quando um processo entra no estado TASK_RUNNING o kernel vai checar se existe alguma prioridade maior do que o processo corrente. Caso exista, o processo corrente é interrompido e o que tem a prioridade maior começa a executar. Política de Escalonamento • A prioridade de um processo em Linux está em constante mudança, por isso o escalonador permanece em constante atualização sobre o andamento desses processos, para que assim possa ajustar as suas prioridade. Dessa forma os processos que ficarem proibidos de utilizar a CPU por um longo tempo, tem sua prioridade incrementada, enquanto os que passaram um longo período dentro dela tem sua prioridade decrementada. Política de Escalonamento • Quando falamos no assunto escalonamento é importante notar que os processos são classificados de duas formas: E/S e CPU. O primeiro faz uso extenso dos recursos de entrada e saída, isso significa que grande parte do seu tempo é utilizado no aguardo da conclusão das operações de Entrada e Saída, já o segundo são processos que necessitam permanecer um longo tempo dentro da CPU. Política de Escalonamento • Uma classificação alternativa define três classes de processos: Processos Interativos: os processos que estão em constante interação com o usuário, sendo assim eles perdem grande parte do tempo esperando uma atividade do usuário, como um clique do mouse ou o aperto de uma tecla. Política de Escalonamento Processos em Lote: não necessitam de nenhuma interação do usuário e por isso muitas vezes rodam em background. Como são processos de baixa prioridade, são frequentemente penalizados pelo escalonador. Processos em Tempo Real: esses processos nunca devem ser bloqueados por processos de baixa prioridade, precisam de um tempo de resposta super rápido e com uma variação bastante baixa. Algoritmo de Escalonamento • O algoritmo de escalonamento do Linux funciona dividindo o tempo do CPU em fatias. Em uma única fatia cada processo possui um tempo especifico de duração que é computada assim que a fatia é iniciada. Geralmente processos diferentes tem tempos de execuções diferentes. Quando o tempo de execução de um processo termina na CPU é retirado e outro processo que está rodando é colocado no seu lugar . Algoritmo de Escalonamento • Uma fatia termina quando todos os processos esgotaram seu tempo reservado de execução, dessa forma o escalonador é responsável por calcular o tempo de execução de cada processo assim que uma nova fatia é iniciada. • Para o Linux escolher qual processo deve rodar ele precisar escolher qual tem a prioridade maior, existem dois tipos de prioridade: Algoritmo de Escalonamento • Prioridade Estática: definido pelo usuário para processos que necessitam de tempo real, os valores variam de 1 até 99 que nunca são modificados pelo escalonador. • Prioridade Dinâmica Esta é aplicada para os processos convencionais. A prioridade dinâmica dos processos convencionais é sempre inferior aos processos com prioridade estática. Referências • Ubuntu. Disponível em: <http://www.uniriotec.br/~morganna/guia/proce sso.html> Acessado: 16 de novembro de 2013. • PASSE, Fernando. Disponível em: <http://www.ebah.com.br/content/ABAAAe7o0A H/historia-linux?part=2> Acessado: 16 de novembro de 2013. • TOLEDO, Marcelo. Disponível em < http://marcelotoledo.com/stuff/artigos/processo s_no_linux/gerenciamento_de_processos_no_lin ux.html > Acessado: 16 de novembro de 2013. • ALECRIM, Emerson. Disponível em <http://www.infowester.com/linprocessos.ph p>Acessado: 16 de novembro de 2013.