Mudanças no ./src
-
Para facilitar o export no src/utils depois de usar
make
usarexport PATH=$PATH:$(pwd)
, se não quiser colocar no .bashrc/zshrc Mas no src/threads (adicionado no src/threads/Makefile os comandos para executar o pintos mais fácil com GUI ou sem); -
Para funcionar no Arch Linux modifiquei o src/Makefile.build:93 para ele reduzir o tamanho do loader.bin;
-
Adicionado lógica para ir executando os testes em especifico, do threads, usa
make test TEST=<nome_do_test>
;
- Alarm Clock
- Advanced Scheduler
Alarm
Reimplementar timer_sleep()
no device/time.c
que está originalmente implementado como espera ocupada, chamando thread_yiel()
enquanto o tempo não estiver 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 blocking.
Scheduler
Implementar uma mlfqs, na documentação oficial prevê a implementação completa de mlfqs e fila de prioridade; com o mlfqs, as prioridades definidas pelas threads devem ser ignoradas e controladas pelo escalonador;Segundo o apêndice sobre o escalonador, devemos implementar o conceito de avg_load, thread_nice e o cpu_recent_time;
O avg_load é a carga média do sistema levando em conta a quantidade de threads em ready_list, sem incluir thread ociosa:
O cpu recent time é uma média móvel exponencial, específica de cada thread, e que começa em 0, servindo como peso na hora de calcular a prioridade; a implementação consiste em uma função exponencial em que quanto mais o tempo passa os cpu time antigos fiquem com 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, há funções para implementar e ele funcionar corretamente, e deve estar entre -20 e 20; sua função é calcular a prioridade: quanto mais positivo, menor a prioridade, que vai ser calculada usando o recent_time (apenas se ele mudar) e então mudar a thread de fila na mlfqs. Segue a formula:
O kernel não suporta float nem double, então a documentação recomenda usar o formato de 17.14, 17 bits para a parte inteira e 14 para a fracionária. Para transformar reais nesses tipos, basta multiplicar por 2^Q, com 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, para simular operações em float usando inteiros (ver aqui como as operações podem ser feitas).
Tests
- PASS tests/threads/alarm-single
- PASS tests/threads/alarm-multiple
- PASS tests/threads/alarm-simultaneous
- FAIL tests/threads/alarm-priority
- PASS tests/threads/alarm-zero
- PASS tests/threads/alarm-negative
- FAIL tests/threads/priority-change
- FAIL tests/threads/priority-donate-one
- FAIL tests/threads/priority-donate-multiple
- FAIL tests/threads/priority-donate-multiple2
- FAIL tests/threads/priority-donate-nest
- FAIL tests/threads/priority-donate-sema
- FAIL tests/threads/priority-donate-lower
- FAIL tests/threads/priority-fifo
- FAIL tests/threads/priority-preempt
- FAIL tests/threads/priority-sema
- FAIL tests/threads/priority-condvar
- FAIL tests/threads/priority-donate-chain
- PASS tests/threads/mlfqs-load-1
- PASS tests/threads/mlfqs-load-60
- PASS tests/threads/mlfqs-load-avg
- PASS tests/threads/mlfqs-recent-1
- PASS tests/threads/mlfqs-fair-2
- PASS tests/threads/mlfqs-fair-20
- PASS tests/threads/mlfqs-nice-2
- PASS tests/threads/mlfqs-nice-10
- PASS tests/threads/mlfqs-block
*Conforme previsto pelo projeto;
Equipe:
Luiz Gustavo |
Heitor Melo |
Henrique César |
Emanuelle Giovanna |
---|