Este projeto implementa uma solução para o clássico problema de sincronização de threads conhecido como Problema dos Leitores e Escritores. O problema envolve controlar o acesso concorrente a um recurso compartilhado (neste caso, uma lista de palavras) por múltiplas threads que podem ser leitores ou escritores.
- Múltiplos leitores podem acessar o recurso simultaneamente
- Apenas um escritor pode acessar o recurso por vez
- Leitores e escritores não podem acessar o recurso ao mesmo tempo
EP-SO/
├── Main.java # Classe principal com execução dos testes
├── bd.txt # Base de dados de palavras
├── Elements/
│ ├── Element.java # Classe abstrata base
│ ├── Reader.java # Implementação de leitores
│ └── Writer.java # Implementação de escritores
├── Structure/
│ └── Words.java # Estrutura compartilhada com sincronização
└── Outputs/
├── runSimultaneo.txt # Resultados com leitura simultânea
├── runExclusivo.txt # Resultados com acesso exclusivo
└── plots.py # Script para visualização dos resultados
O projeto compara duas abordagens:
Permite que múltiplos leitores acessem o recurso ao mesmo tempo:
- Leitores incrementam um contador (
readerCount) - Primeiro leitor bloqueia escritores
- Último leitor libera escritores
- Escritores têm acesso exclusivo
Todos os acessos (leitura e escrita) são exclusivos:
- Apenas uma thread acessa por vez
- Simula mutex tradicional
- Usado como baseline para comparação
- 100 threads em cada teste (proporção variável entre leitores/escritores)
- 100 acessos por thread
- 50 repetições para cada proporção (média dos tempos)
- Sleep de 1ms após operações para simular processamento
- Semáforos (
java.util.concurrent.Semaphore) para sincronização
- Java JDK 8 ou superior
javac Main.javajava MainO programa executará automaticamente ambos os modos (simultâneo e exclusivo) em threads separadas.
Os resultados são salvos em arquivos CSV no formato:
leitores,escritores,tempo_medio
Onde:
leitores: número de threads leitoras (0-100)escritores: número de threads escritoras (0-100)tempo_medio: tempo médio de execução em milissegundos
Para visualizar os resultados:
cd Outputs
python plots.pyO script gerará gráficos comparando o desempenho das duas abordagens sob diferentes proporções de leitores/escritores.
- Threads e Concorrência: Criação e sincronização de múltiplas threads
- Semáforos: Primitivas de sincronização para controle de acesso
- Exclusão Mútua: Garantia de acesso exclusivo ao recurso crítico
- Race Conditions: Prevenção de condições de corrida
- Starvation: Considerações sobre inanição de threads
- Deadlock: Prevenção através de ordem correta de aquisição de locks
- O arquivo
bd.txtcontém o texto base usado como recurso compartilhado - A variável
DIFFERENCEemMain.javacontrola o incremento nas proporções testadas (padrão: 1) - Cada teste embaralha as threads aleatoriamente antes da execução para evitar viés
Projeto desenvolvido como Exercício Programa da disciplina de Sistemas Operacionais.