Escolar Documentos
Profissional Documentos
Cultura Documentos
Atividade 2 - 22/01/20
Samuel de Castro Ribeiro 0032743
1.2) ATIVIDADE: Faça os exercícios nº 20, 22, 23, 26, 28, 31 do livro-texto do autor
TANENBAUM (4ª ed., pág. 57-58 do cap. 1).
20. Para cada uma das chamadas de sistema a seguir, dê uma condição que a faça
falhar: fork, exec e unlink.
A chamada de sistema “fork” falhará caso não exista espaços livres na tabela de
processos. O “exec” falhará caso não exista o nome do arquivo passado como parâmetro.
Já o “unlink” falhará caso o arquivo a ser desvinculado passado como parâmetro não
exista.
22. A chamada count = write(fd, buffer, nbytes); pode retornar qualquer valor
em count fora nbytes? Se a resposta for sim, por quê?
Sim, pode haver retorno de valor diferente de nbytes. Isso se justifica pelo fato de que a
chamada pode falhar caso o arquivo seja inválido ou não possa ser lido, retornando o
valor -1. Outra forma para que o nbytes não seja retornado, se deve ao fato de que caso o
disco esteja cheio, não será possível escrever o número de bytes que foram solicitados,
ou seja, o final do arquivo pode ter sido encontrado antes.
Como a chamada lseek posiciona o arquivo no byte 3 (que no caso é representado pelo
número 4) e a chamada read tem como segundo parâmetro o endereço do buffer do
arquivo fd e terceiro parâmetro o nbytes a serem lidos, que no caso são 4, portanto o
buffer contém os bytes: 1, 5, 9, 2.
26. No exemplo dado na Figura 1.17, a rotina de biblioteca é chamada read e a
chamada de sistema em si é chamada read. É fundamental que ambas tenham o
mesmo nome? Se não, qual é a mais importante?
28. Para um programador, uma chamada de sistema parece com qualquer outra
chamada para uma rotina de biblioteca. É importante que um programador saiba
quais rotinas de biblioteca resultam em chamadas de sistema? Em quais
circunstâncias e por quê?
Com base no sistema UNIX, o interpretador de comandos deve executar uma chamada
de sistema fork() que cria o processo filho idêntico ao pai 9exceto por alguns atributos e
recursos), onde em seguida o programa selecionado é carregado na memória e executado
através da chamada de sistema exec().
Com base no Windows, o shell deve executar a chamada de sistemas CreateProcess().
Os módulos de kernel carregáveis tem como característica de projeto que o kernel forneça
serviços nucleares enquanto outros serviços são implementados dinamicamente quando o
kernel estiver em execução.
Eles têm como vantagem serem mais flexíveis em comparação a um sistema em camadas
já que um módulo pode chamar qualquer outro módulo, sem a necessidade de chamar
diretamente um módulo seguinte.
Outra vantagem seria sua semelhança com a abordagem microkernel, já que o módulo
principal tem apenas funções nucleares e o conhecimento de como carregar e se
comunicar com outros módulos, porém ele é mais eficiente já que os módulos não
precisam invocar a transmissão de mensagens para se comunicar.