Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/equiel-1703/escalonador-so
Projeto de estudo para entender o funcionamento de um escalonador simples de sistemas operacionais.
https://github.com/equiel-1703/escalonador-so
Last synced: 17 days ago
JSON representation
Projeto de estudo para entender o funcionamento de um escalonador simples de sistemas operacionais.
- Host: GitHub
- URL: https://github.com/equiel-1703/escalonador-so
- Owner: Equiel-1703
- License: mit
- Created: 2023-11-18T18:08:38.000Z (about 1 year ago)
- Default Branch: main
- Last Pushed: 2023-11-21T19:23:56.000Z (about 1 year ago)
- Last Synced: 2024-11-19T10:12:21.887Z (3 months ago)
- Language: C++
- Size: 39.1 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Simulador de Escalonador
Este programa é um simulador de um escalonador - um dos principais componentes de um sistema operacional. Ele possui dois algoritmos implementados: SJF (Shortest Job First) e GJF (Greatest Job First). Para usá-lo, é preciso fornecer como entrada o arquivo contendo as tarefas para ele escalonar, o número de cores do processador da simulação e a política de escalonamento.
A saída do programa mostra as tarefas lidas do arquivo de entrada ordenadas em ordem crescente de tempo, o que cada núcleo processou em cada instante de tempo e o tempo total que levou para os núcleos executarem todas as tarefas. Um arquivo de texto "saida.txt" é gerado contendo essas mesmas informações mostradas no terminal.
A forma de uso do simulador na linha de comando é:
```simulador-so ```
Onde:
- \ é o caminho do arquivo de texto contendo as tarefas para o escalonador. A forma que esse arquivo deve ser estruturado é explicado mais abaixo
- \ é o número de cores do processador da simulação
- \ [OPCIONAL] é a política de escalonamento usada para selecionar as tarefas. Como dito anteriormente, há duas políticas implementadas:
- s -> Shortest Job First, nessa política as tarefas **menores** são executadas primeiro
- g -> Greatest Job First, tarefas **maiores** são executadas primeiroSe o parâmetro `` não for fornecido, o simulador executa usando SJF.
## Arquivo com tarefas
O arquivo de texto contendo as tarefas para a simulação deve ser estruturado da seguinte forma:
```
...
```
Como eu ainda estava a aprendendo a utilizar Regex em C++ quando escrevi esse código, o algoritmo que seleciona os dados da linha possui algumas limitações:
- O id de cada tarefa só pode possuir uma combinação de letras maiúsculas/minúsculas e números. Caracteres como underline (_) e travessão (-) não são aceitos
- O tempo de duração da tarefa deve ser um número inteiro (essa nem é uma limitação do algoritmo de Regex, mas o programa em si foi projetado para usar um contador inteiro)
- Se houver mais de um caractere de espaço entre o id e o tempo, a linha toda é ignoradaEm uma atualização futura do programa eu pretendo melhorar isso.
## UML e um pouco sobre o código
Nesse projeto tive a oportunidade de aprender e praticar técnicas muito legais de C++, como ponteiros inteligentes, templates de classes, tratamento de exceções na linguagem e *move semantics* - um conceito que eu nem fazia ideia que existia e é muito útil.
Quando eu fiz o diagrama de classes desse projeto eu não só tive em mente as boas práticas de programação orientada a objetos (*single responsibility*, *open-closed principle* etc) mas também levei em consideração de como deveria ser a estrutura de um escalonador real dentro de um sistema operacional. Por isso existem as classes Core, Task e Scheduler:
![escalonador-os-UML](https://github.com/Equiel-1703/escalonador-so/assets/96885946/5161a53a-9978-4dad-bd2e-3df42c014ab8)
Uma outra coisa que fiz nesse projeto foi tentar seguir à risca o ![Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html). Esse guia contém uma série de regras e convenções usadas pela Google para desenvolvimento de código em C++. Algumas regras eu realmente gostei e vou levar pra vida, mas outras nem tanto.
Uma das coisas desse guia que eu realmente gostei foi a norma de nomear variáveis de classe usando *snake_case* seguido de um underline (_). Dessa forma, sabemos no código interno que isso é uma variável da classe que estamos trabalhando:
```
class SimulationResults
{
private:
int total_time_;
...
}
```
Mas uma regra que eu simplesmente não consegui seguir foi a de nomear métodos de uma classe usando *PascalCase*. Isso pra mim é muito contraintuitivo, principalmente por eu ter acostumado com a convenção usada em Java. Na linguagem do café javanês, tradicionalmente se nomeia classes usando *PascalCase* e métodos usando *camelCase*. Dessa forma, temos uma diferença visível no código entre métodos e classes. Como eu não gostei dessa norma eu fiz o que todo bom programador teimoso faz: fiz do meu jeito e funcionou bem.