Mudanças no ./src
-
Para facilitar o export no src/utils depois de usar
makeusarexport PATH=$PATH:$(pwd), se nao quiser colocar no .bashrc/zshrc Mas no src/threads(adicionado no src/threads/Makefile os comandos para executar o pintos mais facil. com GUI ou sem) não precisa nem nomake checkdo src/threads/build (se der algum erro oque foi modificado ta no src/tests/Make.tests:58) -
Para funcionar no Arch Linux modifiquei o src/Makefile.build:93 para ele reduzir o tamanho do loader.bin
-
Adicionado logica para ir executando os testes em especifico, no caso do threads, basicamente usa
make ngui/gui TEST=<nome_do_test>
- Alarm Clock
- Advanced Scheduler
Alarm
Reimplementar 'timer_sleep()' no 'device/time.c' que ta originalmente implementado com 'busy wait', que fica chamando 'thread_yield()' enquanto o tempo não tiver passado ideia: Adicionar a verificação ao scheduler, adicionando um campo na struct de threads para indicar o tempo que ela deve ficar parada se tiver com status de blockingScheduler
Implementar uma mlfqs, na documentação oficial ele diz para dar opção de ter o mlfqs ou o por prioridade, então deveria implementar os dois (verificar!!); Com o mlfqs as prioridades definidas pelas threads devem ser ignoradas e controladas pelo escalonadorSegundo o apêndice que fala do scheduler basicamente temos de implementar o conceito de avg_load, thread_nice e o cpu_recent_time; O avg_load basicamente é a carga média do sistema levando em conta a quantidade de threads em ready_list, sem incluir a thread ociosa:
O cpu recent time basicamente é uma média móvel exponencial, específica de cada thread e que começa em 0, que serve como peso na hora de calcular a prioridade, basicamente ele vai considerar uma função exponencial em que quanto mais o tempo passa os cpu time antigos tenham pesos menores e os mais recentes os pesos maiores, todas as threads devem ter seu recent time recalculados 1 vez por segundo(timer_ticks() % TIMER_FREQ == 0) usando:
O nice é específico de cada thread, tem funções para implementar e ele funcionar direito com o resto, e ele deve estar entre -20 e 20, ele vai servir para calcular a prioridade, quanto mais positivo, menor a prioridade, que vai ser calculada usando o recent_time(apenas se ele mudar) para mudar a thread de fila na mlfq, usando a formula:
O kernel não suporta float nem double, então a doc recomenda usar o formato de 17.14, 17 bits para a parte inteira e 14 para a fracionária; Para transformar reais nesses tipos é só multiplicar por 2^Q, onde Q é o numero de bits separado para a parte fracionária, e truncar para int, a documentação recomenda usar isso no recent cpu time e no avg, nesse caso então vai basicamente simular operações em float usando inteiros(ver aqui como as operações podem ser feitas
Equipe:
Márcio Campos |
João Victor |
Esdras Gabriel |
Gabriel Jatobá |
|---|