Linux Kernel Escalonamento de Processos Linux Kernel Captulo

  • Slides: 14
Download presentation
Linux Kernel – Escalonamento de Processos Linux Kernel Capítulo 3 – Escalonamento de Processos

Linux Kernel – Escalonamento de Processos Linux Kernel Capítulo 3 – Escalonamento de Processos 09/2005, Por ngelo N. Vimeney baseado em LOVE, Robert – Linux kernel Development – Developer’s Library

Linux Kernel – Escalonamento de Processos Visão Geral Características principais do mecanismo de escalonamento

Linux Kernel – Escalonamento de Processos Visão Geral Características principais do mecanismo de escalonamento do Linux: § Sistema operacional multitarefas; § escalonamento preemptivo; § utiliza 3 políticas de escalonamento: FIFO, Round-Robin e por Prioridade; § prioridades calculadas dinamicamente; § timeslice calculado dinamicamente; § tratamento diferenciado para os processos do tipo “tempo-real”; § kernel preemptivo. 09/2005, Por ngelo N. Vimeney baseado em LOVE, Robert – Linux kernel Development – Developer’s Library

Linux Kernel – Escalonamento de Processos Determinando Prioridades Características principais do mecanismo de prioridades

Linux Kernel – Escalonamento de Processos Determinando Prioridades Características principais do mecanismo de prioridades do Linux: § Duas escalas de prioridade distintas: nice values e real-time priorities; § nice values: -20 a 19 § real-time: 1 a MAX_RT_PRIO-1 = 99 MAX_RT_PRIO 1 real time MAX_RT_PRIO+40 nice values § tanto o usuário quanto o sistema influenciam na determinação das prioridades dos processos; § procura beneficiar processos interativos (como? ? ); § task_struct. sleep_avg § 0 ---- MAX_SLEEP_AVG = 10 ms; § Real-time priorities implementadas de acordo com o padrão POSIX; 09/2005, Por ngelo N. Vimeney baseado em LOVE, Robert – Linux kernel Development – Developer’s Library

Linux Kernel – Escalonamento de Processos Determinando Timeslices Características principais do mecanismo de prioridades

Linux Kernel – Escalonamento de Processos Determinando Timeslices Características principais do mecanismo de prioridades do Linux: § O timeslice destinado a cada processo é calculados com base na sua prioridade dinâmica; Menor prioridade ou menor interatividade Mínimo 10 ms Maior prioridade ou maior interatividade Default 100 ms Máximo 200 ms § processos filhos ganham a metade do tempo restante no timeslice do seu pai; 09/2005, Por ngelo N. Vimeney baseado em LOVE, Robert – Linux kernel Development – Developer’s Library

Linux Kernel – Escalonamento de Processos O Algoritmo de Escalonamento Metas (alcançadas) para novo

Linux Kernel – Escalonamento de Processos O Algoritmo de Escalonamento Metas (alcançadas) para novo escalonador desenvolvido a partir da versão 2. 5 do kernel: § Garantir complexidade assintótica constante - O(1); § implementar escalabilidade SMP (Symmetric Multiprocessing) perfeita; § implementar afinidade SMP aprimorada; § garantir boa interatividade; § garantir justiça entre os processos; § otimização para o caso comum onde existem apenas 1 ou 2 processos prontos para execução e ainda funcionar bem para múltiplos processadores cada um com vários processos. 09/2005, Por ngelo N. Vimeney baseado em LOVE, Robert – Linux kernel Development – Developer’s Library

Linux Kernel – Escalonamento de Processos O Algoritmo de Escalonamento Round n: n+1: Fila

Linux Kernel – Escalonamento de Processos O Algoritmo de Escalonamento Round n: n+1: Fila de expirados Fila de ativos Starvation? ? 09/2005, Por ngelo N. Vimeney baseado em LOVE, Robert – Linux kernel Development – Developer’s Library

