Baixe o app para aproveitar ainda mais
Prévia do material em texto
Sistemas Operacionais Implementação de Processos no MINIX 3 Parte III Prof. Sílvio Fernandes UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO DEPARTAMENTO DE CIÊNCIAS EXATAS E NATURAIS CURSO DE CIÊNCIA DA COMPUTAÇÃO Comunicação entre processos no MINIX 3 O código de alto nível do IPC encontra-se em proc.c A tarefa de núcleo é transformar uma interrupção de HW ou de SW em uma mensagem A 1ª é gerada pelo HW e a última é a maneira como um pedido de serviço de sistema, i.e., uma chamada de sistema 2 Comunicação entre processos no MINIX 3 No arquivo proc.c Duas macros úteis são definidas BuildMess (ausente v.3.2.1) que é usada apenas para construir mensagens usandas por notify A única chamada de função é get_uptime que lê uma variável mantida pela tarefa de relógio para que a notificação possa incluir uma identificação de tempo (timestamp) As chamadas aparentes para uma função denominada priv são expansões de outra macro, definidas em priv.h: #define priv(rp) ((rp)->p_priv) A outra macro (CopyMess) é uma interface amigável para o programador, para a rotina em linguagem assembly cp_mess em klib386.s 3 Comunicação entre processos no MINIX 3 No arquivo proc.c Em BuildMess, a macro priv é usada para 2 casos especiais Se a origem de uma notificação HARDWARE, ela transportará uma cópia do mapa de bits de interrupções pendentes do processo de destino Se a origem for SYSTEM, os dados transportados correspondem ao mapa de bits de sinais pendentes Quando uma notificação não pode ser enviada, o bit correspondente ao remetente é ativado no mapa de bits do destinatário Na operação de receive, o mapa de bits é verificado e se for encontrado um bit ativado, a mensagem será novamente gerada 4 Comunicação entre processos no MINIX 3 No arquivo proc.c A primeira função é sys_call (ausente v.3.2.1) Ela converte uma interrupção de SW em uma mensagem Após todos os testes terem sido realizados, uma das funções mini_send, mini_receive ou mini_notify é chamada para fazer o trabalho real 5 Comunicação entre processos no MINIX 3 No arquivo proc.c Mini_send Tem 3 parâmetros: o processo que fez a chamada, o processo destino e um ponteiro para o buffer onde a mensagem está armazenada O teste (linhas 7606 a 7610) verifica se o processo que fez a chamada e o destino não estão tentando um enviar para o outro O teste principal (7615 e 7616): verificar se o destino está bloqueado em uma operação receive e por quem ele está esperando Se o destino não estiver esperando ou se esperar por outro remetente ele será bloqueado e o remetente retirado da fila (7623 a 7632) 6 Comunicação entre processos no MINIX 3 No arquivo proc.c Mini_send Enfileiramento de processos tentando enviar para o processo 0 7 Comunicação entre processos no MINIX 3 No arquivo proc.c Mini_receive É chamada por sys_call quando seu parâmetro function é RECEIVE ou BOTH Notificações têm prioridades mais altas que mensagens normais, mas nunca serão resposta direta para uma instrução send Portanto, os mapas de bits só serão consultados para verificar se existem notificações pendentes quando o flag SENDRED_BUSY não estiver ativado O envio utiliza as macros BuildMess e CopyMess Apenas uma notificação é entregue por vez; mini_send retorna após a entrega de uma notificação (7684) 8 Comunicação entre processos no MINIX 3 No arquivo proc.c Mini_notify Se o destinatário estiver bloqueado e esperando para receber, a notificação será gerada e entregue por BuildMess O flag RECEIVING do destinatário é desativado e então é recolocado em enqueue Se o destinatário não estiver esperando por mensagem, um bit será ativado em seu mapa s_notify_pending Quando mini_notify for executada a uma interrupção de SW, as interrupções serão desativadas, exceto as tarefas de relógio ou de sistema (futuras) 9 Escalonamento no MINIX 3 O MINIX 3 usa um algoritmo de escalonamento multinível Os processos recebem prioridades iniciais, relacionadas à estrutura de camadas do MINIX 3, mas existem mais camadas e a prioridade de um processo pode mudar durante sua execução O escalonador mantém 16 filas de processos prontos para executar (aptos) 10 Escalonamento no MINIX 3 11 Escalonamento no MINIX 3 12 A figura anterior mostra as filas e os processos que estão em vigor no instante em que o núcleo termina a inicialização e começa a executar, isto é, na chamada para restart em main.c O array rdy_head tem uma entrada para cada fila, com essa entrada apontando para o processo que está no início da fila Analogamente, rdy_tail é um array cujas entradas apontam para o último processo em cada fila Esses 2 arrays são definidos com a macro EXTERN em proc.h Escalonamento no MINIX 3 13 O enfileiramento inicial de processos durante a inicialização do sistema é determinado pela tabela image em table.c O algoritmo de escalonamento é simples Encontrar a fila de prioridade mais alta que não esteja vazia e escolher o processo que está no início dessa fila O processo IDLE está sempre pronto e fica na fila de prioridade mais baixa Se todas as filas de prioridades mais altas estiverem vazia, o processo IDLE será executado Escalonamento no MINIX 3 14 Em proc.c, enqueue é chamada com um ponteiro para uma entrada na tabela de processos como argumento Ela chama a função sched (na v. 3.2.1 chama-se smp_schedule), com ponteiros para variáveis que determinam m qual fila o processo deve estar e se ele deve ser adicionado no início ou no final dessa fila Quando um processo deve sair da fila de aptos a executar, a função dequeue é chamada Um processo deve está executando para ser bloqueado; portanto, o processo a ser removido provavelmente estará no início de sua fila Escalonamento no MINIX 3 15 A função sched escolhe a fila em que vai colocar um processo que se tornou pronto recentemente e se vai inseri-lo no início ou no final dessa fila É verificada se o quantum do processo inteiro foi usado Se não foi, ele será reiniciado com o que tiver restado da sua última vez Em caso afirmativo, então é verificado se o processo teve dois turnos seguidos, sem que nenhum outro tenha executado; então é atribuída uma penalidade +1; se o quantum foi inteiramente utilizado e outros processos tiveram chance de executar, o valor da penalidade se tornará -1 Escalonamento no MINIX 3 16 Em seguida é determinada a fila a ser usada A fila 0 é a de mais alta prioridade A fila 15 a de mais baixa Todos os processos começam com suas prioridades máxima; portanto, uma penalidade negativa não muda nada, até que tenham sido atribuídas penalidades positivas Também existe um limite inferior de prioridades Processos normais nunca podem ser colocados na mesma fila que IDLE Escalonamento no MINIX 3 17 Basicamente, o escalonador é pick_proc Sua principal função é configurar o next_ptr Toda alteração nas filas que possa afetar a escolha do processo a ser executado em seguida exige que pick_proc seja novamente executada As funções restantes em proc.c são lock_send, lock_enqueue e lock_dequeue Dão acesso às suas funções básicas usando lock e unlock, da mesma maneira como para lock_notify Utilitários e a biblioteca do núcleo 18 Finalmente, o núcleo tem um biblioteca de funções de suporte escritas em linguagem assembly, que são incluídaspela compilação de klib.s (ausente v.3.2.1), e alguns programas utilitários escritos em C, no arquivo misc.c (ausente v.3.2.1) Klib.s, semelhante a mpx.s, seleciona a versão específica da máquina apropriada com base na definição de WORD_SIZE O código de klib386.s possui cerca de 2 dezenas de rotinas utilitárias em assembly, por eficiência ou porque não podem ser escritas em C Referências TANENBAUM, Andrew S.; WOODHULL, Albert S. Sistemas Operacionais: Projeto e Implementação. 3ª Ed., Prentice Hall, 2008. 19
Compartilhar