Você está na página 1de 2

Escola de Artes, Ciências e Humanidades - EACH-USP

Professores Responsáveis: Marcelo Morandini e Norton T. Roman


ACH2044 – Sistemas Operacionais
EACH - Segundo Semestre de 2010
Segundo Exercício Prático - Data de entrega: até 26 de novembro de 2010

Implementação de Readers e Writers


Este trabalho tem por objetivo apresentar o aluno ao uso de threads, ilustrando a importância prática do
uso de soluções para o problema de Leitores e Escritores.
Para tal, vocês devem:
• Organizar-se em grupos de até 4 (quatro) pessoas.
• Criar uma estrutura de dados (vetor ou lista ligada de Strings), contendo, em cada posição, uma
palavra do arquivo “bd.txt”. Esse arquivo corresponde ao texto “A Treatise Concerning the Principles
of Human Knowledge”, de George Berkeley (1710), formatado de modo a que haja apenas uma
palavra (e pontuação satélite) por linha, num total de 36.242 linhas. Assim, sua estrutura terá esse
número de elementos, com uma palavra por elemento. Vale lembrar que a estrutura deve permitir
concorrência, ou seja, deve ser uma região crítica.
• Criar um vetor de objetos de thread, contendo n objetos de leitura/escrita, organizados
aleatoriamente. Cada objeto no vetor deve ter, em seu método run, pelo menos 2 itens:
○ Um comando para que, quando rodado, o objeto durma um número aleatório de 0 a 10
milissegundos.
○ Um acesso a alguma posição aleatória da base de dados (estrutura correspondente ao bd),
seja de leitura ou escrita. No caso de leitura, o sistema lê o conteúdo e armazena em uma
variável. No caso de escrita, o sistema escreve “MODIFICADO” na posição correspondente na
tabela.
• Implementar ou baixar uma solução (sim, é permitido o uso de solução não própria), em Java,
para o problema de Leitores e Escritores.
• Aplicar essa solução à estrutura de dados e ao vetor de threads concorrentes, marcando o tempo
total de execução do sistema.
• Implementar uma solução sem o uso de Leitores e Escritores, aplicando-a à estrutura de dados
e vetor de threads, marcando o tempo total de execução do sistema.
Ao executar, seu sistema deve criar a base de dados na memória e o vetor de threads. Na hora de criar
o vetor, carregue-o com 30 objetos de thread, variando a proporção de readers e writers dentre esses objetos.
Por exemplo, vocês podem experimentar as proporções 0(readers):30(writers), 7:23, 15:15, 23:7 e 30:0.
Defina pelo menos 5 proporções diferentes, medindo o tempo total de execução (do início ao fim do main)
do sistema nesses casos. É muito importante que a posição de cada objeto no vetor, quando de sua criação,
seja escolhida de forma aleatória, ou seja, dada uma proporção de, digamos 2:28, não há como saber onde
esses 2 Leitores estão, sem inspecionar o vetor.
Em seguida, o sistema deve correr o vetor de threads, rodando-as uma a uma. A aleatoriedade na
posição do objeto dentro do vetor, bem como no tempo que a thread dorme antes de rodar, devem ajudar a
dissipar quaisquer efeitos determinísticos nesse experimento.
Por fim, construa uma versão do mesmo sistema, mas sem o uso de Leitores e Escritores, ou seja, com
o sistema bloqueando todo e qualquer acesso à base toda vez que alguém, seja Leitor ou Escritor, estiver
dentro dela.
Avaliação do Sistema
Como forma de avaliação, você deve construir um relatório (com gráficos) dizendo, para cada
proporção usada, qual o tempo médio gasto pelo sistema. O tempo médio, nesse caso, é obtido rodando-se o
sistema 50 vezes, e tirando-se a média de execução em cada uma das vezes.
De modo a obter um valor-base de comparação, execute o mesmo teste (repetição de 50 vezes, com as
mesmas proporções definidas), porém sem o uso de Leitores e Escritores. Inclua os resultados em seu
relatório, indicando claramente se houve ganho, por parte de qual estratégia, e em que situação (proporção
de Leitores e Escritores).

Material para Entrega


A entrega será feita unica e exclusivamente via COL. Você deve criar um arquivo “.zip” contendo o
seguinte material:
● Código java do programa
● Especificação em javadoc de todas as classes construidas
● Relatório de avaliação do sistema, descrito acima
Vale lembrar que o prazo de entrega é 26 de Novembro de 2010.

Links Úteis
Para auxiliá-lo nessa tarefa, vale consultar algum material sobre threads, em especial:
• http://www.javaworld.com/javaworld/jw-05-2002/jw-0503-java101.html
• http://www.javaworld.com/javaworld/jw-06-2002/jw-0607-java101.html
• http://www.javaworld.com/javaworld/jw-07-2002/jw-0703-java101.html
• http://www.javaworld.com/javaworld/jw-08-2002/jw-0802-java101.html