Linux Kernel – Escalonamento de Processos O Algoritmo de Escalonamento struct runqueue { spinlock_t

Linux Kernel – Escalonamento de Processos O Algoritmo de Escalonamento struct runqueue { spinlock_t unsigned long struct task_struct mm_struct prio_array int struct task_struct list_head atomic_t } lock; /* spin lock which protects this runqueue */ nr_running; /* number of runnable tasks */ nr_switches; /* number of context switches */ expired_timestamp; /* time of last array swap */ nruninterruptible; /* number of tasks in uinterruptible sleep */ *curr; /* this processor’s currently running task */ *idle; /* this processor’s idle task */ *prev_mm; /* mm_struct of last running task */ *active; /* pointer to the active priority array */ *expired; /* pointer to the expired priority array */ arrays[2]; /* the actual priority arrays */ prev_cpu_load[NR_CPUS]; /* load on each processor */ *migration_thread; /* the migration thread on this processor */ migration_queue; /* the migration queue for this processor */ nr_iowait; /* number of tasks waiting on I/O*/ 09/2005, Por ngelo N. Vimeney baseado em LOVE, Robert – Linux kernel Development – Developer’s Library

Linux Kernel – Escalonamento de Processos O Algoritmo de Escalonamento struct prio_array { unsigned

Linux Kernel – Escalonamento de Processos O Algoritmo de Escalonamento struct prio_array { unsigned int unsigned long struct list_head }; nr_active; /* number of taks */ bitmap[BITMAP_SIZE]; /* priority bitmap */ queue[MAX_PRIO]; /* priority queues */ struct list_head { struct list_head }; *next; *prev; /* ponteiro para o próximo nó da lista */ /* ponteiro para o no anterior */ 09/2005, Por ngelo N. Vimeney baseado em LOVE, Robert – Linux kernel Development – Developer’s Library

Linux Kernel – Escalonamento de Processos O Algoritmo de Escalonamento arrays[0] queue[0] = queue[1]

Linux Kernel – Escalonamento de Processos O Algoritmo de Escalonamento arrays[0] queue[0] = queue[1] =. . . active . . . queue[MAX_PRIO] = arrays[1] queue[0] = expired queue[1] =. . . queue[MAX_PRIO] = 09/2005, Por ngelo N. Vimeney baseado em LOVE, Robert – Linux kernel Development – Developer’s Library

Linux Kernel – Escalonamento de Processos O Algoritmo de Escalonamento void schedule(){ struct task_struct

Linux Kernel – Escalonamento de Processos O Algoritmo de Escalonamento void schedule(){ struct task_struct *next; struct prio_array *array; struct list_head *queue; int idx; … array = rq->active; . . . idx = sched_find_first_bit(array->bitmap); queue = array->queue + idx; next = list_entry(queue->next, task_t, run_list); . . . prev = context_switch(rq, prev, next); } 09/2005, Por ngelo N. Vimeney baseado em LOVE, Robert – Linux kernel Development – Developer’s Library

Linux Kernel – Escalonamento de Processos O Algoritmo de Escalonamento Principais trabalhos realizados pela

Linux Kernel – Escalonamento de Processos O Algoritmo de Escalonamento Principais trabalhos realizados pela função context_swith() : § Chaveamento do mapeamento da memória virtual do processo antigo para o novo processo: através de chamada a função switch_mm() (definida em include/asm/context. h) § Salvamento e recuperação de dados de pilha e registradores: através de chamada a função swith_to() (definida em include/asm/system. h) 09/2005, Por ngelo N. Vimeney baseado em LOVE, Robert – Linux kernel Development – Developer’s Library

Linux Kernel – Escalonamento de Processos O Algoritmo de Escalonamento Privilegiando processos interativos sem

Linux Kernel – Escalonamento de Processos O Algoritmo de Escalonamento Privilegiando processos interativos sem starvation : § Função scheduler_tick(), chamada via interrupção de tempo (Capítulo 9): struct task_struct *task = current; struct runqueue *rq = this_rq(); If (! - - task->time_slice){ if ( ! TASK_INTERACTIVE(task) || EXPIRED_STARVING( rq ) ){ enqueue_task( task, rq->expired ); }else{ enqueue_task( task, rq->active ); } } 09/2005, Por ngelo N. Vimeney baseado em LOVE, Robert – Linux kernel Development – Developer’s Library

Linux Kernel – Escalonamento de Processos Balanceamento de Carga Características principais do balanceamento de

Linux Kernel – Escalonamento de Processos Balanceamento de Carga Características principais do balanceamento de carga no Linux: § Implementado em kernel/sched. c na função load_balance(); § É chamada por schedule() quando a runqueue corrente está vazia ou pelo temporizador do sistema. § Em sistemas monoprocessados, nem sequer é compilada com o kernel. § Algoritmo: 1. Encontra a runqueue mais ocupada. Se não existe nenhuma runqueue com pelo menos 25% a mais de carga do que a runqueue atual, termina. 2. Decide qual priority array dentro da runqueue mais sobrecarregada será escolhido. O expired é o mais indicado. Por quê? 3. Escolhe a fila de processos de maior prioridade. Por quê? 4. Cada processo desta prioridade é analisado. São escolhidos os melhores. Quais? ? ? 5. Enquanto houver filas desbalanceadas, repete passo 1. 09/2005, Por ngelo N. Vimeney baseado em LOVE, Robert – Linux kernel Development – Developer’s Library

Linux Kernel – Escalonamento de Processos Perguntas? ? ? ? 09/2005, Por ngelo N.

Linux Kernel – Escalonamento de Processos Perguntas? ? ? ? 09/2005, Por ngelo N. Vimeney baseado em LOVE, Robert – Linux kernel Development – Developer’s Library