Prova 1 2011/2 1. Dados dois processos A e B, sendo o processo A com threads BTN (conhecidas pelo kernel), e o processo B com threads BTU (conhecidas somente pelo usuário). Responda: Se A possui 4 threads: a1) Quantas regiões de código tem A? a2) Quantas regiões de dados globais tem A? a3) Quantas regiões de pilha possui A? a4) Quantas heaps possui A? Se B possui 7 threads: b1) Quantas seções globais tem B? b2) Quantas seções de dados tem B? b3) Quantas regiões de pilha tem B? c) Quantas pilhas existem no total, sendo que o kernel não está rodando threads extras? 2. Sobre syscalls bloqueantes e não bloqueantes. a) Quando uma syscall é feita ela troca de contexto ou executa e retorna imediatamente sem trocar? a) Qual a diferença em uma chamada de sistema bloqueante e não bloqueante? b) Qual a vantagem de usar uma system call não bloqueante? c) A syscall write é bloqueante ou não bloqueante? Se sim, ela pode ser convertida? 3. Sobre espera ocupada. a) O que é espera ocupada? b) Espera ocupada pode ser evitada? Como? c) P() e V() causam espera ocupada? c) As operações de read e write em arquivos gera espera ocupada? d) As operações de read e write em PIPES gera espera ocupada? 4. Fazer uma das duas: a) Dadas as instruções nativas: initMutex(); wait_mutex(); signal_mutex(); Implementar um semáforo contador de 1 a 6 com semáforos binários usando os protótipos: typedef struct_s { ... } sem; inicSem(sem s, int val); wait(sem s); signal(sem s); b) Codificar um PIPE com os protótipos: typedef pipe_s { ... } pipe; int initPipe(pipe *p); void read (pipe *p, char buffer[], int n_bytes); void write (pipe *p, char buffer[], in n_bytes);