Objetivo:
Implementar um núcleo gerenciador de processos, usando threads, aproveitando a interface produzida para o projeto anterior. Assim, o núcleo usará a função que le arquivos contendo instruções de programas sintéticos (exemplo), devendo agora retornar um inteiro que representa a ação definida pela instrução lida. Antes de fazer isso, deve tratar o sinal retornado pela função interruptControl, que retorna um inteiro identificando o tipo de interrupção que demandou a sua ação (retorna 0 se não houve interrupção).
Já o tratamento das instruções identificadas a partir do programa sintético é determinado por uma função chamada sysCall, a ser implementada por vocês, que é chamada quando o retorno da interruptControl é 0.
A partir do inteiro obtido de uma dessas funções o núcleo ativa o thread correspondente,
bem como aloca o próximo processo na CPU usando o algoritmo de escalonamento definido ao final deste texto.
As origens possíveis para os eventos a serem tratados pelo núcleo (com cada inteiro que as identificam) são:
ATENÇÃO: Para este projeto precisam ser implementados apenas os threads números 2, 3, 10 e 11. Os demais serão funções vazias.
- processInterrupt (1) -- interrupção gerada pelo final do quantum-time de um processo
- semaphoreP (10) -- tratamento de bloqueio de processo
- semaphoreV (11) -- tratamento de desbloqueio de processo
- ioRequest (4) -- chamada de operação de entrada/saída
- ioFinish (5) -- sinalização de final de E/S
- memLoadReq (6) -- chamada de operação de carregamento na memória
- memLoadFinish (7) -- sinalização de final de carregamento
- fsRequest (8) -- chamada para operação no sistema de arquivos
- fsFinish (9) -- sinalização de final de operação no sistema de arquivos
- processCreate (2) -- chamada para iniciar a criação de um processo no BCP
- processFinish (3) -- chamada para terminar a existência de um processo no BCP
Nesse momento é preciso escrever os códigos correspondentes às
threads de semáforos, criação, término e interrupção de processos e escalonamento. As demais
funcionalidades devem ser implementadas como funções vazias.
ALGORITMO DE ESCALONAMENTO:
Prioridade com quantum-time, em que o processo escolhido para executar será aquele com menor
valor de prioridade (lida do programa sintético) e irá executar pelo tempo equivalente a 2000 ut, ou
até ocorrer uma chamada de semáforo, E/S, ou término de processo.
Para melhor entendimento de como programar usando threads veja esse
documento.
Para a implementação desse núcleo faça uso das bibliotecas "semaphore.h" e "pthreads.h" presentes no UNIX para o uso de semáforos e de threads.
PRAZO PARA ENTREGA: 03/11/2015, até 24h00 (data e horário do recebimento do e-mail para aleardo at sjrp dot unesp dot br)
|