Академический Документы
Профессиональный Документы
Культура Документы
1 - Threads
Troca de contexto entre threads é muito mais rápida que entre processos;
1
Sistemas Operacionais
2
Sistemas Operacionais
3
Sistemas Operacionais
Condição de corrida é aquela que pode ocorrer quando dois (ou mais) processos
têm acesso compartilhado a dados e um processo consegue alterar o conteúdo
dos dados sem que o outro processo o possa perceber.
ex: Spool de impressão - Considerações:
1. processos entram com o nome do arquivo a ser impresso num diretório de
impressão com entradas numeradas e possuindo duas variáveis
compartilhadas: in (próxima entrada livre) e out (próximo arquivo a ser
impresso);
2. processo impressor verifica se há arquivos neste diretório. Havendo, imprime
o arquivo e exclui o nome do arquivo;
Cenário:
2.4 Semáforos
Operações:
OBS:
As operações sobre semáforos são atômicas (indivisíveis);
Se o semáforo for binário, após um SIGNAL ele permanecerá em zero,
porém, haverá menos um processo dormindo naquele semáforo;
Semáforos devem ser implementados como chamadas do sistema;
No caso de sistemas com mais de um processador, utilizam-se variáveis de
travamento TSL para garantir que somente um deles escreva num semáforo
em um instante de tempo;
Quando um processo é bloqueado em um semáforo, ele é adicionado à sua
lista de processos bloqueados.
Podemos visualizar um semáforo como uma estrutura que possui uma variável
inteira que contém um valor inicial e a qual todo acesso é feito por meio das duas
operações atômicas: wait e signal. Outros nomes também são usados :
1. down ou sleep para wait
2. up ou wakeup para signal
WAIT
1. Quando um processo deseja entrar em uma RC, executa o wait.
2. wait decrementa o valor do semáforo.
3. Se o valor < 0, já existe um processo acessando a RC.
a. O processo que executou o wait vai para a fila de processos
bloqueados no semáforo.
b. Este processo é bloqueado.
4. Se o valor = 0, significa que não havia nenhum processo acessando a RC, e o
processo que executou o wait pode entrar na RC.
a. Como o wait decrementa o valor do semáforo, agora a RC está
bloqueada para novos acessos.
6
Sistemas Operacionais
wait()
{
s.valor--; // decrementa valor do semaforo
if(s.valor < 0) // se valor < 0, sig. que existe processo acessando a RC
{
adicona o processo P a s.lista;
bloqeuia P;
}
else
processo executanto wait entra na RC;
}
SIGNAL
signal()
{
s.valor++; // incrementa valor do semaforo
if(s.valor <= 0) // se o semaforo for <= 0, sig. que existe processo bloqueado
{
remove um processo P de s.lista;
desbloqueia P;
}
processo executanto signal sai da RC;
}
Obs:
1. Semáforos utilizados para implementar exclusão mútua são inicializados
com valor 1 (um).
2. O módulo do valor negativo do semáforo em um determinado momento
indica o número de processos bloqueados naquele semáforo.
7
Sistemas Operacionais
Exemplo:
while(true)
{
região não-crítica // neste região não se acessa variáveis compartilhadas
...
wait(mutex); // trava acesso a RC por outros processos
região crítica // com a RC bloqueada, este processso pode acessar com
// segurança variáveis compartilhadas
...
signal(mutex); // saindo da RC, libera-se o acesso a RC p/outros proc.
região não-crítica // neste região não se acessa variáveis compartilhadas
...
}
Solução:
void P1() void P2()
{ {
... wait(sinc);
...
...
... ...
signal(sinc); ...
} } 8
Sistemas Operacionais
#include “prototypes.h”
#define N 100 // nro de posições do buffer
#typedef int semaphore; // um semáforo pode ser representado por um int
9
Sistemas Operacionais
Modela o acesso a bases de dados: muitos processos podem ler uma base ao
mesmo tempo, mas se um processo estiver escrevendo, nenhum outro pode ter
acesso a base, nem mesmo para leitura.
typedef int semaphore; / * use your imagination * /
semaphore mutex = 1; / * controls access to ’rc’ * /
semaphore db = 1; / * controls access to the data base * /
int rc = 0; / * # of processes reading or wanting to * /
void reader(void)
{
while (TRUE) / * repeat forever * /
{
down(&mutex); / * get exclusive access to ’rc’ * /
rc = rc + 1; / * one reader more now * /
if (rc == 1) down(&db); / * if this is the first reader ... * /
up(&mutex); / * release exclusive access to ’rc’ * /
read_data_base(); / * access the data * /
down(&mutex); / * get exclusive access to ’rc’ * /
rc = rc - 1; / * one reader fewer now * /
if (rc == 0) up(&db); / * if this is the last reader ... * /
up(&mutex); / * release exclusive access to ’rc’ * /
use_data_read(); / * noncritical region * /
}
}
void writer(void)
{
while (TRUE) / * repeat forever * /
{
think_up_data(); / * noncritical region * /
down(&db); / * get exclusive access * /
write_data_base(); / * update the data * /
up(&db); / * release exclusive access * /
}
}
Uma solução para o problema dos Leitores e Escritores
12
Sistemas Operacionais
void customer(void)
{
down(mutex); / * enter critical region * /
if (waiting < CHAIRS) / * if there are no free chairs, leave * /
{
waiting = waiting + 1; / * increment count of waiting customers * /
up(customers); / * wake up barber if necessary * /
up(mutex); / * release access to ’waiting’ * /
down(barbers); / * go to sleep if # of free barbers is 0 * /
get_haircut(); / * be seated and be serviced * /
}
else
{
up(mutex); / * shop is full; do not wait * /
}
}
13
Sistemas Operacionais
14