https://github.com/ingogbe/os-simulator
OS-Simulator do problema do PDF incluso no projeto.
https://github.com/ingogbe/os-simulator
Last synced: 3 months ago
JSON representation
OS-Simulator do problema do PDF incluso no projeto.
- Host: GitHub
- URL: https://github.com/ingogbe/os-simulator
- Owner: ingogbe
- Created: 2017-12-01T12:44:13.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2017-12-29T15:01:47.000Z (over 7 years ago)
- Last Synced: 2025-01-27T11:23:21.486Z (4 months ago)
- Language: Java
- Homepage:
- Size: 549 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# OS-Simulator
Descrição do problema [aqui](https://github.com/ingoguilherme/OS-Simulator/blob/master/example/TP2-SimulaSO.pdf).
## Ambiente usado para implementação e testes
* Sistema Operacional Windows 10
* Eclipse IDE Oxygen Release (4.7.0)
* Eclipse IDE Neon.1a Release (4.6.1)
* Java SE Development Kit 8 Update 101 (64-bit) (8.0.1010.13)
* Java 8 Update 131 (64-bit) (8.0.1310.11)## Como executar o programa
Abra o Eclipse e adicione o projeto.
1. New
2. Java Project
3. Desmaque o checkbox `Use default location`
4. Browse
5. Selecione a pasta do projeto
6. FinishAbra o arquivo `Main.java` e execute-o.
## Componentes Implementados
1. Processador (Processor)
2. Disco (Disk)
2. Teclado (Keyboard)### Processador (Processor)
O `Processador (Processor)` sempre que lê/executa uma instrução, ele mostra a mensagem `Executei uma instrução` e em seguida mostra a instrução lida na próxima linha (linha de baixo). Ele possui 3 tipos de instruções (até o momento):
1. Instrução de componente (Component Instruction)
2. Valor inteiro (Integer)
3. Vetor de instruções (ArrayList)> #### Component Instruction
> Ao executar uma instrução `Component Instruction`, o processador pega e identifica para qual componente deve mandar e envia para o mesmo. Ele possui apenas uma instrução (até o momento):
> 1. Disco (Disk)> #### Integer
> Ao executar uma instrução `Integer` apenas mostra a instrução junto ao seu valor na tela.> #### ArrayList
> Ao executar uma instrução `ArrayList` ele entra diretamente no vetor e ja executa a primeira instrução do mesmo e as demais sequencialmente. Após terminar as instruções do vetor, volta ao fluxo normal.### Disco (Disk)
Como o disco possui tempo de execução maior que o do processador, quando ele é chamado pelo processador, o mesmo da um `up()` no semáforo do disco para manter esse controle, assim o disco executa todas as instruções passadas pelo processador no tempo dele, cada vez que executa uma, dando um `down()`.
### Teclado (Keyboard)
Como o teclado é praticamente independente, executa e mostra sempre que o usuário inserir algum comando, ele não é executado pelo `Processador (Processor)`, apenas mostra na tela os dados inseridos pelo processador.
## Exemplo de uso
Para desligar o `OS-Simulator` depois de ler todas as intruções do processaor, troque a constante `turnOff` para `true`, ou caso não deseja encerar as threads ao acabar as instruções e sim parar manualmente a execução, deixe em `false`.
```java
public static final boolean turnOff = true;
```> Observação: O teclado sempre espera alguma leitura, já que quando inicia ele já fica esperando essa leitura. caso o `turnOff` seja `true`, é necessário inserir alguma entrada no teclado após o processador ter encerrado.
```java
//Sempre inicializa para salvar o tempo inicial da execução do programar (as mensagens mostradas no console utilizam funções estáticas dessa classe, e requerem a inicialização para mostrar os dados corretos)
new Time();
//Gera instruções aleatórias na memória (nessa exemplo está gerando entre 1 e 5 instruções aleatórias)
LinkedList memory = Random.generateRandomDataList(Random.generateRandomInt(1, 5));//Cria semáforo do disco (disk)
Semaphore diskSemaphore = new Semaphore(0);/*
* Parâmetros do construtor do disco (disck):
* (tempo que disco leva para executar uma instrução, semáforo do disco)
*/
d = new Disk(2000, diskSemaphore);/*
* Parâmetros do construtor do processador (processor):
* (tempo que processador leva para executar uma instrução, vetor com as instruções, semáforo do disco)
*/
p = new Processor(1000, memory, diskSemaphore);/*
* Construtor do teclado (keyboard):
*/
k = new Keyboard();//Inicia todos os componentes criados anteriormente
p.start();
d.start();
k.start();
```## Exemplo do formato de saída:
A saída é composta por 3 colunas cada linha:
Os sleeps dentro de cada componente são executadas por primeiro para simular que a tarefa está sendo realizada, e logo após
imprime a mensagem no console.1. A primeira coluna é o tempo em que foi executado em milisegundos, começando em 0 desde a execução do programa.
2. A segunda coluna é o componente responsavel por essa mostrada na linha.
3. E a terceira é a mensagem ou dado mostrado/executado pelo componente.### Exemplo de saída no console
```javascript
7 | PROCESSOR | Inicia Processador!
7 | KEYBOARD | Inicia Teclado!
7 | DISK | Inicia Disco!1008 | PROCESSOR | Executei uma instrução.
1008 | PROCESSOR | Data [Type: Integer, Value: 19]2008 | PROCESSOR | Executei uma instrução.
2008 | PROCESSOR | Data [Type: Component Instruction, Value: Disk]3008 | PROCESSOR | Executei uma instrução.
3008 | PROCESSOR | Data [Type: Component Instruction, Value: Disk]4008 | DISK | Dei uma volta.
4008 | PROCESSOR | Executei uma instrução.
4008 | PROCESSOR | Data [Type: Component Instruction, Value: Disk]5009 | PROCESSOR | Executei uma instrução.
5009 | PROCESSOR | Data [Type: Integer, Value: 13]6008 | DISK | Dei uma volta.
6009 | PROCESSOR | Executei uma instrução.
6009 | PROCESSOR | Data [Type: Component Instruction, Value: Disk]7009 | PROCESSOR | Executei uma instrução.
7009 | PROCESSOR | Data [Type: Component Instruction, Value: Disk]8008 | DISK | Dei uma volta.
8009 | PROCESSOR | Executei uma instrução.
8009 | PROCESSOR | Data [Type: Integer, Value: 7]9010 | PROCESSOR | Executei uma instrução.
9010 | PROCESSOR | Data [Type: Integer, Value: 4]10008 | DISK | Dei uma volta.
10010 | PROCESSOR | Executei uma instrução.
10010 | PROCESSOR | Data [Type: Component Instruction, Value: Disk]11010 | PROCESSOR | Executei uma instrução.
11010 | PROCESSOR | Data [Type: Integer, Value: 15]12009 | DISK | Dei uma volta.
12010 | PROCESSOR | Executei uma instrução.
12010 | PROCESSOR | Data [Type: Component Instruction, Value: Disk]13010 | PROCESSOR | Executei uma instrução.
13010 | PROCESSOR | Data [Type: Integer, Value: 8]14009 | DISK | Dei uma volta.
14011 | PROCESSOR | Executei uma instrução.
14011 | PROCESSOR | Data [Type: Component Instruction, Value: Disk]15011 | PROCESSOR | Executei uma instrução.
15011 | PROCESSOR | Data [Type: Component Instruction, Value: Disk]16009 | DISK | Dei uma volta.
16011 | PROCESSOR | Executei uma instrução.
16011 | PROCESSOR | Data [Type: Integer, Value: 20]17011 | PROCESSOR | Executei uma instrução.
17011 | PROCESSOR | Data [Type: Component Instruction, Value: Disk]18010 | DISK | Dei uma volta.
18011 | PROCESSOR | Executei uma instrução.
18011 | PROCESSOR | Data [Type: Component Instruction, Value: Disk]19011 | PROCESSOR | Executei uma instrução.
19011 | PROCESSOR | Data [Type: Integer, Value: 14]20010 | DISK | Dei uma volta.
20012 | PROCESSOR | Não há mais instruções
22010 | DISK | Dei uma volta.
32997 | KEYBOARD | Usuário digitou algo: 'kk'.
```
## TODO
- [ ] Variável do processador `Program Counter` (PC) é um endereço para a lista (memória). Alterar para salvar índice da memória (i) ao invés de armazenar o objeto `Data` (instrução completa).
- [ ] Aceitar múltiplos componentes do mesmo tipo e saber diferenciá-los