Git Product home page Git Product logo

pintos's Introduction

pintOS

Mudanças no ./src
  • Para facilitar o export no src/utils depois de usar make usar export 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>;

Objetivos:

  • Alarm Clock
  • Advanced Scheduler

Detalhamentos:

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;

Fila esquema

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:

$$avg = (\frac{59}{60}) * avg + (\frac{1}{60}) * (tamanho-da-ready-list)$$

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:

$$CpuTime = ( \frac{2 * avg}{2 * avg + 1} * CpuTime + nice) * 100$$

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:

$$p = floor(PriMax - (\frac{RecentCpuTime}{4}) - (nice * 2))$$
Pontos Flutuantes

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

pintos's People

Contributors

zed201 avatar heitormelo avatar saposopa avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.