Você está na página 1de 11

Ministério da Ciência, Tecnologia e Ensino Superior

Curso: ................................................................................................................................................

Prova de Sistemas Operativos (21111) Data: 14 de Julho de 2009

Nome: .................................................................................................................................................
Nº de Estudante: ........................................ B. I. nº ..............................................
Turma: ................... Assinatura do Vigilante: .............................................

RESERVADO PARA A Universidade Aberta

Classificação: ( ) ..................................................................................................................

Prof. que classificou a prova: ......................................................................................................

Para a resolução do teste, leia as seguintes informações e


instruções, antes de responder

- O enunciado do teste tem 11 páginas, sendo constituído por duas partes, I e II, com a
cotação total de 20 valores.
- Nas respostas, tenha a preocupação de utilizar uma letra legível por outra pessoa.
- A parte I é constituída por questões do tipo resposta aberta, com a cotação total de
12 valores.
- A parte II é constituída por questões de escrita de Software, com a cotação total de 8
valores.
- As cotações são indicadas nas próprias questões/alíneas.
- As respostas às questões devem ser dadas no próprio enunciado, limitadas ao espaço
em branco a seguir a cada questão. Antes de escrever, planeie a sua resposta de
acordo com o espaço disponível.
- Todas as respostas devem ser escritas unicamente com caneta azul ou preta.
- É permitido utilizar máquina de calcular.
- O não cumprimento das instruções implica a anulação das respectivas questões ou
do teste.
- O tempo de realização do teste é de 150 minutos.
- Verifique se o teste está completo e termina na palavra FIM.

1
Grupo I

1.1. [1] Uma das principais funções de um SO é a gestão de recursos de um sistema


complexo constituído por muitas partes. Explique porquê. Dê exemplos de gestão
espacial e de gestão temporal.

1.2. [1] Indique e explique qual foi a razão inicial que levou ao conceito de
multiprogramação.

2
1.3. [1] Em que consiste uma função de sistema ? Explique sucintamente como é
implementada a chamada a uma função de sistema.

1.4. [1] Justifique porque não se deve programar com suposições baseadas no tempo
de execução do código.

3
1.5. [1] Comente possíveis razões para existirem tarefas.

1.6. [1] Justifique por que razão não existe protecção de memória entre tarefas.

4
1.7. [1] Explique em que consiste o problema da inversão de prioridade.

1.8. [1] Escreva um pequeno programa em pseudo linguagem C com 2 processos que
conduza a uma situação de interblocagem (deadlock).

5
1.9. Considere um sistema com memória virtual e paginação. O espaço de
endereçamento virtual é de 12 bits (4KB) e em determinado momento a tabela de
páginas (mononível) tem o seguinte conteúdo,

nº entrada conteúdo bit presente/ausente


(decimal) (binário) (1/0)
7 00 0
6 00 1
5 10 1
4 01 1
3 00 0
2 00 0
1 11 1
0 00 0

1.9.1. [0,75] Considere as dimensões da página virtual e da moldura de página (page


frame) iguais. Indique justificando a dimensão da página utilizada.

1.9.2. [0,75] Considere o endereço virtual 1000 0111 1101. Indique justificando o
endereço físico correspondente.

1.9.3. [0,5] Considere o endereço virtual 0010 0100 1001. Explique sucintamente o
que acontece quando o programa efectua uma referência a este endereço.

6
1.10. [1] Descreva resumidamente o método de implementação de ficheiros por i-
nodes.

1.11. [1] O que é e que funções desempenha o Master Boot Record (MBR) ?

7
Grupo II

Nas questões que se seguem, além de apresentar o código, deverá também


comentar/explicar a sua estrutura e funcionamento, factor igualmente importante para
a classificação das respostas.

2.1.1. [3] Escreva um programa em linguagem C que crie um sub-processo e que


com recurso à função execv() execute o comando “ls –l /home >
aaa”. O comando ls encontra-se na directoria /bin. O processo pai deve
esperar que o processo filho termine.

8
2.1.2. [1] Após a execução do programa anterior, é criado o ficheiro aaa. Indique
qualitativamente qual é o seu conteúdo e qual o mecanismo que levou à sua
criação.

2.2. [4] Escreva um programa multitarefa em linguagem C segundo a norma POSIX


que determine o valor máximo dos elementos de um vector int x[] de
dimensão int nx. O vector e a sua dimensão constituem variáveis globais ao
programa e admite-se que foram devidamente inicializados.

A tarefa principal deve criar duas sub-tarefas em que cada uma em paralelo (ou
em pseudo-paralelismo) analiza metade do vector x[]. A tarefa principal deve
esperar que ambas as tarefas terminem e depois deve imprimir o resultado final e
terminar.

Nota: planeie cuidadosamente como é dividido o trabalho entre as sub-tarefas e


como é efectuada a sincronização e a comunicação da informação necessária à
resolução do problema entre as três tarefas.

9
(espaço de resposta à questão 2.2.)

10
Formulário

#include <stdlib.h>
int system(char *string);

#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
pid_t getpid(void);
pid_t getppid(void);

#include <unistd.h>
unsigned int sleep(unsigned int seconds);
extern char **environ;
int execl(char *path, char *arg, ...);
int execlp(char *file, char *arg, ...);
int execle(char *path, char *arg , ..., char *envp[]);
int execv(char *path, char *argv[]);
int execvp(char *file, char *argv[]);
int execve(char *path, char *argv [], char *envp[]);

#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);

#include <pthread.h>
int pthread_create(pthread_t *thread, pthread_attr_t *attr,
void *(*start_routine)(void*), void *arg);
int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_setdetachstate(pthread_attr_t *attr, int
detachstate);
#define PTHREAD_CREATE_DETACHED
#define PTHREAD_CREATE_JOINABLE
int pthread_join(pthread_t thread, void **value_ptr);
int pthread_mutex_init(pthread_mutex_t *mutex,
pthread_mutexattr_t * attr);
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destroy(pthread_mutex_t *mutex);

FIM

11

Você também pode gostar