Академический Документы
Профессиональный Документы
Культура Документы
1. Toda vez que vai ocorrer uma mudança de processo rodando(quando ambos estão
ainda rodando), ocorre um chaveamento de contexto entre processos, o que ele faz é
salvar todas informações do processo atual e carregar as informações do próximo
processo e executar.
a. As informações Salvas são:
i. Prioridade
ii. Local da memória caso o processo utilize
iii. Contexto (instrução em execução e valores nos registradores)
iv. Dono do processo
v. Tamanho da memória utilizada
vi. Contabilidade de recursos utilizados como I/O, memória e processador*
vii. Estado do processo
2. Multithreading ajuda principalmente a otimizar o uso do computador, por exemplo, ao
realizar uma soma o CPU vai fazer muito rápido, mas ao esperar uma I/O se a aplicação
for single thread ela ficará parada esperando, se for multithreading 1 thread pode cuidar
do I/O em questão e a outra pode continuar rodando e executando funções mais
rápidas enquanto espera a entrada ou saída terminar a comunicação.
Ou seja melhora o desempenho do software, visto que consegue utilizar melhor os
recursos.
3. 2^n onde N é o número de forks, logo, como temos 3 forks.
2³ = 8 = número de processos criados.
Se não contar o pai, seriam 2^n -1.
4. t1:=3; t2:=3;
(contadores, para cada join triplo que tem no grafo)
P1; fork a2; fork a4; fork a3; quit;
(P1 é executada, tem um fork para P2, P4 e P3, quit no final de cada comando)
a2: P2; fork a7; fork a5; quit;
(para cada aN, executa o respectivo Processo, se for join, sinaliza o contador que está dando join
, próximo aN)
a3: P3; fork a6; fork a8; quit;
a4: P4; join t1, a9; quit;
a5: P5; join t1, a9; quit;
a6: P6; join t1, a9; quit;
a7: P7; join t2, a10; quit;
a8: P8; join t2, a10; quit;
a9: P9; join t2, a10; quit;
a10: P10; quit;
5. Primeiro, post que pode ajudar a elucidar vários conceitos:
https://stackoverflow.com/questions/15983872/difference-between-user-level-and-kern
el-supported-threads
User threads: gerenciadas por user-level-libraries, sem suporte ao kernel
Kernel threads: gerenciadas diretamente pelo SO.
n
Tipos de mapeamento:
Vantagens e Desvantagens:
6. São alocados para processos: dados, código, heap e stack;
Para threads são alocados e dividem com os processos os código e dados, variáveis
globais, arquivos abertos, diretórios, informações do SO, etc. Além disso elas têm uma
stack separada, registradores, incluindo stack pointer(SP) e program counter(PC).
São considerados mais leves que processo pois tem um share de memória, ou seja, o
chaveamento de contexto acontece muito mais rápido que um processo faria.
CAIU NA PROVA 2017/1
7. Como o pid == 0 é referente ao filho, ele acrescenta 5 ao inteiro “value” mas não dá o
print dele, lembrando que as variáveis são diferentes do pai e do filho, são copiadas.
Pid > 0 é do processo pai, logo ele vai printar o valor do processo pai que é 5.
Na linha A portanto vai ser impresso 5.
wait(NULL) faz com que o pai execute só depois que todos filhos terminarem
8. C1; C2; C3 executados em sequencia:
● x = 5
● y = 2
(Espera x > y e executa C1 depois C2) ao mesmo tempo que (executa C3)
1. É quando diferentes processos acessam e manipulam dados concorrentemente.
Resultado depende da ordem que são executados.
2. É quando um processo ou uma thread está esperando para que alguma condição
aconteça para continuar executando. Para evitar, temos diversas técnicas como
at-most-once, funções atômicas, etc.
3.
4. Satisfaz pois tem no máximo uma referência(y = x - y) de uma variável(x) em outra etapa
concorrente.
Os valores finais podem ser:
x = 2
y = 1
Ou
x = 2
y = 0
5. Não, para ocorrer deadlock, devemos ter alguma dessas quatro situações:
a. Exclusão Mútua: um recurso não pode ser usado por mais de um processo;
b. Pare e espere: processos que já estão segurando recursos podem requisitar
novos recursos
c. Sem preemptividade: Nenhum recurso pode forçadamente ser retirado de um
processo que o está segurando, recursos podem ser liberados explicitamente e
somente pelo processo.
d. Espera Circular: 2 ou mais processos formam uma cadeia circular onde cada
processo espera para um recurso que o outro processo está segurando;
Logo, para termos deadlocks, temos que ter ou multithreading ou vários
processos ou os 2.
6. O caso em que o starvation ocorre é quando um processo está esperando para ser
atendido, mas sempre chega outro processo que é escolhido pelo escalonador.
7. Propriedades primitivas de exclusão mútua:
a. Exclusão Mútua: garantir que no máximo um processo esteja executando uma
seção crítica;
i. Como tem a variável booleana wantsToEnter e mais uma variável turn
que indica se é a vez do processo em questão, ele nunca vai ter 2
processos executando a seção crítica.
b. Progressão: Um processo fora da seção crítica não pode impedir outro de entrar;
i. Como existem as 2 variáveis explicadas em A, o processo fora da seção
crítica vai alternar ao final da execução de cada um deles, logo o outro
também vai ter a sua vez, sem impedimentos.
c. Espera limitada: Um processo não deve ser proibido indefinidamente de entrar
em uma seção crítica
i. Mesmo motivo da B, existe uma alternância entre os processos.
d. Não deve fazer suposições sobre velocidade relativa do computador, ou
execução relativa a velocidade dos processos.
i. Não existem suposições que dependam de velocidade do computador,
existe um controle de variáveis.
8. Se por exemplo, P1 é executado, e na região não crítica ele demora muito executar,
depois de ter alterado o turn, o processo P2 vai executar, ao terminar vai setar uma flag
contrária a sua execução, então se P1 ainda estiver executando a seção não crítica ele
vai tentar executar novamente(o P2) e assim ele estaria esperando e sendo bloqueado
pois P1 não chegou no turn novamente.
9. Busy-wait num sistema com um único processador implica em tempo perdido de
execução já que o processo só está ocupando a cpu sem fazer nada. Em sistemas
multicore isso pode ser aceitável já que outras threads estarão executando em paralelo
e o fato de não ter troca de contexto do processo em busy wait, pode fazer valer a pena
ele ficar executando "nada" contando que seja liberado logo.
10. Porque dá muito poder ao usuário, pode acontecer de um processo ser executado
infinitamente(loop) e se entrar não irá sair.
11. Como os 2 estão acessando uma mesma conta, pode acontecer de que ao passar a
quantia a ser retirada, ele reconheça como a quantia a ser depositada na função de
depósito. Ou que o marido retire a quantia que a esposa está tentando depositar, enfim,
conflito de dados.
Para resolver essa situação exclusão mútua pode ser aplicada, considerando cada
função como uma seção crítica.
Saldo: 100
Deposito: 80
Saque: 20
Ambas operações são feitas de forma concorrente
terminal A: operação deposito, saldo = 100
Terminal B: operação saque, saldo = 100
Terminal A: soma 50 ao saldo de 100
Terminal B: subtrai 80 de 100
Terminal A: salva saldo 150
Terminal B: salva saldo de 20
Depósito foi perdido
-> implementar seção crítica com mutex ou algo do tipo
1. Diferenças e Conceito
a. Mutex
i. Mutex deixam somente uma thread por vez entrar na seção crítica e
somente essa thread pode liberar o mutex.
No semáforo, pode ser sinalizado de qualquer outra thread ou processo a
liberação. Por esse motivo semáforos são mais adequados para
problemas de sincronização como produtor-consumidor.
O mesmo mutex pode ser compartilhado entre vários processos,
consequentemente várias threads entre esses processos.
b. Semáforos
i. O semáforo faz o mesmo com o mutex com a diferença de que podem
entrar X processos dentro dessa seção crítica.
Assim como mutex, podem ser utilizados por vários processo e threads,
lembrando que os semáforos podem liberar ou alocar recursos de
qualquer outra thread/processo.
c. Monitores
i. Monitores, assim como mutex só deixam uma thread/processo executar
a seção critica, são feitos para multi-thread dentro de um único processo.
2.
a) turn = 2;
b) p2WantsToEnter = 1 && turn = 2;
c) turn = 1;
d) p1WantsToEnter = 1 && turn = 1;
3. Será violada pois se V pode interferir em P ou o contrário, pode interferir na contagem
de recursos que o semáforo está controlando no momento. Logo mais de uma thread
poderia por exemplo usar o mesmo recurso.
4. Sem arrive1=0,
arrive2=0;
Process Worker1 {
V(arrive1);
P(arrive2)
}
Process Worker2 {
V(arrive2);
P(arrive1);
}
5. Poderiamos utilizar dois semáforos inicializados em zero, semaforoA e semaforoB.
threadA: tarefa Y threadB: tarefa X
semaforoA.V() semaforoB.V()
semaforoB.P() semaforoA.P()
Tarefa A tarefa B
6. Porque caso os semáforos sejam inicializados em zero, vai dar deadlock pois a thread 1
vai estar esperando o recurso do semaforoB e a thread 2 vai estar esperando o recurso
do semaforoA. Caso sejam inicializados em 1+, a thread 1 pode executar a tarefa A
antes da tarefa X ser executada, assim como a B pode executar a tarefa B antes da
tarefa Y. Nesse caso, os semáforos acabam não tendo sentido.
7. P = tirar recurso
V = repor recurso
Se executarmos começando em 1, 12 operações P’s, ficaremos com -11, ao
retornarmos recurso com 7 operações V’s, temos -11 + 7 = -4, logo temos 4 processos
aguardando recurso.
Comunicação Inter-processos
1. Bind → Associa o socket ao endereço local, isso seria o bind em si, é usado para que o
cliente possa se conectar no servidor usando o endereço local. É utilizado no Server
side. É usada tanto em UDP quanto em TCP.
Connect → É a primitiva que conecta a um endereço remoto(servidor), logo, é utilizado
pelo Client. É usada somente em TCP, UDP simplWRRWesmente envia por sendto.
2.
a. At-most-once(no máximo uma vez)
b. At-least-once(pelo menos uma vez)
c. Exactly-once(somente uma vez)
3. O RMI Registry é um serviço de nomeação, o rmiserver usa o rmiregistry para fazer
um bind de um objeto remoto em java com os nomes, para que o cliente possa
tratar diretamente pelo nome registrado no rmiregistry e executar os métodos destes
objetos.
RMI cria um proxy remoto para este objeto e envia para os clientes, este objeto de
proxy, contém a referência para um objeto.
CAIU NA PROVA 2017/1 (com outros valores)
4. i) Cada requisição do cliente: 4ms + 1ms (send) + 0,5ms (marshalling) +
4ms(transmissão do request) + 1ms (receive) + 0,5ms (unmarshalling) = 11ms
Cada resposta do servidor: 12ms (processar) + 1ms(receive) + 0,5 (unmarshalling) +
4ms (transmissão da resposta) + 1ms (send) + 0,5ms (marshalling) = 19ms
Como são duas requisições, 2 * 11 + 2 * 19 = 60
ii) marshall + send + transmissão + unmarshall + servidor + marshall + transmissão + receive +
unmarshall + cliente = 24ms, 2*24 = 48
Se considerar a fluxo da seguinte forma:
cliente marsh send ----- trans ----- r eceive unmarsh servidor marsh send ---- t rans ---- receive unmarsh
i) soma cada valor individual * numero de requisições
ii) (soma a parte azul * requisições) + soma parte rosa apenas uma vez*
* uma pq ta tudo concorrente no cliente
Provas anteriores
Prova 2016 (folder P1/2016)
Questão 1: Qual é a saída do programa abaixo, impressa na “Linha C” e na “Linha D”?
Linha C: PARENT: value = 20 (value = 17+3 -> valor obtido pela execução da thread)
Linha D: CHILD: value = 3
(compilei e testei)
Pthread_create, recebe 4 parâmetros, sendo o 3 e o 4 uma função de inicio e seus
parâmetros respectivamente.
Questão 2: Considere a notação co-oc para especificação de programas concorrentes, e a
primitiva <await(B) S;>, onde B é uma expressão booleana e S é uma sequência de 0 ou mais
comandos. Dado o conjunto de comandos abaixo:
C1: x = x - y²
C2: y = y + x
Para cada um dos casos abaixo, assuma x = 3 e y =2 inicialmente. Quais são os valores finais
para x e y?
i. C1;C2;
Único valor possível: x = -1 e y = 1, pois não há concorrência.
ii. co <C1;> // <C2;> oc
Duas sequências possíveis de execução:
C1C2: x = -1 e y = 1
C2C1: x = -22 e y = 5
iii. co <await(y >= x) C1;> // <C2;> oc
Lado esquerdo tranca pois y = 2 < x = 3. Logo, C2 executa antes.
C2 -> y = 5, x = 3. -> y > x! C1 desbloqueia.
C1 -> x = -22.
Valores finais: x = -22, y = 5.
Questão 3: Compare os mecanismos de comunicação Pipes Unix, Sockets UNIX e Sun RPC.
Compare as características e funcionalidades apresentadas por cada um deles. Em quais
situações cada um dos mecanismos é apropriado?
Sockets : É
local ou remoto, permite comunicação bidirecional, tem suporte a diferentes tipos
de protocolos, flexibilidade (TCP/UDP)
Pipes: F
luxo de dados unidirecional, operar processos relacionados, apenas comunicação local
Sun RPC: É implementação de alto nível, semântica at-least-once, binding local, apropriado para
chamada de procedimento remoto.
Questão 4: Qual a finalidade das variáveis tipo lock(mutex), semáforos e monitores? Porque
existem esses diferentes mecanismos? O que difere um do outro?
Diferenças e Conceito
a. Mutex
i. Mutex deixam somente uma thread por vez entrar na seção crítica e
somente essa thread pode liberar o mutex.
No semáforo, pode ser sinalizado de qualquer outra thread ou processo a
liberação. Por esse motivo semáforos são mais adequados para
problemas de sincronização como produtor-consumidor.
O mesmo mutex pode ser compartilhado entre vários processos,
consequentemente várias threads entre esses processos.
b. Semáforos
i. O semáforo faz o mesmo com o mutex com a diferença de que podem
entrar X processos dentro dessa seção crítica.
Assim como mutex, podem ser utilizados por vários processo e threads,
lembrando que os semáforos podem liberar ou alocar recursos de
qualquer outra thread/processo.
c. Monitores
i. Monitores, assim como mutex só deixam uma thread/processo executar
a seção crítica, são feitos para multi-thread dentro de um único processo.
CAIU NA PROVA 2017/1 (com outros valores)
Questão 5: Uma variável s, do tipo semáforo, é inicializada em 2. Em seguida, onze operações
P(s) e sete operações V(s) são realizadas por processos distintos. Ao final, qual é a quantidade
de processos que estão esperando neste semáforo?
Semáforo iniciado em 2;
Cada operação P tira 1;
Cada Operação V soma 1;
Ao executar 11x a operação P, temos 2 -11 = -9.
Ao executar em 7x a operação V, temos -9 + 7 = -2.
Logo temos 2 processos esperando o semáforo.
CAIU NA PROVA 2017/1
Questão 6: Com relação a comunicação inter-processos por troca de mensagens, analise as
afirmativas abaixo:
i) Comunicação síncrona acontece somente quando ambas as primitivas send e receive
tem semânticas bloqueantes.
ii) Sockets fornece um modelo de comunicação com nomeação direta.
iii) Recebimento bloqueante implica que o processo que faz o receive irá bloquear até
que a mensagem seja transferida do buffer para o processo, ou retornará NULL caso não haja
mensagens no buffer.
a) Apenas I
b) Apenas I e II
c) Apenas I e III
d) Apenas II e III
e) I, II e III
CAIU NA PROVA 2017/1
Questão 7: A
ssinale a alternativa INCORRETA:
a) Semáforos podem ser usados para sincronização de condição, exclusão mútua e
alocação de recursos.
b) Uma aplicação contém uma condição de corrida somente quando o sistema
operacional que executa esta aplicação tiver mais de um processador.
c) Um semáforo binário é um tipo especial de semáforo usado para implementar exclusão
mútua. Para este fim, ele é inicializado em 1 e só pode assumir valores 0 e 1.
d) Um Monitor é uma construção que oferece duas facilidades: acesso em exclusão mútua
para dados compartilhados e sincronização de condição entre processos através da
primitiva wait e signal.
e) Sincronização de condição permite garantir que processos executarão suas ações em
uma determinada ordem, independentemente do escalonamento.
CAIU NA PROVA 2017/1 (IGUAL)
Questão 8: Assuma um processo cliente que faz chamadas remotas de procedimento(RPC) em
um servidor que está em uma máquina remota. O cliente leva 6 ms para computar os
argumentos que serão enviados para cada requisição, e o servidor leva 12 ms para processar
cada requisição. O tempo de processamento do sistema operacional para executar cada send()
ou receive() é 0,5 ms, e o tempo para transmissão para rede de cada mensagem de requisição
ou resposta é 3 ms. A execução dos procedimentos marshalling ou unmarshalling leva 1,5 ms
por mensagem.
Suponha que tanto o processo cliente quanto o processo servidor estejam executando
em uma máquina com um único processador, e que o tempo necessário para trocas de
contexto(context switch) possa ser ignorado. Calcule o tempo levado pelo cliente para gerar e
receber resultado de duas requisições:
(i) Se o cliente for implementado com uma única thread.
(ii) Se o cliente tiver duas threads que possam fazer requisições concorrentemente.
(i) Resposta:
Cliente trabalhando(envio):
Trabalho da requisição do cliente + marshalling + send() + transmissão
6 + 1,5 + 3 + 0,5 = 11
Servidor trabalhando(recebimento e envio):
receive() + unmarshalling + trabalho na requisição recebida do cliente + marshalling + send() +
transmissão
0,5 + 1,5 + 12 + 1,5 + 0,5 + 3 = 19
Cliente trabalhando(recebimento):
receive() + unmarshalling
0,5 + 1,5 = 2
2 + 11 + 19 = 32ms x 2 = 64ms
(ii) Resposta:
Cliente trabalhando(envio total do cliente):
Trabalho da requisição pelo cliente + marshalling + transmissão + send()
6 + 1,5 + 3 + 0,5 = 11
Servidor trabalhando:
receive() + unmarshalling + trabalho da primeira requisição pelo servidor + marshalling + send()
0,5 + 1,5 + 12 + 1,5 + 0,5 = 16
receive() + unmarshalling + trabalho da segunda requisição pelo servidor + marshalling + send()
+ transmissão
0,5 + 1,5 + 12 + 1,5 + 0,5 + 3 = 19
Cliente trabalhando(aqui só contamos o último recebimento pois o primeiro enquanto o
servidor trabalhava foi feito):
receive() + unmarshalling
0,5 + 1,5 = 2
2 + 16 + 19 + 11 = 48ms
Questão 9: I mplemente usando pseudo-linguagem, um monitor que emule a funcionalidade de
um semáforo. O monitor deve obrigatoriamente implementar os procedimentos SemaphoreP()
e SemaphoreV(). Assuma existência de um tipo de dado COND, usado para declarar variável de
condição.
(tem nos slides de monitor isso)
monitor Semaphore {
int s = 1; # s >= 0
cond pos; # signaled when s > 0
procedure Psem() {
while (s == 0)
wait(pos);
s = s – 1;
}
procedure Vsem() {
s = s + 1;
signal(pos);
}
}
Prova 1 - 2014
CAIU NA PROVA 2017/1
Questão 1: C onsiderando a implementação de monitores, explique as diferenças entre as
estratégias de sinalização “signal-and-continue”(SC) e “signal-and-wait”(SW). Em particular,
explique o que acontece com o processo sinalizador e com o processo sinalizado em cada uma
das estratégias.
1) Dentre as duas estratégias de sinalização, existe uma diferença básica em relação ao
processo sinalizador e sinalizado:
a) Em SC -> Não-preemptiva -> O processo sinalizador continua sua execução e o sinalizado
passa para a fila do monitor. Estratégia predominante em Java, ambientes Unix e pthreads.
b) Em SW -> Preemptiva -> O processo sinalizador vai para a fila da entrada do monitor e o
processo sinalizado inicia sua execução.
c) Ainda existe SU (Signal and Urgent Wait) no qual o processo sinalizador vai para a frente da
fila de entrada do monitor e o sinalizado inicia sua execução.
Questão 2: R
epetida de 2016(3)
CAIU NA PROVA 2017/1
Questão 3: S
ervidores podem ser construídos de forma a limitar o número de conexões
abertas. Por exemplo, um servidor pode desejar ter no máximo N conexões sockets abertas em
um dado momento. Assim que N conexões forem estabelecidas, o servidor não irá aceitar
qualquer nova conexão até que uma conexão existente seja liberada. Explique como semáforos
podem ser usados pelo servidor para limitar o número de conexões concorrentes.
Com um semáforo S inicializado em 100. Realiza uma operação P(S) cada vez que uma
conexão for aberta e uma operação V(S) toda vez que uma conexão for fechada.
CAIU NA PROVA 2017/1 (igual)
Questão 4: Em sistema leitores-escritores com preferência para leitores, uma operação de
leitura consome 3 unidades de tempo e uma operação de escrita consome 5 unidades de
tempo. No instante ti -1 não há nenhum processo leitor, nem escritor. Um leitor chega no tempo
ti, e cinco leitores e um escritor chegam no tempo ti+1. Se não chegar mais nenhum processo,
qual instante de tempo o escritor terminará de escrever?
a) ti+8
b) ti+9
c) ti+18
d) ti+19
e) ti+20
Os leitores têm preferência e operações de escrita não podem ser feitas ao mesmo
tempo em que alguma outra operação estiver sendo feita.
Em ti, chega o primeiro leitor, que ficará lendo até t i+3. No instante seguinte, t+1, cinco
leitores e um escritor chegam. Como operações de leitura podem ser feitas simultaneamente
e os leitores têm preferência, eles já iniciam a leitura, e a terminam em t +4. O escritor fica
aguardando até que não haja algum leitor ou outro escritor executando. Portanto, em t +4 o
escritor passa a executar, e termina de escrever em t+9.
CAIU NA PROVA 2017/1 (igual)
Questão 5: U
ma variável s, do tipo semáforo, é inicializada em 3. Doze operações P(s) e sete
operações V(s) são realizadas por processos distintos. Qual é a quantidade de processos que
estão esperando neste semáforo? (Conferida na prova)
a) 5
b) 4
c) 3
d) 2
e) 1
S = 3.
Como P = tirar 1;
E V = colocar 1;
12x P = -12
7x V = 7
3 - 12 + 7 = -2, logo 2 processos estão aguardando.
Questão 6: R epetida da prova de 2016(7)
CAIU NA PROVA 2017/1
Questão 7: Nesta questão, assuma um modelo de falhas que considere APENAS perdas
ocasionais de mensagens, duplicações de mensagens, e mensagens entregues fora de ordem.
Assinale a alternativa CORRETA:(Conferida na prova)
a) Nos modelos Sun RPC e Java RMI, o middleware/runtime implementa um protocolo da
família request-reply com semântica at-least-once, garantindo assim que o
procedimento ou método remoto será executado pelo menos uma vez (mas poderá ser
executado mais vezes).
b) Em RPC, parâmetros de entrada definidos na IDL podem ser passados por valor ou por
referência, mas parâmetros de saída somente podem ser passados por valor.
c) No modelo RMI, o componente dispatcher faz o marshalling dos argumentos de uma
chamada no lado do cliente e despacha a chamada para o servidor remoto.
d) A implementação do Sun RPC adota uma semântica at-least-once, e assume que as
operações implementadas pelo servidor são idempotentes.
e) No modelo RMI, o módulo de referência remota é responsável por traduzir referências
locais para referências remotas, e por implementar um protocolo da família
request-reply com uma determinada semântica.
Questão 8: R
epetida Prova de 2016(6)
CAIU NA PROVA 2017/1
Questão 9: Qual é a saída do programa abaixo, impresso na “Linha A”?(Conferida na prova)
#includes…
Logo o value ta sendo acrescido no processo filho e no else, o processo pai é impresso,
mas como tem a cópia de variáveis, não tem relação os 2 values, é impresso então o
valor 5, que é o valor inicial da variável value que não foi alterada no processo pai.
Questão 10: Assuma um processo cliente que faz chamadas remotas de procedimento(RPC)
em um servidor que está em uma máquina remota. O cliente leva 5ms para computar os
argumentos para cada requisição, e o servidor leva 10ms para processar cada requisição. O
tempo de processamento do sistema operacional para executar cada send() ou receive() é
0,5ms, e o tempo para transmissão na rede de cada mensagem de requisição ou resposta é
3ms. A execução dos procedimentos de marshalling ou unmarshalling leva 0,5ms por
mensagem.
Suponha que o tempo necessário para trocas de contexto(context-switch) possa ser
ignorado. Calcule o tempo levado pelo cliente para gerar e receber o resultado de duas
requisições.
(i) se o cliente for implementado com uma única thread.
(ii) se o cliente tiver duas threads que possam fazer requisições concorrentemente em um
único processador.
CAIU NA PROVA 2017/1 (igual)
Questão 11: Considere o programa abaixo, escrito em pseudo-linguagem. O programa deve
implementar corretamente o acesso a um buffer limitado de 10 posições, utilizando monitores
e variáveis de condição(cheio e vazio). Complete as lacunas para garantir o acesso
sincronizado de produtores/consumidores ao buffer compartilhado. Importante considere que
o monitor implementa a semântica “signal-and-continue”(SC).
monitor Buffer{
typeT buf[n];
int inicio = 0, fim = 0, cont = 0, n = 10;
cond cheio,
vazio;
procedure coloca(typeT dado) {
ESPAÇO A
buf[fim] = dado; fim = (fim+1) % n; cont++;
ESPAÇO B
}
procedure retira(typeT &resultado) {
ESPAÇO C
resultado = buf[inicio]; inicio = (inicio+1) % n; cont--;
ESPAÇO D
}
}
ESPAÇO A = while(cont == n) wait(cheio);
ESPAÇO B = signal (vazio);
ESPAÇO C = while (cont == 0) wait (vazio);
ESPAÇO D = signal (cheio);
Prova 1 - 2013
Questão 1: Dentre as afirmações abaixo, assinale quais são verdadeiras (V) e quais são falsas
(F).
( F ) Toda solução para exclusão mútua necessita de operações Test And Set implementadas
pelo hardware (processador)
( V ) Um grafo de fluxo de processos que não é propriamente aninhado pode ser implementado
em C sobre um sistema operacional UNIX utilizando as chamadas fork, quit e join
( F ) Programação concorrente somente confere maior velocidade ao programa quando se
utilizam máquinas com múltiplos processadores, ou múltiplos cores
( F ) Um trecho de pseudo-código utilizando semáforos que faz: “while (condição) P();” é um
exemplo típico de busy waiting, o que é fácil perceber pela construção “while”, que permanece
continuamente testando a condição
( F ) A vantagem de usar threads é que não é necessário empregar mecanismos de
sincronização de controle e de acesso a dados, já que elas executam dentro de um processo.
Como um processo só pode ser escalonado em um único processador (ou core), se elimina a
concorrência.
( F ) A inversão de prioridade é caracterizada por uma thread de menor prioridade ser
escalonada antes de uma thread de maior prioridade quando as duas se encontram no estado
apto (ready)
( V ) A inversão de prioridade é caracterizada por uma thread de menor prioridade deter um
recurso (lock de uma seção crítica) e assim impedir que uma thread de maior prioridade saia do
estado bloqueado
( V ) Espera ativa (busy waiting) é uma técnica em que um processo (ou thread) verifica
continuamente uma condição até que ela seja verdadeira.
( F ) Com relação a sockets, um programa UDP emprega a primitiva accept, enquanto um
programa TCP emprega a primitiva connect
( F ) Em monitores, a estratégia de sinalização signal-and-continue implica que o processo
sinalizado irá continuar sua execução no monitor a partir daquele momento, enquanto que o
processo sinalizador irá para a fila de entrada.
Questão 2: Repetida questão 4 da lista
CAIU NA PROVA 2017/1
Questão 3: C
om relação a mecanismos de comunicação entre processos, explique as
diferenças entre os modelos de comunicação com memória compartilhada (shared-memory) e
troca de mensagens (message passing). Quais são as vantagens e desvantagens de cada um?
Troca de mensagens:
Utilizada para pequenas quantidades de dados;
Utiliza várias vezes chamadas do Kernel;
Programação simples;
Pode ser utilizada entre processos não-relacionados;
Utilizada em programação distribuída
Memória Compartilhada:
Utilizada para grandes quantidades de dados;
Chamadas do Kernel apenas para estabelecer a região da memória;
Comunicação mais rápida e eficiente;
Utilizada apenas entre processos relacionados;
(Programação mais complexa? Tá meio riscado na prova.. Melhor confirmar)
Questão 4: Repetida Prova 2014(4)
Questão 5: Utilizando um modelo de falhas que considere perdas ocasionais de mensagens,
duplicações de mensagens e mensagens entregues fora de ordem, uma semântica no máximo
uma vez (at-most-once) é caracterizada por:
a) Garantir que uma tarefa remota foi executada uma única vez retornando um resultado
válido ou, em caso contrário, retornando um erro.
b) Garantir que uma tarefa remota foi executada pelo menos uma vez, mas, eventualmente,
ela pode ter sido realizada várias vezes antes de retornar um resultado válido.
c) Executar a tarefa remota exatamente uma vez, mesmo na presença de falhas.
d) Talvez ter sido executada uma vez.
e) Executar a tarefa remota várias vezes, mas mantendo sempre o mesmo resultado final.
Questão 6: A
ssinale a alternativa INCORRETA:
a) Semáforos podem ser usados para sincronização de controle, exclusão mútua e
alocação de recursos
b) Uma aplicação contém uma condição de corrida do tipo data race somente quando o
sistema computacional que executa esta aplicação tiver mais de um processador (ou
core).
c) Um semáforo binário é um tipo especial de semáforo usado para implementar exclusão
mútua. Para esse fim, ele é inicializado em 1 e só pode assumir um de dois valores, zero
ou um.
d) Um monitor é uma construção que oferece duas facilidades: acesso em exclusão mútua
para dados compartilhados e sincronização de controle entre processos através da
primitivas wait e signal.
e) Sincronização de controle é a garantia de que processos executarão suas ações em
uma determinada ordem, independentemente do escalonamento.
Questão 7: Repetida da prova de 2014(7)
Questão 8: Repetida da prova de 2016(6)
Questão 9: I gual a questão 2 da parte de primitivas de sincronização da Lista, apenas pede para
preencher outra parte do código.
Questão 10: Considere o pseudo-código abaixo, que consiste em uma tentativa de resolver o
problema do jantar dos filósofos. Qual é o problema dessa solução? Apresente duas (2) formas
de resolver o problema: explique o que deve ser feito e mostre as soluções em pseudo-código.
N = 5
Var semaphore forks[N] = {1,1,1,1,1}
Process Philosopher [int i=0 to N-1] {
int left = i;
right = (i+1) % N;
while (true) {
Think;
P(forks[left]);
P(forks[right]);
Eat;
V(forks[left]);
V(forks[right]);
}
}
O problema é que todos os filósofos podem pegar o garfo à esquerda, e ficar esperando o garfo
da direita, que nesse caso nunca será liberado. (DEADLOCK)
Solução 1:
Um filósofo pega o garfo da direita e depois o da esquerda, e os demais pegam primeiro da
esquerda e depois o da direita
…
while (true) {
Think;
if (i == 0){
P(forks[right]);
P(forks[left]);
} else {
P(forks[left]);
P(forks[right]);
}
Eat;
V(forks[left]);
V(forks[right]);
}
...
Solução 2:
Se no máximo N-1 filósofos tentarem comer, haverá sempre um que terá a chance de pegar
dois garfos.
Deve ser feito utilizando um semáforo adicional para representar o número máximo de
filósofos que terá a chance de pegar dois garfos.