Examen de Sistemas Operativos
Examen de Sistemas Operativos
Examen de Sistemas Operativos
Indique su nombre completo y número de cédula en cada hoja (no se corregirán las hojas sin nombre). Numere
todas las hojas e indique la cantidad total de hojas en la primera.
Escriba las hojas de un solo lado y empiece cada problema en una hoja nueva.
Si se entregan varias versiones de un problema, solo se corregirá la primera versión.
Sólo se contestarán dudas de letra y no se aceptarán dudas en los últimos 30 minutos del examen.
El examen es SIN material. En su banco solo puede tener las hojas del examen, lápiz, goma y lapicera. Todas sus
demás pertenencias debe colocarlas en el piso debajo de su asiento.
Para aprobar el examen es necesario un mínimo de 60 puntos.
El examen dura 3 horas. Al momento de finalizar el examen no se podrá escribir absolutamente nada en las
hojas, el estudiante debe dirigirse a la fila de entrega. Identificar cada una de las hojas con nombre, cédula y
numeración debe realizarse dentro de la duración del examen.
A través de los registros: Se utilizan un conjunto de registros para pasar los parámetros.
Tiene el problema de la cantidad de parámetros es fija y que restringe el tamaño del
valor. En Intel se utilizan 5 registros: ebx, ecx, edx, esi, y edi.
1 de 8
Departamento de Arquitectura Examen Sistemas Operativos
Solución: Un directorio es un archivo cuyo contenido es una tabla. Cada entrada de esa tabla
(las entradas de directorios) relaciona un nombre de archivo con un número de inodo. Al
querer abrir un archivo (digamos, miarchivo.txt), el FS busca en esa tabla la entrada con ese
nombre, y mira cuál es el número de inodo que le corresponde (Ej: 721). Luego realiza las
operaciones con el número de inodo.
Un hardlink es una entrada de directorio (hl_miarchivo.txt) que apunta a un inodo asociado
con un archivo ya existente (721). Las dos entradas de directorio referencian al mismo archivo.
Es importante tener siempre presente que, a partir de que se crea el hard link (es decir, que se
crea la segunda entrada apuntando al mismo inodo), ya no hay diferencia entre la referencia
original y la nueva. Por este motivo el SO utiliza un conteo de referencias para saber cuántas
referencias hay a un cierto inodo. Esta herramienta es muy útil pero es válida solamente en
un mismo Filesystem.
Un softlink es un archivo nuevo que referencia una ruta. Este archivo tinene su propio inodo.
En el bloque de datos se guarda la ruta del archivo al cual referencia. En el inodo del archivo
apuntado el conteo de referencia no aumenta al utilizar esta técnica. Esta herramienta se
puede utilizar para referenciar archivos o directorios entre varios Filesystems
Al crear hardlink.file el conteo de referncias en el inodo asociado a source.file aumenta en 1.
Al eliminar el archivo source.file el conteo de refrencias en el inodo asociado disminuye en 1.
Como todavía existe la referencia al inodo con nombre hardlink.file, se accede al archivo sin
problemas.
(c) En un momento se debe quitar la CPU al proceso P1 y asignarla al proceso P2 (context switch).
I. (2 pts) ¿Cuál es el nombre del componente del sistema operativo que realiza dicha tarea?
II. (3 pts) Enumere las tareas que debe realizar dicho componente.
Cambio de contexto: Salvar registros del procesador en PCB del proceso saliente. Cargar
los registros con los datos del PCB del proceso entrante.
Cambiar el bit de modo a usuario.
Saltar a la instrucción adecuada que había quedado el proceso que se asignó a la CPU
(registro program counter).
1. Como los recursos requeridos por P0 pueden satisfacerse con los recursos disponibles,
se puede ejecutar P0 y luego de que finalice disponer de los recursos liberados (dispo-
nibles para a ser [1,0,1,1,0] + [2,1,1,2,1] = [3,1,2,3,1]
2. A continuación, los recursos requeridos por P1 pueden satisfacerse con los recursos dis-
ponibles, se puede ejecutar P1 y luego de que finalice disponer de los recursos liberados
(disponibles para a ser [3,1,2,3,1]+ [1,1,0,0,0] = [4,2,2,3,1].
3. Luego se ejecuta P2 y disponibles pasa a ser [0,0,0,0,1] + [4,2,2,3,1]. = [4,2,2,4,1].
4. Por último, se ejecuta P3, sin generarse un deadlock
Solución:
La MMU es configurable y puede trabajar con tablas de páginas con estructura jerárquica de dos
o cuatro niveles.
En cada configuración, todos lo niveles indexan la misma cantidad de entradas por tabla.
Cada entrada de la tabla de páginas ocupa 24 bits.
(a) (3 pts) Describa qué es la MMU y para qué se utiliza.
(b) (3 pts) Determine cómo se distribuyen los bits de la dirección virtual cuando se utiliza una estruc-
tura jerárquica de dos y de cuatro niveles. Indique para qué se utiliza cada parte de la dirección
virtual en cada caso.
Solución: Por letra, las direcciones virtuales son de 24 bits. Para el offset se precisan 8 bits ya
que cada página contiene 256 bytes.
Dos niveles: | 8 bits 1er nivel | 8 bits 2do nivel | 8 bits offset |
Cuatro niveles: | 4 bits 1er nivel | 4 bits 2do nivel | 4 bits 3er nivel | 4 bits 4to nivel | 8 bits
offset |
(c) (3 pts) ¿Cuál es la cantidad máxima de memoria virtual que puede ser asignada a un proceso en
cada uno de los niveles jerárquicos soportados?
(d) (6 pts) Suponga un proceso con la máxima cantidad de memoria virtual asignada y otro con tan
solo una página asignada. Indique cuántos bytes de memoria utilizaría el sistema operativo para
sus tablas de páginas dependiendo de la cantidad de niveles jerárquicos utilizados.
(e) (3 pts) Suponga que la TLB se encuentra vacía, ¿cuántos accesos a memoria principal requiere un
proceso para leer un byte de memoria principal a partir de una dirección virtual en cada uno de
los niveles jerárquicos soportados?
Solución: Dos niveles: 1 acceso para la tabla de 1er nivel, 1 acceso para la tabla de 2do nivel
y 1 acceso para acceder al offset dentro de la página buscada = total 3 accesos.
Cuatro niveles: 1 acceso para la tabla de 1er nivel, 1 acceso para la tabla de 2do nivel, 1 acceso
para la tabla de 3er nivel, 1 acceso para la tabla de 4to nivel y 1 acceso para acceder al offset
dentro de la página buscada = total 5 accesos.
(f) (5 pts) Discuta y justifique en qué casos utilizaría una estructura jerárquica de dos niveles para
los procesos de un sistema, y en qué casos utilizaría una de cuatro niveles.
(g) (3 pts) Muestre un diagrama explicando cómo se realiza la traducción de una dirección de me-
moria virtual a memoria física para alguno de los dos niveles soportados y presente un ejemplo
concreto.
Solución:
(h) (6 pts) Suponga ahora que la MMU brinda un tercer modo de funcionamiento que consiste en una
estructura jerárquica de dos niveles con las mismas características que antes pero con un tamaño
de página de 64 KiB (216 bits). Determine cómo se destribuyen los bits de la dirección virtual en
este caso, y discuta en qué caso sería conveniente utilizar esta estructura en lugar de las dos
anteriores y en qué casos no lo sería.
Solución:
#define ESPERANDO 1
#define ATENDIENDO 2
#define EMERGENCIA 3
Monitor salaDeEspera {
int pacientesEsperandoMedico = 0;
int pacientesEsperandoOftalmologo = 0;
condition medico;
condition enfermero;
condition oftalmologo;
condition esperoMedico;
condiiton esperoOftalmologo;
condition esperoExamenMedico;
condition esperoExamenOfalmologico;
void llegaPaciente() {
if (estadoMedico == ESPERANDO){
medico.signal();
} else if (estadoMedico == EMERGENCIA &&
estadoOftalmologo == ESPERANDO) {
// atendido por oftalmologo
oftalmologoHaceExamenGeneral = true;
oftalmologo.signal();
} else {
pacientesEsperandoMedico++;
esperoMedico.wait();
}
esperoExamenMedico.wait();
if (!oftalmologoHaceExamenGeneral){
if (estadoOftalmologo == ESPERANDO){
oftalmologo.signal();
} else {
pacientesEsperandoOftalmologo++;
esperoOftalmologo.wait();
}
}
esperoExamenOfalmologico.wait();
oftalmologoHaceExamenGeneral = false;
}
void medicoListo() {
if (hayEnfermero){
enfermero.signal();
estadoMedico = EMERGENCIA;
} else if (pacientesEsperandoMedico > 0){
pacientesEsperandoMedico--;
esperaMedico.signal();
} else {
estadoMedico = ESPERANDO;
medico.wait();
if (hayEnfermero){
estadoMedico = EMERGENCIA;
return true;
} else {
estadoMedico = ATENDIENDO;
return false;
}
}
}
void medicoTerminaExamen() {
esperoExamenMedico.signal();
}
void medicoTerminaEmergencia(){
hayEnfermero = false;
}
void oftalmologoListo(){
if (pacientesEsperandoOftalmologo > 0){
pacientesEsperandoOftalmologo--;
esperaOftalmologo.signal();
} else if (estadoMedico == EMERGENCIA &&
pacientesEsperandoMedico > 0) {
pacientesEsperandoMedico--;
esperoMedico.wait();
estadoOftalmologo = ATENDIENDO;
oftalmologoHaceExamenGeneral = true;
return true; //
} else {
estadoOftalmologo = ESPERANDO;
oftalmologo.wait();
estadoOftalmologo = ATENDIENDO;
if (oftalmologoHaceExamenGeneral){
return true;
} else{
return false;
}
}
}
void oftalmologoTermina{
if (oftalmologoHaceExamenGeneral){
oftalmologoHaceExamenGeneral = false;
esperoExamenMedico.signal();
}
esperoExamenOfalmologico.signal();
}
void llegaEnfermero() {
hayEnfermero = true;
if (estadoMedico == ESPERANDO){
medico.signal();
} else {
enfermero.wait();
}
}
void medicoGeneral(){
while (true){
bool esEmergencia = salaDeEspera.medicoListo();
if (esEmergencia){
atenderEmergencia();
salaDeEspera.medicoTerminaEmergencia();
} else {
examenMedicinaGeneral();
salaDeEspera.medicoTerminaExamen();
}
descansar();
}
}
void oftalmologo(){
while (true){
bool tuvoExamenGeneral = salaDeEspera.oftalmologoListo();
if (!tuvoExamenGeneral)
examenMedicinaGeneral();
examenOftalmologico();
salaDeEspera.oftalmologoTermina();
descansar();
}
}
void paciente() {
salaDeEspera.llegaPaciente()
obtenerCertificado();
}
void enfermero(){
while (true){
otrasTareas();
salaDeEspera.llegaEnfermero();
atenderEmergencia();
}
}
cobegin
oftalmologo();
medicoGeneral();
enfermero();
paciente();
paciente();
...
...
paciente();
coend