Sunteți pe pagina 1din 334

1 2 3 test extra NOTA

Fundamentos de los Sistemas Operativos


Convocatoria ordinaria – primera parte
28 de mayo de 2018

Nombre y apellidos DNI/NIE


SOLUCIONES
DURACIÓN: Dispone de 90 minutos para realizar el examen.
Lea las instrucciones para el test en la hoja correspondiente.

1 (1’50 puntos) Responda a estas dos cuestiones, empleando hasta 150 palabras para cada una:
a) ¿Qué es una rutina de servicio de interrupción y qué relación tiene con el sistema operativo?
Tal y como hemos visto en la asignatura, una R.S.I. es una sección de código máquina (rutina) que la
CPU invoca de forma automática cuando recibe una interrupción hardware o software. La relación de
la R.S.I. con el sistema operativo es que, estructuralmente, la R.S.I. habitualmente es parte integrante
del código del S.O.; y funcionalmente, es el mecanismo de activación del sistema operativo (las
interrupciones fuerzan la ejecución de las R.S.I.

b) Normalmente, cuando actualizamos el sistema operativo de un PC o un móvil a una versión


más reciente, no tenemos que actualizar ni reinstalar las aplicaciones que ya tenemos
funcionando en el equipo, a pesar de que esas aplicaciones solo estaban preparadas para
dialogar con la versión anterior del SO. ¿Cómo es esto posible?
Aquí hay que hablar de que el SO establece una interfaz entre él y las aplicaciones, normalmente a
través de un repertorio de llamadas al sistema, formatos estándares de ficheros ejecutables,
dispositivos de arranque, etc. Mientras se mantenga igual toda esa interfaz, el SO puede tener
cambios internos que no afectan a su diálogo con las aplicaciones. Y las aplicaciones tienen
restringida la interacción con el interior del SO: solo pueden dialogar a través de la interfaz. Por su
parte, los fabricantes de SO se preocupan de que la interfaz sea bastante estable, precisamente para
no obligar a los desarrolladores y usuarios a estar haciendo cambios en sus productos e instalaciones.
De hecho, si un SO añade nuevas funcionalidades en su interfaz, suele hacerlo de forma aditiva
(añade servicios nuevos, pero respeta las interfaces antiguas).

2 (1,50 puntos) Queremos gestionar la cola de espera de una impresora que atiende las peticiones de
los trabajadores de una empresa. Hay unas 10 personas que diariamente imprimen unos 200
documentos en conjunto. Cada petición a la impresora consiste en un documento en formato PDF. Se
proponen cuatro posibles algoritmos para la gestión de esta cola: a) un FCFS; b) un Round Robin con
Q=10 segundos; c) un SJF no expulsivo; d) un SJF expulsivo. Para el SJF, se usará el número de páginas
del documento PDF como un estimador del tiempo de la tarea.
Realice una valoración comparativa de la adecuación de estos cuatro algoritmos al problema
planteado, indicando las ventajas e inconvenientes de cada uno.

En la respuesta a esta pregunta hay que resaltar varias características de los algoritmos propuestos.
Primero, que los SJF postergarán a los trabajos con más páginas y no tienen garantizado que se
impriman en un cierto tiempo. Segundo, que los algoritmos expulsivos (Round Robin y SJF expulsivo)
pueden retirar de la impresora a un documento que está a medio imprimir. Esto complica la
localización de los documentos, cuando los usuarios los quieran recoger.

Teniendo en cuenta las anteriores consideraciones, el Round Robin parece generar más
inconvenientes que beneficios, máxime cuando el algoritmo es más complejo que el FCFS (hay que
gestionar un temporizador, hay que guardar y recuperar el estado de la impresión que se deja a
medio…).

· Página 1 de 3
En el enunciado se dice que se imprimen unos 200 documentos al día. Si asumimos una jornada de
12 horas, nos sale en promedio un documento cada 4 minutos, así que no parece que en general haya
que preocuparse mucho por la cola de impresión. Por ello el FCFS puede resultar una solución
adecuada, ya que además es el algoritmo más simple y entendible por los usuarios. Se puede optar
por un SJF si en la empresa se dan con frecuencia conflictos cuando alguien quiere imprimir un
documento pequeño y urgente, pero se encuentra con que la impresora tiene en cola documentos muy
voluminosos.

NOTA: lo importante aquí no es responder exactamente en el sentido que hemos dado en los
anteriores párrafos, sino demostrar que se están aplicando los conocimientos sobre los algoritmos de
planificación a un caso real, usando además el sentido común (imprescindible para cualquier
profesional).

3 (1 punto) Hemos escrito un pequeño programa en C para que se ejecute en un sistema operativo
multihilo que corre sobre un ordenador tipo PC. El programa lanza exactamente DOS hilos. Ambos
hilos ejecutan la función un_hilo() que se muestra en el cuadro inferior. El código utiliza una variable
compartida «dentro», de la forma en la que se muestra en el cuadro. La variable dentro solamente se
manipula en el código que se muestra aquí (no se toca en ningún otro sitio).
// variable global
int dentro = 0;

// Código de un hilo // Programa principal


void un_hilo() { main() {
while (true) { …lanza un hilo que ejecuta un_hilo()
dentro++; …lanza un hilo que ejecuta un_hilo()
puts(“hola”); }
dentro--;
}
}

¿Qué valores diferentes puede adquirir la variable «dentro» a lo largo de la vida del programa?
Justifique con claridad su respuesta.

Los dos hilos ejecutan continuamente las instrucciones de incremento y decremento de la variable
«dentro». Si solamente hubiera un hilo en ejecución, el valor de «dentro» iría fluctuando entre 0 y 1 de
forma alternativa. Al haber dos hilos concurrentes, los incrementos y decrementos se pueden
entrelazar. Es importante observar qué ocurre cuando los dos hilos quieren modificar simultáneamente
la variable «dentro». Caben dos escenarios: a) que las operaciones sean atómicas (un hilo completa
«dentro++» o «dentro--» sin que el otro hilo interfiera); o b) que las operaciones no sean atómicas y
que puedan interferir entre sí.

En el escenario (a), de operaciones atómicas, puede demostrarse que la variable «dentro» solamente
puede adquirir los valores 0, 1 y 2. Dejamos al estudiante la demostración, que puede hacerse
mostrando todas las posibles secuencias de ejecución de las dos instrucciones «dentro++» y «dentro--
» por parte de cada hilo.

En el escenario (b) la cosa es más complicada, porque puede darse el caso que hemos descrito al
inicio del Tema 3, cuando varios procesos modifican simultáneamente una variable compartida. Por
ejemplo, si dentro=0 y los dos hilos quieren incrementarla al mismo tiempo, puede ocurrir lo siguiente:

Hilo 1: R1 ß dentro (R1 valdrá 0)


Hilo 2: R2 ß dentro (R2 valdrá 0)
Hilo 1: R1 ß R1+1 (R1 valdrá 1)
Hilo 2: R2 ß R2+1 (R2 valdrá 1)
Hilo 1: dentro ß R1 (se asigna 1 a dentro)
Hilo 2: dentro ß R2 (se asigna 1 a dentro)

En este caso, la variable «dentro» pasa a valer 1, aunque se han intentado hacer dos incrementos,
que si no se hubieran entrelazado habrían dado el resultado final de 2. Como se «pierde» uno de los
Página 2 de 3
Nombre y apellidos DNI/NIE

incrementos, los dos decrementos posteriores pueden dejar en «dentro» el valor -1. Como este suceso
puede ocurrir repetidas veces, es fácil demostrar que «dentro» puede adquirir cualquier valor negativo.
Análogamente, este mismo escenario puede darse cuando los dos hilos intentan decrementar al
mismo tiempo la variable. De ahí se sigue que, a lo largo del tiempo, la variable «dentro» puede
adquirir cualquier valor entero.

NOTA: en la pregunta NO se pide una «solución» a ningún problema. De hecho, no se expone la


existncia de ningún problema. Las respuestas que describen supuestas soluciones han sido
penalizadas en la calificación, salvo que esa descripción esté apropiadamente ligada a la justificación
pedida en la pregunta.

Página 3 de 3
1 2 3 NOTA
Fundamentos de los Sistemas Operativos
Convocatoria ordinaria – segunda parte
28 de mayo de 2018
Nombre y apellidos DNI/NIE
SOLUCIONES

DURACIÓN: Dispone de 2 horas para realizar el examen.


1 (4 puntos) Una gasolinera dispone de un solo surtidor de gasolina con una capacidad para
almacenar 1000 litros de combustible. A dicha gasolinera pueden acudir vehículos para repostar y
camiones cisterna para llenar el depósito del surtidor. El funcionamiento de la gasolinera y el
comportamiento de los vehículos y camiones cisterna es el siguiente:
• En cualquier instante de tiempo, el surtidor sólo puede ser utilizado por un vehículo
repostando o por un camión cisterna llenando el depósito del surtidor.
• A la hora de ocupar el surtidor, un camión cisterna tiene prioridad sobre un vehículo.
• Cuando un vehículo se detiene para repostar, lo hace por una cantidad de litros que varía según
el vehículo. Si el surtidor está libre y posee suficiente gasolina, entonces reposta. Si el surtidor
está siendo utilizado por otro vehículo o no posee una cantidad suficiente para satisfacer la
cantidad requerida, entonces el vehículo se pone en una cola de espera.
• Al llegar un camión cisterna a la gasolinera, si hay otro camión cisterna en la gasolinera,
esperando a llenar el depósito del surtidor o llenando el depósito, entonces sigue de largo y no
se detiene. Cuando un camión cisterna se detiene para llenar el depósito del surtidor, entonces
comprueba que el surtidor no está siendo utilizado por un vehículo. Si está siendo utilizado,
entonces espera a que quede libre. Si no está siendo utilizado, entonces llena el depósito del
surtidor hasta completar su capacidad (asuma que el camión cisterna siempre posee suficiente
combustible para llenar el depósito) y abandona la gasolinera.
Utilizando cerrojos y variables de tipo condición, desarrolle un modelo software que reproduzca el
funcionamiento de la gasolinera y el comportamiento de los vehículos y camiones cisterna. Asuma que
inicialmente el depósito del surtidor está lleno. Su solución debe consistir en la implementación de las
dos funciones siguientes:
void Repostaje( int litros_repostaje )
Las unidades de ejecución que simulan a los vehículos, cuando quieren repostar invocan a esta
función. El parámetro litros_repostaje indica cuántos litros requiere repostar el vehículo.
La función provocará el bloqueo de la unidad de ejecución que la invoca si no se puede
repostar. Su retorno significa que se ha producido el repostaje.

void Suministro( )
Las unidades de ejecución que simulan a los camiones cisterna invocan a esta función para
suministrar combustible a la gasolinera. La función provocará el bloqueo de la unidad de
ejecución que la invoca si no se puede suministrar combustible. Su retorno significa que se ha
producido el suministro de combustible.

· Página 1 de 6
Solución simple: No cumple el enunciado al 100%. No hay garantías de la preferencia de los camiones
cisterna (Se propone una calificación máxima de un 60% si se implementa una versión en esta línea).

// Variables globales
Mutex cerradura = new Mutex();
Condition cola_vehículo = new Condition(cerradura);
int litros_sut = 1000;

// Esta función la invocan los vehículos // Esta función la invocan los camiones
void Repostaje(int litros_repostaje) void Suministro( )
{ {

// Se controla el acceso a la gasolinera // Se controla el acceso a la gasolinera


surtidor cerradura.lock();
cerradura.lock();
litros_surt = 1000;
// Si no hay suficiente combustible,
// espera // Ha terminado de suministrar
while (litros_repostaje>litros_surt) { // combustible. Despertamos a los
cola_vehiculo.wait(); // vehículos en espera
} cola_vehículo.broadcast();

// En este pto. el vehículo puede // Ha terminado de reponer


repostar // Permite que otros utilicen el surtidor
litros_surt -= litros_repostaje; cerradura.unlock();

// Ha terminado de repostar return;


// Permite que otros utilicen el surtidor }
cerradura.unlock();

return;
}

Página 2 de 6
Nombre y apellidos DNI/NIE

Solución más elaborada garantizando la preferencia de los camiones cisterna una vez que dejan
constancia de su llegada.

// Variables globales
Mutex cerradura = new Mutex();
Condition cola_vehículo = new Condition(cerradura);
Condition cola_camion = new Condition(cerradura);
boolean vehiculo_repostando = false;
boolean hay_cam = false;
int litros_sut = 1000;

// Esta función la invocan los vehículos // Esta función la invocan los camiones
void Repostaje(int litros_repostaje) void Suministro( )
{ {

cerradura.Lock(); // Se controla el acceso a la gasolinera


while ((hay_cam==true) || cerradura.lock();
(vehiculo_repostando==true) || if (hay_cam==true) {
(litros_repostaje>litros_surt)) cerradura.unlock();
cola_vehiculo.wait(); return;
litros_surt -= litros_repostaje; }
vehiculo_repostando= true; hay_cam=true;
cerradura.unlock(); if (vehiculo_repostando)
cola_camion.wait();
// Repostando ….esto llevará su tiempo cerradura.unlock(),

cerradura.Lock() // Suministrar combustible …


vehiculo_repostando=false;
if (hay_cam==true) cerradura.lock();
cola_camion.signal(); litros_surt = 1000;
else hay_cam = false;
cola_vehiculo.broadcast(); cola_vehiculo.broadcast();
cerradura.unlock(); cerradura.unlock(),

return; return;
} }

2 (2 puntos) Responda a las siguientes cuestiones, empleando hasta 150 palabras para cada una:
a) (0,5 puntos) ¿Qué diferencia hay entre realizar una operación Lock sobre un cerrojo y una
operación Wait sobre una variable condición?
Pauta de la respuesta à La operación Lock sobre un cerrojo dejará bloqueado al hilo o
proceso si este se encuentra adquirido por otro hilo o proceso. En caso contrario el hilo
adquiere el cerrojo y continua su ejecución. En cambio, en el caso de una variable condición, la
operación de Wait siempre provocará el bloqueo del hilo o proceso que la invoque.

b) (0,5 puntos) ¿Cuál es el motivo por el que hay que garantizar la atomicidad en la
implementación de las operaciones sobre cerrojos y variables condición?
Pauta de la respuesta à En su implementación se emplean variables compartidas, siendo por
tanto a su vez un problema de sección crítica. Si las operaciones no fueran atómicas, no habría
garantías de exclusión mutua en caso de que varios hilos o procesos compartan el mismo
cerrojo o variable condición.

Página 3 de 6
c) (0,5 puntos) Explique dos ventajas de un esquema de gestión de memoria paginada frente a un
esquema de gestión de memoria contigua.
Pauta de la respuesta à Elimina el problema de la fragmentación externa. Permite establecer
niveles de protección a nivel de página. Facilita la compartición de memoria entre varios
procesos.

d) (0,5 puntos) Alguien afirma que en un sistema de gestión memoria virtual paginada que
emplea como política de reemplazo de páginas el algoritmo LRU, para una cadena de
referencias a memoria dada, ha obtenido un número de fallos de página mayor que el obtenido
con el algoritmo de segunda oportunidad. ¿Es posible? Justifique su respuesta.

Pauta de la respuesta à Sí, por ejemplo, en la siguiente cadena de referencias 1 2 3 1 4 2 3,


para tres marcos inicialmente libres, el algoritmo LRU da 6 fallos de página, mientras que 2ª
oportunidad da 4 fallos.

3 (4 puntos) Suponga un sistema informático con memoria virtual y con las siguientes características:
• Su bus de direcciones es de 64 bits.
• Posee instalados 4 Gbytes de memoria principal.
• El tiempo medio de acceso a la memoria principal es de 100 nseg.
• Su memoria es paginada de un único nivel, con páginas de 4 Kbytes.
• Posee una TLB, con una tasa promedio de acierto del 95%.
• El tiempo de acceso a la TLB es de 10 nseg.
• El espacio lógico máximo direccionable por un programa es de 32 Gbytes.
• Los módulos del sistema operativo cargados en memoria ocupan de manera contigua el primer
Gbyte de la memoria principal.
• Se ha observado que por término medio un fallo de página se produce cada 1000 accesos a
memoria.
• En caso de fallo de página, el sistema consume 20 mseg en resolver el fallo.
• La asignación de páginas a los procesos se realiza por demanda.
• El sistema operativo permite que como máximo 4 páginas de un proceso estén en memoria al
mismo tiempo, siendo la política de reemplazo de páginas local.
Responda a las siguientes cuestiones:
a. (0,25 puntos) ¿Cuál es la cantidad máxima de memoria principal que se puede instalar en el
sistema?
264 bytes

Página 4 de 6
Nombre y apellidos DNI/NIE

b. (0,25 puntos) ¿Cuál es la estructura de una dirección lógica?


Espacio lógico = 32 Gbytes = 235 bytes => Dirección lógica = 35 bits
Tamaño de página = 4 Kbytes = 212 bytes
Página Desplazamiento
23 bits 12 bits

c. (0,5 puntos) ¿Cuántas entradas como máximo podrá tener la tabla de páginas de un proceso?

Según el espacio lógico de direcciones, un proceso podría tener 223 páginas, siendo por tanto
este el número máximo de entradas de la tabla de páginas de un proceso (se propone una
calificación de 0,35 puntos para esta respuesta).

Sin embargo, cada entrada de la tabla de páginas ocupa 52 bits (número de bits necesarios
para direccionar un marco físico en un bus de 64 bits y tamaño de marco 212 bytes), es decir,
se necesitan como mínimo 7 bytes para cada entrada. Dado que el tamaño de página son 212
bytes y nos dicen que se trata de un sistema paginado de un nivel, el tamaño de la tabla de
páginas estará limitado por el tamaño de página, puesto que según el espacio lógico de
direcciones, el tamaño máximo de la tabla de páginas de un proceso sería 223 entradas x 7
bytes cada entrada = 223 x 7 bytes, tamaño muy superior al tamaño de página. Realmente el
número de entradas máximo de la tabla de página que caben en un marco físico son 212/7 =
585,14, es decir, 585 páginas, siendo 585 por tanto el número máximo de entradas de la tabla
de páginas de un proceso.

d. (0,5 puntos) ¿Cuántas entradas tendrá la tabla de marcos de página?


Para la memoria instalada en el sistema 4 Gbytes = 232 bytes, el número entradas de la tabla
de marcos de página será 232/212 = 220 entradas.

Si en lugar de la memoria instalada se considerara la cantidad de memoria máxima que se


podría instalar, el número entradas de la tabla de marcos de página será 264/212 = 252
entradas.

e. (0,5 puntos) En el caso de que sólo se encuentre el sistema operativo en memoria principal,
¿en qué estado estará la tabla de marcos de página?
Dado que nos indican que el SO ocupa el primer Gbyte de la memoria, ocupara 230 bytes / 212
= 218 marcos de página. Por tanto, las primeras 218 entradas de la tabla de marcos de página
indicará que dichos marcos están ocupados y el resto estarán marcados como libres (desde la
entrada 218 hasta la entrada 220-1).

Página 5 de 6
f. (1 puntos) ¿Cuál sería el tiempo medio efectivo de acceso a una dirección de memoria virtual?
Tiempo medio efectivo de acceso a memoria =
TTLB + PTLB×TRAM + (1-PTLB-PF) × (2×TRAM) + PF×TF

Donde:

TTLB = tiempo de acceso a la TLB (siempre se consume) = 10nseg


PTLB = probabilidad de acierto de la TLB = 95%
PF = probabilidad de fallo de página = 0,1%
TRAM = tiempo de acceso a la RAM = 100nseg
TF = tiempo de resolución de un fallo de página = 20mseg = 2×107 nseg

Sustituyendo = 10nseg + 95%×100nseg + 4,9%×200nseg + 0,1%×2×107 nseg ≅ 2×106 nseg

NOTA: la tasa de fallos de página de este sistema es exageradamente grande e impacta


muchísimo en el tiempo de acceso a la memoria virtual. Un sistema en uso real normalmente
tendría tasas muchísimo más bajas.

g. (1 punto) Dada la siguiente cadena de referencias a páginas de memoria de un proceso: 1, 2, 3,


1, 3, 2, 1, 4, 1, 4, 3, 2, 5, 1, 2, 4, 2, 1, 3, 1. Indique los fallos de página y el estado de los marcos
de memoria del proceso después de cada referencia, al aplicar cada una de las siguientes
políticas de sustitución: LRU y Segunda oportunidad. Asuma que inicialmente el proceso no
tiene ninguna página en memoria.
LRU = 8 fallos de página.
1 2 3 1 3 2 1 4 1 4 3 2 5 1 2 4 2 1 3 1
1 1 1 1 5 5 5 3
2 2 2 2 2 2 2
3 3 3 3 4 4
4 4 1 1 1
* * * * * * * *

Segunda oportunidad = 8 fallos de página
1 2 3 1 3 2 1 4 1 4 3 2 5 1 2 4 2 1 3 1
»1+ »1+ »1+ »1+ 5+ 5+ 5+ 5+ »5- »5-
2+ 2+ 2+ »2- 1+ 1+ 1+ 1- 1+
3+ 3+ 3- »3- 2+ 2+ 2- 2-
4+ 4- 4- »4- »4+ 3+ 3+
* * * * * * * *

En la descripción de los marcos, se usan estas convenciones:
» es el marco al cual apunta la manecilla del reloj que empezará a buscar posibles víctimas.
+ la página tiene el bit de referencia activo
- la página tiene el bit de referencia desactivado

Página 6 de 6
1 2 3 test extra NOTA
Fundamentos de los Sistemas Operativos
Examen parcial – 9 de abril de 2018

Nombre y apellidos DNI/NIE


SOLUCIONES
DURACIÓN: Dispone de dos horas para realizar el examen.
Lea las instrucciones para el test en la hoja correspondiente.
proceso llegada duración
1 (1’25 puntos) A un planificador de CPU llegan tres procesos, Pa 0 8
según el cuadro adjunto. Aplique las dos políticas SRTF (SJF Pb 3 4
expulsivo) y Round Robin (Q=2) y, para cada una de ellas, obtenga
Pc 5 2
lo siguiente:
• Diagrama de Gantt o similar con la planificación.
• Tiempo de espera y de retorno de cada uno de los procesos.
• Número de cambios de contexto realizados durante la planificación.

Ver modelo de respuesta en la próxima página

· Página 1 de 4
Página 2 de 4
Nombre y apellidos DNI/NIE

2 (1’50 puntos) Responda a estas dos cuestiones, empleando hasta 150 palabras para cada una:
a) ¿Cuál es la diferencia entre un sistema de tiempo compartido y un sistema de tiempo real?
Ponga algún ejemplo práctico y realista en el que un sistema de tiempo compartido no puede
resolver un requisito de tiempo real.
El objetivo central de un sistema de tiempo compartido es repartir la CPU entre los procesos de
manera que den una experiencia interactiva a los usuarios, mientras que un sistema de tiempo real
trata de garantizar que cada proceso finalice en un plazo de ejecución determinado. La cuestión es
que un sistema de tiempo compartido no está concebido para garantizar plazos de finalización: no da
prioridad a los procesos que tienen más urgencia por finalizar.

En esta pregunta se puede responder con ejemplos en los que un sistema de tiempo compartido
fracasa con una exigencia de tiempo real, si el sistema está muy cargado y un proceso de tiempo real
no disfruta de suficientes rodajas de CPU para poder acabar a tiempo. Por ejemplo en un Round
Robin con Q=1 milisegundo, una tarea que debe finalizar en 2 milisegundos se mete en la cola de
preparados junto con otros 5 procesos. Esta tarea no tiene garantizado finalizar en el plazo marcado.
Podríamos aplicar este ejemplo general a múltiples situaciones reales: reproducción de archivos
multimedia, ejecución de un proceso crítico en respuesta a un evento de E/S (ej. alarma contra
incendios, en un automóvil explosionar el airbag ante una deceleración brusca, en un portátil pasar a
modo hibernación cuando la batería alerta de que está a punto de agotarse, etc.).

b) Describa cómo puede protegerse la zona de memoria del núcleo mediante los registros base y
límite.
Aquí hay que explicar el mecanismo de los registros base y límite y cómo se puede aplicar para
delimitar la zona de memoria a la que puede acceder un proceso de usuario. En la respuesta hay que
dejar claro que la CPU distingue un modo privilegiado de un modo usuario en el cual se controlan los
accesos a memoria; que el control se realiza mediante hardware; y que el sistema debe dar valores a
estos registros para que se obligue al proceso de usuario a acceder a una zona determinada.

3 (1’25 puntos) Se propone el siguiente algoritmo para resolver el problema de sección crítica para
dos procesos:
// Variables compartidas
bool flag[2] = { false, false };

// Código del proceso 0 // Código del proceso 1


while (true) { while (true) {

... código de sección no crítica ... código de sección no crítica

flag[0]=true; flag[1]=true;
while (flag[1]) { while (flag[0]) {
flag[0]=false; flag[1]=false;
sleep(1); sleep(1);
flag[0]=true; flag[1]=true;
} }

... código de sección crítica ... código de sección crítica

flag[0]=false; flag[1]=false;
} }

¿Se trata de una solución válida para el problema? ¿Por qué? Justifíquelo en relación con las
propiedades que debe cumplir un algoritmo válido para el problema de la sección crítica.

¿Este algoritmo puede mejorarse de alguna forma?


Página 3 de 4
En este algoritmo cada proceso «i» que quiere entrar en sección crítica declara primero que nada su
intención de acceder, poniendo a TRUE la variable flag[i]. Cuando abandona la sección crítica, vuelve
a poner flag[i] a FALSE. El bucle sirve para detener al proceso «i» si este observa que su compañero
tiene intención de entrar en sección crítica: esto se hace observando el valor de flag[] para el otro
proceso. Si observa que el compañero quiere entrar en sección crítica, el proceso «i» mantiene
durante un segundo su flag[i] a FALSE y al cabo de ese tiempo vuelve a intentar entrar.

El algoritmo planteado asegura la exclusión mutua entre ambos procesos, ya que ninguno de los dos
avanza a su sección crítica si observa que el otro ha declarado su interés en entrar. Sin embargo,
cuando los dos procesos quieren entrar al mismo tiempo, puede ocurrir que ambos se queden
atascados en un bucle infinito (livelock), poniendo a FALSE y TRUE sus respectivos flags y
observándose mutuamente como interesados en entrar en la sección crítica. Por tanto no se garantiza
el progreso del algoritmo, aunque la situación descrita es poco probable: en un sistema real, lo más
probable es que alguno de los dos procesos acabe entrando.

Por último, hay que destacar que el algoritmo no garantiza la espera limitada de un proceso.
Supongamos que el proceso 0 está dentro de la sección crítica y que el proceso 1 quiere entrar. El
proceso 1 se mantiene en el bucle de espera. Supongamos que mientras el proceso 1 está en el
«sleep», con su flag a FALSE, el proceso 0 abandona la sección crítica y vuelve de inmediato a
solicitar entrar en sección crítica: podrá entrar, ya que flag[1] está a FALSE. Si el proceso 1 se
despierta y vuelve a evaluar flag[0], observará que está a TRUE y volverá a esperar. Esta situación,
teóricamente, se puede dar una y otra vez, sin garantía de que el proceso 1 vuelva a entrar en sección
crítica.

El algoritmo se podría mejorar de muchas formas, por ejemplo obligando a que el sleep() fuera
aleatorio (disminuiría la probabilidad de un atasco eterno o livelock), o bien utilizando una variable que
deshaga el empate si los dos procesos están interesados en entrar (como ocurre en el algoritmo de
Peterson), etc.

Página 4 de 4
1 2 3 4 test extra NOTA

Fundamentos de los Sistemas Operativos



Examen parcial – 3 de abril de 2017

Nombre y apellidos DNI/NIE


SOLUCIONES

DURACIÓN: Dispones de dos horas para realizar el examen.


Lee las instrucciones para el test en la hoja correspondiente.

1 (1’25 puntos) A un planificador de CPU llegan tres procesos, proceso llegada duración
según el cuadro adjunto. Aplica las dos políticas SRTF (SJF expulsivo) Pa 0 10
y RR (Q=3) y, para cada una de ellas, obtén lo siguiente: Pb 2 6
• Diagrama de Gantt o similar con la planificación. Pc 5 2
• Tiempo de espera y de retorno de cada uno de los procesos.
• Número de cambios de contexto realizados durante la planificación.
Solución en la figura inferior:

· Página 1 de 6

2 (0’50 puntos) ¿Qué diferencias hay entre un micronúcleo y un núcleo monolítico?


Pregunta básica de conceptos del Tema 1. La diferencia radica en la arquitectura del código.

3 (1 punto) Muchos informáticos sostienen que uno de los beneficios del sistema operativo es que los
desarrolladores de aplicaciones no tienen que estar modificando su software cada vez que hay un
cambio en las tecnologías hardware, especialmente cuando aparece una nueva tecnología de
almacenamiento (ej. discos SSD). Elabora unos argumentos que apoyen esa afirmación. No uses más
de 150 palabras en tu exposición.
Pregunta de aplicación de conceptos trabajados en el Tema 1. Imprescindible mencionar que el SO
actúa como intermediario entre las aplicaciones y el hardware de E/S a través de una interfaz de
programación (API). Esta API se diseña de manera que sea independiente del dispositivo,
abstrayendo detalles que puedan variar según las características del hardware. Si se puede
desarrollar un manejador interno del SO que adapte el nuevo hardware a la misma API, las
aplicaciones no necesitan ninguna modificación, ya que la API del SO permanece inalterada. Sólo hay
que actualizar el SO.

4 (1’25 puntos) En una tienda de pájaros tenemos una jaula con canarios que revolotean en su
interior. Regularmente cada canario quiere comer de un comedero de alpiste, en el que solamente
puede haber tres pájaros al mismo tiempo. Si un pájaro quiere comer y el comedero está lleno, se
debe esperar a que haya hueco. Por su parte, el encargado de la tienda de vez en cuando repone el
alpiste del comedero. Mientras el encargado está reponiendo, ningún pájaro puede estar comiendo: el
encargado debe esperar a que se quede vacío el comedero y, una vez vacío, ningún pájaro entra a
comer hasta que el encargado termina de reponer.
El algoritmo general de un pajarito y del encargado se muestra en el siguiente cuadro.

void pajarito () { void encargado() {


while ( pajaritoVivo() ) { while ( ! jubilado() ) {
… revolotear por la jaula … hacer otras cosas
… esperar a que haya hueco y que … esperar a que no haya pájaros
el encargado no esté reponiendo el comiendo
alpiste REPONER_ALPISTE();
COMER(); }
} }
}

TAREA. Tienes que arreglar el algoritmo para que los pajaritos y el encargado se sincronicen entre
todos ellos conforme al enunciado expuesto. Puedes utilizar variables de estado y operaciones básicas
de sincronización (entradas y salidas en sección crítica, colas de espera, etc.). Si ya conoces el uso de
semáforos, puedes resolverlo con ellos si lo prefieres (no habrá diferencia en la calificación de la
pregunta).

NOTA. Escribe tu intento aunque no tengas la solución completa y perfecta para todos los escenarios.
En ese caso, describe las limitaciones que sepas que tiene tu propuesta.

Página 2 de 6
Nombre y apellidos DNI/NIE

Solución: primera versión, con sincronización de bajo nivel

Este algoritmo en realidad es una variante simplificada del «problema de los lectores y escritores», con
un máximo de tres lectores (los pájaros) y un solo escritor (el encargado de la tienda). Cualquier
solución al problema de los lectores y escritores puede adaptarse con facilidad a este ejercicio.

A continuación se muestra una solución con herramientas de bajo nivel:

Variables compartidas:
int comiendo = 0; // cantidad de pájaros que están comiendo
bool reponiendo = false; // ¿quiere el encargado reponer?

void pajarito () { void encargado() {


while ( pajaritoVivo() ) { while ( ! jubilado() ) {
… revolotear por la jaula … hacer otras cosas
ENTRARSC(); ENTRARSC();
while (comiendo==3 OR reponiendo){ reponiendo = true;
SALIRSC(); while (comiendo>0) {
DORMIR(); SALIRSC();
ENTRARSC(); DORMIR();
} ENTRARSC();
comiendo++; }
SALIRSC(); REPONER_ALPISTE();
reponiendo = false;
// ojo, queda fuera de la sección DESPERTAR();
// crítica,para que varios pájaros SALIRSC();
// puedan comer al mismo tiempo }
COMER(); }

ENTRARSC();
comiendo--;
DESPERTAR();
SALIRSC();
}
}

Es importante dejar la operación COMER() fuera de una sección crítica. Si la envolvemos dentro de
una S.C., no se permitirá a más de un pájaro estar en el comedero y por tanto no se cumpliría
eficazmente la característica de que puedan comer hasta tres juntos.

Ojo, en la anterior solución no hace falta usar la variable reponiendo, ya que el encargado mientras
está reponiendo alpiste retiene el uso de la sección crítica e impide a los pájaros usar el comedero.
Pero esta variable impide el bloqueo indefinido del encargado en caso de que continuamente lleguen
pájaros: los pájaros que intenten comer después de que reponiendo==true se quedarán bloqueados
en el bucle while.

Página 3 de 6
Segunda versión, con semáforos

El código equivalente al anterior algoritmo, pero utilizando semáforos, podría ser así:

Semáforo mutex = 1;
Semáforo cola = 0;
int esperando = 0;

void bloquear() {
esperando++;
V(mutex);
P(cola);
P(mutex);
}

void despertar() {
while (esperando>0) {
esperando--;
V(cola);
}
}

void pajarito () { void encargado() {


while ( pajaritoVivo() ) { while ( ! jubilado() ) {
… revolotear por la jaula … hacer otras cosas
P(mutex); P(mutex);
while (comiendo==3 OR reponiendo){ reponiendo = true;
bloquear(); while (comiendo>0) {
} bloquear();
comiendo++; }
V(mutex); REPONER_ALPISTE();
reponiendo = false;
// ojo, queda fuera de la sección despertar();
// crítica,para que varios pájaros V(mutex);
// puedan comer al mismo tiempo }
COMER(); }

P(mutex);
comiendo--;
despertar();
V(mutex);
}
}

Página 4 de 6
Nombre y apellidos DNI/NIE

Tercera versión, con semáforos

El segundo algoritmo con semáforos se puede optimizar para situar en colas distintas el
bloqueo/desbloqueo del encargado y los pajaritos. La optimización lleva a un código más difícil de
entender y verificar. El siguiente código se ofrece solamente como referencia para el estudio; no es un
código que se pueda elaborar fácilmente durante la realización de un examen.

Semáforo mutex=1, colaEncargado=0, colaPajaritos=0;


int comiendo = 0, pajEsperando = 0;
bool reponiendo = false;

void pajarito () { void encargado() {


while ( pajaritoVivo() ) { while ( ! jubilado() ) {
… revolotear por la jaula … hacer otras cosas
P(mutex); P(mutex);
while (comiendo==3 OR reponiendo) { reponiendo = true;
pajEsperando++; if (comiendo>0) {
V(mutex); V(mutex);
P(colaPajaritos); P(colaEncargado);
P(mutex); }
}
comiendo++; REPONER_ALPISTE();
V(mutex);
reponiendo = false;
COMER(); for i in 1..min(3,pajEsperando) {
pajEsperando--;
P(mutex); V(colaPajaritos);
comiendo--; }
if (comiendo==0 AND reponiendo) { V(mutex);
V(colaEncargado); }
} }
elsif (pajEsperando>0) {
pajEsperando--;
V(colaPajaritos);
}
else V(mutex);
}
}

Página 5 de 6
Cuarta solución con semáforos, compacta

Los semáforos permiten una solución mucho más compacta:

Variable compartida:
Semáforo comedero = 3;

void pajarito () { void encargado() {


while ( pajaritoVivo() ) { while ( ! jubilado() ) {
… revolotear por la jaula … hacer otras cosas
P(comedero); P(comedero);
COMER(); P(comedero);
V(comedero); P(comedero);
} REPONER_ALPISTE();
} V(comedero);
V(comedero);
V(comedero);
}
}

En este algoritmo, el encargado acapara todos los créditos para poder usar el comedero, con lo cual
impide que mientras repone alpiste pueda haber algún pájaro. Si el encargado se encuentra con uno o
varios pájaros comiendo, se quedará esperando a que los pájaros liberen sus semáforos.

Eso sí, este algoritmo no resuelve el problema de que continuamente lleguen pajaritos al comedero y
con ello impidan trabajar al encargado (los otros algoritmos sí lo resuelven, por medio de la variable
reponiendo).

Página 6 de 6
1 2 3 test extra NOTA

Fundamentos de los Sistemas Operativos



Convocatoria ordinaria – 23 de mayo de 2017
Primera parte: temas 1, 2 y 3

Nombre y apellidos DNI/NIE


SOLUCIONES

DURACIÓN: Dispones de dos horas para realizar el examen.


Lee las instrucciones para el test en la hoja correspondiente.

1 (1’25 puntos) Responde a cada apartado. Usa como máximo 100 palabras por respuesta.
• En la planificación de procesos, ¿cuál es el problema que tienen los algoritmos basados en
prioridades? ¿Cómo se puede abordar ese problema?
Pauta de la respuesta à Riesgo de inanición o postergación indefinida de los procesos con baja
prioridad. Se soluciona con envejecimiento (aging).

• ¿Qué beneficios aportan los métodos de planificación multicola respecto a los de una sola
cola?
Pauta de la respuesta à Podemos dar un tratamiento diferente a procesos de distinto tipo, ej.
interactivos, por lotes, de tiempo real, de mucha prioridad, etc. Cada uno con una política de
planificación distinta.

2 (1’50 puntos) Explica cada uno de estos aspectos sobre la técnica de multiprogramación.
Desarrolla cada apartado en menos de 150 palabras.
• Cómo consiguió la multiprogramación aumentar el rendimiento de los sistemas con un solo
procesador.
Pauta de la respuesta à evitando que la CPU se quede ociosa si el proceso en curso queda
bloqueado; se aprovecha y se ejecutan fragmentos de procesos que estén dispuestos a ejecutar
instrucciones; se solapa la ejecución de instrucciones en CPU con la realización de operaciones de
E/S

• Qué necesidades de protección y seguridad introdujo la multiprogramación, especialmente


en el ámbito de la gestión de la memoria.
Pauta de la respuesta à si tenemos varios procesos en ejecución, estos normalmente estarán
compartiendo la memoria principal. Dada esta configuración, hay que evitar que un proceso acceda
por error o malicia al espacio de memoria de otro. Además, hay que evitar que si un proceso se
bloquea, o daña al SO, arrastre con él al conjunto de procesos del sistema.

3 (1’25 puntos) En una carretera tenemos un puente controlado por un sistema de sensores. Cada
sensor se encarga del extremo de un carril y ejecuta un proceso independiente que detecta cuándo
entra o sale un vehículo del puente. Cada evento modifica un contador compartido por todos los
sensores. En total hay seis sensores (tres carriles, un sensor en cada extremo). Además de los
procesos sensores, un proceso monitor se encarga de consultar periódicamente el contador y alerta
si se alcanza el límite máximo de vehículos dentro del puente.
El sistema software se implementa en lenguaje C. El código sigue este esquema (la variable
“contador” está inicializada a cero):

· Página 1 de 2
Sensor de entrada Sensor de salida Monitor
while (true) { while (true) { while (true) {
... esperar una entrada ... esperar una salida sleep(1);
contador++; contador--; if (contador>MAX) {
} } alerta();
}
}

El sistema se instala y se observa que funciona bien durante un tiempo, pero al cabo de unas horas
el monitor no detecta cuándo se alcanza el límite máximo. Haciendo trazas se observa que la
variable “contador” acaba adquiriendo valores incorrectos. Incluso a veces se observan valores que
no deberían darse nunca, por ejemplo un -1. Los dispositivos electrónicos se han comprobado y
estos sí que funcionan perfectamente, no parece haber errores físicos de lectura.
¿Qué explicación puede tener este comportamiento del algoritmo? ¿Por qué el contador adquiere
valores incorrectos? ¿Hay alguna solución algorítmica al problema?
El problema viene de las modificaciones concurrentes a la variable contador, que no están
protegidas para que se ejecuten de forma atómica. Si dos procesos incrementan o decrementan al
mismo tiempo contador, se puede perder una de las dos operaciones.

Existen formas algorítmicas de remediar este problema, y es conseguir que las modificaciones a
contador sean atómicas, lo cual se puede conseguir con cualquier algoritmo válido de sección
crítica. O con un semáforo tipo mutex, si disponemos de esa herramienta.

(extra) También se puede atenuar el problema si cada sensor utiliza una variable propia, ej.
entrada1, entrada2, entrada3, salida1, salida2, salida3. Y el monitor sume y reste los valores de
esas seis variables para ofrecer el balance general de entradas y salidas. El problema de esta
técnica es que con el tiempo los contadores se saldrían del rango de valores del tipo manejado.
Además, no soluciona del todo el problema, porque como el monitor no lee todos los valores al
mismo tiempo, la suma puede dar un resultado que no se corresponda con la realidad.

Página 2 de 2
1 2 3 test extra NOTA

Fundamentos de los Sistemas Operativos


Convocatoria ordinaria – 23 de mayo de 2017
Segunda parte: temas 3, 4 y 5

Nombre y apellidos DNI/NIE


SOLUCIONES

DURACIÓN: Dispones de dos horas para realizar el examen.


Lee las instrucciones para el test en la hoja correspondiente.

1 (1’25 puntos) Un sistema de archivos trabaja con bloques de datos de 1KiB y enlaces de 16 bits.
Este sistema emplea una política de asignación de espacio indexada simple, con un único bloque de
datos para los índices.
¿Cuál es el tamaño máximo que puede llegar a tener un archivo en este sistema?
El tamaño máximo está condicionado por el número de enlaces que caben en el bloque de índices.
Como el bloque es de 1KiB y los enlaces son de 2 bytes (16 bits), en el bloque caben 1024/2 = 512
enlaces. Cada enlace apunta a un bloque de 1KiB, así que el tamaño total del archivo con 512
enlaces es de 512×1024 bytes = 512 KiB.

Se desea que el sistema admita archivos más grandes y con este fin se proponen estas dos
intervenciones: a) Duplicar el tamaño de los bloques de datos (pasar a 2KiB); b) permitir que el
bloque de índices ocupe dos bloques de datos. ¿Cuál de las dos intervenciones elegirías tú y por
qué?

Si duplicamos el tamaño del bloque de datos (2048 bytes), en el bloque de índices cabrán el doble
de enlaces: 1024 enlaces de 2 bytes. Por tanto un archivo puede llegar a tener 1024 bloques de
2048 bytes, que son 1024×2048 = 210×211 = 221 = 2 MiB.

Por su parte, si permitimos que el bloque de índices ocupe dos bloques de datos, duplicaremos la
cantidad de enlaces que puede almacenar, o sea que también pasamos a 1024 enlaces. Como los
bloques siguen siendo de 1 KiB, el tamaño máximo del archivo será de 1024×1 KiB = 1 MiB.

Observando cómo resultan los tamaños máximos de ambas intervenciones, está claro que la
primera opción (duplicar el tamaño del bloque de datos) aumenta mucho más el límite.

2 (1’5 puntos) En un sistema de memoria virtual paginada tenemos esta secuencia de referencias a
páginas virtuales de un proceso: 1, 2, 3, 4, 2, 5, 1, 3, 4, 5, 3, 1, 5. El proceso tiene tres marcos
asignados, inicialmente vacíos. Planifica esta secuencia con estos dos algoritmos: óptimo (OPT) y
segunda oportunidad. Indica en cada caso cuándo se produce un fallo de página y qué página se
reemplaza.
Esta es la planificación según el algoritmo óptimo.

acceso 1 2 3 4 2 5 1 3 4 5 3 1 5
marcos 1-- 12- 123 124 124 154 154 354 354 354 354 154 154
víctima 3 2 1 3/4
fallo F F F F F F F

Se produce un total de siete fallos de página.


En el penúltimo acceso, a la página 1, se pueden elegir como víctimas tanto la página 3 como la 4,
ya que no se van a acceder más en el futuro.

· Página 1 de 3
Esta es la planificación según la «segunda oportunidad».

acceso 1 2 3 4 2 5 1 3 4 5 3 1 5
marcos »1+ »1+ »1+ 4+ 4+ »4+ 4- 3+ »3+ 3- 3+ »3- »3-
2+ 2+ »2- »2+ 2- 1+ »1+ 1- 5+ 5+ 5- 5+
3+ 3- 3- 5+ »5+ 5- 4+ »4+ »4+ 1+ 1+
víctima 1 3 2 4 5 1 4
fallo F F F F F F F F F F

Se produce un total de diez fallos de página.


En la descripción de los marcos, se usan estas convenciones:
» es el marco al cual apunta la manecilla del reloj que empezará a buscar posibles víctimas.
+ la página tiene el bit de referencia activo
- la página tiene el bit de referencia desactivado


3 (1’25 puntos) Tenemos un baño público en el que cabe un número ilimitado de personas. Cada
cierto tiempo un empleado realiza la limpieza del baño, actuando de la siguiente forma: pone un
letrero para impedir que entren personas al baño, se espera a que quienes están dentro acaben y
salgan, y una vez que el recinto está vacío, realiza la limpieza. Cuando termina de limpiar, retira el
letrero y se marcha, quedando el baño libre para que entren nuevos usuarios.
Se quiere implementar un software que simule este baño, con hilos que implementan a las
personas que interactúan con él. A continuación se muestran los bocetos de las funciones que
ejecutarán los hilos usuarios y el hilo limpiador:

void usar_baño () { void limpiar_baño() {


… esperar a que el baño esté libre … poner letrero «baño cerrado»
… y llegados a este punto… … esperar a que se quede vacío
… hacer lo habitual en un baño … limpiar el baño
… y salir del baño … quitar letrero
} }

TAREA. Tienes que añadir al boceto de código las acciones de sincronización necesarias para
cumplir con las especificaciones descritas arriba. Utiliza semáforos como herramienta de
sincronización.

NOTA. Si te cuesta implementar el problema con semáforos, utiliza las herramientas de “esperar” y
“despertar” que vimos en clase, o al menos expresa algorítmicamente cómo hay que sincronizar los
procesos. Así podrás tener algo de puntuación en este ejercicio.

El sistema planteado no es más que una variante del problema de los lectores y escritores. Es
una variante con prioridad a los escritores (el limpiador) y con la característica de que solamente
hay un proceso escritor. Por tanto, puede servir como solución cualquier algoritmo que resuelva el
segundo problema de los lectores y escritores, o en general que dé prioridad a los escritores.

Aquí se muestra una posible implementación, adaptada a las especificaciones del enunciado. La
solución utiliza un mutex y dos colas de espera: una para el limpiador y otra para los usuarios que
se encuentren con que se está limpiando el baño.

Página 2 de 3
Nombre y apellidos DNI/NIE

int usuarios_esperando = 0;
int usuarios_dentro = 0;
bool letrero_puesto = false;

Semáforo mutex = 1;
Semáforo usuarios = 0;
Semáforo limpiador = 0;

void usar_baño() {
P(mutex);
// Bloquearse si el limpiador ha puesto
// el letrero
while (letrero_puesto) {
usuarios_esperando++;
V(mutex);
P(usuarios);
P(mutex);
}
usuarios_dentro++;
V(mutex);

// ... usar el baño


// nótese que se hace fuera del mutex
// para permitir usuarios concurrentes

P(mutex);
usuarios_dentro--;
// Si es el ultimo usuario en salir
// y el letrero está puesto, avisa al limpiador
if (usuarios_dentro==0 and letrero_puesto) {
V(limpiador);
}
V(mutex);
}

void limpiar_baño() {
P(mutex);
letrero_puesto = true;
// Bloquearse mientras haya usuarios dentro del baño
if (usuarios_dentro>0) {
V(mutex);
P(limpiador);
P(mutex);
}

// ... limpiar el baño

letrero_puesto = false;
// Si hay usuarios esperando, hay que desbloquearlos
while (usuarios_esperando>0) {
usuarios_esperando--;
V(usuarios);
}
V(mutex);
}

Página 3 de 3
1 2 3 4 test extra NOTA

Fundamentos de los Sistemas Operativos


Convocatoria extraordinaria
7 de julio de 2017
Nombre y apellidos DNI/NIE

DURACIÓN: Dispones de dos horas y media para realizar el examen.


Lee las instrucciones para el test en la hoja correspondiente.

1 (0’75 puntos) Responde con brevedad a las siguientes cuestiones:


a) ¿Por qué los procesadores ofrecen dos modos de funcionamiento, llamados «modo sistema» y
«modo usuario»?
b) Nombra tres llamadas al sistema de Linux que conozcas. Explica qué hacen.
c) ¿En qué consiste el sistema de procesamiento por lotes?

2 (1 punto) La O.S.T.I.A. (Operating Systems Technology Innovation Agency) es una agencia de


investigación que busca innovar sobre sistemas operativos. Sus ingenieros tratan de modificar el
algoritmo SJF para reducir su riesgo de inanición. Finalmente dan con dos propuestas:
a) Cuando la CPU queda libre, el planificador utilizará dos criterios de forma alternativa: la primera
vez entrará en CPU el proceso más corto de la cola de preparados, pero la siguiente vez se
elegirá al proceso más largo, luego de nuevo el más corto, después el más largo y así
sucesivamente.
b) Cuando la CPU queda libre, se aplican de forma alternada SJF y FCFS para escoger al siguiente
proceso de la cola de preparados. Una vez se aplica SJF, la siguiente FCFS, luego SJF y así
sucesivamente.
Valora las propuestas de la O.S.T.I.A.: ¿alguna de ellas resuelve el riesgo de inanición del SJF? ¿Alguna
de ellas produce alguna mejora interesante en la planificación de procesos?

3 (1 punto) Responder a cada apartado:


 (0,30 puntos) Supongamos que tenemos la misma cantidad de RAM que de memoria
secundaria. En ese caso, ¿tiene algún sentido utilizar memoria virtual?
 (0,70 puntos) Tenemos una arquitectura de memoria que utiliza paginación de un solo nivel,
con las siguientes características: direcciones lógicas de 24 bits, direcciones físicas de 32 bits,
tamaño de página de 2KiB y tamaño de cada entrada en la tabla de páginas igual a 3 bytes. En
este sistema, ¿cuánto espacio ocupa la tabla de páginas de un proceso que maneja un espacio
lógico de 10 MiB? ¿Cuántas páginas en total estará ocupando ese proceso? (contando con lo
que ocupa su propia tabla de páginas).

· Página 1 de 2
4 (1’25 puntos) Estamos desarrollando una void entra_grupo (int npersonas) {
aplicación para gestionar el acceso a un parque … si se supera la capacidad del parque,
natural, en el que solo puede haber dejar al hilo esperando
simultáneamente 200 visitantes. El acceso se hace … aumentar el número de personas que
por grupos de personas. La API para controlar el hay en el parque
acceso define dos operaciones: entra_grupo(N) y }
sale_grupo(N), respectivamente para registrar la void sale_grupo (int npersonas) {
entrada o la salida de un grupo de N personas. … reducir el número de personas que hay
Estas operaciones pueden ser invocadas por hilos en el parque
concurrentes. Se quiere grantizar un … desbloquear otros grupos en espera,
comportamiento seguro, de manera que un hilo si es necesario
que trate de hacer entrar un número de personas }
que desbordaría la capacidad del parque, tendrá
que quedar en espera hasta que haya hueco suficiente. La operación de salir se ejecutará siempre sin
bloqueos (salvo que sea un error, p.ej. dejar el parque con una cantidad negativa de personas).

TAREA. Debes implementar mediante semáforos las acciones de sincronización de estas dos
operaciones. Introduzca las variables auxiliares que considere necesarias. NO hay que implementar el
sistema completo, ni los hilos: sólo el código de sincronización de estas dos operaciones. El algoritmo
debe estar libre de interbloqueos, pero no tienes que remediar la posible inanición de grupos grandes.

Página 2 de 2
1 2 3 4 test extra NOTA

Fundamentos de los Sistemas Operativos



Examen parcial – 11 de abril de 2016

Nombre y apellidos DNI/NIE


DURACIÓN: Dispones de dos horas para realizar el examen.


Lee las instrucciones para el test en la hoja correspondiente.

1 (1’25 puntos) El algoritmo Round-Robin para la planificación de CPU surgió cuando los
computadores solamente disponían de un procesador. En la actualidad, los multiprocesadores son
cada vez más baratos y es normal que la CPU de un PC o un móvil cuente con varios núcleos. Si lo
habitual es que un computador actual tenga ocho o más procesadores, ¿sigue teniendo sentido utilizar
el algoritmo Round-Robin?
2 (1 punto) Has sido contratado por la Operating Systems Technology Innovation Agency (O.S.T.I.A.),
para asesorarle sobre su último proyecto, que consiste en un sistema operativo que soporte al mismo
tiempo las API de Windows y de Linux. La O.S.T.I.A. se debate entre dos arquitecturas (ver la figura). En
una propuesta, se dispone de dos módulos independientes para Windows y Linux, cada uno de los
cuales accede directamente a los recursos del hardware. La otra propuesta incluye una capa de
software básica, que está en contacto directo con el hardware y que atiende las peticiones de los
subsistemas Windows y Linux. Hay discusiones sobre los beneficios e inconvenientes de cada una de
las dos aproximaciones. Ayuda a la O.S.T.I.A. y aporta tu opinión experta: ¿qué arquitectura te parece
más conveniente? ¿Qué ventajas e inconvenientes le ves a cada una?

procesos Windows procesos Linux procesos Windows procesos Linux

API Win API Linux API Win API Linux

Subsistema Subsistema
Subsistema Subsistema Windows Linux
Windows Linux

Subsistema común

Hardware Hardware

3 (0,75 puntos) Supongamos un computador que carece de sistema de interrupciones. ¿Qué


dificultades tendríamos para implementar en este computador un núcleo de sistema operativo?
4 (1 punto) Explica por qué es importante que un algoritmo que resuelva el problema de la sección
crítica debe cumplir la condición de progreso. Intenta apoyarte en ejemplos.

· Página 1 de 1
1 2 test extra NOTA

Fundamentos de los Sistemas Operativos



Convocatoria ordinaria – 26 de mayo de 2016
PRIMERA PARTE

Nombre y apellidos DNI/NIE


DURACIÓN: Dispones de dos horas para realizar el examen.


Lee las instrucciones para el test en la hoja correspondiente.

1 (2 puntos) Cuando un programador en C utiliza llamadas al sistema, estas tienen el mismo aspecto
que cualquier otra función de biblioteca, como en este ejemplo de Linux:
#include <math.h>
#include <stdio.h>
#include <unistd.h>

main() {
double raizDeDos = sqrt(2.0); // biblioteca math.h
printf (“la raíz cuadrada de 2 es %lf\n”, raizDeDos); // biblioteca stdio.h
int fd = open(“mifichero.txt”,O_RDWR); // Llamadas al sistema
write(fd, “hola”, 4);
close(fd);
}

La apariencia de las llamadas al sistema es la misma, pero hay grandes diferencias en la forma como se
ejecutan internamente. ¿Puedes explicar las peculiaridades que tiene la ejecución de una llamada al
sistema, comparada con la ejecución de una función corriente de biblioteca?

2 (2 puntos) A un ingeniero de la O.S.T.I.A. (Operating Systems Technology Innovation Agency) se le ha


ocurrido una nueva técnica de planificación de procesos, que consiste en un Round Robin de cuanto
variable. Cada proceso comienza a ejecutarse con un cuanto de 1 milisegundo. La siguiente vez que
entra en CPU, al proceso se le darán 2 milisegundos; la siguiente, 3 milisegundos y así sucesivamente:
cada vez que el proceso vuelve a entrar en CPU, se incrementa su Q en 1 milisegundo. Por lo demás, el
algoritmo funciona exactamente igual que un Round Robin.

Para probar el algoritmo, la O.S.T.I.A. ha preparado una carga de trabajo como la que se muestra a
continuación (los tiempos están en milisegundos).

proceso llegada duración


A 0 5
B 3 4
C 5 3
D 6 2

Se pide que hagas lo siguiente:

a) Simular la ejecución del nuevo algoritmo con esta carga de trabajo, así como con un Round
Robin convencional con Q=2 milisegundos. Mostrar los diagramas de Gantt correspondientes.
b) Comparar los resultados de los dos algoritmos. ¿Qué diferencias se observan?
c) Hacer una valoración general del nuevo algoritmo propuesto. ¿Crees que merece la pena?
¿Aporta algo interesante? ¿Tiene algún inconveniente?

· Página 1 de 1
1 2 test extra NOTA

Fundamentos de los Sistemas Operativos



Convocatoria ordinaria – 26 de mayo de 2016
SEGUNDA PARTE

Nombre y apellidos DNI/NIE


DURACIÓN: Dispones de dos horas para realizar el examen.


Lee las instrucciones para el test en la hoja correspondiente.

1 (1’5 puntos) Responde a las siguientes cuestiones de forma breve y justificando adecuadamente tus
argumentos.
a) ¿Por qué el tamaño de página debe ser siempre una potencia de 2?
b) En un sistema multiprogramado, cuando ocurre un cambio de contexto lo normal es limpiar el
contenido actual de la TLB. ¿Cuál puede ser el motivo?

2 (2’5 puntos) Tenemos una cuenta bancaria compartida, sobre la que hay procesos que ingresan y
retiran dinero, mediante estas tres operaciones:

• void ingresar ( float euros ); // incrementa en “euros” el saldo de la cuenta


• void retirar_efectivo ( float euros ); // disminuye en “euros” el saldo de la cuenta
• void cargar_recibo ( float euros ); // igual que la anterior (ver enunciado)

La cuenta tiene un saldo inicial de E euros. Si un proceso intenta retirar_efectivo() y no hay saldo
suficiente para sacar el dinero deseado, el proceso se quedará bloqueado hasta que haya saldo
suficiente. La operación cargar_recibo(), al contrario que la anterior, nunca bloquea al proceso, incluso
si la cuenta se queda en números rojos.

Los accesos a la cuenta deben hacerse en exclusión mutua para que no se corrompa el valor del saldo.

TAREA: escribir el código de estas tres operaciones, resolviendo mediante semáforos la sincronización
aquí planteada.

· Página 1 de 1
1 2 test extra NOTA

Fundamentos de los Sistemas Operativos



Convocatoria ordinaria – 26 de mayo de 2016
SEGUNDA PARTE

Nombre y apellidos DNI/NIE


DURACIÓN: Dispones de dos horas para realizar el examen.


Lee las instrucciones para el test en la hoja correspondiente.

1 (1’5 puntos) Responde a las siguientes cuestiones de forma breve y justificando adecuadamente tus
argumentos.
a) ¿Por qué el tamaño de página debe ser siempre una potencia de 2?
b) ¿Una dirección física puede corresponderse simultáneamente con varias direcciones lógicas?
Pon ejemplos.

2 (2’5 puntos) Tenemos un depósito de agua compartido por varios procesos que meten y extraen
líquido, mediante estas tres operaciones:

• void meter ( float L ); // añade L litros al depósito


• void sacar_exacto ( float L ); // extrae L litros del depósito
• void sacar_lo_que_puedas ( float L ); // igual que la anterior (ver enunciado)

El depósito tiene un nivel inicial de N litros. Las operaciones sacar_exacto() y sacar_lo_que_puedas()


intentan extraer una cierta cantidad L de agua. Si no hay agua suficiente para satisfacer la petición, las
operaciones actúan de forma distinta: ante ese caso, sacar_exacto() dejará bloqueado al proceso hasta
que haya agua suficiente, mientras que sacar_lo_que_puedas() tomará toda el agua que hay en ese
momento en el depósito y retornará sin bloquearse.

Las modificaciones del depósito deben hacerse en exclusión mutua.

TAREA: escribir el código de estas tres operaciones, resolviendo mediante semáforos la sincronización
aquí planteada.

· Página 1 de 1
1 2 3 4 NOTA

Fundamentos de los Sistemas Operativos



Convocatoria extraordinaria – 1 de julio de 2016

Nombre y apellidos DNI/NIE


DURACIÓN: Dispones de tres horas para realizar el examen.

1 (4 puntos) Responde a las siguientes cuestiones de forma breve y justificando adecuadamente


tus argumentos.
a) (0,60p) ¿Para qué se incorporó el bit de referencia a las MMU?
b) (0,60p) Explica las diferencias principales entre las llamadas pthread_create() y fork().
c) (0,40p) ¿Por qué las operaciones de un semáforo deben ser necesariamente atómicas?
d) (0,80p) Los sistemas operativos ofrecen llamadas al sistema de E/S independientes del
dispositivo. ¿Qué beneficios reporta esto al programador?
e) (0,80p) ¿En qué consiste un micronúcleo o microkernel?
f) (0,80p) ¿Mediante qué mecanismos un proceso de usuario puede conmutar de modo
usuario a modo núcleo?

2 (2 puntos) A un computador con un único procesador llega la carga de trabajo que se muestra
en la tabla. Planifica esta carga de trabajo con estos tres algoritmos: Round Robin (Q=2), SJF y SJF
expulsivo (SRTF). Para cada algoritmo, obtén el diagrama de Gantt, el tiempo medio de espera, el
número de cambios de contexto y el rendimiento de la CPU.

proceso llegada duración


A 0 4
B 1 3
C 3 1
D 9 3
E 10 1

3 (2 puntos) Tenemos una arquitectura de memoria que utiliza paginación de un solo nivel, con
las siguientes características: direcciones lógicas de 24 bits, direcciones físicas de 32 bits, tamaño
de página de 1KiB y tamaño de cada entrada en la tabla de páginas igual a 3 bytes.
(1p) En este sistema, ¿cuántos bytes ocupará la tabla de páginas de un proceso que maneja un
espacio lógico de 100 MiB? ¿Cuántos marcos de página podrá ocupar ese mismo proceso?

(0,75p) Este mismo sistema utiliza una TLB, para la que se observa una tasa de aciertos del 95%. Si
el tiempo de acceso a la TLB es de 2 nanosegundos y el tiempo medio de acceso a la RAM es de 40
nanosegundos, ¿cuál será el tiempo medio efectivo de acceso a un dato en memoria?

(0,25p) En este mismo sistema, se observa que hay 3 procesos en ejecución: uno maneja un
espacio lógico de 100 MiB, otro maneja 200 MiB y el tercero maneja 50MiB. Se observa que el
espacio físico que consumen es de 275MiB, bastante menos que la suma de los tres espacios
lógicos. Teniendo en cuenta que el sistema NO utiliza memoria virtual, ¿a qué puede ser debida
esta diferencia de tamaños?
· Página 1 de 2

4 (2 puntos) En la O.S.T.I.A. (Operating Systems Technology Innovation Agency) están


desarrollando un software para gestionar una impresora. Primero han escrito una función para
enviar un documento a la impresora (imprime_documento) y ha funcionado perfectamente.
Después han intentado escribir un programa para manejar un servidor de impresión que atiende
una cola de documentos pendientes de imprimir, tal y como se muestra más abajo.
Lamentablemente, con el código actual los documentos suelen salir mal impresos: por ejemplo, se
mezclan contenidos de distintos documentos, o se pierden documentos completos.
Ayuda la O.S.T.I.A.: ¿A qué crees que se debe el problema? Explica los motivos desde tus
conocimientos sobre programación concurrente.
Además de dar una explicación, arregla el código aquí expuesto para que los documentos se
impriman correctamente. Utiliza semáforos para lograr la sincronización que sea necesaria.

NOTA: puedes escribir tu solución en seudocódigo, no hace falta que tu algoritmo sea compilable.

1 struct Documento {
2 // ... campos con el contenido del documento
3 };
4
5 // función para imprimir directamente sobre la impresora
6 // (comprobado que funciona correctamente)
7 void imprime_documento(struct Documento* doc);
8
9 // funciones auxiliaries para manejar una cola FIFO
10 // (también funcionan correctamente)
11 void cola_añade (struct Documento* doc);
12 struct Documento* cola_extrae();
13
14 int peticiones_en_cola = 0;
15
16 // rutina del servidor de impresión
17 void servidor_impresora() {
18 while (true) {
19 while ( peticiones_en_cola == 0 ) {}
20 struct Documento* doc = cola_extrae();
21 imprime_documento(doc);
22 peticiones_en_cola--;
23 }
24 }
25
26 // función para que un proceso envíe
27 // un documento a la cola de impresión
28 void envía_cola_impresión (struct Documento* doc) {
29 peticiones_en_cola++;
30 cola_añade (doc);
31 }

Página 2 de 2
1 2 3 test extra NOTA

Fundamentos de los Sistemas Operativos


Examen parcial – 10 de abril de 2015

Nombre y apellidos DNI/NIE


SOLUCIONES
DURACIÓN: Dispone de dos horas para realizar el examen.
Lea las instrucciones para el test en la hoja correspondiente.
1 (1’25 puntos) A un planificador de CPU llegan cuatro procesos, proceso llegada duración
según el cuadro adjunto. Aplique las dos políticas SRTF y RR (q=2) y,
A 0 6
para cada una de ellas, obtenga lo siguiente:
B 1 4
 Diagrama de Gantt o similar con la planificación.
C 3 1
 Tiempo de espera y de retorno de cada uno de los procesos.
 Número de cambios de contexto realizados durante la D 5 4
planificación.

· Página 1 de 5
2 (1 punto) Los diseñadores de sistemas operativos, cuando idean políticas para gestionar el acceso a
un recurso, no pueden en general encontrar un algoritmo que optimice al mismo tiempo el
rendimiento, la seguridad y la justicia en el reparto del recurso: deben encontrar algoritmos que
lleguen a un balance entre todos estos criterios.
TAREA. Ilustre este problema con un ejemplo concreto. No use más de 200 palabras en su exposición.

Hay varios casos que se han visto en la asignatura y que se pueden aprovechar para responder a esta
cuestión. Algunos ejemplos:

Lo que ocurre cuando queremos planificar la CPU: si queremos optimizar el tiempo de espera medio,
el mejor algoritmo es el SJF, pero a cambio perjudica enormemente a los procesos de larga duración.
Si queremos dar un reparto justo y equilibrado, podemos intentar un Round Robin, pero incurre en un
mayor número de cambios de contexto y por tanto disminuye el rendimiento de la CPU respecto a
SJF. No hay una política que sea óptima en rendimiento y en justicia a la vez.

También está el caso de los algoritmos de sección crítica, que los podemos diseñar muy sencillos,
pero sin ninguna garantía de que se cumpla la exclusión mutua. En este caso, la seguridad nos hace
aumentar la complejidad de nuestras políticas. En el caso de la instrucción “test-and-set” y similares,
es fácil diseñar un algoritmo de sección crítica que cumpla sólo la exclusión mutua, pero asegurar la
espera limitada exige un algoritmo más complejo y que tarda más en ejecutarse.

Los mismos casos anteriores se pueden aplicar a cualquier recurso al que varios procesos quieran
acceder, pero que se deba utilizar de forma excluyente. Por ejemplo, una impresora. Podemos
gestionar la cola de acceso de manera que se saque más trabajo por unidad de tiempo, pero a costa
de un reparto injusto. Etcétera.

Página 2 de 5
Nombre y apellidos DNI/NIE

3 (1’75 puntos) En una agencia de meteorología


tenemos un programa multihilo que se encarga de // variables globales
float estimaciones[5] = {∞,∞,∞,∞,∞};
lanzar cinco hilos que intentan estimar por float predicción = ∞;
distintos métodos la temperatura que hará
hilo estimador(int i) { // i=0..4
mañana en Las Palmas. En cuanto dos de los cinco - Calcula la estimación por el método “i”
hilos hayan terminado, otro hilo calculará la estimaciones[i] = valor estimado
media de sus respectivas estimaciones y esa será }
la predicción definitiva. hilo predictor() {
- Espera a que terminen dos estimaciones
Los hilos utilizan un vector global para anotar sus - Calcula la media de las dos estimaciones
estimaciones, que serán leídas por el hilo predicción = media calculada
}
predictor. El cuadro adjunto muestra el esquema
general del código.

TAREA. Tiene usted que añadir el código que sea necesario para sincronizar al hilo predictor con los
hilos estimadores, utilizando semáforos como herramientas de sincronización.

Si lo considera necesario, puede crear nuevas variables o cambiar el código, siempre que se mantenga
la arquitectura general aquí expuesta.

Página 3 de 5
Para sincronizar los procesos, basta con utilizar un semáforo inicializado a cero, sobre el que el
proceso predictor hace dos operaciones WAIT consecutivas. Cada proceso estimador, según termina,
ejecuta una operación SIGNAL sobre el semáforo. De esa forma se garantiza que el predictor sigue
adelante cuando dos estimadores han finalizado.

Se adjunta un ejemplo de código que implementa esta estrategia. También se implementa la recogida
de las estimaciones desde el vector compartido.

// Este semáforo sirve para señalizar que un estimador ha terminado


Semáforo terminado = 0;

hilo estimador(int i) {
// Calcula la estimación por el método "i"
estimaciones[i] = valor_estimado;

// Avisa de que ha terminado


SIGNAL(terminado);
}

hilo predictor() {
// espera a que terminen al menos dos estimadores
WAIT(terminado);
WAIT(terminado);

// calcula la media de las dos estimaciones


// recorre la lista y encuentra dos estimaciones ya hechas
// este código no es necesario para superar el ejercicio, aunque si se
// gestiona la recogida de resultados, se obtendrá una major calificación
// OJO – en este código se asume que no hay problemas
// de acceso concurrente a estimaciones[]

float suma = 0.0;


int encontrados=0;
for (int i=0;i<5;i++) {
if (estimaciones[i] != ∞) {
suma+=estimaciones[i];
encontrados++;
if (encontrados==2) break;
}
}
float media = suma/2.0;

predicción = media;
}

Página 4 de 5
Nombre y apellidos DNI/NIE

Otra alternativa, utilizando un contador de procesos terminados y protegiendo el acceso al vector


estimados[] mediante un mutex:

// Este semáforo sirve para avisar al predictor


Semáforo puede_predecir = 0;
// Contador de estimadores terminados
int terminados = 0;
// Mutex para proteger el código crítico
Semáforo mutex = 1;

hilo estimador(int i) {
// Calcula la estimación por el método "i"

// Escribe el resultado y avisa al predictor (si es el caso)


WAIT(mutex);
estimaciones[i] = valor_estimado;
terminados++;
if ( terminados==2 ) SIGNAL(puede_predecir);
SIGNAL(mutex);
}

hilo predictor() {
// espera a que terminen al menos dos estimadores
WAIT(puede_predecir);

// calcula la media de las dos estimaciones


// recorre la lista y encuentra dos estimaciones ya hechas
// en este caso, aprovechamos el mutex para proteger el acceso al vector

float suma = 0.0;


int encontrados=0;
for (int i=0;i<5;i++) {
WAIT(mutex);
float dato = estimaciones[i];
SIGNAL(mutex);
if (dato != ∞) {
suma+=dato;
encontrados++;
if (encontrados==2) break;
}
}
float media = suma/2.0;
predicción = media;
}

Página 5 de 5
1 2 3 test extra NOTA

Fundamentos de los Sistemas Operativos


   
Convocatoria ordinaria – 28/5/2015
Primera parte

Nombre  y  apellidos     DNI/NIE  


   

DURACIÓN:  Dispone  de  dos  horas  para  realizar  el  examen.  


Lea  las  instrucciones  para  el  test  en  la  hoja  correspondiente.  
proceso   llegada   duración  
1  (1’25  puntos)  A  un  planificador  de  CPU  llegan  cuatro  procesos,  
según  el  cuadro  adjunto.  Aplique  las  dos  políticas  SRTF  y  RR  (q=3)  y,   A   0   6  
para  cada  una  de  ellas,  obtenga  lo  siguiente:   B   2   3  
• Diagrama  de  Gantt  o  similar  con  la  planificación.   C   3   1  
• Tiempo  de  espera  y  de  retorno  de  cada  uno  de  los  procesos.   D   5   4  
• Número  de  cambios  de  contexto  realizados  durante  la  
planificación.  

 
     ·∙  Página  1  de  2    
 

2 (1’25  puntos)  Explique  los  beneficios  que  se  derivan  de  que  el  sistema  operativo  ofrezca  una  
interfaz  de  acceso  a  la  E/S  que  sea  independiente  del  dispositivo  físico.  No  use  más  de  200  palabras  en  
su  exposición.  
Se trata de resaltar las ventajas que tiene en cuanto a hacer independiente el código de las
aplicaciones de los detalles concretos de implementación de los dispositivos, consiguiendo una
interfaz más simple y abstracta, y por tanto más fácil de usar para un desarrollador de aplicaciones.
Con esto aumenta la productividad de los desarrolladores y las aplicaciones resultan más sostenibles
en el tiempo: los cambios en las tecnologías de los dispositivos son resueltos por el SO sin necesidad
de reescribir las aplicaciones de usuarios. El SO también puede aprovechar para proporcionar una
interfaz más robusta (ej. que aplique control de errores físicos e incluso los corrija, o que aplique
directivas de seguridad), todo ello de forma transparente a los usuarios.
Ver diapos del primer bloque: 14, 15, 22, 23, 24.

3  (1’5  puntos)  Analice  la  validez  de  este  algoritmo  de  gestión  del  problema  de  la  sección  crítica  para  
dos  procesos.  Demuestre  razonadamente  las  conclusiones  a  las  que  llegue.  
//  variables  globales  
bool  quiere1=false,  quiere2=false;  

  Código  del  proceso  1     Código  del  proceso  2  


1   …  Sección  no  crítica  …   1   …  Sección  no  crítica  …  
2   quiere1  =  true;   2   quiere2  =  true;  
3   while  (quiere2)  {   3   while  (quiere1)  {  
4      quiere1  =  false;   4      quiere2  =  false;  
5      sleep  (  rand()%10  );   5      sleep  (  rand()%10  );  
6      quiere1  =  true;   6      quiere2  =  true;  
7   }   7   }  
8   …  SECCIÓN  CRÍTICA  …   8   …  SECCIÓN  CRÍTICA  …  
9   quiere1  =  false;   9   quiere2  =  false;  

Puede verse que si uno de los dos procesos observa que el otro tiene interés en entrar en sección crítica
(línea 3), abandona durante un tiempo aleatorio la contienda (líneas 4 y 5), para a continuación volver a
intentar entrar (líneas 6 y 3). El algoritmo asegura la exclusión mutua: si el proceso 1 ejecuta la línea 3, se
cumple que quiere1==true. Si quiere2==true, el proceso 2 está entre las líneas 3 y 8 del código, y el
proceso 1 no va a entrar en sección crítica hasta que el proceso 2 ejecute la línea 9 (por tanto, abandona la
sección crítica), o la línea 4 (el proceso abandona la lucha por entrar). Si quiere2==false, el proceso 1
podrá entrar en sección crítica y el proceso 2, si alguna vez quiere entrar en s.c., tendrá que ejecutar las
líneas 2 o la línea 6, y se mantendrá en espera en la línea 3, ya que quiere1==true. Todo este
razonamiento se puede aplicar intercambiando los procesos 1 y 2 y las respectivas variables quiere1 y
quiere2. Todo lo anterior lleva a concluir que se cumple la exclusión mutua.
Con respecto a la propiedad de progreso, puede darse el caso de que los dos procesos quieran entrar a la
vez y estén ejecutando la pausa temporal (líneas 4, 5 y 6) de manera totalmente síncrona, con pausas
idénticas. Esto provocaría que siempre las comprobaciones de la línea 3 serían ciertas y por tanto, ambos
procesos entrarían en un bucle perpetuo de verificar-abandonar por un tiempo-volver a intentarlo. Esto
implica que no se puede garantizar plenamente la propiedad de progreso. Sin embargo, si las pausas de la
línea 5 son lo bastante aleatorias, la probabilidad de que se produzca un atasco perpetuo es virtualmente
nula, así que podríamos considerar que hay progreso a efectos prácticos.
Finalmente, la propiedad de espera limitada no se puede garantizar al 100%, ya que un proceso que
acaba de salir de la sección crítica mientras el otro está interesado en entrar puede volver a entrar en
sección crítica una y otra vez. Por ejemplo, el proceso 1 puede estar en la línea 8 y el proceso 2 en la línea
5, haciendo una pausa antes de volver a intentar entrar en sección crítica. El proceso 1 podría salir de
sección crítica (línea 9) y, antes de que el proceso 2 se pueda dar cuenta, volver a ejecutar el código de
entrada (líneas 2, 3 y 7). Por tanto entraría de nuevo en sección crítica. Estos pasos se pueden dar una y
otra vez, con lo que se postergaría indefinidamente la entrada del proceso 2 en sección crítica. No
obstante, al igual que con la propiedad de progreso, la posibilidad real de que esta situación se mantenga
indefinidamente tiende a cero, con lo cual en un escenario práctico se podría considerar que no va a haber
esperas indefinidas.
    Página  2  de  2  
1 2 3 test extra NOTA

Fundamentos de los Sistemas Operativos


   
Convocatoria ordinaria – 28/5/2015
Segunda parte

Nombre  y  apellidos     DNI/NIE  


SOLUCIONES    

Dispone  de  dos  horas  para  realizar  el  examen.  Justifique  las  respuestas  que  haga  a  estos  ejercicios.  
Lea  las  instrucciones  para  el  test  en  la  hoja  correspondiente.    
1  (1,25  puntos)  Se  quiere  dar  formato  a  una  memoria  USB  de  4  gigabytes  con  un  sistema  FAT.  El  
tamaño  de  los  grupos  (clusters)  o  bloques  de  datos  será  de  4  KiB.  Se  está  dudando  si  utilizar  FAT16  o  
FAT32  (16  o  32  bits  por  enlace),  ya  que  por  un  lado  FAT16  permitiría  usar  menos  espacio  para  la  FAT,  
pero  se  teme  que  no  sea  capaz  de  direccionar  toda  la  unidad.  
• ¿Podemos  usar  FAT16,  o  necesariamente  nos  tenemos  que  ir  a  FAT32?  
• ¿Cómo  cambiaría  su  respuesta  si  el  USB  se  formateara  usando  un  tamaño  de  bloque  de  datos  
de  64KiB?  
Para saber si podemos usar FAT16, debemos calcular el número de bloques que contiene el
dispositivo y si estos pueden ser manejados con 16 bits, que dan 216 combinaciones.

El dispositivo tiene 4 gigabytes = 4×230 = 232 bytes. Los bloques miden 4 KiB = 212 bytes. Por tanto hay
un total de 232 ÷ 212 = 220 bloques. Claramente, 16 bits son insuficientes para direccionar esta cantidad
de bloques, así que tendríamos que usar FAT32.

Si el tamaño de bloque fuera de 64 KiB, habría un total de de 232 ÷ 216 = 216 bloques, que sí se podrían
direccionar con 16 bits, así que en ese caso sí se podría utilizar FAT16.

Este  USB  se  quiere  emplear  en  una  cámara  de  fotos,  que  genera  archivos  JPEG  de  un  tamaño  medio  de  
3  megabytes  (el  tamaño  exacto  varía  en  función  de  la  foto).  Suponiendo  que  usamos  grupos  de  64KiB,  
alguien  afirma  que  al  guardar  una  foto,  en  promedio  se  desperdicia  en  torno  a  un  1%  del  espacio  
asignado  en  el  disco  por  culpa  de  la  fragmentación  interna.  ¿Es  correcta  esta  afirmación?  

Si tenemos un archivo de 3 megabytes (3×220 bytes), ocupará aproximadamente 3×220 ÷ 216 = 3×24 =
48 bloques. La fragmentación interna ocurrirá siempre en el último bloque de datos del archivo y será
como mucho de un bloque. Esto nos da un porcentaje relativo en torno a la longitud del archivo de
1/48 ≈ 2%, para el peor caso. Si el caso promedio es de desperdiciar medio bloque, el desperdicio es
la mitad, o sea en torno a un 1%. Por tanto la afirmación podría ser correcta, siempre dependiendo de
cómo se distribuyen las diferentes longitudes de las fotos.

2 (1,25  puntos)  ¿Es  técnicamente  posible  que  un  procesador  maneje  un  espacio  de  direcciones  lógicas  
de  64  bits  y  direcciones  físicas  de  32  bits?  ¿Esto  es  posible  con  segmentación,  paginación  o  con  ambas  
técnicas?  ¿Qué  utilidad  podría  tener  esta  diferencia  de  tamaño  entre  el  espacio  lógico  y  el  físico?  
Los espacios de direcciones lógico y físico pueden ser diferentes en cualquier caso. En el ejemplo
propuesto, si se trata de un sistema paginado con páginas de 2P bytes, cada página lógica de 64-P
bits tendría asociado en la tabla de páginas un marco físico de 32-P bits. En el caso de un sistema
segmentado, las direcciones base de los segmentos serían números de 32 bits. No hay mayor
problema en el circuito de traducción.

Por supuesto, lo anterior implica que un programa con un espacio lógico de más de 232 bytes no
podría ser ubicado completamente en la memoria física. Esta limitación parece inútil, pero no lo es
tanto si estamos implementando un sistema de memoria virtual: un bit de validez nos puede marcar
si una página o un segmento están en la memoria principal, o por el contrario hay que localizarlos en

     ·∙  Página  1  de  3    


memoria secundaria. Así el programa puede manejar un rango de direcciones mucho mayor que lo
que puede ofrecer la RAM, y aprovechar el disco para ofrecer una extensión de la memoria.

Otra utilidad del espacio lógico mayor que el físico es permitir trabajar con tecnologías de memoria
limitadas, pero manteniendo una arquitectura de la CPU que siga funcionando igual cuando esta
tecnología permita mayores tamaños. Es lo que ocurre con los actuales sistemas x86, que trabajan
con direcciones lógicas de 64 bits, pero por el momento usan direcciones físicas de 48 bits, suficientes
para las capacidades actuales de los bancos de memoria RAM.

 
3  (1,5  puntos)  Un  ascensor  tiene  una  capacidad  
máxima  de  6  personas  y  450  kilogramos.  Se   void  sube_persona  (float  peso)  {  
quiere  simular  el  comportamiento  del  ascensor   …  esperar  si  no  se  puede  subir  
mediante  un  conjunto  de  hilos  que  actúan  como   …  subir  al  ascensor    
}  
personas  que  entran  y  salen  del  aparato.  Para  
ello,  tiene  usted  que  implementar  dos   void  baja_persona  (float  peso)  {  
operaciones,  sube_persona(peso)  y   …  bajar  del  ascensor  
baja_persona(peso).  Estas  dos  operaciones  serán   …  provocar  desbloqueos  
}  
invocadas  por  los  hilos  que  simulan  las  personas.  

La  operación  de  subir  debe  dejar  bloqueado  al  proceso  que  hace  la  llamada  mientras  el  ascensor  esté  
lleno,  o  bien  la  carga  en  kilos  no  permita  que  el  proceso  se  monte  en  el  ascensor.  La  operación  de  bajar  
debe  actualizar  el  estado  del  ascensor  y,  si  es  el  caso,  inducir  el  desbloqueo  de  otras  personas  que  
puedan  estar  esperando  para  entrar.  

TAREA.  Debe  usted  implementar  mediante  semáforos  las  acciones  de  sincronización  de  estas  
operaciones  de  subir  y  bajar.  Introduzca  las  variables  auxiliares  que  considere  necesarias.  NO  hay  que  
implementar  el  sistema  completo,  ni  los  hilos:  sólo  el  código  de  sincronización  de  estas  dos  
operaciones.  

El problema se puede resolver con la receta clásica de utilizar un mutex más una cola de espera, y
organizar un bucle while en el que se evalúa la condición de bloqueo. Nos podría quedar un código
similar a este:

//  mutex  +  cola  de  espera  por  condición  


Semáforo  mutex  =  1;  
Semáforo  cola  =  0;  
int  esperando  =  0;  
 
//  estado  del  ascensor  
int  personas_dentro  =  0;  
float  peso_dentro  =  0.0;  
 
void  sube_persona  (float  peso)  {  
   WAIT(mutex);  
   while  (  personas_dentro==6  ||  peso_dentro+peso>450  )  {  
       esperando++;  
       SIGNAL(mutex);  
       WAIT(cola);  
       WAIT(mutex);  
   }  
   personas_dentro++;  
   peso_dentro  +=  peso;  
   SIGNAL(mutex);  
}  

    Página  2  de  3  
Nombre  y  apellidos     DNI/NIE  
   
 

 
void  baja_persona  (float  peso)  {  
   WAIT(mutex);  
   personas_dentro-­‐-­‐;  
   peso_dentro  -­‐=  peso;  
   while  (esperando>0)  {  
       esperando-­‐-­‐;  
       SIGNAL(cola);  
   }  
   SIGNAL(mutex);  
}  

En esta solución, cada vez que una persona se baja del ascensor desbloquea a todas las personas
que se encuentran esperando, lo cual puede ser ineficiente (ej. si se libera una plaza y hay 20
personas esperando, es posible que sólo hiciera falta reevaluar la condición para una de las 20
personas). Este algoritmo se podría optimizar de manera que sólo se desbloquee el conjunto de
personas mínimo para que el sistema avance. Esta mejora excede lo que se puede exigir para el
limitado periodo de tiempo de un examen, pero se deja como ejercicio para quien quiera profundizar
en la práctica de la programación concurrente.

    Página  3  de  3  
 
Fundamentos de los Sistemas Operativos
Convocatoria extraordinaria, 2 de julio de 2015

Nombre  y  apellidos     DNI/NIE  


SOLUCIONES    

Dispone  de  tres  horas  para  realizar  el  examen.  Justifique  las  respuestas  que  haga  a  estos  ejercicios.  
Lea  las  instrucciones  para  el  test  en  la  hoja  correspondiente.    
1 (1  punto)  Cuando  un  fabricante  introduce  modificaciones  en  la  nueva  versión  del  núcleo  de  un  
sistema  operativo,  algunas  modificaciones  requieren  cambios  en  la  API  del  núcleo,  mientras  que  otras  
ocurren  de  forma  transparente.  Por  ejemplo,  si  modificamos  la  política  de  asignación  de  espacio  en  
disco  de  FAT  a  contigua,  los  procesos  podrán  seguir  utilizando  la  misma  API  para  trabajar  con  ficheros.  
Pero  si  en  un  sistema  que  no  utiliza  carpetas  le  añadimos  esa  funcionalidad,  tendremos  que  cambiar  la  
API  (por  ejemplo  con  llamadas  para  crear  y  borrar  carpetas).  
A  continuación  se  muestran  algunos  escenarios  de  cambio  en  el  núcleo.  Para  cada  uno  de  ellos,  
indique  si  la  modificación  requiere  necesariamente  cambios  en  la  API  del  núcleo  y,  en  tal  caso,  en  qué  
línea  deberían  ir  los  cambios.  Para  ayudar  a  imaginarse  estos  escenarios,  piense  en  el  sistema  
operativo  que  hemos  empleado  en  la  asignatura  (Unix/Linux).  

Esta pregunta es bastante abierta y no hay una solución «perfecta y canónica». Si se argumenta
adecuadamente, puede haber contestaciones afirmativas o negativas a cada cuestión. Aquí se dan
algunos ejemplos.
Para considerar como correcta una respuesta, basta con que se responda de forma coherente, no
hace falta dar tanto detalle como en las respuestas aquí escritas.
Se considera totalmente superada esta pregunta si se han respondido correctamente 5 de los 6
escenarios.

Escenarios  de  cambio:  


a) Se  cambia  la  política  de  planificación  de  procesos  de  Round-­‐Robin  a  SJF.  
No debería cambiar la API: los usuarios seguirán lanzando sus procesos y el SO los planificará de otro
modo.
Pero podría haber algún cambio de API si el SO permitía parametrizar el planificador (ej. Controlar el
tamaño del cuanto de tiempo del Round Robin).

b) Se  aumenta  el  máximo  número  de  procesos  que  admite  el  sistema,  de  16  a  256.  
No debería cambiar la API.

c) A  un  núcleo  que  sólo  gestiona  procesos  pesados  se  le  añade  la  posibilidad  de  manejar  procesos  
ligeros  (hilos).  
Hay que proporcionar una nueva API para que el usuario pueda crear y finalizar procesos ligeros
dentro de su proceso pesado.

d) Se  cambia  la  política  de  reemplazo  de  memoria  virtual.  


No debería afectar a la API, ya que el reemplazo de páginas ocurre de forma transparente a los
usuarios. No obstante, podría haber algún cambio en la API si el SO permite a los usuarios gobernar o
consultar algún parámetro del sistema de memoria virtual.

e) A  un  sistema  de  archivos  que  sólo  trabaja  mediante  acceso  secuencial  se  le  añade  la  posibilidad  
de  usar  acceso  directo.  
Hay que proporcionar nuevas llamadas para poder hacer accesos directos a cualquier posición dentro
de un fichero.

     ·∙  Página  1  de  5    


f) El  sistema  sólo  gestionaba  semáforos  binarios  y  ahora  permite  semáforos  generales.  
Depende de cómo fuera la API de semáforos binarios. Si la API sólo ofrecía servicios básicos de
creación, WAIT y SIGNAL, se pueden mantener con la misma interfaz, aunque su comportamiento
variará. Si la API estaba muy adaptada a los semáforos binarios, habrá que hacer algún cambio, por
ejemplo si para crear un semáforo tenía sendos servicios para «crear semáforo inicializado a cero» y
«crear semáforo incializado a uno».

2  (0,75  puntos)  Se  quiere  dar  formato  a  una  memoria  USB  de  4  gigabytes  con  un  sistema  de  archivos  
que  admite  estos  dos  modelos  de  asignación  de  espacio:  indexado  simple  (un  solo  nivel)  y  FAT.  En  
ambos  casos,  se  trabaja  con  enlaces  de  16  bits  y  con  bloques  de  datos  de  64  KiB.  
Para  cada  uno  de  los  dos  modelos  planteados,  calcule:  
• El  tamaño  máximo  que  puede  llegar  a  tener  un  archivo.  
• Cuántos  bloques  en  total  ocupará  un  fichero  de  100.000  bytes.  
Para el sistema indexado simple, tenemos que los enlaces del archivo se almacenan en un único
bloque de índices, que tendrá 64 KiB. Los enlaces ocupan 16 bits = 2 bytes, así que cada bloque
puede guardar hasta 64 KiB / 2 bytes = 32 Ki enlaces. Por tanto un archivo puede tener hasta 32 KiB
bloques de 64 KiB, lo que da un total de 32Ki×64Ki = 215×216 = 231 bytes = 2 GiB.

El archivo de 100.000 bytes necesita 2 bloques de datos para guardar su contenido. Además hace
falta un bloque para los índices, así que en total este archivo ocupa 3 bloques.

Para el sistema FAT, no hay más restricción para el tamaño máximo que el número de enlaces
posibles, que es de 216. Por tanto un archivo puede llegar a tener 216 bloques, cada uno de 64Ki = 216
bytes, lo que da un total de 216×216 = 232 bytes = 4 GiB.
NOTA: en un sistema FAT real, algunos valores de los enlaces estarán reservados, p.ej. para marcar
el fin de fichero o un bloque erróneo, así que la cantidad real será algo menor.

En el caso de la FAT, el archivo de 100.000 bytes ocupará dos bloques. Aparte se consumirán dos
enlaces de la FAT: esto normalmente no se contabiliza en la ocupación del archivo, ya que la FAT es
una estructura global de tamaño fijo.

    Página  2  de  5  
Nombre  y  apellidos     DNI/NIE  
   
 

3  (0,75  puntos)  Describa  cuál  es  la  utilidad  del  bit  de  referencia  en  los  sistemas  de  memoria  virtual.  
¿Cuáles  serían  las  consecuencias  de  no  disponer  de  este  bit?  
Tal y como se describe en la literatura sobre sistemas de gestión de memoria virtual, el bit de
referencia se creó para poder implementar algoritmos de reemplazo eficientes, que no requieran un
coste de implementación hardware elevado. Mediante el bit de referencia, el hardware marca aquellas
páginas que se han estado accediendo recientemente: de esta forma se pueden implementar
algoritmos que clasifiquen las páginas en función de su patrón de accesos reciente (ej. NRU, algoritmo
del reloj o 2ª oportunidad, WSClock…).

Si no dispusiéramos del bit de referencia, sería complicado implementar algoritmos eficientes de


reemplazo, que se aproximen al óptimo. Sabemos que la política LRU es una buena aproximación al
óptimo, pero si no tenemos información de cuáles son las páginas recientemente accedidas, no
podemos implementar ni LRU ni aproximaciones a él.

 
4  (1,5  puntos)  Tenemos  un  depósito  de  agua  con  una  capacidad  de  10.000  litros.  Sobre  este  depósito  
se  han  definido  dos  operaciones,  mete_agua(L)  y  saca_agua(L),  respectivamente  para  añadir  o  extraer  
una  cantidad  de  agua  (L)  del  depósito.  Estas  operaciones  pueden  ser  invocadas  por  hilos  concurrentes  
y  se  quiere  asegurar  un  funcionamiento  sincronizado,  de  manera  que  un  hilo  que  trate  de  meter  más  
agua  de  la  que  cabe  en  el  depósito,  deberá  esperarse  hasta  que  haya  hueco  suficiente.  Análogamente,  
un  hilo  que  intente  sacar  agua  deberá  esperar  
void  mete_agua  (float  litros)  {  
a  que  haya  suficiente  cantidad  de  agua.  
…  si  el  depósito  se  rebosa,  esperar  
TAREA.  Debe  usted  implementar  mediante   …  añadir  el  agua  al  depósito  
…  desbloquear  si  hay  otros  hilos  esperando  
semáforos  las  acciones  de  sincronización  de  
}  
estas  dos  operaciones.  Introduzca  las  variables  
void  saca_agua  (float  litros)  {  
auxiliares  que  considere  necesarias.  NO  hay  
que  implementar  el  sistema  completo,  ni  los   …  esperar  hasta  que  haya  agua  suficiente  
…  retirar  el  agua  del  depósito  
hilos:  sólo  el  código  de  sincronización  de  estas  
…  desbloquear  si  hay  otros  hilos  esperando  
dos  operaciones.   }  

    Página  3  de  5  
A continuación se presenta una posible solución a este problema. Se emplea el patrón clásico de un
mutex para proteger los datos compartidos y una cola para mantener a los procesos bloqueados. Se
implementan dos colas: una para los procesos que quieren meter agua y otra para los que quieren
sacar agua.

const  float  TOPE  =  10000.0;  


float  agua_actual  =  0.0;  
 
Semáforo  mutex  =  1;  
Semáforo  colameter  =  0;  
int  parameter  =  0;  
Semáforo  parasacar  =  0;  
int  parasacar  =  0;  
 
void  mete_agua  (float  litros)  {  
  WAIT(mutex);  
  while  (agua_actual  +  litros  >  TOPE)  {  
    parameter++;  
    SIGNAL(mutex);  
    WAIT(colameter);  
    WAIT(mutex);  
  }  
  agua_actual  +=  litros;  
  while  (parasacar>0)  {  
    parasacar-­‐-­‐;  
    SIGNAL(colasacar);  
  }  
  SIGNAL(mutex);  
}  
 
void  saca_agua  (float  litros)  {  
  WAIT(mutex);  
  while  (agua_actual  <  litros)  {  
    parasacar++;  
    SIGNAL(mutex);  
    WAIT(colasacar);  
    WAIT(mutex);  
  }  
  agua_actual  -­‐=  litros;  
  while  (parameter>0)  {  
    parameter-­‐-­‐;  
    SIGNAL(colameter);  
  }  
  SIGNAL(mutex);  
}  
 

    Página  4  de  5  
Nombre  y  apellidos     DNI/NIE  
   
 

Esta es otra solución basada en el algoritmo anterior, pero simplificado para usar una sola cola de
espera.

Semáforo  mutex  =  1;  


Semáforo  cola  =  0;  
int  esperando  =  0;  
 
void  esperar()  {  
  esperando++;  
  SIGNAL(mutex);  
  WAIT(cola);  
  WAIT(mutex);    
}  
 
void  avisar  ()  {  
  while  (esperando>0)  {  
    esperando-­‐-­‐;  
    SIGNAL(cola);  
  }  
}  
 
void  mete_agua  (float  litros)  {  
  WAIT(mutex);  
  while  (agua_actual  +  litros  >  TOPE)  {  
    esperar();  
  }  
  agua_actual  +=  litros;  
  avisar();  
  SIGNAL(mutex);  
}  
 
void  saca_agua  (float  litros)  {  
  WAIT(mutex);  
  while  (agua_actual  <  litros)  {  
    esperar();  
  }  
  agua_actual  -­‐=  litros;  
  avisar();  
  SIGNAL(mutex);  
}  

    Página  5  de  5  
1 2 3 test extra NOTA

Fundamentos de los Sistemas Operativos


Examen parcial – 10 de abril de 2014

Nombre y apellidos DNI/NIE


SOLUCIONES
DURACIÓN: Dispone de dos horas y media para realizar el examen.
1 (1,5 puntos) Tenemos un planificador de procesos que utiliza cuatro clases de prioridad, numeradas de
la 0 a la 3, en orden descendente de prioridad. El algoritmo de planificación es un Round-Robin para las
clases 0, 1 y 2. La clase 3 utiliza un FCFS. Los cuantos de tiempo de las clases 0, 1 y 2 son de 1, 2 y 3
milisegundos, respectivamente. El algoritmo de planificación entre colas es expulsivo: siempre recibe
atención la cola más prioritaria que tenga procesos preparados.
Un proceso que entra en el sistema es ubicado inicialmente en la clase 0. La prioridad de los procesos se va
degradando de la siguiente forma: un proceso permanece en la clase C hasta que haya consumido dos turnos
de CPU, tras lo cual es degradado a la clase C+1. Cuando un proceso alcanza la clase 3 permanece en ella
hasta que termina su ejecución.
TAREA: Obtener el rendimiento de CPU, el tiempo de retorno medio y la clase en la que terminan tres
procesos, P1, P2 y P3, que llegan en el mismo instante y con duraciones respectivas 4, 8 y 12 milisegundos.
Una política como la aquí descrita, ¿qué ventaja tendría en un sistema real sobre un Round-Robin simple?

Los tiempos de retorno son, en milisegundos: P1=8; P2=18; P3=24.


Por tanto el tiempo medio de retorno es (8+18+24)/3 = 50/3 = 16,67 milisegundos.
P1 termina en la clase 1; P2 termina en la clase 2; P3 termina en la clase 2.
El rendimiento de la CPU es del 100% (no ha habido tiempos ociosos en toda la ejecución).
A continuación se muestra una simulación temporal de la ejecución para sostener los resultados
anteriores:
0   1   2   3   4   5   6   7   8   9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24  
 P1   x           x           x   x                                                                      
P2       x           x               x   x           x   x           x   x                              
P3           x           x                   x   x           x   x           x   x   x   x   x   x      

En un sistema real, un algoritmo como este podría tener cierto beneficio para primar a los procesos
recién llegados y a los que consumen muy pocos milisegundos de tiempo de CPU en unas pocas
ráfagas (menos de cuatro ráfagas). Para un caso real, en el que los procesos suelen entrar y salir
muchas veces de la CPU para resolver operaciones de E/S, acabaría ocurriendo que gran parte de los
procesos acabarían rápidamente en la clase 3 y por tanto serían tratados con un FCFS. Por tanto este
sistema no aporta una ventaja clara sobre un Round-Robin simple: más bien lo convierte de hecho en
un FCFS y además con una implementación más compleja.

     ·∙  Página  1  de  3    


2 (1 punto) Analice la validez de este algoritmo de gestión del problema de la sección crítica para dos
procesos. Demuestre razonadamente las conclusiones a las que llegue, no deje nada sin justificar.
//  Variables  enteras  globales  
int  flag0=1,  flag1=1,  turno=3;  

1   Proceso  P0()  {   1   Proceso  P1()  {  


2    for(;;)  {   2    for(;;)  {  
3        flag0  =  0;   3        flag1  =  0;  
4        turno  =  0;   4        turno  =  1;  
5        while  (flag1==0)  &&  (turno==1)  {   5        while  (flag0==0)  &&  (turno==0)  {  
6            null;   6            null;  
7        }   7        }  
8        SECCIÓN  CRÍTICA   8        SECCIÓN  CRÍTICA  
9        flag0  =  1;   9        flag1  =  1;  
10    }   10    }  
11   }   11   }  

SOLUCIÓN
El algoritmo propuesto es similar a la solución de Peterson al problema de la sección crítica para dos
procesos. La única diferencia está en la inicialización de la variable turno que cada proceso realiza en
la línea 4. Mientras que en la solución propuesta por Peterson cada proceso asigna a turno el “id” del
otro proceso, en la propuesta que figura en el ejercicio cada proceso inicializa turno a su propio “id”.

Esta modificación afecta de manera determinante a la propiedad de exclusión mutua. Supongamos


que inicialmente el proceso P0 entra en su sección crítica. En este caso el estado de las variables
globales sería el siguiente: flag0 es igual a cero, flag1 es igual a uno y turno es igual a cero. Si ocurre
un cambio de contexto mientras el proceso P0 se encuentra en su sección crítica y el proceso P1
ejecuta el preprotocolo para intentar entrar en su sección crítica, el estado de las variables globales
tras la ejecución de las líneas 3 y 4 en P1 sería el siguiente: flag0 es igual a cero, flag1 es igual a cero
y turno es igual a uno. En este caso, el proceso P1 rebasaría el bucle de la línea 5 y entraría
igualmente en su sección crítica, violando por tanto el principio de exclusión mutua al estar ambos
procesos en sus secciones críticas.

Por tanto, al no cumplirse la propiedad de exclusión mutua podemos confirmar que no se trata de una
solución válida al problema de la sección crítica.

    Página  2  de  3  
Nombre y apellidos DNI/NIE

3 (1,5 puntos) Un ordenador está conectado a un servidor de tres impresoras idénticas. El estado del
servidor se define mediante un vector llamado printers[]. Cada elemento corresponde a una impresora.
El valor -1 inicial significa que la impresora está libre. Un proceso que desea usar la impresora debe ejecutar
un procedimiento Get_Printer(pid). Cuando finaliza debe ejecutar otro procedimiento llamado
Release_Printer(pid). En el cuadro adjunto se muestra el uso típico de una impresora.
TAREA: Escribir el código de ambos procedimientos e //  Variables  enteras  globales  
implementar con semáforos las sincronizaciones int  printers[3]=  {-­‐1,-­‐1,-­‐1};  
necesarias para que se cumplan estos requisitos:
Proceso  Pn()  {  
• Si un proceso quiere utilizar una impresora y no hay    ...  
ninguna disponible, el proceso debe esperar hasta    Get_Printer(pid);  
que alguna impresora quede libre.
   //  Usa  la  impresora  
• No puede haber más de un proceso utilizando una
misma impresora.    Release_Printer(pid);  
• Mientras un proceso está utilizando una impresora,    ...  
en la posición del vector printers debe }  
almacenarse su pid.

SOLUCIÓN
Esta es una posible solución al ejercicio planteado, escrita en C.
#define  NPRINTERS  3  
Semáforo  libres  =  NPRINTERS;  
Semáforo  cerrojo  =  1;  
int  printers[NPRINTERS]  =  {  -­‐1,  -­‐1,  -­‐1  };  
 
void  Get_Printer  (int  pid)  {  
   P(libres);  
   P(cerrojo);  
   for  (int  i=0;  i<NPRINTERS;  i++)  {  
       if  (printers[i]==-­‐1)  {  
           printers[i]  =  pid;  
           break;  
       }  
   }  
   V(cerrojo);  
}  
 
void  Release_Printer  (int  pid)  {  
   P(cerrojo);  
   for  (int  i=0;  i<NPRINTERS;  i++)  {  
       if  (printers[i]==pid)  {  
           printers[i]  =  -­‐1;  
           break;  
       }  
   }      
   V(cerrojo);  
   V(libres);  
}  

    Página  3  de  3  
1 2 3 test extra NOTA

Fundamentos de los Sistemas Operativos


Examen convocatoria ordinaria
27 de mayo de 2014 – PRIMERA PARTE

Nombre y apellidos DNI/NIE


SOLUCIONES
DURACIÓN: Dispone de 100 minutos para realizar el examen.

1 (1 punto) Responda a las siguientes cuestiones, de manera justificada:


a) (0,5 puntos) ¿Para qué sirven las interrupciones? ¿Cuáles son las diferencias entre una excepción (trap) y
una interrupción? ¿Puede un programa de usuario generar de forma intencionada alguna excepción? Si así
fuera ¿con qué propósito lo haría?
Una interrupción es un evento del hardware que supone un cambio en el flujo de ejecución. Cuando
ocurre una interrupción, la ejecución del código en curso se detiene temporalmente y se transfiere el
control a la rutina de manejo de interrupción correspondiente; cuando ésta termina, el control se
devuelve al código que fue interrumpido para que este continúe su ejecución. Una excepción es una
interrupción generada por software. Una interrupción puede usarse para indicar que se ha completado
una operación de E/S, eliminando así la necesidad de interrogar repetidamente al dispositivo (polling).
Una excepción puede usarse para invocar servicios del sistema operativo (llamadas al sistema) o para
tratar errores aritméticos (división por cero, desbordamientos, …).

b) (0,5 puntos) ¿Cuál es el propósito de las llamadas al sistema y cómo se relacionan éstas con el S.O. y con
el concepto de modo dual de operación?
Las llamadas al sistema son la interfaz del S.O. para los programas en ejecución, es decir, son los
mecanismos que utilizan los programas en ejecución para solicitar servicios al núcleo del sistema
operativo de tal forma que cuando un proceso realiza una llamada al sistema, el S.O. recupera el
control y se conmuta de modo no privilegiado a modo privilegiado.

2 (1,5 puntos) Sea un sistema con dos CPUs (CPU0 y CPU1) y con multiprocesamiento simétrico (SMP).
En un sistema SMP, las CPUs pueden usarse indistintamente para ejecutar cualquier tipo de tarea y una
tarea puede ejecutarse indistintamente en cualquier CPU. Es posible, e incluso probable, que un mismo
proceso use ambas CPU a lo largo de su ejecución, aunque no de manera simultánea. La política de
planificación de este sistema es turno rotatorio (round robin) con cuanto de 3 u.t. Suponga que el sistema
recibe la carga de trabajo que se muestra más abajo.
Teniendo en cuenta lo siguiente:
• Hay una sola cola de preparados.
• Todos los recursos de E/S son compartibles (dos o más procesos pueden hacer uso simultáneo de
cualquier recurso de E/S).
• En caso de que dos procesos deban acceder en el mismo instante a una CPU y sólo haya una
disponible, se le concederá al proceso de menor numeración.
• En caso de que, en un instante dado, un proceso pueda ocupar cualquiera de las dos CPUs (por
encontrarse ambas desocupadas), se le concederá la misma que ocupó por última vez.
Se pide:
• Dibujar el diagrama de Gantt, reflejando claramente qué proceso ocupa qué CPU en cada instante.

     Página  1  de  4    
• Calcular el tiempo medio de retorno y el tiempo medio de espera.
• Calcular el rendimiento de cada CPU, considerando como tiempo final el instante en el que termina
el último proceso y como tiempo inicial t=0
Carga  de  trabajo  
Proceso   Instante   Ráfaga  de   Ráfaga  de   Ráfaga  de  
de  llegada   CPU   E/S   CPU  
P0   0   4   4   3  
P1   2   4   4   4  
P2   2   4   3   3  

Respuesta:

Tiempos (u.t.)
Espera Retorno
P0 2 13-0=13
P1 3 17-2=15
P2 1 13-2=11
Media 2 13

Rendimientos:

CPU0: (3+4+3)/17 = 10/17 ≈ 58.8%


CPU1: (3+1+1+3+4)/17 = 12/17 ≈ 70.6%

    Página  2  de  4  
Nombre y apellidos DNI/NIE

3 (1,5 puntos) a) (0,5 puntos) Suponga una propuesta de solución por software al problema de la sección
crítica. Explique y describa las tres propiedades que debe cumplir para considerarla una propuesta válida.
¿Es posible que la solución propuesta cumpla la propiedad de progreso y no se cumpla la propiedad de
espera limitada? Justifique su respuesta.
Para que una solución por software al problema de la sección crítica sea válida, debe cumplir tres
propiedades:
Exclusión mutua: si un proceso está ejecutando una sección crítica, no se permitirá que otros
procesos ejecuten sus secciones críticas.
Progreso: si varios procesos quieren entrar en sus secciones críticas, sólo entrará uno y en la
decisión de cuál será sólo intervendrán los procesos que tienen intención de entrar. Además, esta
decisión se debe tomar en un tiempo finito.
Espera limitada: todo proceso que tenga intención de entrar en su sección crítica, lo hará después de
un número de intentos finito.
Sí es posible. Puede ocurrir que en una solución se cumpla la propiedad de progreso y no se cumpla
la espera limitada. Supongamos que la decisión de entrar en las secciones críticas dependan de los
procesos que desena entrar y que esta decisión se tome en un tiempo finito, es decir, que se cumpla
la propiedad de progreso. Podría ocurrir que la solución propuesta haga que la decisión se tome
siempre a favor de uno o varios procesos y que un proceso pueda quedar postergado indefinidamente.
Se trataría de una situación en la que se estaría cumpliendo la propiedad de progreso pero no la
propiedad de espera limitada.

b) (1,0 punto) Suponga que tenemos un vector global de N elementos enteros que van a ser sumados de
forma concurrente por dos hilos. Empleando semáforos como herramienta de sincronización proponga
una solución que desarrolle la tarea propuesta teniendo en cuenta que:
a. Un mismo número no puede sumarse dos veces.
b. Cada hilo va tomando elementos consecutivos del vector y los va sumando, siempre
asegurándose de no usar elementos que el otro hilo ya haya sumado.
c. Uno de los hilos y sólo uno debe mostrar la suma total.
d. El proceso pesado que crea los hilos debe mostrar un mensaje al comenzar la prueba y otro
cuando los hilos hayan terminado.
NOTA: Se podrá alcanzar una puntación máxima de 1,0 punto si la solución propuesta emplea la biblioteca
pthreads para resolver el problema. En ese caso puede asumir que se dispone de una biblioteca que
implementa semáforos y puede usted elegir la notación que prefiera (por ejemplo, la ofrecida este curso en
la práctica de hilos, semáforo.h). En caso de que opte usted por expresar la solución mediante lenguaje
algorítmico (sin hacer uso de la biblioteca pthreads), la puntuación máxima que se podrá obtener en este
apartado será de 0,75 puntos.

SOLUCIÓN
Esta es una posible solución al ejercicio planteado, escrita en C. La notación usada para expresar las
operaciones con semáforos es la que se ha ofrecido este curso en el fichero semáforo.h.
#include  <stdio.h>  
#include  <pthread.h>  
#include  <stdlib.h>  
#include  “semáforo.h”  
 

    Página  3  de  4  
//  Variables  globales  
const  int  TAM=100;  //  Tamaño  del  vector  
int  sum;  //  Variable  que  almacena  la  suma  de  elementos  
int  índice;  //  Índice  que  indica  el  siguiente  elemento  a  sumar  
int  mostrartotal  //  Flag  que  se  emplea  para  saber  si  ya  se  ha    
                                 //  mostrado  el  total  por  parte  de  uno  de  los  hilos  
Semaforo  mutex;  //  Semáforo  para  garantizar  la  exclusión  mutua  
 
void*  Hilo_Sumador(void*  nada)  {  
   while  (true)  {  
//  Hacemos  una  operación  WAIT  sobre  mutex  para  garantizar  exclusión  
//  mutua  en  el  acceso  al  vector  
       WAIT(&mutex);  
       if  (indice==TAM)  {  
                 if  (mostrartotal)  {  
                       printf(“La  suma  total  del  vector  es:  %d\n”,  sum);  
                       mostrartotal=0;  
                 }  
                 SIGNAL(&mutex);  
                 break;  
           }  
       sum=sum+vec[indice];  
       indice++;  
       SIGNAL(&mutex);  
   }  
}  
 
main()  
{  
   pthread_t  hilo1,  hilo2;  
   void*  dummy;  
 
//  Inicializamos  la  variables  globales  
   sum=0;  
   índice=0;  
   mostrartotal=1;  
   INICIASEM  (&mutex,  1)  
 
//  Lanzamos  los  dos  hilos  sumadores  
   printf("Comienza  la  operación  de  suma  ...\n");  
   pthread_create(&hilo1,NULL,  Hilo_Sumador,NULL);  
   pthread_create(&hilo2,NULL,  Hilo_Sumador,NULL);  
 
//  Esperamos  por  la  finalización  de  los  dos  hilos  para  mostrar  el    
//  mensaje  final  
   pthread_join(hilo1,&dummy);  
   pthread_join(hilo2,&dummy);  
 
   printf("Fin  de  la  prueba  de  hilos\n");  
}  

    Página  4  de  4  
1 2 3 test extra NOTA

Fundamentos de los Sistemas Operativos


Examen de convocatoria ordinaria
27 de mayo de 2014 – SEGUNDA PARTE

Nombre y apellidos DNI/NIE


SOLUCIONES
DURACIÓN: Dispone de 100 minutos para realizar el examen.

1 (2 puntos) Tenemos un búfer compartido en el que depositan elementos dos procesos productores P1 y
P2, y del que extraen elementos dos consumidores C1 y C2, de forma que el consumidor C1 sólo puede
consumir elementos producidos por P1 y el consumidor C2 elementos producidos por P2. El búfer tiene
una capacidad limitada de N elementos. Si un productor se encuentra el búfer lleno, debe esperar a que se
abra un hueco.
Proponer una solución, empleando semáforos como herramienta de sincronización, de forma que los
elementos se consuman siguiendo una política global FIFO, es decir, si existen elementos de los dos tipos
en el vector, deberá intervenir en primer lugar el consumidor cuyo tipo coincida con el tipo del siguiente
elemento a consumir siguiendo un orden FIFO.

SOLUCIÓN
Esta es una posible solución al ejercicio planteado, escrita en C.
//  Variables  globales  
#define  TAM_BUFFER  100  
typedef  Elemtype  …..;  
//  Búfer  para  almacenar  los  elementos  
Elemtype  buffer[TAM_BUFFER];  
//  Búfer  que  indica  el  tipo  de  elemento  almacenado  en  cada    
//  posición:  1  para  elementos  de  tipo  1,  2  para  elementos  de    
//tipo  2  y  -­‐1  cuando  la  posición  está  libre  
int  buffer_type[TAM_BUFFER]=[-­‐1,  -­‐1,  -­‐1,  …….-­‐1];  
//  Indices  marcadores  de  las  posiciones  de  entrada  y  salida  de    
//  elementos  
int  in=0,out=0;  
//  Semáforo  para  controlar  el  número  de  elementos  tipo  1    
//  almacenados  en  el  búfer  
Semaforo  full_type1=0;  
//Semáforo  para  controlar  el  número  de  elementos  tipo  2    
//  almacenados  en  el  búfer  
Semaforo  full_type2=0;  
//  Semáforo  para  controlar  el  número  de  huecos  libres  en  el    
//  búfer  
Semaforo  empty=TAM_BUFFER;  
//  Cola  de  espera  para  el  consumidor  tipo1  cuando  el  siguiente    
//  elemento  a  consumir  es  de  tipo2  
Semaforo  queue_type1=0;  
//  Cola  de  espera  para  el  consumidor  tipo2  cuando  el  siguiente    
//  elemento  a  consumir  es  de  tipo1  
Semaforo  queue_type2=0;  
//  Semáforo  para  garantizar  exclusión  mutua  en  el  acceso  a  las    
//variables  compartidas  
Semaforo  mutex=1;  
   

     Página  1  de  5    
 
//  Variables  para  indicar  si  los  procesos  consumidores  de  tipo  1    
//  y  2  están  bloqueados  en  los  semáforos  queue_type1  y    
//  queue_type2  respectivamente  
int  c1_bloq=0;  
int  c2_bloq=0;  
   
Process  P1()  {   Process  P2()  {  
Elemtype  elem;   Elemtype  elem;  
   
   while  (true)  {      while  (true)  {  
       //  Producir  elem            //  Producir  elem  
//  Si  el  búfer  está  lleno,  esperamos   //  Si  el  búfer  está  lleno,  esperamos  
       wait(empty);            wait(empty);    
       wait(mutex);          wait(mutex);  
       buffer(in)=elem;          buffer(in)=elem;  
       buffer_type(in)=1;          buffer_type(in)=2;  
       in=(in+1)%TAM_BUFFER;          in=(in+1)%TAM_BUFFER;  
       signal(mutex);          signal(mutex);  
//  Avisamos  que  hemos  introducido  un   //  Avisamos  que  hemos  introducido  un  
//  elemento  de  tipo1   //  elemento  de  tipo2  
       signal(full_type1);          signal(full_empty2);  
   }      }  
}   }  
   
Process  C1()  {   Process  C2(){  
Elemtype  elem;   Elemtype  elem;  
   
   while  (true)  {      while  (true)  {  
       wait(full_type1)          wait(full_type2)  
       wait(mutex);          wait(mutex);  
       if  (buffer_type(out)==2)  {          if  (buffer_type(out)==1)  {  
           c1_bloq=1;              c2_bloq=1;  
           signal(mutex);              signal(mutex);  
           wait(queue_type1);              wait(queue_type2);  
       }          }  
       elem=buffer(out);          elem=buffer(out);  
       buffer_type[out]=-­‐1;          buffer_type[out]=-­‐1;  
       out=(out+1)%TAM_BUFFER;          out=(out+1)%TAM_BUFFER;  
       if  (buffer_type[out]==2  &&          if  (buffer_type[out]==1  &&  
c2_bloq)  {   c1_bloq)  {  
               c2_bloq=0;                  c1_bloq=0;  
               signal(empty_type2);                  signal(empty_type1);  
           }              }  
       signal(mutex);          signal(mutex);  
       signal(empty);          signal(empty);  
   
   //  Consumir  elem      //  Consumir  elem  
   }      }  
}   }  

    Página  2  de  5  
2 (1 punto) La familia de procesadores de Intel x86 utiliza direcciones lógicas y físicas de 32 bits y una
memoria paginada de dos niveles. La dirección lógica se estructura de la siguiente forma:
0                                              9   10                                          19   20                                  31  
Nivel  1   Nivel  2   Desplazamiento  

Cada entrada de las tablas de páginas ocupa 4 bytes, en ambos niveles.


Suponga que en Intel han decidido ofrecer un modelo de direcciones lógicas y físicas de 48 bits. Para
adaptar el actual esquema de paginación de 32 bits, los ingenieros de Intel proponen tres alternativas:
A. Aumentar el tamaño dedicado al desplazamiento dentro la página, de 12 bits a 28 bits. Esquema:
[10|10|28]
B. Aumentar el tamaño dedicado a los dos niveles de paginación, de 10 bits a 18 bits cada uno.
Esquema: [18|18|12]
C. Añadir más niveles de tablas, pasando de dos a cuatro niveles jerárquicos. Cada nivel ocupa 9 bits
dentro de la dirección lógica. Esquema: [9|9|9|9|12]
En todos los casos, las entradas de las tablas de páginas pasarán a ocupar 8 bytes, dado que las direcciones
físicas son más anchas.
Intel recurre a usted, como experto en sistemas operativos, para que valore el impacto que tiene cada una de
las alternativas en las prestaciones del sistema.
TAREA. Tiene usted que elaborar un informe de unas 500 palabras que explique el impacto de las tres
alternativas en el diseño del procesador, en el rendimiento de la ejecución de los procesos y en el sistema
operativo. En su exposición, considere estos aspectos:
• Cambios estructurales en las tablas de traducción de direcciones y el tamaño de página.
• Cambios en la eficiencia en la traducción dinámica de direcciones.
• Impacto en el diseño del sistema operativo: impacto en factores tales como la fragmentación,
espacio consumido por los procesos, velocidad de carga y ejecución de los procesos, etc.

En la alternativa (A) resulta un tamaño de página de 228 = 256 megabytes. Este tamaño parece
desproporcionado para las capacidades típicas de las memorias principales que nos encontramos en
2014. Por ejemplo, una RAM de 8GB tendría 32 páginas: si cada proceso en ejecución debe tener
reservada al menos una página en exclusiva, esto limita muchísimo la cantidad de procesos que
pueden residir en el sistema. Por otro lado, la fragmentación interna alcanzaría dimensiones
excesivas, teniendo en cuenta los tamaños típicos que manejan los procesos en los sistemas
operativos actuales.
En cuanto a las tablas de páginas, se observa que la alternativa (B) genera tablas muy grandes, que
ocupan varias páginas contiguas. Lo podemos ver calculando cuál es el tamaño máximo que puede
tener una tabla en cada alternativa:
.- Alternativa A: 10 bits por nivel. 210 entradas × 8 bytes = 8KB.
.- Alternativa B: 18 bits por nivel. 218 entradas × 8 bytes = 2MB.
.- Alternativa C: 9 bits por nivel. 29 entradas × 8 bytes = 4KB.
En las alternativas (A) y (C), las tablas nunca ocuparán más de una página contigua. Pero en la
alternativa (B), con páginas de 4KB, una tabla puede llegar a ocupar nada menos que 512 páginas
contiguas. Esto complica la gestión del espacio libre, ya que muchas tablas requerirán buscar varios
marcos de página consecutivos.
A grandes rasgos, parece que la alternativa (C) requiere más cambios en el hardware, pero es la que
menos impacta en el aprovechamiento de la memoria principal. Las otras dos alternativas producen
problemas importantes de fragmentación.

NOTA histórica: el esquema definido por la arquitectura x86-64 es precisamente la alternativa (C).

     Página  3  de  5    
3 (1 punto) Tenemos un sistema de archivos tipo UNIX en el que para localizar los bloques de un archivo
se utilizan 11 entradas directas, una entrada indirecta, una entrada doblemente indirecta y una entrada triple
indirecta. El tamaño de bloque es de 1KiB (1024 bytes) y los enlaces a bloques son de 32 bits.
Para responder a las siguientes cuestiones, asuma que la información del inodo del archivo ya se encuentra
en memoria principal.
a) En función de la información dada, ¿cuál es la longitud máxima que puede tener un fichero en este
sistema? (se puede dar una estimación aproximada).
b) Tenemos un fichero de 10 megabytes de longitud. ¿Cuántos bloques consume del sistema de
archivos? (NOTA: 1 megabyte = 1024 KiB).
c) Al fichero anterior le queremos modificar un byte situado en la posición 1.000.000, relativa al
comienzo del fichero. ¿Cuántos accesos a bloques tenemos que realizar para completar la operación?

a) Para calcular la longitud máxima, hay que obtener cuántos bloques puede llegar a tener un archivo
si utiliza los índices a plena capacidad.
Cada enlace ocupa 32/8 = 4 bytes
Cada bloque de índices puede contener 1024/4 = 256 enlaces
11 entradas directas = 11 bloques de datos
1 entrada indirecta = 256 bloques de datos
1 entrada doble indirecta = 256×256 = 216 bloques de datos
1 entrada triple indirecta = 256×256×256 = 224 bloques de datos

Por tanto, un fichero podría llegar a tener B=224+216+256+11 bloques de datos, que en bytes son
B×1024. B está en torno a 224, así que el tamaño máximo es algo superior a 224×210 = 234 bytes, que
son unos 16 gigabytes.
(no hace falta dar la cifra exacta, ya que no se dispone de calculadora en el examen)

b) 10 megabytes son 10×220 bytes y por tanto requieren 10×220/210 = 10×210 bloques de datos. En
decimal, 10.240 bloques.
Aparte de lo anterior, hay que considerar los posibles bloques de índices, si utiliza entradas indirectas.
El archivo tiene más de 11 bloques y por tanto utiliza al menos el nivel indirecto simple (256 entradas),
que necesita un bloque adicional.
También debe usar el nivel indirecto doble, para las 10240-256-11=9973 entradas restantes. Al menos
deberá consumir un bloque de primer nivel. Del segundo nivel, tendrá que consumir el redondeo
superior de 9973/256=39 bloques.
Este archivo no consume entradas del nivel indirecto triple.
Por tanto, el archivo en total debe consumir 10.240 + 1 + 1 + 39 = 10.281 bloques.

3) Para completar la operación, necesitamos realizar estas acciones:


Leer el bloque de datos donde está el byte que queremos modificar.
Modificar el dato en memoria principal.
Escribir el nuevo contenido del bloque de datos.
A su vez, para leer el bloque de datos, necesitamos saber dónde se encuentra, recurriendo a los
bloques de índices. Como la posición es 1.000.000, puede obtenerse que el bloque de datos es
1.000.000/1024, que es un número algo inferior a 1.000. Las entradas directas alcanzan los 11
primeros bloques; las indirectas simples, del bloque 12 al bloque 267; las indirectas dobles comienzan
en el bloque 268 y siguen 65.536 bloques más. Por tanto, nuestro bloque debe resolverse en el nivel
indirecto doble. Esto exige leer el bloque de índices de primer nivel, localizar el bloque de siguiente
nivel y leerlo.
Para realizar la escritura, como ya conocemos cuál es el bloque de datos, no necesitamos volver a
recorrer los bloques de índices.

    Página  4  de  5  
Nombre y apellidos DNI/NIE

En definitiva, los accesos a bloques que hay que realizar son:


Leer el bloque de índices de primer nivel, para el grupo de doble indirecto.
Leer el bloque de índices de segundo nivel correspondiente al bloque deseado.
Leer el bloque de datos deseado.
Escribir el bloque de datos modificado.

Con lo cual, la respuesta a la pregunta es que hacen falta cuatro accesos a bloques para resolver
la operación.

    Página  5  de  5  
1 2 3 test extra NOTA

Fundamentos de los Sistemas Operativos


Examen convocatoria extraordinaria
27 de junio de 2014 – PRIMERA PARTE

Nombre y apellidos DNI/NIE


SOLUCIONES
DURACIÓN: Dispone de 100 minutos para realizar el examen.

1 (1 punto) Estamos en 1960. Tenemos un sistema operativo no multiprogramado, al que se le incorpora


multiprogramación con tiempo compartido. El fabricante del sistema operativo afirma que no es necesario
realizar ningún cambio en las aplicaciones de usuario ya existentes (ni modificar código ni recompilar) y que
podrían ejecutarse normalmente en el nuevo entorno. Explique por qué esa afirmación puede ser creíble.
Utilice entre 100 y 300 palabras.

SOLUCIÓN
La afirmación puede resultar creíble, ya que la incorporación de multiprogramación puede respetar
totalmente la API del sistema operativo que usaban los programas antiguos. La implementación de la
multiprogramación puede realizarse totalmente por parte del sistema operativo, sin intervención alguna
de los programas de usuario (ej. el sistema operativo utiliza el sistema de interrupciones para decidir
cuándo realiza un cambio de contexto). Por supuesto, el nuevo sistema operativo tendría que resolver
cuestiones tales como el reparto de la memoria entre los distintos procesos, pero eso es técnicamente
posible. En un caso radical, las aplicaciones antiguas podrían correr sobre una máquina virtual que
ejecutara el sistema operativo no multiprogramado, con lo cual para las aplicaciones viejas no habría
ninguna diferencia entre el entorno original y el nuevo.
De hecho, históricamente se han dado casos similares al planteado en la pregunta, como la posibilidad
de ejecutar aplicaciones MS-DOS (no multiprogramado) sobre plataformas Windows
(multiprogramadas).
Por tanto, es posible construir un nuevo sistema operativo que no requiera hacer modificaciones en las
aplicaciones antiguas.

2 (1,5 puntos) Sea un sistema operativo con planificación de procesos mediante dos colas con prioridad.
Teniendo en cuenta lo siguiente:
• Todos los procesos ingresan en la cola Q0 de mayor prioridad, que se planifica mediante un
algoritmo de turno rotatorio (round robin) con un cuanto de 2 u.t.
• Tras haber ocupado dos veces la CPU provenientes de Q0, los procesos son degradados a la cola
Q1, de menor prioridad, y permanecen en ella hasta finalizar su ejecución.
• La cola Q1 se planifica con el algoritmo SRTF.
• En este sistema la E/S se gestiona con una política FIFO. El recurso de E/S no se puede
compartir, por lo que si está ocupado y un proceso necesita usarlo, deberá esperar a que quede libre.
Dada la siguiente carga de trabajo:
Carga de trabajo 
Proceso  Instante  Ráfaga de  Ráfaga de  Ráfaga de 
de llegada  CPU  E/S  CPU 
P0  0  4  2  2 
P1  1  2  1  3 
P2  2  2  2  3 

     Página 1 de 3  
Se pide:
• Dibujar el diagrama de Gantt.
• Calcular el tiempo medio de retorno y el tiempo medio de espera.

SOLUCIÓN

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
P0 RR RR SRTF
P1 RR RR SRTF
P2 RR RR SRTF
E/S P1 P2 P0

Tiempos de Retorno Tiempos de Espera


P0 16 u.t. 4+6-2 = 8 u.t.
P1 13-1=12 u.t. 1+4+2-1 = 6 u.t.
P2 14-2=12 u.t. 2+4+1-2 = 5 u.t.
Tiempos Medios 40/3 u.t. 19/3 u.t.

3 (1,5 puntos) Empleando semáforos como herramienta de sincronización cree un programa que lance
tres hilos que deberán cooperar para escribir los números del 0 al 99 en orden creciente y cumpliendo los
siguientes requisitos.
a. Un hilo debe escribir solo los números 0, 3, 6, …. Otro hilo debe escribir solo 1, 4, 7, … El hilo
restante debe escribir solo los números 2, 5, 8, …
b. El programa principal debe esperar por la terminación de los tres hilos antes de finalizar.
NOTA: Se podrá alcanzar una puntación máxima de 1,5 puntos si la solución propuesta emplea lenguaje C
y la biblioteca pthreads para resolver el problema. En ese caso puede asumir que se dispone de una biblioteca
que implementa semáforos y puede usted elegir la notación que prefiera (por ejemplo, la ofrecida este curso
en la práctica de hilos, semáforo.h). En caso de que opte usted por expresar la solución mediante lenguaje
algorítmico (sin hacer uso de la biblioteca pthreads), la puntuación máxima que se podrá obtener en este
apartado será de 1,0 puntos.

    Página 2 de 3 
Nombre y apellidos DNI/NIE

SOLUCIÓN
Esta es una posible solución al ejercicio planteado, escrita en C. La notación usada para expresar las
operaciones con semáforos es la que se ha ofrecido este curso en el fichero semaforo.h.
#include <stdio.h> 
#include <pthread.h> 
#include <stdlib.h> 
#include “semaforo.h” 
 
// Variables globales 
Semaforo s[3]; // Semáforos para sincronizar los hilos 
 
void* Hilo_impresor(void* id) { 
  int i; 
  int myid = (int)id;  // Identifica qué semáforo debe usar 
  for (i=myid; i<100; i+=3) { 
    // Hacemos una operación WAIT sobre el semáforo para sincronizar 
    WAIT(&s[myid]); 
    printf(“%d\n”, i);  
    fflush(stdout);  // Vacía el buffer de salida estándar 
    SIGNAL(&s[(myid+1)%3]);  // Permite proceder al siguiente hilo en la secuencia  
  } 
  return NULL; 

 
main() 

  pthread_t hilo1, hilo2, hilo3; 
  void *dummy; 
 
// Inicializamos los semáforos 
  INICIASEM (&s[0], 1) 
  INICIASEM (&s[1], 0) 
  INICIASEM (&s[2], 0) 
 
// Lanzamos los tres hilos impresores 
  printf("Comienza la impresión de los números ...\n"); 
  pthread_create(&hilo1, NULL, Hilo_impresor, (void *)0); 
  pthread_create(&hilo2, NULL, Hilo_impresor, (void *)1); 
  pthread_create(&hilo3, NULL, Hilo_impresor, (void *)2); 
 
// Esperamos por la finalización de los hilos 
  pthread_join(hilo1, &dummy); 
  pthread_join(hilo2, &dummy); 
  pthread_join(hilo3, &dummy); 
 
  printf("Fin del programa\n"); 

    Página 3 de 3 
1 2 3 test extra NOTA

Fundamentos de los Sistemas Operativos


Examen de convocatoria extraordinaria
27 de junio de 2014 – SEGUNDA PARTE

Nombre y apellidos DNI/NIE


SOLUCIONES
DURACIÓN: Dispone de 120 minutos para realizar el examen.

1 (2 puntos) Estamos en el taller de empaquetado de una explotación platanera. Tenemos a varias


personas (procesos productores) que colocan manos de plátanos en una cinta transportadora. Los
productores etiquetan las manos con una de estas dos calidades: A y B. En el otro extremo de la cinta hay
dos personas (procesos consumidores) que recogen los plátanos de acuerdo con su calidad: una persona, el
«señor A», recoge sólo los plátanos de calidad A y otra persona, el «señor B», los plátanos de calidad B.
Los plátanos van llegando por la cinta
en el mismo orden en el que se van
produciendo. Los plátanos se deben
recoger también en orden de llegada: la
primera mano de plátanos de la cinta
debe ser recogida por el consumidor
encargado de la calidad de esa mano.
El otro consumidor debe aguardar
hasta que la primera mano de la cola
sea de su calidad. Por ejemplo, si la
primera mano es de calidad A y la
segunda de calidad B, el señor B debe
esperarse hasta que el señor A recoja la
primera mano de calidad A.
TAREA. Escriba el código de sincronización de los procesos productores y los consumidores, utilizando
semáforos como herramienta de sincronización. Escriba SOLAMENTE el código que realiza un productor
cuando coloca una mano, y el código que ejecuta cada consumidor cuando quiere recoger una mano. No se
líe con otras cosas.
Para desarrollar su implementación, asuma que ya se dispone una API que maneja la cinta (se muestra a
continuación). Ojo, esta API no tiene control de concurrencia. Asuma también que la cinta tiene tamaño
ilimitado (no hay que controlar si se llena).

// los dos tipos de calidades 
enum TCalidad { CALIDAD_A, CALIDAD_B }; 
 
// Coloca una nueva mano al final de la cinta 
void ProduceMano (Mano* una_mano, TCalidad calidad); 
 
// Recoge la primera mano de plátanos que está en la cinta 
Mano* RecogeMano(); 
 
// Rutina que nos dice si la cinta está vacía 
bool CintaVacía(); 
 
// Rutina que nos dice de qué calidad es la primera mano que hay  
// actualmente en la cinta. No modifica el contenido de la cinta. 
TCalidad CalidadSiguienteMano(); 
 

     Página 1 de 9  
SOLUCIÓN
Esta es una posible solución que evita al máximo la espera activa.
Pueden plantearse otras múltiples soluciones menos eficientes.

bool esperandoA=false, esperandoB=false;


Semáforo señorA=0, señorB=0, mutex=1;

// --- Productor
P(mutex);
bool estabaVacia = CintaVacia();
ProduceMano(mano,calidad);
if (estabaVacia) {
if (esperandoA && calidad==CALIDAD_A) {
esperandoA = false;
SIGNAL(señorA);
}
else if (esperandoB && calidad==CALIDAD_B) {
esperandoB = false;
SIGNAL(señorB);
}
}
V(mutex);

// --- Señor A
// Nos bloqueamos si la cinta está vacía o no hay una mano
// de calidad «A»
P(mutex);
if ( CintaVacia() || CalidadSiguienteMano() != CALIDAD_A ) {
esperandoA = true;
V(mutex);
WAIT(señorA);
P(mutex);
}

mano = RecogeMano();

// Si el señor B está esperando y la siguiente mano es para él,


// le despertamos.
if ( esperandoB &&
!CintaVacia() && CalidadSiguienteMano() == CALIDAD_B ) {
esperandoB = false;
SIGNAL(señorB);
}

    Página 2 de 9 
Nombre y apellidos DNI/NIE

V(mutex);

// SeñorB de forma similar al Señor A, pero intercambiando las


variables y valores

Solución menos eficiente (espera activa):

Semáforo mutex=1;

// --- Productor
P(mutex);
ProduceMano(mano,calidad);
V(mutex);

// --- Consumidor
Mano* consume (TCalidad mi_calidad) {
// bucle de espera activa
// sencillo, pero tremendamente ineficiente
P(mutex);
while ( CintaVacia() ||
CalidadSiguienteMano() != mi_calidad ) {
V(mutex);
// haz una pausa a ver si cambia el estado
P(mutex);
}
mano = RecogeMano();
V(mutex);
return mano;
}

// --- Señor A
mano = consume(CALIDAD_A);

// --- Señor B
mano = consume(CALIDAD_B);

    Página 3 de 9 
2 (1 punto) a) Un sistema realiza una gestión de memoria virtual mediante paginación por demanda. El
tamaño de página es 512 bytes, el espacio lógico de direcciones 8KBytes y el espacio físico de direcciones
4KBytes. Suponga que en el sistema se encuentra en memoria un solo proceso y que el contenido de los
marcos de página es el siguiente:

Marco
Página
físico
0 Pág. 4
1 Pág. 9
2 Pág. 5
3 Pág. 1
4
5
6
7

Asumiendo una política de reemplazo local de páginas mediante el algoritmo óptimo, y dada la siguiente
secuencia de direcciones lógicas de acceso a memoria 0x0458, 0x066D, 0x0801, 0x026E, 0x0AD8,
represente el estado final de la memoria física y de la tabla de páginas del proceso tras la secuencia de
accesos a memoria.

SOLUCIÓN
Espacio físico de direcciones = 4Kbytes = 212 bytes
Tamaño de página = 512 bytes = 29 bytes.
Por tanto la estructura de las direcciones físicas es la siguiente:
Dirección física (12 bits)
Página Desplazamiento
3 bits 9 bits

Espacio lógico de direcciones = 8 Kbytes = 213 bytes.


Por tanto la estructura de las direcciones lógicas es la siguiente:
Dirección lógica (13 bits)
Página Desplazamiento
4 bits 9 bits

    Página 4 de 9 
Nombre y apellidos DNI/NIE

La tabla de páginas del proceso inicialmente será la siguiente:


Página Marco Bit
lógica validez
0 I
1 3 V
2 I
3 I
4 0 V
5 2 V
6 I
7 I
8 I
9 1 V
10 I
11 I
12 I
13 I
14 I
15 I
NOTA: V: válida / I: inválida
La secuencia de referencias lógicas a memoria dada en el ejercicio es la siguiente:
Dirección lógica hexadecimal Dirección lógica binario Secuencia de páginas lógicas
Pag. (4 bits) Despl. (9 bits)
0x0458 0000 0100 0101 1000 Página 2
0x066D 0000 0110 0110 1101 Página 3
0x0801 0000 1000 0000 0001 Página 4
0x026E 0000 0010 0110 1110 Página 1
0x0AD8 0000 1010 1101 1000 Página 5

Por tanto, la cadena de referencias lógicas es 2,3,4,1,5


Si tomamos en cuenta que nos indican que la política de reemplazo es local y asumimos que al proceso no
se le asignan nuevos marcos, aplicando la política de reemplazo óptima, la memoria reflejaría los siguientes
cambios:

Marco Cadena de referencias a memoria


Página
físico 2 3 4 1 5
0 Pág. 4 4 4 4 4 4
1 Pág. 9 2 3 3 3 3
2 Pág. 5 5 5 5 5 5
3 Pág. 1 1 1 1 1 1
4
5
6
7
Fallos * *

    Página 5 de 9 
Como se puede observar se producen dos fallos de página, y la tabla de páginas del proceso quedaría de la
siguiente forma:
Página Marco Bit
lógica validez
0 I
1 3 V
2 I
3 1 V
4 0 V
5 2 V
6 I
7 I
8 I
9 1 I
10 I
11 I
12 I
13 I
14 I
15 I

Si consideramos que al proceso se le pueden asignar los marcos libres de memoria, aplicando la política de
reemplazo óptima, la memoria reflejaría los siguientes cambios:

Marco Cadena de referencias a memoria


Página
físico 2 3 4 1 5
0 Pág. 4 4 4 4 4 4
1 Pág. 9 9 9 9 9 9
2 Pág. 5 5 5 5 5 5
3 Pág. 1 1 1 1 1 1
4 2 2 2 2 2
5 3 3 3 3
6
7
Fallos * *

    Página 6 de 9 
Nombre y apellidos DNI/NIE

Como se puede observar se producen igualmente dos fallos de página, y la tabla de páginas del proceso
quedaría de la siguiente forma:

Página Marco Bit


lógica validez
0 I
1 3 V
2 4 V
3 5 V
4 0 V
5 2 V
6 I
7 I
8 I
9 1 V
10 I
11 I
12 I
13 I
14 I
15 I

b) Se tiene un sistema de memoria virtual con paginación a dos niveles que permite agrupar las páginas en
“directorios de páginas”. Cada directorio de páginas puede contener hasta 256 páginas. Los espacios de
direcciones lógicas de este sistema son de 4Gbytes y el tamaño de página es de 4Kbytes. El espacio de
direcciones físicas es de 1Gb. Describa la estructura de las direcciones lógicas y de las direcciones físicas de
este sistema de memoria virtual. Es un requisito dejar constancia por escrito de su planteamiento.

SOLUCIÓN
Espacio de direcciones físicas = 1 Gb = 230 bytes. Por tanto se necesitan 30 bits para direccionar el espacio
físico de direcciones:

Dirección física
30 bits

Tamaño de página = 4 Kbytes = 212 bytes. Por tanto se necesitan 12 bits para el desplazamiento dentro de
una página:

Dirección física (30 bits)


Página Desplazamiento
18 bits 12 bits

Espacio lógico de direcciones = 4 Gbytes = 232 bytes. Por tanto se necesitan 32 bits, es decir, 4 bytes para
direccionar el espacio lógico de direcciones y por consiguiente el tamaño de una dirección lógica es 32 bits:

Dirección lógica
32 bits
    Página 7 de 9 
Cada directorio de páginas puede contener 256 = 28 páginas. Por tanto se necesitan 8 bits para el segundo
nivel de paginación. Si para el desplazamiento se necesitan 12 bits, nos restan 12 bits que serán los
empleados para el primer nivel de paginación:

Dirección lógica (32 bits)


er
1 nivel paginación 2º nivel paginación Desplazamiento
12 bits 8 bits 12 bits

3 (1 punto) Tenemos un sistema de archivos tipo UNIX en el que para localizar los bloques de un archivo
se utilizan 10 entradas directas, una entrada indirecta, una entrada doblemente indirecta y una entrada triple.
Los bloques tienen un tamaño de 2 Kbytes y el tamaño de los índices (direcciones de bloques de disco) es
de 32 bits.

En este sistema, un programa UNIX crea un fichero y realiza sobre él una operación write() de 55 millones
de bytes.
NOTA: En este ejercicio, dada la dificultad para realizar los cálculos sin poder emplear calculadora,
obtendrán una calificación del 100% aquellos apartados donde la lógica y el razonamiento seguido sea el
correcto aunque no se de el resultado exacto.
a) ¿Cuántos bloques de disco ocupa ahora el fichero, incluyendo bloques de índices?
Si dividimos 55 millones entre el tamaño de bloque (2048 bytes), veremos cuantos bloques serán
necesarios para almacenar esta cantidad de información:
55 millones/ 2048 = 26855,47 => Por tanto, se necesitan 26856 bloques para almacenar los datos, de
forma que del bloque 26856 se ocupan únicamente 960 bytes
Ahora debemos calcular el número de bloques índices necesarios:
Número de bloques a los que podemos apuntar con las entradas directas: 10
Número de bloques a los que podemos apuntar con la entrada indirecta: Tenemos que cada índice
ocupa 4 bytes (32 bits), por lo que el número de índices que caben en un bloque será: 2048 / 4= 2 11 /22
= 29 = 512 índices. Por tanto con la entrada indirecta podemos apuntar a 29 = 512 bloques
Número de bloques a los que podemos apuntar con la entrada doble indirecta: 29 * 29 = 218 bloques =
262144 bloques.
Número de bloques a los que podemos apuntar con la entrada triple indirecta: 2 9 * 29 *29 = 227 bloques.
En nuestro caso, como necesitamos apuntar a 26856 bloques, necesitaremos las 10 entradas directas,
la entrada indirecta (512) y de la entrada doble indirecta necesitaremos 26856 - 512 - 10 = 26334
índices. Para calcular el número bloques índices de la entrada doble indirecta que se necesitan,
dividimos 26334 / 512 = 51,43. Es decir, necesitaremos 52 bloques índices. En resumen necesitamos
1 (bloque índice entrada indirecta)+ 1 (bloque índice de la entrada doble indirecta)+ 52 (bloques
índices de la entrada doble indirecta) = 54 bloques índices.
Por tanto, el total de bloques que ocupará el fichero es 26856 bloques datos + 54 bloques índices =
26910 bloques.

b) ¿Cuál es el tamaño máximo de un fichero en este sistema?


Para ver el tamaño máximo de un fichero, tendremos que analizar, por un lado el número máximo de
bloques a los que podemos apuntar con el tamaño de los índices (32 bits) y por otro lado el número de
bloques a los que podemos apuntar con la estructura de control indicada en el ejercicio (10 entradas
directas, una entrada indirecta, una entrada doblemente indirecta y una entrada triple). El tamaño
máximo de un fichero vendrá condicionado por el límite más restrictivo impuesto por las estructuras
anteriores.
Si el tamaño de los índices es 32 bits, podemos apuntar a 232 bloques = 4.294.967.296 bloques

    Página 8 de 9 
Nombre y apellidos DNI/NIE

Por otro lado, si analizamos el número de bloques al que podemos apuntar con la estructura de control
indicada en el ejercicio, tenemos que podemos apuntar a 10 + 512 + 2 18 + 227 bloques =134.480.394
bloques
Por tanto, el tamaño máximo de un fichero viene determinado por el número de bloques a los que
podemos apuntar con la estructura de control indicada en el ejercicio y será: (10 + 512 + 2 18 + 227
bloques ) * 2048 bytes.

c) Si la gestión del espacio en disco fuera enlazada y el tamaño del disco fuera de 8Terabytes, con el
mismo tamaño de bloque, ¿cuántos bloques de disco ocuparía el fichero anterior tras realizar las
mismas operaciones?
Nos indican que el tamaño del disco es 8Tbytes = 23 * 210 * 210* 210 * 210 = 243 bytes. Para saber el
número de bloques, dividimos el tamaño del disco entre el tamaño de bloque: 243 / 211 = 232 bloques.
Por tanto, para poder apuntar a 232 bloques, el tamaño del puntero debe ser 32 bits, es decir, 4 bytes.
Por tanto, la cantidad de información que se almacena en cada bloque será 2048 – 4 = 2044 bytes.
Para calcular el número de bloques necesarios para almacenar un fichero con 55 millones de bytes,
dividimos la cantidad de información que debemos almacenar entre el número de bytes que se pueden
almacenar en cada bloque: 55 millones / 2044 = 26908,02. Es decir, se necesitarán 26909 bloques.

d) Si el sistema de archivos aquí descrito se emplea en un sistema informático donde el 99% de los
ficheros tiene un tamaño aproximado de 24KBytes, ¿cuál de los dos sistemas de gestión de espacio
en disco emplearía y por qué?
Vamos a analizar en primer lugar el número de bloques necesarios para almacenar un fichero de
24KBytes (24576 bytes) según los dos sistemas de gestión de espacio en disco.
Para el caso de la asignación indexada, necesitamos 24 KBytes / 2 KBytes = 12 bloques. Por tanto,
necesitamos las 10 entradas directas más la entrada indirecta para apuntar a los dos bloques
restantes. Por tanto, en ocupación tendríamos los 12 bloques de datos más el bloque índice indirecto,
es decir, 13 bloques.
En el caso de la enlazada necesitamos 24 Kbytes /2044 = 12,02 bloques, es decir, necesitaremos 13
bloques.
Por tanto, desde el punto de vista del espacio ocupado por los ficheros en ambos casos y sin tomar en
cuenta el espacio ocupado por las estructuras de control de las entradas de directorio, ambos
sistemas de gestión de espacio tendrían aproximadamente el mismo costo. Sin embargo, es cierto que
si el 99% de los archivos tienen este tamaño, en la mayoría de los casos estamos desaprovechando el
espacio ocupado por el puntero doble y triple indirecto en la estructura de control de la indexada.
El ejercicio no da ninguna información sobre los tipos de acceso a los ficheros en el sistema y las
operaciones habituales sobre el sistema de archivos, un dato que es importante para decantarnos por
uno u otro sistema. Por ejemplo, si se realizan con frecuencia accesos directos a los ficheros, el
sistema de gestión indexada sería más eficiente que la enlazada, pues en este último caso sabemos
que penalizamos los accesos directos ya que obligan a leer todos los bloques previos al bloque donde
se encuentra la información a leer o modificar.

    Página 9 de 9 
1 2 3 4 test extra NOTA

Fundamentos de los Sistemas Operativos


Convocatoria especial – 17 de noviembre de 2014

Nombre y apellidos DNI/NIE


SOLUCIONES
DURACIÓN: Dispone de tres horas para realizar el examen (el test y estos cuatro ejercicios)
1 (1,25 puntos) Un sistema de memoria virtual paginada utiliza páginas de 1 KiB y direcciones lógicas de
32 bits. En un momento dado, en la tabla de páginas de un proceso se encuentra la siguiente información: la
página 0 está cargada en el marco 5, la página 1 en el marco 4 y la página 3 en el marco 15.
Bajo estas condiciones, ¿con qué dirección lógica se corresponde la dirección física 1024?

La dirección física 1024 se corresponde con el byte 0 del marco 1 de memoria. Según la información
proporcionada en el enunciado, no se nos da información sobre la página lógica que se encuentra
cargada en ese marco de página, por lo que no es posible averiguar la dirección lógica con la que se
corresponde dicha dirección física.

2 (1,25 puntos) En un sistema operativo se utiliza una estructura de inodes parecida a la de Unix. Los
bloques de datos son de 1024 bytes. Las entradas en los inodes dedican 64 bits al tamaño del archivo y 16 bits
a los punteros de los bloques. Un inode tiene ocho entradas de direccionamiento directo, una de
direccionamiento indirecto simple y otra de direccionamiento indirecto doble.
Sobre esta descripción, indique si cada una de estas afirmaciones es verdadera o falsa. Debe justificar sus
respuestas:
a) El tamaño máximo de un fichero es de 264 bloques.

La afirmación es incorrecta.
Se indican en el enunciado varios parámetros que pueden condicionar el tamaño máximo de un
fichero. Por tanto, es conveniente analizarlos todos ya que el tamaño máximo estará condicionado por
aquel parámetro más restrictivo:
· 64 bits del inode dedicados al tamaño del archivo: un archivo podría tener un máximo de 264 bytes,
es decir, 254 bloques.
· 16 bits para los punteros a bloques: podremos direccionar hasta 216 bloques diferentes.
· Según la estructura del inode, un fichero que ocupe todo el espacio tendrá 8+512+512+(512×512)
bloques, es decir, aproximadamente 218 bloques.
Cualquiera de estas cantidades supera con creces el tamaño de 264 bloques.

b) El número máximo de bloques asignados a un archivo en su inode es: 262 664.

La afirmación es incorrecta.
El número de bloques de datos que puede llegar a tener un archivo es de
8+512+512+(512×512)=262664. A esto hay que sumar los bloques asignados al archivo para
mantener sus tablas de índices, que en el peor caso serían 1 indirecto simple + 1 maestro del indirecto
doble + 512 indirectos dobles = 514 bloques de índices. La cantidad total, pues, es superior a la que
indica el enunciado.

c) El tamaño máximo de un archivo que utiliza todo el disco es de 64 MiB.

Respuesta variable.
Para empezar, no se nos da el dato del tamaño del disco, con lo cual no se puede calcular una cifra.
En segundo lugar, lo normal sería que las estructuras de control del sistema de ficheros se lleven una
     ·∙  Página  1  de  5    
parte del espacio físico, con lo cual no puede existir un archivo «que utiliza todo el disco», al menos en
el sentido literal de la afirmación. Si se toman estas consideraciones, la respuesta debería ser «la
afirmación no tiene sentido» o «no hay datos suficientes para calificar la afirmación».
Si por «disco» entendemos «espacio direccionable», serían 216 bloques de 1024 bytes, por tanto
64MiB. A este espacio ocupado habría que descontarle los bloques necesarios para mantener los
índices, que haría que la longitud del archivo esté por debajo de esos teóricos 64MiB. No obstante, si
la expresión «tamaño de un archivo» se entiende como el «espacio ocupado por un archivo», sí podría
considerarse correcta la afirmación.

3 (1 punto) A continuación se muestran las demandas futuras de CPU y E/S de un conjunto de procesos
secuenciales que arriban simultáneamente a un ordenador con un solo procesador. En cada casilla se
muestra el tiempo requerido para completar una petición de CPU o E/S, en unidades de tiempo arbitrarias.
Las casillas vacías indican que no hay peticiones futuras.
Por ejemplo, el proceso 3 demanda 2 unidades de tiempo de CPU, luego pedirá 4 unidades de E/S, tras lo
que necesita 1 unidad de tiempo de CPU, atendida la cual finaliza.
CPU E/S CPU
Proceso 1 7 1 6
Proceso 2 4 4 4
Proceso 3 2 4 1
Proceso 4 1 7 1
Obtener el diagrama de Gantt, el tiempo medio de retorno y el tiempo medio de espera al aplicar Round-
Robin con cuanto igual a 3 unidades de tiempo como política de planificación.

Ver solución al final del documento.

4 (1,5 puntos) Queremos procesar una imagen de tamaño N×N, siendo N una potencia de 2. El objetivo
es aplicar cierta operación matemática a cada uno de los píxeles de la imagen. Para ello disponemos ya de
una función Process_Pixels(…) , descrita más abajo. El procesamiento se hará concurrente, mediante
M hilos (M es una potencia de 2). Cada hilo ejecutará la misma rutina, llamada ImageThread() , sin
argumentos, que debe usted implementar. La rutina debe estar escrita de forma que cada hilo procese un
subconjunto de píxeles, garantizando que todos los píxeles de la imagen quedan procesados y que no se
procesa un mismo píxel varias veces. Utilice semáforos en caso de que sea necesario aplicar alguna
sincronización entre hilos.
Considere que tanto M como N son cantidades constantes y conocidas de antemano.
Process_Pixels (row,col,npixels) procesa npixels consecutivos de la fila row a partir de la columna col
de la imagen. Esta función no tiene ningún control de concurrencia interno.

    Página  2  de  5  
Nombre y apellidos DNI/NIE

SOLUCIÓN
Esta es una de las soluciones más simples para el problema. Consiste en que cada hilo toma un bloque de
filas contiguas de la imagen. El número de filas por hilo es N/M, que es un número exacto según se ha
explicado en el enunciado. Aquí está escrita en lenguaje C.

//  constantes  M  y  N.  Los  valores  son  ejemplos.  


#define  N  512    
#define  M  8  
#define  RowsPerThread  (N/M)  
 
//  Variable  global  que  señala  la  primera  fila  que  está  
//  pendiente  de  procesarse  
int  current_row=0;  
 
//  Semáforo  para  garantizar  exclusión  mutua  en  la    
//  manipulación  de  current_row  
Semaforo  mutex=1;  
 
//  Rutina  que  ejecutan  los  hilos  
void  ImageThread()  {  
 
//  Toma  la  fila  inicial  que  le  toca  a  este  hilo  
wait(mutex);  
int  start_row  =  current_row;  
int  end_row      =  current_row  +  RowsPerThread;  
 
//  Actualiza  la  fila  inicial  para  el  siguiente  hilo  que  elija  
current_row  =  end_row;  
signal(mutex);  
 
//  Procesa  las  filas  que  le  tocan  al  hilo  
for  (  int  row=start_row;  row<end_row;  row++  )  {  
               Process_Pixels  (row,0,N);  
}  
}  

    Página  3  de  5  
Esta es otra solución más sofisticada, en la que cada hilo va tomando bloques de slice píxeles, empezando
desde la posición (0,0). Para simplificar los cálculos, se asume que el valor de slice es un divisor exacto de N,
para que sean más simples los cálculos.
La solución aquí mostrada tiene varias ventajas sobre la anterior: no necesita conocer cuál es el número de
hilos que participan y rinde mejor tiempo de ejecución si hay diferencias grandes de velocidad entre los
hilos.

//  Constantes  del  algoritmo.  Los  valores  son  ejemplos.  


#define  N  512    
#define  SLICE  64  
#assert  (N  %  SLICE)  ==  0    
 
//  Variables  que  indican  el  siguiente  píxel  de  la  imagen  a  procesar  
int  current_row=0,  current_col=0;  
 
//  Variable  que  indica  el  número  de  píxeles  que  quedan  por  asignar  
int  pending_pixels  =  N*N;  
 
//  Semáforo  para  garantizar  exclusión  mutua  en  el  acceso  a  las    
//  variables  compartidas  
Semaforo  mutex=1;  
 
//  Rutina  que  ejecutan  los  hilos  
void  ImageThread()  {  
   while  (true)  {  
       //  Cogemos  un  trozo  de  imagen  para  procesar  
       wait(mutex);  
       //  si  ya  no  quedan  píxeles  pendientes,  salimos  
       if  (pending_pixels==0)  {  
               signal(mutex);  
               break;  
       }  
 
       //  Este  hilo  tomará  a  partir  de  (current_row,current_col)  
       int  myrow  =  current_row;  
       int  mycol  =  current_col;  
 
       //  Actualizamos  los  valores  de  current_row  y  current_col  
       if  (  current_col  +  SLICE  ==  N  )  {  
  current_row++;  
  current_col  =  0;  
       }  
       else  {  
  current_col  +=  SLICE;  
       }  
       pending_pixels  -­‐=  SLICE;  
 
       signal(mutex);  
 
       Process_Pixels(myrow,mycol,SLICE);  
   }  
}  
 

    Página  4  de  5  
3 Solución del ejercicio 3. Esta es una de las posibles soluciones válidas. A lo largo de la simulación pueden producirse entradas y salidas simultáneas de procesos;
dependiendo del orden en que las procesemos, obtendremos diferentes planificaciones.

RR, q=3

tiempo 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
CPU P1 P2 P3 P4 P1 P2 P3 P1 P1 P4 P2 P1 P2
P3 P2
E/S P4
P1

Cuando termina un proceso una operación de E/S al mismo tiempo que a otro proceso se le cumple su cuanto y a este último aún que faltan ciclos de disfrute de la
CPU, se ha optado por incluir en primer lugar en la cola de preparados al proceso que termina la operación de E/S. En caso de que varios terminen
simultáneamente sus operaciones de E/S se ha cogido al de menor Pi.
CPU ociosa

Tiempos de Retorno Tiempos de Espera


P1 26 (9-3)+(14-12)+(23-19) = 12
P2 27 3+(12-6)+(20-17)+(26-23) = 15
P3 14 6+(13-12) = 7
P4 20 8+(19-16) = 11
Tiempos Medios (26+27+14+20)/4 (12+15+7+11) /4

     ·∙  Página  5  de  5    


Calificación

1
2
Fundamentos de los Sistemas Operativos 3
Examen Parcial
19 de abril de 2013

Nombre Titulación
SOLUCIONES Grado

Dispone de tres horas para realizar el examen


1 (3 puntos) Contestar de forma precisa a las siguientes cuestiones:

a) ¿Cuál es la función del núcleo en un sistema operativo?


Solución
Es el componente que proporciona los servicios básicos de gestión de recursos del sistema operativo,
a través de llamadas al sistema, que constituyen una interfaz de programación (API).
Ver Silberchatz, séptima edición, pág. 5; Wikipedia; diapos tema 3, página 20.

b) ¿qué se entienden por instrucciones privilegiadas en un procesador?


Solución
Son aquellas que en determinados procesadores tienen restringida su ejecución a que el procesador se
encuentre funcionando en un modo de alto privilegio (modo supervisor o modo núcleo).
Ver Silberchatz, séptima edición, pág. 17; diapos tema 2, página 19.

c) ¿qué relación tiene el SO con el sistema de interrupciones?


Solución
Tiene una relación múltiple: en primer lugar, el SO tiene la misión de atender las interrupciones
mediante las rutinas de servicio de interrupción. En segundo lugar, el SO suele utilizar las
interrupciones como mecanismo para que los procesos invoquen las llamadas al sistema
(interrupciones software).
Ver Silberschatz, séptima edición, págs. 16 y 17, págs. 454 y siguientes; diapos temas 2 y 3.

d) Las primeras versiones de iOS (sistema operativo del iPad y el iPhone) no ofrecían
multitarea para las aplicaciones de usuario, y sólo recientemente se ha incorporado esa
funcionalidad. ¿Qué motivos puede haber para que un fabricante de sistemas operativos
se resista a incorporar la multitarea, teniendo en cuenta las ventajas que aporta al sistema
y a los usuarios?
Solución
Esta pregunta puede responderse de múltiples maneras, dependiendo de la postura que adopte el estudiante. La cuestión
aquí es saber argumentar la posible posición de la empresa desde las bases teóricas de la asignatura.
No obstante lo anterior, a continuación exponemos una discusión sobre el caso planteado, para dar ejemplos de
argumentos que se podrían usar en la respuesta.
Discusión: La postura de la empresa puede estar fundamentada en que la multitarea favorece un
mayor consumo de recursos, ya que fomenta la existencia simultánea de varios procesos en memoria
y también que el procesador se encuentre más tiempo activo, con lo cual puede haber un mayor
consumo energético, cuestión que es muy crítica en los dispositivos portátiles. Un uso inadecuado de
la multiprogramación podría llevar a un agotamiento prematuro de la memoria y de la batería, lo cual
empeoraría la percepción del usuario hacia el dispositivo (el usuario no pensaría «el planificador de
procesos hace que la batería dure menos», sino más bien «a este cacharro le dura poco la batería»). En
el caso que nos atañe, el fabricante del sistema operativo es también el fabricante del hardware, y sus
ingresos provienen de la venta del hardware. No le interesa favorecer una percepción negativa hacia
su hardware, aunque la causa no sea del propio hardware.

e) Defina brevemente las tres propiedades que debe cumplir una solución válida al problema
de la sección crítica.
Solución
Las tres propiedades son: exclusión mutua, progreso y espera limitada.
Ver definiciones en Silberchatz, séptima edición, pág. 173; diapos tema de concurrencia, página 17.

f) ¿Qué clases de interfaces ofrece un sistema operativo? ¿A qué tipos o perfiles de personas
se las ofrece?
Solución
El sistema operativo es, entre otras cosas, una interfaz con los recursos del hardware. Esta interfaz se
puede ofrecer de muchas formas, que normalmente se agrupan en tres tipos básicos: interfaz de
programación (API); interfaz de línea de órdenes (CLI) e interfaz gráfica (GUI). La API es una
interfaz que se le ofrece al programador. La CLI y la GUI se ofrecen a todos los usuarios del sistema,
aunque la CLI suele estar más orientada a usuarios avanzados (ej. administradores de sistemas,
programadores, etc.)
Nota: no hace falta usar los términos API, CLI y GUI para dar por válida la respuesta. Lo que cuenta
son los conceptos de interfaz para el programador e interfaz para usuarios finales.
Ver Silberchatz, páginas 35-36; diapos temas 1 y 3.

2 (3 puntos) Considera un sistema operativo que utiliza la siguiente política de planificación de


procesos con múltiples colas con realimentación: todos los procesos que ingresan al sistema pasan
directamente a la cola Q0, que se gestiona con un algoritmo Round Robin de cuanto 2 u.t.. A todos
los procesos que están en Q0 se les proporciona un cuanto de tiempo de 2 u.t.; aquellos que no
terminen su ráfaga de CPU en ese intervalo de tiempo, son degradados y pasan a ser gestionados por
la siguiente cola Q1, que se planifica mediante un algoritmo FCFS. Los procesos de la cola Q1
permanecen en ella hasta el final de su ejecución. Las colas tienen prioridades absolutas, siendo Q0 la
de mayor prioridad y Q1 la de menor prioridad, siendo la política entre ellas expulsiva, de forma que
si se está ejecutando un proceso y llega un trabajo a una cola de mayor prioridad, el proceso de
mayor prioridad se atiende inmediatamente, expulsando al de menor prioridad que ocupaba la CPU.

A continuación, se presenta una tabla con las demandas futuras de CPU y E/S de una serie de
procesos, junto con sus tiempos de llegada al sistema.
Se considerará la E/S como un recurso no compartible y gestionado con una política FCFS.

Se pide resolver las siguientes cuestiones:


a) (1,75 puntos) Obtener el diagrama de Gantt correspondiente. Debe quedar reflejado el uso
que hacen los distintos procesos, tanto de la CPU como de la E/S.
b) (0,75 puntos) Calcular el tiempo medio de retorno y el tiempo medio de espera.
c) (0,5 puntos) ¿Puede existir inanición en este sistema de planificación? Justificar la respuesta
Tiempo de llegada CPU E/S CPU
P1 0 1 7 1
P2 1 6 1 1
P3 4 3 1 1
a) Solución

b) Solución
Tiempos de retorno:
P1: 9-0=9
P2: 13-1=12
P3:12-4=8
Media = (9+12+8)/3

Tiempos de espera:
P1: 0
P2: (6-4) + (10-8) = 4
P3: (9-6) = 3
Media = (0+4+3)/3

c) Solución
Desde luego, puede existir inanición, ya que si continuamente están llegando nuevos procesos al
sistema, los que están en la cola Q1 nunca podrán usar la CPU. Para evitar este problema sería
necesario modificar la política de planificación, por ejemplo, permitiendo que los procesos que llevan
mucho tiempo en la cola Q1 pudieran ser promovidos a la cola Q0 de mayor prioridad.

3 (4 puntos) Resolver las siguientes cuestiones:


3.a (1 punto) Comentar la validez del siguiente programa como solución al problema de la
sección crítica para dos procesos. Justificar explícitamente la respuesta.
// Variables enteras globales
int flag0=1, flag1=1;
1 Proceso P0() { 1 Proceso P1() {
2 for(;;) { 2 for(;;) {
3 flag0:=0; 3 flag1:=0;
4 while (flag1==0) { 4 while (flag0==0) {
5 flag0:=1; 5 flag1:=1;
6 while (flag1==0) { 6 while (flag0==0) {
7 null; 7 null;
8 } 8 }
9 flag0:=0; 9 flag1:=0;
10 } 10 }
11 SECCION CRITICA 11 SECCION CRITICA
12 flag0:=1; 12 flag1:=1;
13 } 13 }
14 } 14 }

a) Solución
La solución planteada se basa en el uso de dos variables compartidas, flag0 y flag1, con las que cada
proceso advierte al otro que se encuentra en su sección crítica o que pretende entrar en ella. Para que
la solución propuesta sea válida debe cumplir las condiciones de exclusión mutua, progreso y espera
limitada.
La propuesta de solución no es válida ya que aunque cumple la propiedad de exclusión mutua, no
cumple las propiedades de progreso y espera limitada. Si ambos procesos alternan la ejecución de las
sentencias 3, 4, 5, 6 y 9 quedarían en el bucle de forma indefinida. Por tanto, no se cumple la
propiedad de progreso. Tampoco cumple la propiedad de espera limitada, puesto que el código no
ofrece ninguna garantía a un proceso que se encuentre en el protocolo de entrada a la sección crítica,
que terminará accediendo a la sección crítica en un tiempo finito. Por ejemplo, supongamos que el
proceso 0 entra en la sección crítica. En ese caso, si el proceso 1 intenta acceder a la sección crítica,
quedará iterando en el bucle de la sentencia 6. Podría ocurrir que el proceso 0 termine la sección
crítica y vuelva a acceder. Y esto podría suceder de forma indefinida.

3.b (1,5 puntos) Implementar el seudo-código correspondiente para lograr la sincronización


de tres procesos (P1, P2 y P3) de forma que el orden de la ejecución de las sentencias S1, S2 y S3 de
los procesos sea la siguiente: en primer lugar se debe ejecutar S1; al finalizar S1 se puede ejecutar S3 y
cuando finaliza S3 se puede ejecutar S2. Al terminar S2 se puede volver a ejecutar S1 y así
sucesivamente. Para lograr la sincronización se deben emplear semáforos.
Proceso P1() { Proceso P2() { Proceso P3() {
for(;;) { for(;;) { for(;;) {
S1; S2; S3;
} } }
} } }

b) Solución

Semaforo sem1(1), sem2(0), sem3(0);

Proceso P1() { Proceso P2() { Proceso P3() {


for(;;) { for(;;) { for(;;) {
P.sem1(); P.sem2(); P.sem3();
S1; S2; S3;
V.sem3(); V.sem1(); V.sem2();
} } }
} } }

3.c (1,5 puntos) Implementar el seudo-código correspondiente para lograr la sincronización


de cuatro procesos (P1, P2, P3 y P4) de forma que el mensaje del proceso P4 “Termina P4”
se imprima por pantalla una vez que P1, P2 y P3 impriman sus mensajes respectivos de
terminación. Para lograr la sincronización se deben emplear semáforos.
Proceso P1() { Proceso P2() {
int cont; int cont;
for(cont=1;cont<=3;cont++) { for(cont=1;cont<=3;cont++) {
S1; S2;
} }
printf(“Termina P1\n”); printf(“Termina P2\n”);
} }

Proceso P3() { Proceso P4() {


int cont; int cont;
for(cont=1;cont<=3;cont++) { for(cont=1;cont<=3;cont++) {
S3; S4;
} }
printf(“Termina P3\n”); printf(“Termina P4\n”);
} }
NOTA: La sentencia printf(“Termina PX\n”) no es atómica.

c) Solución
A continuación se presenta una posible solución al problema. No pretende ser la única ni la mas
óptima.

Semaforo mutex(1), sincro(0);


int terminados=0;
Proceso P1() { Proceso P2() {
int cont; int cont;
for(cont=1;cont<=3;cont++) { for(cont=1;cont<=3;cont++) {
S1; S2;
} }
P.mutex(); P.mutex();
printf(“Termina P1\n”); printf(“Termina P2\n”);
terminados++; terminados++;
if (terminados==3) if (terminados==3)
V.sincro(); V.sincro();
V.mutex(); V.mutex();
} }

Proceso P3() { Proceso P4() {


int cont; int cont;
for(cont=1;cont<=3;cont++) { for(cont=1;cont<=3;cont++) {
S3; S4;
} }
P.mutex(); P.sincro();
printf(“Termina P3\n”); printf(“Termina P4\n”);
terminados++; }
if (terminados==3)
V.sincro();
V.mutex();
}
Calificación

1
Fundamentos de los Sistemas Operativos 2
Convocatoria ordinaria – PRIMERA PARTE 3
7 de junio de 2013

Nombre y apellidos DNI/NIE


SOLUCIONES

1 (5 puntos) Conteste de forma precisa a las siguientes cuestiones. Cada pregunta vale un punto.
a. ¿Cuál es la función del shell en un sistema operativo?
Es el componente que ofrece una interfaz a los operadores y administradores del sistema, para
que puedan trabajar con el sistema a través de órdenes básicas que se teclean en una consola.
Ver Silberschatz, séptima edición, pág. 37; Wikipedia; diapos tema 3, página 10.
b. ¿Cuál es la diferencia entre concurrencia y paralelismo?
El paralelismo es un caso particular de concurrencia en el que hay ejecución simultánea de
procesos, en distintos procesadores.
Ver diapos tema de Concurrencia, páginas 6 y 7.
c. ¿Qué diferencia hay entre interbloqueo e inanición?
En el caso del interbloqueo, se trata de un estado de bloqueo colectivo entre varios procesos
que esperan mutuamente entre ellos. Por su parte, la inanición es el estado de un proceso (o
varios) que queda permanentemente bloqueado en espera de un recurso a causa de la política
de gestión.
Podemos ver que una de las diferencias entre interbloqueo e inanición es que esta última puede
existir un único proceso perjudicado/bloqueado, mientras que en el interbloqueo
necesariamente existirán dos o más procesos bloqueados.
Otra diferencia tiene que ver con la causa del problema. La inanición tiene que ver con la forma
en la que el sistema asigna prioridades de acceso a los recursos; el interbloqueo puede estar
originado por muchos motivos.
Las soluciones a ambos problemas también difieren: la inanición la podemos gestionar
aplicando medidas correctoras al cálculo de prioridad de los procesos (ej. con técnicas de
envejecimiento). Sin embargo, el tratamiento del interbloqueo es mucho más complejo.
d. ¿Qué es un semáforo binario?
Un semáforo binario es aquel que sólo permite contener dos estados o valores, 0 y 1, a
diferencia de un semáforo general, en el que no hay un límite superior al valor que puede
contener.
Ver diapos de concurrencia, página 46.
e. Si una caché puede ser tan grande como el dispositivo para el que se utiliza (ej. memoria
RAM sobre disco duro), ¿por qué no hacerla así de grande y con ello eliminar la necesidad del
dispositivo?
Hay que tener en cuenta la existencia de una jerarquía de memorias, según la cual, las
tecnologías de memoria más rápidas del mercado son también las más caras. La RAM es
mucho más cara que el disco, así que si sustituyéramos el disco por un dispositivo basado en
RAM, nuestro computador sería mucho más costoso. Por otro lado, si se cumple el principio de
localidad y nuestras cachés nos dan una buena tasa de aciertos, es posible que con una
pequeña cantidad de RAM podamos tener un tiempo de acceso medio a disco sólo un poco
superior al tiempo de acceso si los datos estuvieran siempre en RAM, y por un precio
sensiblemente inferior.
Hay otro aspecto que puede influir en descartar la RAM, y es el carácter volátil de esta
tecnología. Para mantener datos en una RAM de forma continuada, necesitamos alimentación
eléctrica permanente, y eso supone otro coste adicional. Las tecnologías de discos no necesitan
suministro de electricidad para mantener la información almacenada.
2 (3 puntos) Un sistema operativo multihilo, con un solo procesador, implementa un algoritmo de
planificación de CPU basado en el Round Robin que funciona de la siguiente forma: a cada hilo que
entra en el procesador se le concede un cuanto de tiempo inversamente proporcional al número de
hilos que tiene el proceso pesado al que pertenece. Expresado algebraicamente, el cuanto de tiempo
concedido es:
𝑄𝑏𝑎𝑠𝑒
𝑄𝑎𝑐𝑡𝑢𝑎𝑙 =
𝑁𝐻𝑎𝑐𝑡𝑢𝑎𝑙
donde Qbase es una constante del sistema y NHactual es el número de hilos que contiene el proceso
actual. Con un ejemplo: si Qbase=12 milisegundos, el proceso PA tiene 2 hilos y el proceso PB tiene
3 hilos, cuando entre en CPU un hilo del proceso PA, se le concederá un cuanto de 12/2=6
milisegundos. Cuando entre un hilo del proceso PB, se le concederá un cuanto de 12/3=4
milisegundos. El cuanto se ajusta dinámicamente a medida que cada proceso crea nuevos hilos o
estos finalizan. Por lo demás, la política funciona como un Round Robin clásico.
TAREA. Tiene usted que redactar un breve informe que valore técnicamente esta política de
planificación. (extensión recomendada: entre 200 y 500 palabras). En su valoración, no olvide tratar
aspectos como estos:
• Cuál puede ser la motivación para que alguien proponga esta política, o qué objetivos puede
perseguir con ella.
• Qué efectos tiene esta política de planificación sobre el sistema en general, especialmente
centrándose en las diferencias con el Round Robin clásico.
• Cómo influye el número de hilos de un proceso en el tratamiento que recibe en el
procesador. Piense en los casos extremos (procesos con muchos hilos o procesos con un
único hilo).
• Si hay aspectos dentro de la política que entrañan riesgos o problemas.
La lista de tópicos anterior es orientativa, no son los «apartados de la pregunta». El objetivo es que
usted redacte un informe, organizado como usted prefiera, siempre que sea claro, correctamente
escrito y que valore razonadamente la política utilizando los conceptos teóricos de la asignatura.
La característica fundamental de esta variante del Round Robin es que el número de hilos de un
proceso afecta a su tiempo de disfrute del procesador. Cuantos más hilos contenga un proceso
pesado, más cortas serán las rodajas de tiempo asignadas a ese proceso. Puede verse que si
todos los hilos de un proceso pesado están en la cola de preparados, en cada ronda de
atención a la cola, el proceso recibirá en conjunto un tiempo de CPU exactamente igual a
Qbase, cantidad que es independiente del número de hilos. Esto significa que si un proceso
tiene muchos más hilos que otro, no recibe más tiempo de CPU por ese motivo. Esto invita a
pensar que uno de los motivos para implementar esta política es equilibrar el reparto de
tiempo de CPU asignado a los distintos procesos, de forma que no se favorezca a los procesos
que tienen muchos hilos, que es algo que sí ocurriría en un Round Robin convencional (más
hilos, más rodajas de tiempo).
Tal y como se expone la política, no se tiene en cuenta el estado de los hilos a la hora de hacer
el cálculo del cuanto. Así, un proceso que tenga N hilos y sólo M de ellos en la cola de
preparados recibirá un total de M/N*Qbase en cada ronda de atención a la cola de preparados.
Esto implica que, en el caso general, cuantos más hilos tenga un proceso pesado, más
probable es que reciba menos CPU en relación con otros procesos que tengan menos hilos.
Por todo lo anterior, esta política también se puede considerar una técnica para penalizar a los
procesos con mucha concurrencia interna, y también para influir en los programadores para
que no abusen de la creación de hilos.
Un posible problema de esta política es que el cuanto de tiempo puede hacerse demasiado
pequeño, para un proceso que tenga una cantidad elevada de hilos. Un proceso que tenga N
hilos en la cola de preparados va a generar N veces más cambios de contexto por unidad de
tiempo que un proceso con un único hilo. Esto puede tener un impacto en el rendimiento
general del sistema, ya que se incrementaría el tiempo dedicado a cambios de contexto (que es
improductivo).
3 (2 puntos) Diseñe una solución para dos procesos al problema de la sección crítica, basada en la
instrucción atómica SWAP(A,B). La solución debe cumplir al menos la propiedad de exclusión
mutua y la de progreso. No hace falta garantizar la espera limitada. Justifique la validez de la solución.
Puede verse una solución en las diapos del Tema 6, página 32.
Calificación

1
2
Fundamentos de los Sistemas Operativos 3
Convocatoria ordinaria – SEGUNDA PARTE
7 de junio de 2013

Nombre y apellidos DNI/NIE


SOLUCIONES
DURACIÓN: Dispone de dos horas para realizar el examen.
PUNTOS EXTRAS: este examen contiene hasta 2,5 puntos extras, que servirán para incrementar los 10 puntos de
la nota base del examen. La nota del examen será la suma de los puntos básicos y los extras, hasta un máximo de 10.
1 (5 puntos + 0,5 puntos extras) Test. En cada uno de los siguientes apartados, señale cuál
opción es correcta. En caso de que existan varias opciones ciertas, se considerará como correcta la
más completa o precisa. Las preguntas no contestadas no puntúan; las contestadas erróneamente
puntúan negativamente restando un tercio de su valor. Marque sus respuestas en esta misma hoja,
rodeando con un círculo la opción correcta. Si se equivoca, tache la respuesta equivocada. Escriba
con tinta negra o azul. Las preguntas respondidas con lápiz o con varios círculos no tachados se
considerarán no contestadas.
1. Sea un procesador que utiliza paginación, con 4KB de tamaño de página y en el que los procesos 
pueden direccionar como máximo 8192 páginas. El tamaño de la dirección lógica en este procesador 
es de: 
a. 12 bits. 
b. 13 bits. 
c. ** 25 bits. [13 bits para el selector de página y 12 bits para el desplazamiento] 
d. 32 bits. 
2. En el sistema de la pregunta anterior: 
a. La tabla de páginas de un proceso nunca ocupará más de un marco de página. 
b. La TLB debe tener un tamaño mínimo de 8192 entradas. 
c. La memoria física nunca podrá tener más de 8192 marcos. 
d. ** Un proceso no podrá direccionar simultáneamente más de 8192 marcos. 
3. Sea un sistema con memoria paginada, de un solo nivel, y tamaño de página de 1KB, con una TLB de 
10 entradas. El tiempo de acceso a la RAM es de 120 nseg., el tiempo de acceso a la TLB es de 10 
nseg. y la tasa de fallos de la TLB es del 10%. En este sistema, el tiempo medio de acceso a un dato en 
memoria virtual es de: 
a. 130 nseg. 
b. ** 142 nseg. [10nseg de acceso a la TLB + 10%·120nseg para acceder a la tabla de
páginas + 120nseg para acceder al dato] 
c. 241 nseg. 
d. 250 nseg. 
4. Sea un sistema de memoria paginado que utiliza direcciones lógicas de 24 bits y tamaño de página de 
1 kilobyte. Cada entrada en la tabla de páginas ocupa 4 bytes. ¿Cuál es el número máximo de marcos 
de página que se necesitarán para almacenar por completo una tabla de páginas en memoria? 
a. 16. 
b. 32. 
c. ** 64. [en un marco de 1KB caben 256=28 entradas. Un proceso puede llegar a tener
224/210=214 páginas. Por tanto hacen falta 214/28 = 26 = 64 páginas.] 
d. No es posible calcular el dato sin disponer del tamaño de las direcciones físicas. 
5. Sea la siguiente cadena de referencias a memoria en un sistema paginado: 3 2 1 0 3 2 4 3 2 1 0 4. 
Considerando que disponemos de tres marcos de página, inicialmente libres, y utilizando FIFO como 
política de reemplazo de páginas: 
a. ** La cadena genera 9 fallos de página. [aplicar el algoritmo] 
b. La cadena genera 10 fallos de página. 
c. La cadena genera 6 fallos de página. 
d. La cadena genera 5 fallos de página. 
6. La cadena de referencias de la pregunta anterior, suponiendo que disponemos de N marcos de 
página inicialmente libres y para cualquier política de reemplazo que escojamos: 
a. Genera al menos N fallos de página. [no puede generar más de 12 en el peor caso] 
b. ** Genera al menos 5 fallos de página. [en la cadena hay referencias a cinco páginas
distintas y todas ellas provocarán al menos un fallo.] 
c. Genera como máximo N fallos de página. 
d. Genera como máximo mín(N,12) fallos de página.   
7. Tenemos un sistema de archivos tipo UNIX cuyo tamaño de bloque es de 512 bytes. Considere que la 
estructura de i‐nodos que usa el sistema contiene: 10 entradas directas a bloques, 4 entradas 
indirectas y 2 entradas doblemente indirectas. Cada entrada (o puntero) mide 4 bytes. ¿Cuál es el 
tamaño máximo que podría tener un fichero en este sistema? 
a. 8453 kilobytes. 
b. 10048 kilobytes. 
c. ** 16645 kilobytes. [un fichero puede tener hasta 10 + 4·128 + 2·128·128 entradas =
33290 entradas a bloques de 512 bytes = 16645 KB. Los 128 resultan de dividir 512
bytes del bloque entre 4 bytes por entrada.] 
d. 48096 kilobytes. 
8. En el sistema de archivos descrito en la pregunta anterior, ¿qué ocurrirá con el tamaño máximo de un 
fichero si el tamaño de bloque del sistema pasa a ser de 1024 bytes? Señale cuál es la opción que se 
aproxima más al dato correcto: 
a. El tamaño máximo seguirá siendo más o menos el mismo. 
b. El tamaño máximo se duplicará con respecto al caso original. 
c. ** El tamaño máximo será en torno a cuatro veces el original. [Cada bloque de 1024
bytes puede tener 1024/4=256 entradas. Por tanto un fichero puede tener hasta 10 +
4·256 + 2·256·256 entradas ≈ 128K bloques de 1K = 128MB, que es unas ocho
veces el tamaño máximo original. La medida más cercana de las propuestas es la
(c), ya que la (d) nos llevaría a cantidades de varios terabytes.] 
d. El tamaño máximo aumentará de forma cuadrática (si N era el tamaño original, el nuevo 
estará en torno a N2). 
9. Del sistema de asignación contigua de espacio a ficheros puede afirmarse que: 
a. Permite el acceso eficiente a la información contenida en los ficheros, tanto de manera 
secuencial como directa (aleatoria). 
b. La cuestión de cuánto espacio reservar para un nuevo fichero influye en la eficiencia del 
sistema. 
c. Padece el problema de fragmentación externa. 
d. ** Todas las afirmaciones anteriores son correctas. 
10. Del sistema de asignación enlazada de espacio a ficheros puede afirmarse que: 
a. Permite el acceso eficiente a la información contenida en los ficheros, tanto de manera 
secuencial como directa (o aleatoria). 
b. ** Permite agrupar bloques en grupos contiguos llamados clusters, enlazando los clusters 
entre sí,  lo que reduce la cantidad de punteros necesarios para mantener las listas 
enlazadas, aunque a costa de la fragmentación interna. 
c. Padece el problema de fragmentación externa. 
d. Es muy robusto frente a pérdidas de bloques o punteros causados por averías del hardware. 
11. Sea un sistema de ficheros que gestiona el almacenamiento con el método de asignación enlazada. 
Los bloques de dicho sistema miden 512 bytes y el tamaño de los apuntadores de la lista de bloques 
es de 2 bytes. ¿Cuál es el tamaño máximo (la máxima cantidad neta de información) que puede tener 
un fichero en este sistema? 
a. 510 ∙ 28  bytes. 
b. 512 ∙ 28  bytes. 
c. ** 510 ∙ 216  bytes. [quitamos 2 bytes al bloque de 512, que queda reservado para el
enlace. Puede haber en el mejor de los casos 216 enlaces diferentes.] 
d. 512 ∙ 216  bytes. 
12. El sistema de directorios de Linux tiene una organización de tipo: 
a. Árbol. 
b. Grafo acíclico. 
c. ** Grafo general. 
d. Una combinación precompilada de los anteriores. 
Nombre y apellidos DNI/NIE

(+0,5 puntos extras) Indique cuántas preguntas cree usted que ha acertado en el test: _____
Si la desviación entre su respuesta y los aciertos realmente obtenidos es menor o igual que 1, obtendrá usted 0,5 puntos
extras en la calificación del examen. Si la desviación es de 2, obtendrá usted 0,25 puntos extras.
2 (2 puntos) Ayoze y Belinda son compañeros de estudios. Acaban de comprarse sendas memorias
USB de 16GB para guardar el material de sus asignaturas, consistente sobre todo en documentos
ofimáticos y código fuente. Ayoze formatea su memoria mediante FAT32, mientras que Belinda lo
hace con NTFS. Los dos guardan en sus respectivas memorias exactamente los mismos archivos,
pero mientras a Ayoze el sistema le reporta que la memoria tiene 8GB de espacio libre, a Belinda el
sistema le reporta 9GB de espacio libre.
TAREA. Indique qué causas pueden haber provocado que haya una diferencia tan sustancial en el
espacio libre que hay disponible en cada memoria, teniendo en cuenta que la única diferencia entre
ambas es el tipo de sistema de ficheros.
NOTA: no importa que usted no conozca los detalles de FAT32 y NTFS. El objetivo es que usted
señale posibles factores que originan esta diferencia de espacio libre, derivados de las posibles diferencias
en la la implementación del sistema de archivos.
Hay múltiples factores que pueden provocar estas diferencias. Algunos de ellos pueden ser:
• Un sistema de archivos dedica parte del dispositivo de almacenamiento para almacenar
información de estado del sistema (ej. lista de bloques libres, apuntadores a bloques
dañados, i-nodes, FAT, etc.) Cada sistema de archivos tendrá un formato distinto y, en
consecuencia, habrá variaciones en el espacio que quede disponible.
• Cada uno de los sistemas de archivos puede estar empleando un tamaño de bloque
diferente. Por ejemplo, el FAT32 podría estar usando bloques de 64KB y el NTFS,
bloques de 1KB. Esto puede afectar sensiblemente al espacio consumido, sobre todo si
hay muchos ficheros pequeños que ocupan un solo bloque.
• Cada archivo puede consumir un espacio adicional en estructuras relacionadas con sus
atributos (fechas de acceso, permisos de acceso, versiones, etc.), o bien estructuras
necesarias para conocer cuáles son sus bloques de datos. El tamaño de estas
estructuras puede ser bastante diferente entre cada sistema de ficheros.
• También puede haber diferencias si sólo uno de los sistemas de ficheros ha detectado
bloques dañados, aunque este factor depende de diferencias físicas en los dispositivos,
que en el enunciado de la pregunta no se han dado como posibles.

3 (3 puntos + 2 puntos extras) En una fábrica se tienen tres tipos de procesos que modelan una
planta embotelladora de bebidas, y que trabajan en paralelo:
• Varios procesos de tipo «Embotellador» se encargan de preparar botellas de un litro.
• Un único proceso «Empaquetador» se encarga de empaquetar y reponer las cajas donde se
van colocando las botellas y colocarlas en un pale.
• Un único proceso «Almacenista» se encarga de recoger el pale, buscarle un hueco en el
almacén y reponer los pales de forma que los procesos empaquetadores puedan colocar
nuevas cajas.
Cada vez que un embotellador prepara una botella, ésta se coloca en una caja, que tiene una
capacidad de 12 botellas. Si al colocar la botella la caja queda llena, se envía una señal al
empaquetador, que toma la caja, la sella y la coloca en un pale. El empaquetador deposita una nueva
caja de 12 botellas, totalmente vacía. Cada pale tiene una capacidad para 24 cajas. Si al colocar la caja
en el pale, éste queda completo, se envía una señal al almacenista, que toma el pale y lo ubica en el
almacén. El almacenista deposita un nuevo pale, totalmente vacío.
Mientras el empaquetador está haciendo su labor, los embotelladores no pueden colocar sus botellas,
ya que en esos momentos no hay una caja disponible. Mientras el almacenista está haciendo su labor,
el empaquetador no puede colocar cajas, ya que en esos momentos no hay un pale disponible. Se
asume que siempre existirá hueco en el almacén.
En el momento inicial existe una caja vacía y un pale totalmente vacío. Una vez que arrancan, los
procesos ejecutan su actividad una y otra vez en un bucle infinito.
TAREA. Tiene usted que describir los algoritmos del embotellador, el empaquetador y el
almacenista, implementando con semáforos las sincronizaciones que sean necesarias.
Si quiere obtener puntos extras se proponen estas tareas adicionales:
• Extra 1 (+1 punto). Modifique el sistema de tal forma que, cuando se consigan llenar 20
pales, todos los procesos finalicen.
• Extra 2 (+1 punto). Modifique el sistema de tal forma que los procesos embotelladores
puedan colocar botellas mientras el almacenista está realizando su tarea.

SOLUCIÓN. Aquí se presentan unas propuestas de algoritmos para resolver el ejercicio


principal y los extras. Tenga en cuenta que pueden existir otras soluciones igualmente
correctas.
Semaforo embotella(0), empaqueta(0), almacena(0), alm_empaq(0), mutex(1); 
int nlitros=12; 
int ncajas=24; 
Proceso EmbotelladorN() {    Proceso Empaquetador() { 
for(;;) {  for(;;) { 
   // Prepara una botella     empaqueta.P(); 
   mutex.P();     // Empaqueta la caja actual; 
   nlitros‐‐;     ncajas‐‐; 
   if (nlitros==0) {     if (ncajas==0) { 
      empaqueta.V();        almacena.V(); 
      embotella.P();        alm_empaq.P(); 
   }     } 
   mutex.V();     // Pone una caja nueva vacía 
}     nlitros=12; 
}     embotella.V(); 


Proceso Almacenista() { 
for(;;) { 
   almacena.P(); 
   // Coger y colocar pale; 
   // Poner un nuevo pale vacío 
   ncajas=24; 
   alm_empaq.V(); 

}
Nombre y apellidos DNI/NIE

EXTRA 1
Semaforo embotella(0), empaqueta(0), almacena(0), alm_empaq(0), mutex(1); 
int nlitros=12; 
int ncajas=24; 
int npales=0; 
Proceso EmbotelladorN() {    Proceso Empaquetador() { 
for(;;) {  for(;;) { 
   // Prepara una botella     empaqueta.P(); 
   mutex.P();     // Empaqueta la caja actual; 
   if (npales==20) {     ncajas‐‐; 
      mutex.V();     if (ncajas==0) { 
      break;        almacena.V(); 
   }        alm_empaq.P(); 
   nlitros‐‐;     } 
   if (nlitros==0) {     if (npales==20) { 
      empaqueta.V();        embotella.V(); 
      embotella.P();        break; 
   }     } 
   mutex.V();     // Pone una caja nueva vacía 
}     nlitros=12; 
}     embotella.V(); 


Proceso Almacenista() { 
for(;;) { 
   almacena.P(); 
   npales++; 
   // Coger y colocar pale; 
   if (npales==20) { 
      alm_empaq.V(); 
      break; 
   } 
   // Poner un nuevo pale vacío 
   ncajas=24; 
   alm_empaq.V(); 

}
EXTRA 2

Semaforo embotella(0), empaqueta(0), almacena(0), alm_empaq(0), mutex(1); 
int nlitros=12; 
int ncajas=24; 
Proceso EmbotelladorN() {    Proceso Empaquetador() { 
for(;;) {  for(;;) { 
   // Prepara una botella     empaqueta.P(); 
   mutex.P();     // Empaqueta la caja actual; 
   nlitros‐‐;     // Pone una caja nueva vacía 
   if (nlitros==0) {     nlitros=12; 
      empaqueta.V();     embotella.V(); 
      embotella.P();     ncajas‐‐; 
   }     if (ncajas==0) { 
   mutex.V();        almacena.V(); 
}        empaqueta.P(); 
}     } 


Proceso Almacenista() { 
for(;;) { 
   almacena.P(); 
   // Coger y colocar pale; 
   // Poner un nuevo pale vacío 
   ncajas=24; 
   empaqueta.V(); 

}
Calificación

1
2
Fundamentos de los Sistemas Operativos 3
Convocatoria extraordinaria
27 de junio de 2013

Nombre y apellidos DNI/NIE


SOLUCIONES
DURACIÓN: Dispone de dos horas para realizar el examen.
PUNTOS EXTRAS: este examen contiene hasta 0,5 puntos extras, que servirán para incrementar los 10 puntos de la nota
base del examen. La nota del examen será la suma de los puntos básicos y los extras, hasta un máximo de 10.
1 (6 puntos + 0,5 puntos extras) Test. En cada uno de los siguientes apartados, señale cuál opción es
correcta. En caso de que existan varias opciones ciertas, se considerará como correcta la más completa o
precisa. Las preguntas no contestadas no puntúan; las contestadas erróneamente puntúan negativamente
restando un tercio de su valor. Marque sus respuestas en esta misma hoja, rodeando con un círculo la opción
correcta. Si se equivoca, tache la respuesta equivocada. Escriba con tinta negra o azul. Las preguntas
respondidas con lápiz o con varios círculos no tachados se considerarán no contestadas.
1. ¿Cuál  de  las  siguientes  afirmaciones  sobre  el  sistema  operativo  es  verdadera?  
a. **  El  intérprete  de  órdenes  sirve  para  ejecutar  servicios  proporcionados  por  el  sistema  operativo.  
b. Las  órdenes  del  shell  son  llamadas  al  sistema.  
c. El  intérprete  de  órdenes  se  ejecuta  en  modo  núcleo,  puesto  que  se  comunica  directamente  con  el  
hardware.  
d. El  intérprete  de  órdenes  realiza  la  traducción  dinámica  de  direcciones  de  los  programas  de  usuario.  
2. ¿Cuál  de  estas  afirmaciones  sobre  el  sistema  operativo  es  FALSA?  
a. El  reparto  de  los  recursos  de  la  máquina  entre  los  procesos  que  coexisten  en  el  ordenador  es  una  
tarea  del  sistema  operativo.  
b. Garantizar  la  protección  entre  usuarios  de  un  sistema  es  tarea  del  sistema  operativo,  no  del  hardware.  
c. El  sistema  operativo  se  considera  una  máquina  extendida  porque  además  de  facilitar  el  uso  del  
hardware  también  proporciona  servicios  que  éste  no  puede  ofrecer  por  sí  solo.  
d. **  La  detección  de  un  fallo  de  página  es  tarea  del  sistema  operativo.  
3. Cuál  de  los  siguientes  métodos  de  planificación  de  procesos  es  más  adecuado  para  gestionar  un  sistema,  si  el  
objetivo  principal  es  minimizar  el  tiempo  de  espera  medio  de  los  procesos?  
a. Turno  rotatorio  (o  round  robin).  
b. Turno  rotatorio  con  múltiples  colas  realimentadas.  
c. FIFO.  
d. **  SJF.  
4. ¿Cuál  de  estas  transiciones  de  estados  de  un  proceso  jamás  se  produce  en  un  sistema  normal?  
a. de  “bloqueado”  a  “preparado”.  
b. **  de  “preparado”  a  “bloqueado”.  
c. de  “activo”  a  “preparado”.  
d. de  “activo”  a  “bloqueado”.  
5. Los  hilos  de  un  mismo  proceso:  
a. Comparten  todos  los  recursos,  excepto  las  interrupciones.  
b. **  Comparten  el  código  y  los  datos,  pero  no  la  pila.  
c. Comparten  el  código,  las  variables  locales  y  los  ficheros  abiertos.  
d. Comparten  el  código,  los  registros  de  CPU  y  los  datos.  
   

     Página  1  de  4    
6. Sea  un  sistema  multiprogramado,  con  gestión  de  memoria  virtual  por  demanda  de  páginas  con  tamaño  de  
página  de  4  KB.  Considere  que  la  Tabla  1  representa  la  tabla  de  páginas  de  un  proceso  P  en  un  instante  dado.  
¿Cuál  es  la  dirección  física  correspondiente  a  la  dirección  lógica  0B1F?  Observe  que  todas  las  direcciones  están  
expresadas  en  hexadecimal.  
a. **  2AB1F.  
b. 3BB1F.  
c. No  hay  tal  dirección  física,  pues  se  produce  un  fallo  de  página.  
d. Con  los  datos  proporcionados  no  es  posible  obtener  una  dirección  física.  
7. Considerando  el  mismo  sistema  de  la  pregunta  anterior,  pero  duplicando  el  tamaño  de  página:  
a. Empeoraría  el  problema  de  la  fragmentación  externa  y  disminuiría  el  tamaño  de  las  tablas  de  página.  
b. **  Empeoraría  el  problema  de  la  fragmentación  interna  y  disminuiría  el  tamaño  de  las  tablas  de  
página.  
c. Empeoraría  el  problema  de  la  fragmentación  externa  y  aumentaría  el  tamaño  de  las  tablas  de  página.  
d. Empeoraría  el  problema  de  la  fragmentación  interna  y  aumentaría  el  tamaño  de  las  tablas  de  página.  
8. En  un  sistema  multiprogramado  con  gestión  de  memoria  por  paginación,  donde  los  procesos  tienen  16  KB  de  
espacio  lógico,  las  páginas  son  de  1  KB  y  hay  64  KB  de  memoria  física,  sin  memoria  virtual,  la  dirección  lógica  
está  formada  por:  
a. 4  bits  para  la  página  y  12  bits  para  el  desplazamiento.  
b. **  4  bits  para  la  página  y  10  bits  para  el  desplazamiento.  
c. 6  bits  para  la  página  y  12  bits  para  el  desplazamiento.  
d. 6  bits  para  la  página  y  10  bits  para  el  desplazamiento.  
9. Considere  un  sistema  de  gestión  de  memoria  paginado,  con  doble  nivel  de  paginación  y  los  siguientes  
parámetros:  tiempo  de  acceso  a  la  TLB  tt  u.t.,  tiempo  de  acceso  a  memoria  tm,  tasa  de  aciertos  de  la  TLB,  ta  %.  
¿Cuál  de  las  siguientes  expresiones  corresponde  al  tiempo  medio  de  acceso  a  un  dato  en  memoria?  
a. **  ! !"" !! !! + !! + !"" − !! !! + !!!  
b. 1 100 !! !! + !! + 100 − !! !! + 2!!  
c. !! !! + !! + 100 − !! !! + 3!!  
d. !! !! + 3!! + 100 − !! !! + !!  
10. Dada  la  siguiente  cadena  de  referencias  a  memoria  en  un  sistema  con  tres  marcos  de  página  inicialmente  
libres,  ¿cuántos  fallos  de  página  se  producen?  0  1  2  4  0  1  3  0  1  2  4  3  
a. **  9  fallos  con  la  política  de  reemplazo  FIFO,  9  con  la  de  segunda  oportunidad  y  7  con  la  óptima.  
b. 10  fallos  con  la  política  de  reemplazo  FIFO,  9  con  la  de  segunda  oportunidad  y  7  con  la  óptima.  
c. 10  fallos  con  la  política  de  reemplazo  FIFO,  8  con  la  de  segunda  oportunidad  y  8  con  la  óptima.  
d. 9  fallos  con  la  política  de  reemplazo  FIFO,  8  con  la  de  segunda  oportunidad  y  7  con  la  óptima.  
11. El  mapa  de  bits  para  mantener  el  espacio  libre  en  el  disco  ocupará:  
a. **  Tantos  bits  como  bloques  tenga  el  disco.  
b. Tantos  bits  como  bloques  libres  tenga  el  disco.  
c. Tantos  bits  como  bloques  tenga  el  disco,  multiplicado  por  el  número  de  archivos  que  tenga  cada  
bloque.  
d. Tantos  bits  como  bloques  libres  tenga  el  disco,  multiplicado  por  el  logaritmo  en  base  2  del  tamaño  del  
bloque.  
12. El  método  de  listas  enlazadas  para  la  asignación  del  espacio  en  disco  presenta  el  siguiente  inconveniente:  
a. Es  necesario  conocer  el  tamaño  máximo  de  archivo  en  el  momento  de  su  creación.  
b. Genera  una  excesiva  fragmentación  externa  en  el  disco.  
c. **  El  acceso  aleatorio  (directo)  a  un  archivo  es  muy  ineficiente.  
d. Se  desperdicia  espacio  debido  a  las  tablas  de  índices.  
13. Sea  un  sistema  de  ficheros  gestionado  con  i-­‐nodos  los  cuales,  entre  otra  información,  contienen  las  siguientes  
entradas  a  bloques  de  datos:  16  entradas  directas,  4  entradas  indirectas,  2  entradas  doblemente  indirectas  y  
una  entrada  triplemente  indirecta.  Si  h  es  el  número  de  índices  por  bloque,  ¿cuál  es  el  tamaño  máximo  que  
puede  tener  un  archivo  en  este  sistema?  
a. **  16+4h+2h2+h3  bloques.  
b. 16+4h+2h+3h  bloques.  
c. h(16+4h+2h2+h3)  bloques.  
d. 16+4h+22h+23h  bloques.  

(+0,5 puntos extras) Indique cuántas preguntas cree usted que ha acertado en el test: _____
Si la desviación entre su respuesta y los aciertos realmente obtenidos es menor o igual que 1, obtendrá usted 0,5 puntos extras en
la calificación del examen. Si la desviación es de 2, obtendrá usted 0,25 puntos extras.

    Página  2  de  4  
Marco v r m
0 2A 1 0 1
1 0F 1 0 0
2 F1 0 0 0
3 3B 0 0 0
Tabla  1:  Tabla  de  páginas.  v,  r  y  m  se  refieren  al  bit  
de  validez,  el  bit  de  referencia  y  el  bit  de  modificado,  
respectivamente  

2 (3 puntos) La urbanización Residencial SISOP dispone de una cancha de pádel para uso y disfrute de sus
residentes. La política de uso de esta instalación deportiva es muy simple: a medida que van llegando
jugadores a la cancha, estos van ocupando un puesto a la espera de completar el cupo de 4 jugadores,
momento en el que pueden disputar un partido. Solo cuando llega el cuarto jugador, se disputa el partido.
Una vez el partido finaliza, los cuatro jugadores abandonan la cancha, dejándola libre. Si llegan jugadores
mientras se está disputando un partido, estos deberán esperar a que la cancha quede libre.
Se pide escribir un algoritmo jugador de forma que se cumplan las reglas descritas empleando semáforos como
herramienta de sincronización. Puede asumir que la acción de jugar un partido durará un tiempo finito e igual
para todos los jugadores y además puede suponer que continuamente llegan jugadores a la cancha con la
intención de jugar un partido.
SOLUCIÓN. Se presenta un algoritmo para resolver el ejercicio. Pueden existir otras soluciones
igualmente correctas.
//  Variables  globales  
Semaforo  court  (4),  mutex  (1),  queue(0);  
int  waitingmatch  =  0,  finishingmatch=0;  
 
Proceso  Jugador(){  
int  count;  
 
//Protocolo  de  entrada  a  la  cancha  
court.P();   //  Reservamos  plaza  
mutex.P();   //  Cerramos  semáforo  para  la  modificación/consulta  de  var.  comp.  
waitingmatch++;  
if  (waitingmatch  <  4  )  {  
  mutex.V();   //  Abrimos  el  semáforo  para  evitar  interbloqueos  
queue.P();     //  nos  mantenemos  bloqueados  hasta  ser  cuatro  
}  
else  {  //  waitingmatch  =  4,  desbloqueamos  para  jugar  partido  
  waitingmatch  =  0;  
  for(count=0;  count<3;count++)  {    
queue.V();  //  despertamos  a  los  tres  jugadores  que  esperan  
}  
  mutex.V();  
}  
 
//Jugar  partido  
 
//  Protocolo  de  salida  de  la  cancha  
mutex.P();  
finishingmatch++;  
if  (finishingmatch  =  4)  {  //El  último  abre  la  entrada  a  nuevos  jugadores  
  finishingmatch  =  0;  
  for(count=0;  count<4;count++)  {    
court.V();  //  dejamos  libre  la  entrada  a  otros  cuatro  jugadores  
}  
mutex.V();  
}  

    Página  3  de  4  
3 (1 punto) En un sistema de archivos basado en FAT, tenemos la siguiente información al principio de la
FAT, y en las entradas de directorio de los archivos F1, F2, F3 y F4. ¿Qué bloques componen estos archivos?
¿Encuentra alguna incidencia en el sistema de archivos?

SOLUCIÓN:
F1: bloques 5, 7 y 9
F2: bloques 2 y 3
F3: bloques 6, 11, 12 y 13, pero hay una incidencia: el bloque 13 está marcado como defectuoso
F4: bloque 8

    Página  4  de  4  
Calificación

1
2
Fundamentos de los Sistemas Operativos 3
Convocatoria extraordinaria
27 de junio de 2013

Nombre y apellidos DNI/NIE


SOLUCIONES
DURACIÓN: Dispone de dos horas para realizar el examen.
PUNTOS EXTRAS: este examen contiene hasta 0,5 puntos extras, que servirán para incrementar los 10 puntos de la nota
base del examen. La nota del examen será la suma de los puntos básicos y los extras, hasta un máximo de 10.
1 (6 puntos + 0,5 puntos extras) Test. En cada uno de los siguientes apartados, señale cuál opción es
correcta. En caso de que existan varias opciones ciertas, se considerará como correcta la más completa o
precisa. Las preguntas no contestadas no puntúan; las contestadas erróneamente puntúan negativamente
restando un tercio de su valor. Marque sus respuestas en esta misma hoja, rodeando con un círculo la opción
correcta. Si se equivoca, tache la respuesta equivocada. Escriba con tinta negra o azul. Las preguntas
respondidas con lápiz o con varios círculos no tachados se considerarán no contestadas.
1. ¿Cuál  de  las  siguientes  afirmaciones  sobre  el  sistema  operativo  es  verdadera?  
a. El  intérprete  de  órdenes  realiza  la  traducción  dinámica  de  direcciones  de  los  programas  de  usuario.  
b. Las  órdenes  del  shell  son  llamadas  al  sistema.  
c. El  intérprete  de  órdenes  se  ejecuta  en  modo  núcleo,  puesto  que  se  comunica  directamente  con  el  
hardware.  
d. **  El  intérprete  de  órdenes  sirve  para  ejecutar  servicios  proporcionados  por  el  sistema  operativo.  
2. ¿Cuál  de  estas  afirmaciones  sobre  el  sistema  operativo  es  FALSA?  
a. El  reparto  de  los  recursos  de  la  máquina  entre  los  procesos  que  coexisten  en  el  ordenador  es  una  
tarea  del  sistema  operativo.  
b. **  La  detección  de  un  fallo  de  página  es  tarea  del  sistema  operativo.  
c. Garantizar  la  protección  entre  usuarios  de  un  sistema  es  tarea  del  sistema  operativo,  no  del  hardware.  
d. El  sistema  operativo  se  considera  una  máquina  extendida  porque  además  de  facilitar  el  uso  del  
hardware  también  proporciona  servicios  que  éste  no  puede  ofrecer  por  sí  solo.  
3. Cuál  de  los  siguientes  métodos  de  planificación  de  procesos  es  más  adecuado  para  gestionar  un  sistema,  si  el  
objetivo  principal  es  minimizar  el  tiempo  de  espera  medio  de  los  procesos?  
a. Turno  rotatorio  (o  round  robin).  
b. Turno  rotatorio  con  múltiples  colas  realimentadas.  
c. **  SJF.  
d. FIFO.  
4. ¿Cuál  de  estas  transiciones  de  estados  de  un  proceso  jamás  se  produce  en  un  sistema  normal?  
a. de  “bloqueado”  a  “preparado”.  
b. de  “activo”  a  “preparado”.  
c. **  de  “preparado”  a  “bloqueado”.  
d. de  “activo”  a  “bloqueado”.  
5. Los  hilos  de  un  mismo  proceso:  
a. Comparten  todos  los  recursos,  excepto  las  interrupciones.  
b. Comparten  el  código,  las  variables  locales  y  los  ficheros  abiertos.  
c. Comparten  el  código,  los  registros  de  CPU  y  los  datos.  
d. **  Comparten  el  código  y  los  datos,  pero  no  la  pila.  
   

     ·∙  Página  1  de  4    


6. Sea  un  sistema  multiprogramado,  con  gestión  de  memoria  virtual  por  demanda  de  páginas  con  tamaño  de  
página  de  4  KB.  Considere  que  la  Tabla  1  representa  la  tabla  de  páginas  de  un  proceso  P  en  un  instante  dado.  
¿Cuál  es  la  dirección  física  correspondiente  a  la  dirección  lógica  0B1F?  Observe  que  todas  las  direcciones  están  
expresadas  en  hexadecimal.  
a. No  hay  tal  dirección  física,  pues  se  produce  un  fallo  de  página.  
b. **  2AB1F.  
c. 3BB1F.  
d. Con  los  datos  proporcionados  no  es  posible  obtener  una  dirección  física.  
7. Considerando  el  mismo  sistema  de  la  pregunta  anterior,  pero  duplicando  el  tamaño  de  página:  
a. Empeoraría  el  problema  de  la  fragmentación  externa  y  aumentaría  el  tamaño  de  las  tablas  de  página.  
b. Empeoraría  el  problema  de  la  fragmentación  externa  y  disminuiría  el  tamaño  de  las  tablas  de  página.  
c. **  Empeoraría  el  problema  de  la  fragmentación  interna  y  disminuiría  el  tamaño  de  las  tablas  de  
página.  
d. Empeoraría  el  problema  de  la  fragmentación  interna  y  aumentaría  el  tamaño  de  las  tablas  de  página.  
8. En  un  sistema  multiprogramado  con  gestión  de  memoria  por  paginación,  donde  los  procesos  tienen  16  KB  de  
espacio  lógico,  las  páginas  son  de  1  KB  y  hay  64  KB  de  memoria  física,  sin  memoria  virtual,  la  dirección  lógica  
está  formada  por:  
a. **  4  bits  para  la  página  y  10  bits  para  el  desplazamiento.  
b. 4  bits  para  la  página  y  12  bits  para  el  desplazamiento.  
c. 6  bits  para  la  página  y  12  bits  para  el  desplazamiento.  
d. 6  bits  para  la  página  y  10  bits  para  el  desplazamiento.  
9. Considere  un  sistema  de  gestión  de  memoria  paginado,  con  doble  nivel  de  paginación  y  los  siguientes  
parámetros:  tiempo  de  acceso  a  la  TLB  tt  u.t.,  tiempo  de  acceso  a  memoria  tm,  tasa  de  aciertos  de  la  TLB,  ta  %.  
¿Cuál  de  las  siguientes  expresiones  corresponde  al  tiempo  medio  de  acceso  a  un  dato  en  memoria?  
a. !! !! + 3!! + 100 − !! !! + !!  
b. !! !! + !! + 100 − !! !! + 3!!  
c. **  ! !"" !! !! + !! + !"" − !! !! + !!!  
d. 1 100 !! !! + !! + 100 − !! !! + 2!!  
10. Dada  la  siguiente  cadena  de  referencias  a  memoria  en  un  sistema  con  tres  marcos  de  página  inicialmente  
libres,  ¿cuántos  fallos  de  página  se  producen?  0  1  2  4  0  1  3  0  1  2  4  3  
a. 10  fallos  con  la  política  de  reemplazo  FIFO,  9  con  la  de  segunda  oportunidad  y  7  con  la  óptima.  
b. 10  fallos  con  la  política  de  reemplazo  FIFO,  8  con  la  de  segunda  oportunidad  y  8  con  la  óptima.  
c. **  9  fallos  con  la  política  de  reemplazo  FIFO,  9  con  la  de  segunda  oportunidad  y  7  con  la  óptima.  
d. 9  fallos  con  la  política  de  reemplazo  FIFO,  8  con  la  de  segunda  oportunidad  y  7  con  la  óptima.  
11. El  mapa  de  bits  para  mantener  el  espacio  libre  en  el  disco  ocupará:  
a. **  Tantos  bits  como  bloques  tenga  el  disco.  
b. Tantos  bits  como  bloques  libres  tenga  el  disco.  
c. Tantos  bits  como  bloques  tenga  el  disco,  multiplicado  por  el  número  de  archivos  que  tenga  cada  
bloque.  
d. Tantos  bits  como  bloques  libres  tenga  el  disco,  multiplicado  por  el  logaritmo  en  base  2  del  tamaño  del  
bloque.  
12. El  método  de  listas  enlazadas  para  la  asignación  del  espacio  en  disco  presenta  el  siguiente  inconveniente:  
a. Se  desperdicia  espacio  debido  a  las  tablas  de  índices.  
b. Es  necesario  conocer  el  tamaño  máximo  de  archivo  en  el  momento  de  su  creación.  
c. Genera  una  excesiva  fragmentación  externa  en  el  disco.  
d. **  El  acceso  aleatorio  (directo)  a  un  archivo  es  muy  ineficiente.  
13. Sea  un  sistema  de  ficheros  gestionado  con  i-­‐nodos  los  cuales,  entre  otra  información,  contienen  las  siguientes  
entradas  a  bloques  de  datos:  16  entradas  directas,  4  entradas  indirectas,  2  entradas  doblemente  indirectas  y  
una  entrada  triplemente  indirecta.  Si  h  es  el  número  de  índices  por  bloque,  ¿cuál  es  el  tamaño  máximo  que  
puede  tener  un  archivo  en  este  sistema?  
a. 16+4h+2h+3h  bloques.  
b. **  16+4h+2h2+h3  bloques.  
c. h(16+4h+2h2+h3)  bloques.  
d. 16+4h+22h+23h  bloques.  

(+0,5 puntos extras) Indique cuántas preguntas cree usted que ha acertado en el test: _____
Si la desviación entre su respuesta y los aciertos realmente obtenidos es menor o igual que 1, obtendrá usted 0,5 puntos extras en
la calificación del examen. Si la desviación es de 2, obtendrá usted 0,25 puntos extras.

     ·∙Página  2  de  4  
Marco v r m
0 2A 1 0 1
1 0F 1 0 0
2 F1 0 0 0
3 3B 0 0 0
Tabla  1:  Tabla  de  páginas.  v,  r  y  m  se  refieren  al  bit  
de  validez,  el  bit  de  referencia  y  el  bit  de  modificado,  
respectivamente  

2 (3 puntos) La urbanización Residencial SISOP dispone de una cancha de pádel para uso y disfrute de sus
residentes. La política de uso de esta instalación deportiva es muy simple: a medida que van llegando
jugadores a la cancha, estos van ocupando un puesto a la espera de completar el cupo de 4 jugadores,
momento en el que pueden disputar un partido. Solo cuando llega el cuarto jugador, se disputa el partido.
Una vez el partido finaliza, los cuatro jugadores abandonan la cancha, dejándola libre. Si llegan jugadores
mientras se está disputando un partido, estos deberán esperar a que la cancha quede libre.
Se pide escribir un algoritmo jugador de forma que se cumplan las reglas descritas empleando semáforos como
herramienta de sincronización. Puede asumir que la acción de jugar un partido durará un tiempo finito e igual
para todos los jugadores y además puede suponer que continuamente llegan jugadores a la cancha con la
intención de jugar un partido.
SOLUCIÓN. Se presenta un algoritmo para resolver el ejercicio. Pueden existir otras soluciones
igualmente correctas.
//  Variables  globales  
Semaforo  court  (4),  mutex  (1),  queue(0);  
int  waitingmatch  =  0,  finishingmatch=0;  
 
Proceso  Jugador(){  
int  count;  
 
//Protocolo  de  entrada  a  la  cancha  
court.P();   //  Reservamos  plaza  
mutex.P();   //  Cerramos  semáforo  para  la  modificación/consulta  de  var.  comp.  
waitingmatch++;  
if  (waitingmatch  <  4  )  {  
  mutex.V();   //  Abrimos  el  semáforo  para  evitar  interbloqueos  
queue.P();     //  nos  mantenemos  bloqueados  hasta  ser  cuatro  
}  
else  {  //  waitingmatch  =  4,  desbloqueamos  para  jugar  partido  
  waitingmatch  =  0;  
  for(count=0;  count<3;count++)  {    
queue.V();  //  despertamos  a  los  tres  jugadores  que  esperan  
}  
  mutex.V();  
}  
 
//Jugar  partido  
 
//  Protocolo  de  salida  de  la  cancha  
mutex.P();  
finishingmatch++;  
if  (finishingmatch  =  4)  {  //El  último  abre  la  entrada  a  nuevos  jugadores  
  finishingmatch  =  0;  
  for(count=0;  count<4;count++)  {    
court.V();  //  dejamos  libre  la  entrada  a  otros  cuatro  jugadores  
}  
mutex.V();  
}  

     ·∙Página  3  de  4  
3 (1 punto) En un sistema de archivos basado en FAT, tenemos la siguiente información al principio de la
FAT, y en las entradas de directorio de los archivos F1, F2, F3 y F4. ¿Qué bloques componen estos archivos?
¿Encuentra alguna incidencia en el sistema de archivos?

SOLUCIÓN:
F1: bloques 5, 7 y 9
F2: bloques 2 y 3
F3: bloques 6, 11, 12 y 13, pero hay una incidencia: el bloque 13 está marcado como defectuoso
F4: bloque 8

     ·∙Página  4  de  4  
Calificación

1
2
[GII] Fundamentos de los Sistemas Operativos 3
Convocatoria especial
4
10 de diciembre de 2013

Nombre y apellidos DNI/NIE


SOLUCIONES
DURACIÓN: Dispone de tres horas para realizar el examen.

1 (2,5 puntos) Tenemos un sistema con tres procesos cuya ejecución sigue un patrón repetitivo: primero una ráfaga
de M milisegundos ejecutando código en la CPU, a continuación una operación de E/S que dura N milisegundos, de
nuevo M mseg. de CPU, otros N mseg. de E/S y así una y otra vez. Los valores de M y N son siempre los mismos para
cada proceso. Los procesos nunca finalizan. Estas son las características de los tres procesos cuando el sistema arranca:

Proceso Prioridad inicial Duración CPU (M) Duración E/S (N)

A 0 10 mseg 1 mseg

B 5 5 mseg 5 mseg

C 10 1 mseg 10 mseg

Por ejemplo, el proceso A pretende ejecutar 10 mseg en la CPU, luego 1 mseg en la E/S, luego otros 10 mseg en la
CPU, de nuevo 1 mseg de E/S y así continuamente.

El sistema sigue una política de planificación por prioridades con expulsión.

Cuanto más pequeño es el valor de la prioridad, más prioridad tiene el proceso.

Cada 20 milisegundos, el sistema revisa las prioridades de todos los procesos aplicando esta fórmula:
Nueva = int [ ½ · ( Actual + TCPU ) ]

donde Nueva es el nuevo valor de prioridad del proceso; Actual es la prioridad actual del proceso; TCPU es el tiempo
(en milisegundos) que el proceso ha estado disfrutando de la CPU durante el último periodo de 20 milisegundos. La
función int devuelve la parte entera del argumento.

Otras características del sistema son:

• Sólo hay un procesador y en cada momento sólo puede haber un proceso disfrutando de la CPU.
• Las operaciones de E/S de varios procesos pueden ejecutarse de forma simultánea.
• El tiempo de cambio de contexto se considera despreciable.
• En caso de haber varios procesos con la máxima prioridad dispuestos a entrar en CPU, se escoge al proceso
que lleve más tiempo esperando por la CPU.

A partir del sistema descrito, se pide que usted realice lo siguiente:

• Calcular cómo evolucionan las prioridades de los tres procesos en los primeros 40 milisegundos de
ejecución: ¿qué prioridades tienen pasados 20 mseg. y pasados 40 mseg?. Justifique debidamente los
resultados.
• Aplicada a un conjunto cualquiera de procesos, ¿consideras que esta política beneficia o perjudica a un
tipo de procesos respecto a otros?
• ¿Qué utilidad podría tener una política como esta en un sistema real?

     Página  1  de  5    
SOLUCIÓN:

La evolución de las prioridades es:

Proceso Prioridad t=0 Prioridad t=20 Prioridad t=40

A 0 9 8

B 5 3 6

C 10 5 3

    Página  2  de  5  
Puede observarse que el sistema tiende a bajar claramente la prioridad del proceso A y elevar la del
proceso C. La evolución del proceso B es más errática.
La revisión de prioridades provoca que los procesos muy intensivos en CPU, como el A, acaben
teniendo una prioridad baja, mientras que los procesos muy intensivos en E/S, como el C, acaban con
alta prioridad. Este sería el comportamiento general del algoritmo con una carga arbitraria de procesos.
La utilidad de un algoritmo como este es precisamente la de penalizar a los procesos intensivos en CPU
y favorecer a los intensivos en E/S, que es recomendable para primar aplicaciones interactivas o
multimedia. Al mismo tiempo, la penalización de los procesos intensivos en CPU no tiene riesgo de
inanición, porque si un proceso pierde presencia en CPU, su prioridad irá aumentando a lo largo del
tiempo (hasta alcanzar el valor cero).

2 (2,5 puntos) N amigos han quedado para jugar un torneo de pádel. El formato de la competición es el
siguiente:
• Uno de los amigos se encarga de gestionar el torneo.
• Antes de comenzar un partido, el gestor realiza un sorteo del que saldrán al azar cuatro jugadores que
disputarán el partido. El gestor debe quedar a la espera de la terminación del partido.
• Cada partido tendrá una duración finita. Puede suponer que cada jugador invoca a un procedimiento
“Jugar_Partido()” del que retornará en un tiempo finito y que simulará la finalización del partido.
• Los jugadores no agraciados deben esperar mientras juegan sus cuatro compañeros.
• Al terminar cada partido, se debe avisar al gestor para que realice un nuevo sorteo.
• Una vez que se disputen diez partidos, los jugadores y el gestor terminan el torneo.
Se pide escribir dos algoritmos: jugador y gestor de forma que se cumplan las reglas descritas empleando
semáforos como herramienta de sincronización.

// Variables globales
semaforo semplayers[N]={0,0,0...0}, waitingmatch(0), mutex(1);
int idraffle[4], finishingmatch=0;
const int MAXMATCHES=10;
bool FindelTorneo=false;

Proceso Jugador(id){

for(;;) {
// Espera aviso del gestor para jugar un partido
semplayers[id].P();
if (FindelTorneo==true) break;

Jugar_Partido();

mutex.P(); // Protegemos acceso a la variable compartida


finishingmatch++;
//El último despierta al gestor
if (finishingmatch = 4) {
finishingmatch = 0;
waitingmatch.V();
}
mutex.V(); // Liberamos acceso a la variable compartida
}
}

    Página  3  de  5  
Proceso Gestor(){
int count, nmatches=0;

for(;;) {
// El gestor realiza el sorteo y como resultado deja en
// el vector idraffle los cuatro identificadores de
// los jugadores agraciados

//El gestor debe avisar a los cuatro jugadores


for(count=0; count<4;count++) {
semplayers[idraffle[cont]].V();
}

//El gestor debe esperar a que terminen el partido


waitingmatch.P();

nmatches++;

if (nmatches== MAXMACHES) {
FindelTorneo=true;
for(count=0; count<N;count++) {
semplayers[cont].V();
}
break;
}
}
}

3 (2,5 puntos) Se pide resolver las diferentes cuestiones:

a) Sea la siguiente cadena de referencias a páginas: 1, 0, 4, 0, 3, 6, 5, 4, 3, 6, 0, 5, 4, 2, 0, 1, 3, 0. ¿Cuántos


fallos de página se producirían al aplicar la política LRU, si se dispone de cuatro marcos de página
inicialmente libres? ¿El número de fallos de página aumentaría en caso de disponer de cinco marcos? ¿Por
qué?

Se producen 13 fallos de página:


1   0   4   0   3   6   5   4   3   6   0   5   4   2   0   1   3   0  
1   1   1     1   6   6   6       6   6   6   2     2   2    
  0   0     0   0   0   4       4   5   5   5     1   1    
    4     4   4   5   5       0   0   0   0     0   0    
        3   3   3   3       3   3   4   4     4   3    

El número de fallos de página no puede aumentar si aumenta el número de marcos de página


disponibles, porque el algoritmo LRU tiene la propiedad de pila, que asegura que las páginas usadas
con N marcos son un subconjunto de las usadas con N+1 marcos. Los algoritmos que tienen la
propiedad de pila no padecen la anomalía de Belady, que se caracteriza porque un aumento en el
número de marcos disponibles puede provocar un aumento del número de fallos de página.

    Página  4  de  5  
b) A continuación se presenta la tabla de segmentos de cierto proceso que se está ejecutando en un sistema
que usa segmentación. Dicho sistema tiene 2 Mbytes de memoria física. El tamaño máximo de un
segmento en este sistema es de 8 Kbytes. Responda razonadamente a las siguientes cuestiones:

a) Deducir un posible formato de dirección lógica de este sistema.


b) ¿A qué direcciones físicas se corresponden las siguientes direcciones lógicas, expresadas
como (segmento : desplazamiento): (0 : 325), (0 : 512), (2 : 1028), (2 : 124), (0 : 4096)?
c) ¿Puede darse algún problema de fragmentación en los sistemas segmentados?

Dirección Tamaño
Segmento
Base (bytes)
0 10000 4096
1 512 7600
2 32323 1024

Como el tamaño máximo de un segmento es de 8K, son necesarios 13 bits para el desplazamiento. No
tenemos información acerca del número máximo de segmentos que puede soportar el sistema, pero
sabemos que al menos serán tres, dada la tabla de segmentos del enunciado. Así, puede deducirse que
el formato mínimo de dirección lógica requerirá 2 bits para el segmento y 13 bits para el
desplazamiento.
dir. lógica dir. física
(0 : 325) 10000 + 325 = 10325
(0 : 512) 10000 + 512 = 10512
(2 : 1028) ERROR: violación de segmento
(2 : 124) 32323 + 124 = 32447
(0 : 4096) ERROR: violación de segmento

4 (2,5 puntos) Suponer un sistema de archivos parecido al de Unix cuyos bloques son de tamaño 1Kb y los
punteros a bloques son de 4 bytes. Se tienen 10 punteros a bloques directos de datos, un puntero a un bloque
indirecto simple y uno a bloque indirecto doble. Se quiere incrementar el tamaño máximo permitido para los
ficheros de ese sistema. ¿Cuál de estas siguientes acciones permitiría un mayor aumento: añadir un bloque de
triple indirección o incrementar el tamaño del bloque a 4Kb? Justificar detalladamente la respuesta.

SOLUCIÓN:
Con bloques de 1Kb, y punteros a 4bytes tendremos 1024/4 = 256 punteros a bloques de 1kb.
El tamaño máximo del archivo, con los datos del enunciado sería:
(10 + 256 + 256^2) * 1kb = 65802 Kb.
Según las dos opciones planteadas para ampliar el tamaño del archivo tendríamos:
a) opción 1: añadiendo un bloque de triple indirección:
(10 + 256 + 256^2 + 256^3) * 1kb = 16.843.018 Kb
b) opción 2: ampliando el tamaño de bloque de 4Kb => tendríamos para cada bloque 4*256=1024
punteros a bloques de 4kb
(10 + 1024 + 1014^2) * 4kb = 4.198.440 Kb
Lo que resulta que el tamaño se amplie mucho más con la opción de entrar un bloque de indirección
triple (opción 1).

    Página  5  de  5  
Calificación

1
2
Fundamentos de los Sistemas Operativos (Grado) 3
Examen Parcial
4a
14 de mayo de 2012
4b

Nombre
*** SOLUCIONES ***
Dispone de tres horas para realizar el examen
1 (2 puntos) Contestar de forma precisa a las siguientes cuestiones:

a) Explicar las distintas formas de conectarse los procesadores para formar un sistema
multiprocesador.
Por un lado los sistemas parelelos (estrechamente acoplados) en los que se
comparte una memoria común y otros recursos del sistema y se limita a decenas o
centenares de procesadores. Y por otro lado, los sistemas distribuidos
(débilmente acoplados) que consisten en múltiples procesadores conectados
mediante una red, no comparten memoria ni reloj y es escalable a millones de
procesadores.
b) ¿Qué ventajas tiene utilizar hilos como elemento básico de ejecución frente a los procesos
pesados?
Que son entidades más fáciles de manejar, ya que consumen menos recursos que
los procesos, como por ejemplo memoria. Así, el cambio de contexto entre hilos de un
mismo proceso pesado es menos costoso. Por otro lado, la comunicación entre hilos
es más sencilla (usando la memoria que comparten).
c) Se propone una nueva política de planificación en la que “la CPU se concede al proceso que
menos memoria RAM necesita”. ¿Ofrecería algún beneficio? ¿Algún efecto negativo?
¿Crees que es implementable?
Como se beneficia a los programas de pequeño tamaño, se está estimulando a que
los programadores escriban aplicaciones lo más pequeñas posible (muy deseable).
Asimismo como el PLP ingresaría a los procesos que menos memoria ocupan,
estaríamos aumentando el número de procesos que caben en memoria. Como
aspecto negativo, hay riesgo de inanición para procesos que ocupan mucha memoria.
Es implementable ya que se pueden conocer por anticipado las necesidades de
memoria de un programa (código y datos) o al menos una estimación fiable.
d) ¿Con qué finalidad se emplea la técnica de envejecimiento en la planificación del uso del
procesador?
Se emplea en el contexto de la planificación de procesos por prioridades, con el fin de
evitar que un proceso de baja prioridad quede postergado indefinidamente (nunca se
le cede el procesador) debido a que siempre existan procesos con una mayor
prioridad.
e) ¿Qué tipos de problemas son inherentes al uso de las memorias cachés? Comenta en qué
consisten.
Los problemas que introducen este tipo de memorias son : a) consistencia de las
copias de la memoria cuando el dato está copiado en cachés de distinto nivel, y la b)
coherencia de las copias cuando el dato está copiado en varias copias del mismo
nivel (multiprocesadores, sistemas distribuidos).

1 de 7
2 (3 puntos). Tres procesos, P1, P2 y P3 tienen prioridades de 2, 4 y 8, respectivamente (8
es prioridad más alta que 2). Los procesos ejecutan el siguiente código:

Process P1 Process P2 Process P3


begin begin begin
<codigo_A> <codigo_A> <codigo_A>
wait(X) wait(Y) wait(X)
<codigo_X> <codigo_Y> <codigo_X>
signal(X) signal(Y) signal(X)
<codigo_B> <codigo_B> <codigo_B>
end; end; end;

Los semáforos X e Y están inicializados a 1. El código_A necesita 2 ms de tiempo para ejecutarse, el


código_B 4 ms, el código_X 6 ms y el código_Y 6 ms. Las operaciones wait y signal son instantáneas
y no consumen tiempo. P1 comienza a ejecutarse a los 0 ms, P2 a los 4 ms y P3 a los 8 ms. Hay una
única CPU y el algoritmo de planificación utilizado para determinar que proceso se ejecuta en cada
instante es el de prioridades expropiativo. Se pide:
a) Realizar el diagrama de Gantt, marcando en cada instante de tiempo que parte de código se
está ejecutando del proceso correspondiente (P1_A si es la sección etiquetada como
codigo_A del proceso P1, P1_X si es la sección etiquetada como codigo_X del proceso P1,
…). (1.5 p)
b) Calcular el tiempo de espera medio, el tiempo de retorno medio y el rendimiento de la CPU.
(1.5 p)

Ver solución en la página siguiente:

2 de 7
SOLUCIÓN:

a)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
P1 A A X X X X X X B B B B
P2 A A Y Y Y Y Y Y B B B B
P3 A A X X X X X X B B B B

Obsérvese que el proceso P2, en la práctica, ha gozado de más prioridad que P3. Esto se debe a que P3, en el instante 11, quedó en espera por
un recurso retenido por P1 (el semáforo X). A su vez, P1 no podía avanzar, porque P2 tenía más prioridad. El resultado ha sido que P2 ha
impedido indirectamente que P3 progrese. Este fenómeno se conoce como inversión de prioridades. Los sistemas operativos modernos aplican
técnicas para impedir que se produzca la inversión de prioridades. En nuestro caso, se podría haber elevado artificialmente la prioridad de P1,
para que se adelantara a P2 y no se bloqueara injustamente a P3.

b)

Tiempos de Retorno Tiempos de Espera

P1 36-0 = 36 (18-4)+(32-22) = 24

P2 18-4 = 14 10-8 = 2

P3 32 – 8 = 24 0 **(ver nota)

Tiempos Medios 24,67 8,67

** No se ha contabilizado como tiempo de espera la espera realizada por el proceso cuando queda bloqueado al intentar entrar en la sección
crítica y queda retenido en la operación wait(X), es decir, se ha asumido que dicho proceso pasa a un estado bloqueado y que el tiempo de
3 (2.5 puntos) Suponga un sistema de archivos que utiliza una política de asignación de
espacio en disco indexada a un solo nivel. Sabiendo que el tamaño de bloque es de 128 bytes y
que cada bloque índice tiene cabida para 32 entradas, conteste a las siguientes preguntas, justificando
su respuesta:
1. ¿Cuál es el tamaño máximo que puede tener un fichero en este sistema?
2. ¿Cuál es el número máximo de bloques que puede usarse en este sistema?
3. ¿Existe fragmentación interna? En caso afirmativo, indicar la cantidad de bytes desperdiciado por un
archivo en el mejor o peor de los casos.
4. Si el sistema operativo usara un vector de bits para la administración del espacio libre ¿cuánta memoria
ocuparía dicha estructura de datos?. Exprésela en bytes o múltiplos de byte.
5. Nombre y describa un sistema alternativo de administración del espacio libre.

Solución:

1) El tamaño de un fichero está determinado por el número de entradas del bloque índice. Por
tanto, un fichero puede tener como máximo 32 bloques, es decir 32 x 128 bytes = 4096 bytes =
4Kbytes

2) Conociendo el tamaño de bloque y el número de entradas de un bloque índice se puede


calcular tamaño de cada entrada: 128/32=4bytes = 32 bits. Por lo tanto, se pueden direccionar
hasta 232 bloques diferentes

3) Desde luego, puede existir fragmentación interna, y existirá siempre que el tamaño de un
fichero no sea múltiplo de 128, que ese el tamaño del bloque, y así el último bloque de ese
fichero no estará completamente lleno. El peor de los casos lo constituyen los tamaños de
fichero que respondan a la siguiente expresión: x*128+1 bytes, (0 ≤ x ≤31). Observe que, en
este caso, el último bloque del fichero únicamente almacenaría un byte de información.

4) Sabiendo que el número de bloques del disco es 232, habrá que usar (232)/8 bytes de datos
para almacenar el vector de bits. Por tanto, el espacio ocupado será 229 = 29 · 220 = 512 Mbytes

4 Resolver las siguientes cuestiones:

4.a (1 punto) Supongamos que en un sistema disponemos de la siguiente instrucción:


subc(r,m), siendo r y m dos parámetros enteros. La instrucción anterior decrementa en 1 el
contenido de m y copia el resultado en r de forma atómica.
Se propone el siguiente algoritmo como solución al problema de la sección crítica para los
procesos P1 y P2:

4 de 7
//Variable global
int m=1;
1 Proceso P1() { Proceso P2() {
2 int r1; int r2;
3
4 for(;;) { for(;;) {
5 //Sección no crítica //Sección no crítica
6 do do
7 subc(r1,m); subc(r2,m);
8 while (r1<0); while (r2<0);
9
10 //Sección crítica //Sección crítica
11
12 m=1; m=1;
13
14 //Sección no crítica //Sección no crítica
15 } }
16 } }

¿Es válida la solución anterior? ¿Se podría proponer como solución válida al problema de la
sección crítica para N procesos? Justificar explícitamente la respuesta.

Solución:
La solución anterior no es válida ya que no cumple la propiedad de espera limitada puesto que
se puede comprobar que el proceso P1 podría acceder repetidamente a la sección crítica
impidiendo el acceso del proceso P2. Teniendo esto en cuenta, la solución propuesta cumple
las propiedades de exclusión mutua y progreso tanto en el caso de que tengamos dos procesos
como si tenemos N procesos.

4.b (1,5 puntos) Se dispone de una BD que puede ser usada sólo por 5 procesos al mismo
tiempo. Hay dos tipos de procesos: A y B.
Proponga un protocolo de acceso a la Base de Datos usando semáforos, teniendo en
cuenta que:
§ no puede haber mas de 3 procesos A en la BD al mismo tiempo,
§ no puede haber mas de 4 procesos B en la BD al mismo tiempo.

*****

SOLUCION:
Vamos a dar dos tipos de soluciones, cualquiera de las dos válidas.

SOLUCIÓN A
//Variables globales
//Semáforo de control del número máximo de procesos tipo A que pueden acceder
//concurrentemente a la BD
Semaforo colaA=3;
//Semáforo de control del número máximo de procesos tipo B que pueden acceder
//concurrentemente a la BD
Semaforo colaB=4;
//Semáforo de control del número máximo de procesos que pueden acceder
//concurrentemente a la BD
Semaforo colaAB=5;

5 de 7
Proceso A() {

//Controlamos que no accedan concurrentemente mas de 3 procesos tipo A a la BD
wait(colaA);
//Controlamos que no accedan concurrentemente mas de 5 procesos a la BD
wait(colaAB);

// Acceder a la base de datos

sinal(colaAB); //indicamos que un proceso ha terminado de acceder a la BD


signal(colaA); //indicamos que un proceso A ha terminado de acceder a la BD

}

Proceso B( ) {


//Controlamos que no accedan concurrentemente mas de 4 procesos tipo B a la BD
wait(colaB);
//Controlamos que no accedan concurrentemente mas de 5 procesos a la BD
wait(colaAB);

// Acceder a la base de datos

sinal(colaAB); //indicamos que un proceso ha terminado de acceder a la BD


signal(colaB); //indicamos que un proceso B ha terminado de acceder a la BD

}

SOLUCION B
//Variables globales
int na=0; //número de procesos tipo A accediendo a la base de datos
int nb=0; //número de procesos tipo B accediendo a la base de datos
int naesperando=0; //número de procesos tipo A esperando para acceder a la base de datos
int nbespetando=0; //número de procesos tipo B esperando para acceder a la base de datos
Semaforo mutex=1; //semáforo para proteger la sección crítica del preprotocolo
Semaforo colaA=0; //semáforo para encolar los procesos tipo A cuando no pueden acceder a la BD
Semaforo colaB=0; //semáforo para encolar los procesos tipo B cuando no pueden acceder a la BD

Proceso A() {

// Preprotocolo para comprobar que hay menos de 5 procesos accediendo a la
// BD y no mas de 2 procesos tipo A
wait(mutex);
while (((na + nb) == 5) || (na==3)) {
naesperando++;
signal(mutex);
wait(colaA);
}
na++;
signal(mutex);

6 de 7
// Acceder a la base de datos

// Al terminar de acceder a la BD comprobamos si existen procesos tipo A


// esperando y despertamos a uno. En caso contrario comprobamos si existen
// procesos tipo B esperando y, en caso de que haya menos de 4, despertamos a
// uno.
wait(mutex);
na--;
if (naesperando>0) {
naesperando--;
signal(colaA);
else if (nbesperando>0) && (nb<4) {
nbesperando--;
signal(colaB);
}
signal(mutex);

}

Proceso B( ) {

// Preprotocolo para comprobar que hay menos de 5 procesos accediendo a la
// BD y no mas de 4 procesos tipo B
wait(mutex);
while (((na + nb) == 5) || (nb==4)) {
naesperando++;
signal(mutex);
wait(colaB);
}
nb++;
signal(mutex);

// Acceder a la base de datos

// Al terminar de acceder a la BD comprobamos si existen procesos tipo B


// esperando y despertamos a uno. En caso contrario comprobamos si existen
// procesos tipo A esperando y, en caso de que haya menos de 3, despertamos a
// uno.
wait(mutex);
nb--;
if (nbesperando>0) {
nbesperando--;
signal(colaB);
else if (naesperando>0) && (nb<3) {
naesperando--;
signal(colaA);
}
signal(mutex);

}

7 de 7
  Calificación

2
Fundamentos de los Sistemas Operativos (GII)
Examen Final
15 de Junio de 2012 - PRIMERA PARTE - 3

Nombre Grupo
SOLUCIONES

Dispones de hora y media para completar el examen

1 (6 puntos) Contestar  de  forma  precisa  (máximo  5  líneas)  a  las  siguientes  cuestiones:  
1. ¿Por qué es necesario establecer dos modos de ejecución de instrucciones de un procesador?
Ver  apartado  1.5.6  del  libro  de  la  asignatura  

2. Se considera el algoritmo de planificación del tipo Round Robin de quantum q. ¿Puede afirmarse que
todo proceso de la cola de preparados disfrutará exactamente de q unidades de tiempo de recurso de
CPU? ¿Puede ocurrir que un proceso llegue a utilizar la CPU n unidades de tiempo sin interrupción,
siendo n>q? Justificar la respuesta.
Primera   pregunta:   no   puede   afirmarse,   ya   que   no   se   conoce   la   duración   de   los   procesos   en   la   cola.   Si   un  
proceso  finaliza  su  ejecución  antes  de  cumplirse  el  quantum  q,  abandonará  la  CPU  y  por  tanto  no  se  cumplirá  
el  enunciado.  
Segunda   pregunta:   puede   ocurrir,   por   ejemplo   si   un   proceso   es   el   único   no   bloqueado   y   reclama   más   de   q  
segundos   de   CPU.   El   sistema   lo   mantendrá   en   el   procesador   indefinidamente,   hasta   que   se   bloquee   o   que  
entre  otro  proceso  en  la  cola  de  preparados.  

3. Se tienen 3 procesos: P1, P2 y P3 con tiempos de ejecución: 85, 45 y 118 mseg respectivamente. Si
actúa el PLP según el algoritmo SJF, ¿qué contiene la cola de preparados antes de que empiece a trabajar
el PCP?
P2,  P1,  P3,  en  ese  orden.  
4. Sean dos procesos, P1 con tiempo de ejecución 20 mseg y P2 con 15 mseg. El PCP actúa según un
RR(10mseg) y tiempo de cambio de contexto de 5ms. ¿Cuál es el tiempo de retorno de P1?
NOTA:   durante   el   examen   se   aclaró   que   se   asuma   que   P1   y   P2   acaban   de   llegar   a   la   cola   de   preparados,   y   que  
se  consideren  los  dos  casos  posibles  de  ordenación  (P1  antes  que  P2  y  P2  antes  que  P1).  
Primer  caso  (P1,  luego  P2):  10(p1)+5+10(p2)+5+10(p1)  =  40  mseg  
Segundo  caso  (P2,  luego  P1):  10(p2)+5+10(p1)+5+5(p2)+5+10(p1)  =  50  mseg  
5. Estamos desarrollando un intérprete de órdenes o Shell. Necesitamos escribir el código que lanza el
programa que el usuario le encarga ejecutar al Shell. Para ello necesitamos elegir entre lanzar un nuevo
hilo o bien lanzar un nuevo proceso pesado. ¿Cuál de las dos opciones le parece más adecuada, y por
qué?
Un  Shell  va  a  lanzar  una  aplicación  diferente  al  propio  Shell,  cuyo  código  habrá  que  cargar  en  memoria  desde  el  
fichero   ejecutable.   Esto   no   se   puede   realizar   con   un   hilo,   que   comparte   el   código   del   proceso   padre.   Debe  
realizarse   necesariamente   con   un   proceso   pesado,   para   que   el   Shell   y   la   aplicación   puedan   coexistir   en   el  
sistema.  
6. Sea un archivo que contiene registros de 250 bytes cada uno. Dicho archivo está almacenado en un
sistema de ficheros con bloques de tamaño 1K y que usa FAT para asignación de espacio. Sabiendo
que el primer bloque ocupado por el archivo es el número 3 y considerando la siguiente tabla FAT,
    FSO-­‐  examen  20120615  -­‐  primera  parte  -­‐  p1/5  
¿qué bloque(s) hay que leer para acceder registro 4? (los registros se numeran comenzando por 0)
¿Cuántos registros contiene actualmente el fichero?
0 1 2 3 4 5 6 ...
EOF 6 0 4
Primera  pregunta:  son  los  bloques  3  y  6.  
El  registro  4  está  ocupando  el  rango  de  direcciones  desde  la  1000  hasta  la  1249  (inclusive),  desde  el  principio  
del  archivo.  Estas  se  encuentran  en  el  primer  bloque  asignado  al  archivo  (que  contiene  de  la  0  a  la  1023)  y  el  
segundo  (que  contiene  de  la  1024  a  la  2047).  Por  tanto  hemos  de  buscar  dónde  se  encuentran  en  la  FAT  esos  
dos   primeros   bloques.   El   primero   ya   nos   lo   da   el   enunciado:   es   el   bloque   3.   El   segundo   es   el   siguiente  
apuntado  por  la  FAT,  que  es  el  bloque  6.    
Segunda  pregunta:  tal  y  como  muestra  la  FAT,  el  archivo  está  formado  por  los  bloques  3,  6,  4  y  0.  Por  tanto  
tiene  4Kb  asignados,  que  dan  una  capacidad  para  4096/250  =  16   registros.  En  realidad  la  ocupación  real  podría  
ser  menor  de  16,  ya  que  el  enunciado  no  nos  da  información  sobre  el  uso  efectivo  que  el  archivo  está  haciendo  
de  su  espacio  ocupado.  
7. En un equipo se ha observado la carga del planificador de procesos y resulta que en los últimos diez
minutos se han estado ejecutando cien procesos. Todos ellos siguen sin finalizar en el momento actual.
Por su parte, el tamaño medio de la cola de preparados ha sido de 0,17 procesos durante ese intervalo.
Habiendo tantos procesos activos, ¿cómo puede explicarse un tamaño tan pequeño para la cola de
preparados?
Este  tamaño  tan  escaso  implica,  lógicamente,  que  la  mayoría  de  los  procesos  han  estado  fuera  de  la  cola  de  
preparados.  Pueden  haber  estado  en  dos  lugares:  o  bien  en  algún  procesador;  o  bien  en  una  cola  de  espera  
por   algún   dispositivo   o   evento.   Si   es   el   primer   caso,   se   trataría   de   una   máquina   multiprocesadora   con   una  
buena   cantidad   de   procesadores.   Si   es   el   segundo   caso,   los   procesos   están   continuamente   reclamando  
operaciones   de   E/S   que   les   hacen   estar   bloqueados   con   mucha   frecuencia:   es   decir,   hay   muchos   procesos  
intensivos  en  E/S.  
8. Un lote de 5 procesos A, B, C, D y E se lleva a ejecución en un sistema informático. Los tiempos de
llegada son, respectivamente, 0, 1, 3, 9 y 12. Las duraciones estimadas son, respectivamente, 3, 5, 2, 5 y
5. Si el PCP emplea la política SRTF, ¿cuál es el tiempo de espera medio y el tiempo de retorno medio?
Para  calcular  las  medias,  hace  falta  obtener  los  tiempos  de  cada  proceso.  
La  planificación  habrá  sido:  AAACCBBBBBDDDDDEEEEE  
Tiempos  de  espera:  A=0,  B=4,  C=0,  D=1,  E=3.  MEDIA=(0+4+0+1+3)/5  =  8/5  
Tiempos  de  retorno:  A=3,  B=9,  C=2,  D=6,  E=8.  MEDIA=(3+9+2+6+8)/5  =  28/5  

   
2 (1,5 puntos)   Un   sistema   de   archivos   utiliza   asignación   indexada   como   método   de  
asignación   de   espacio.   La   estructura   de   inodo   consta,   entre   otras   cosas,   de   16   referencias   a  
bloques  directos,  4  referencias  a  un  bloque  indirecto  sencillo,  2  referencias  a  un  bloque  indirecto  
doble  y  1  referencia  a  un  bloque  indirecto  triple.  Sabiendo  el  tamaño  de  bloque  es  de  2K  y  que  en  
el   sistema   de   ficheros   hay   2^64   bloques,   calcula   el   número   máximo   de   bloques   de   datos   que  
puede  ocupar  un  archivo.
Si   hay   264   bloques,   para   poder   direccionarlos   necesitamos   al   menos   64   bits,   es   decir,   64/8   =   8   bytes.   Cada  
entrada  de  un  bloque  de  índices  ocupa  por  tanto  8  bytes.    
Como  los  bloques  de  datos  son  de  2K,  en  cada  bloque  caben  2048/8  =  256  apuntadores  a  bloques.  
Con  estos  datos  podemos  hacer  el  cálculo  general:  
*  16  referencias  directas,  más  
*  4  bloques  indirectos  x  256  apuntadores/bloque  =    210  
*  2  bloques  doble  indirecto  x  256  x  256  =  217  
*  1  bloque  triple  indirecto  x  256  x  256  x  256  =  224  
El  total  es  224+217+210+16  =  16.909.328  bloques  de  datos.  
    FSO-­‐  examen  20120615  -­‐  primera  parte  -­‐  p2/5  
Nombre      

3 (2,5 puntos)
a)   (0,75   puntos)   Usando   semáforos,   sincronice   los   siguientes   procesos   de   manera   que   la  
secuencia  de  ejecución  de  las  funciones  siga  el  orden  especificado  a  continuación:  
B1() --> C1() --> C2() --> A1() --> B2() --> A2()
Utilice  el  menor  número  de  semáforos  posible.  No  olvide  especificar  claramente  la  inicialización  
de  los  semáforos.  
Proceso A Proceso B Proceso C
A1(); B1(); C1();
A2(); B2(); C2();

La  forma  más  inmediata  de  resolver  el  problema  es  utilizar,  por  cada  punto  de  espera,  una  operación  WAIT  
sobre   un   semáforo   inicializado   a   cero.     Y   al   finalizar   la   instrucción   que   desbloquea,   invocar   a   una   operación  
SIGNAL  sobre  ese  semáforo.  He  aquí  el  resultado  de  aplicar  esa  técnica:  
Semáforos  SA1=0,  SA2=0,  SB2=0,  SC1=0    
Proceso  A   Proceso  B   Proceso  C  
WAIT(SA1);   B1();   WAIT(SC1);  
A1();   SIGNAL(SC1);   C1();  
SIGNAL(SB2);   WAIT(SB2);   C2();  
WAIT(SA2);   B2();   SIGNAL(SA1);  
A2();   SIGNAL(SA2);  
 
Si  se  quiere  reducir  al  mínimo  la  cantidad  de  semáforos,  sin  añadir  más  artefactos  al  programa  (ej.  variables  de  
estado),  se  puede  reutilizar  el  semáforo  SC1  para  el  último  acto  de  sincronización.  
Semáforos  s1=0,  s2=0,  s3=0  
Proceso  A   Proceso  B   Proceso  C  
WAIT(s2);   B1();   WAIT(s1);  
A1();   SIGNAL(s1);   C1();  
SIGNAL(s3);   WAIT(s3);   C2();  
WAIT(s1);   B2();   SIGNAL(s2);  
A2();   SIGNAL(s1);  
   
El   algoritmo   se   podría   escribir   con   un   solo   semáforo,   pero   requeriría   añadir   una   variable   de   estado,   para  
conocer  cuál  es  el  proceso  que  tiene  permiso  para  continuar.  Además,  sería  una  solución  de  espera  activa.  

  3  
b)   (1,75   puntos)   Se   dispone   de   una   sala   de   juegos   y   jugadores.   Para   entrar   a   la   sala   se  
necesitan  exactamente  5  jugadores.  A  medida  que  los  jugadores  llegan  esperan  hasta  completar  
5  y  luego  entran  a  jugar  a  la  sala.  Suponga  que  la  sala  tiene  una  capacidad  ilimitada,  es  decir,  
pueden   ir   entrando   en   tandas   de   5   sin   ninguna   limitación.   Sólo   es   necesario   especificar   el  
protocolo  de  entrada  a  la  sala  y  las  pertinentes  declaraciones  e  inicializaciones  de  variables.  
 
Proceso Jugador(){

//Inicialización

//Protocolo de entrada a la sala

//Jugar en la sala

}
NOTA:  el  algoritmo  está  implementado  mediante  semáforos.  
Se  utiliza  una  variable  de  estado  que  registra  cuántos  jugadores  están  esperando.  Cuando  un  jugador  llega  y  
observa  que  no  hay  todavía  cinco,  se  bloquea  en  un  semáforo  que  hace  de  cola  de  espera.  Cuando  llega  un  
quinto  jugador,  desbloquea  a  todos  los  procesos  que  estaban  esperando  y  reinicia  el  contador.  
Como   la   variable   de   estado   es   compartida,   debe   ser   accedida   mediante   un   cerrojo   (un   semáforo   inicializado   a  
uno).  
 
Variables  globales  
Semáforo  mutex  =  1  
Semáforo  cola  =  0  
int  esperando  =  0;  
 
Código  de  entrada  en  la  sala  
WAIT(mutex);  
esperando++;  
if  (esperando  <  5  )  {  
  SIGNAL(mutex);   //  liberamos  el  cerrojo  para  evitar  interbloqueos  
  WAIT(cola);       //  nos  mantenemos  bloqueados  hasta  ser  cinco  
}  
else  {  //  esperando  =  5,  desbloqueamos  a  todos  
  esperando=0;  
  for  i  in  1..4  {  SIGNAL(cola);  }  //  hay  cuatro  compañeros  bloqueados  en  cola  
  SIGNAL(mutex);  
}  

    FSO-­‐  examen  20120615  -­‐  primera  parte  -­‐  p4/5  


Nombre      

 
 
 
Otro  algoritmo  
En  este  otro  algoritmo,  el  quinto  jugador  sólo  desbloquea  a  uno  de  los  compañeros  en  cola,  el  desbloqueado  a  
su  vez  libera  a  otro  compañero  y  así  hasta  completar  los  cinco.  
Los  semáforos  y  variables  de  estado  son  los  mismos  que  en  el  primer  algoritmo.  
 
//  entrar  a  jugar  
WAIT(mutex);  
if  (esperando  <  4  )  {  
  esperando++;  
  SIGNAL(mutex);   //  liberamos  el  cerrojo  para  evitar  interbloqueos  
  WAIT(cola);       //  nos  mantenemos  bloqueados  hasta  ser  cinco  
  esperando-­‐-­‐;     //  uno  menos  para  desbloquear  
  if  (  esperando  >  0  )  {   //  si  quedan  compañeros  bloqueados,  desbloqueo  a  uno  
      SIGNAL(cola);  
  }  
  else  {       //  si  soy  el  último,  libero  el  cerrojo  
    SIGNAL(mutex);  
  }  
}  
else  {  //  esperando  =  4,  iniciamos  la  secuencia  de  desbloqueo  
  SIGNAL(cola);  
}  
 

  5  
  Calificación

Fundamentos de los Sistemas Operativos (GII)


2
Examen Final
15 de Junio de 2012 - SEGUNDA PARTE -
3

Nombre Grupo
SOLUCIONES

Dispone de una hora y media para completar el examen

1 (6.5  puntos)    Contestar  a  las  siguientes  cuestiones:  


1. En  un  sistema  operativo  multitarea  con  16Kbytes  de  espacio  lógico  de  procesos,  con  páginas  
de  512  bytes  y  64  marcos  de  página,  sin  memoria  virtual.  ¿cuál  es  la  estructura  de  la  dirección  
lógica?    

16Kbytes  suponen  2^4*2^10  =2^14  direcciones  lógicas,  por  lo  tanto,  serán  necesarios  14  bits  para  cubrir  
todo   ese   espacio   de   direcciones   lógicas.   Por   otra   parte,   sabemos   que   el   tamaño   de   página   es   de   512  
bytes,  por  lo  que  serán  necesarios  9  bits  para  poder  direccionar  cualquier  byte  de  una  página.  Luego,  el  
espacio  de  direccionamiento  lógico  tiene  la  siguiente  estructura:  
5  bits   9  bits  
página   desplazamiento  

2. Dada  la  siguiente  cadena  de  referencias  a  páginas  :  2  –  4  –  5  –  4  –  6  –  7  –  4  –  2  –  1  –  4  –  7  –  3,  si  


el   sistema   dispone   de   cuatro   marcos   de   memoria   principal,   ¿cuántos   fallos   se   generan  
mediante  el  algoritmo  de  segunda  oportunidad  (o  del  reloj)  para  el  reemplazo  de  páginas?  

En   la   siguiente   figura   puede   verse   una   traza   del   algoritmo   del   reloj.   La   primera   fila   corresponde   a   la  
cadena  de  referencias;  las  siguientes  a  la  traza.  Entre  paréntesis  figura  el  bit  de  referencia  y  en  negrita  el  
candidato  inicial  a  víctima.  Los  fallos  de  página  están  señalados  con  el  símbolo  #  en  la  última  fila.  Como  
puede  observarse,  se  producen  ocho  fallos  de  página.  
2   4   5   4   6   7   4   2   1   4   7   3  
2(1)   2(1)   2(1)   2(1)   2(1)   7(1)   7(1)   7(1)   7(1)   7(1)   7(1)   3(1)  
  4(1)   4(1)   4(1)   4(1)   4(0)   4(1)   4(0)   4(0)   4(1)   4(1)   4(0)  
    5(1)   5(1)   5(1)   5(0)   5(0)   2(1)   2(1)   2(1)   2(1)   2(0)  
        6(1)   6(0)   6(0)   6(0)   1(1)   1(1)   1(1)   1(0)  
#   #   #     #   #     #   #       #  

3. Se  tiene  un  sistema  que  utiliza  gestión  de  memoria  paginada.  El  espacio  de  direccionamiento  
virtual   es   de   10   páginas   de   1024   palabras   (1   palabra   =   2   bytes).   La   memoria   física   está  
dividida  en  32  marcos.  ¿Cuántos  bits  componen  la  dirección  virtual?  

Considerando   que   el   direccionamiento   lógico   se   realiza   a   nivel   de   palabra   (no   de   byte)   serán   necesarios   4  
bits   para   el   número   de   páginas   (el   enunciado   dice   que   hay   10   páginas   direccionables)   y   10   bits   para  
direccionar  el  desplazamiento  dentro  de  la  página.  Por  lo  tanto  la  dirección  virtual  responde  al  siguiente  
esquema:  
4  bits   10  bits  
página   desplazamiento  

    FSO  -­‐  examen  20120615  -­‐  segunda  parte  -­‐  p1/5  


4. La   tabla   de   páginas   de   un   determinado   proceso   indica   que   la   página   2   tiene   asociado   el   marco  
7.  El  tamaño  de  la  memoria  física  es  de  65536  bytes.  Si  en  el  sistema  tenemos  32  marcos  de  
página,  ¿cuál  es  la  dirección  lógica  asociada  a  la  dirección  física  14661?  

Para   poder   conocer   la   dirección   lógica,   primero   es   necesario   averiguar   a   qué   marco   de   página  
corresponde   la   dirección   física   14661.   Sabiendo   que   la   memoria   física   tiene   65536   bytes   y   que   hay   32  
marcos   de   página,   es   inmediato   deducir   el   tamaño   de   página   de   este   sistema:   65536/32   =   2^16/2^5   =  
2^11  =  2048  bytes.  De  ahí  se  deduce  que  la  dirección  física  14661  pertenece  al  marco  de  página  número  
7;   basta   dividir   14661   entre   2048   para   averiguar   que   el   marco   es   7   (cociente)   y   el   desplazamiento   325  
(resto).  
El  enunciado  dice  que  la  página  2  está  alojada  en  el  marco  de  página  número  7,  por  tanto,  la  dirección  
lógica  será:  <página  2,  desplazamiento  325>,  o  lo  que  es  lo  mismo,  2·∙2048+325  =  4421    

5. Un  computador  gestiona  la  memoria  mediante  un  esquema  paginado  de  doble  nivel  con  una  
estructura  de  direcciones  de  32  bits.  Si  se  tienen  10  bits  para  páginas  de  un  primer  nivel,  11  
para   el   de   segundo   y   11   para   el   desplazamiento   de   página,   ¿qué   tamaño   máximo   tendrá   el  
espacio  direccionable  de  los  programas?  

El   espacio   direccionable   viene   dado   por   el   número   de   bits   que   existen   en   la   dirección,  
independientemente  de  los  niveles  de  paginación.  En  este  caso,  como  la  dirección  es  de  32  bits,  el  espacio  
de  direccionamiento  es  de  2^32  bytes,  es  decir  4Gigabytes.  

6. En  un  sistema  operativo  multitarea,  con  8Kbytes  de  espacio  lógico  de  proceso  y  con  páginas  de  
1Kbytes,   y   32Kbytes   de   memoria   física   y   sin   memoria   virtual,   ¿cuánto   ocupará   la   tabla   de  
páginas?  

Si  hay  que  direccionar  8Kbytes  y  el  tamáño  de  página  es  de  1Kbyte,  un  proceso  tendrá  como  máximo  8  
páginas   y   por   lo   tanto   el   número   de   entradas   de   su   tabla   de   páginas   es   8.   Falta   averiguar   cuánto   mide  
cada   una   de   esas   entradas.   Dado   que   en   ellas   se   aloja   un   número   de   marco   y   sabemos   que   en   este  
sistema  hay  32  marcos  de  página,  bastan  5  bits  para  cada  entrada,  estrictamente  hablando.  Así,  la  tabla  
de  páginas  de  un  proceso  en  este  sistema  ocupará,  como  máximo,  8·∙5  =  40  bits  =  5  bytes.    

7. En  la  tabla  de  segmentos  se  encuentra  que  el  segmento  0  tiene  una  base  de  219  y  una  longitud  
de  600.  ¿A  qué  dirección  física  se  corresponde  la  dirección  virtual  (0,430)  dado  el  formato  de  
dirección  (nº  segmento,  desplazamiento  dentro  del  segmento)?  

La  dirección  física  es  la  649:  219+430=649  

8. Considera   un   sistema   paginado   bajo   demanda   que   posee   los   siguientes   datos   de   utilización:   el  
uso  del  procesador  es  del  20%,  el  del  dispositivo  de  paginación  de  disco  es  del  95,5%  y  el  de  
otros   dispositivos   de   E/S   es   del   5%.   ¿Qué   crees   que   está   ocurriendo   en   el   sistema?   ¿Qué  
podríamos  hacer  para  que  se  obtuviera  un  rendimiento  mejor?  

La  baja  utilización  de  la  CPU  y  la  alta  utilización  del  dispositivo  de  paginación  hacen  pensar  que  el  sistema  
sufre   de   sobrepaginación,   es   decir,   que   gran   parte   del   tiempo   se   está   empleando   en   desalojar   páginas   de  
la  memoria  principal  al  dispositivo  de  memoria  secundaria  (swap-­‐out)  para  dejar  espacio  a  nuevas  páginas  
que   provienen   de   dicho   dispositivo   secundario   (swap-­‐in).   Esto   provoca   una   seria   degradación   del  
rendimiento   del   sistema   que   puede   corregirse   reduciendo   temporalmente   el   grado   de  
multiprogramación,  para  que  al  haber  menos  procesos  compitiendo  por  la  memoria  principal  ésta  pueda  
repartirse   de   forma   que   haya   menos   fallos   de   página.   Una   vez   el   sistema   se   recupere   de   la  
sobrepaginación,   los   procesos   temporalmente   suspendidos   pueden   volver   a   la   cola   de   preparados   y  
continuar  su  ejecución.  

9. Te  dan  a  elegir  entre  tres  tamaños  de  página  para  un  sistema  operativo  :  16  bytes,  800  bytes  y  
2048  bytes.  El  sistema  trabaja  con  direcciones  de  32  bits  y  el  tamaño  medio  de  un  programa  es  
de  4  megabytes.  ¿Con  qué  tamaño  de  páginas  te  quedarías?  ¿Por  qué?  

El  tamaño  de  800  bytes  hay  que  descartarlo  de  antemano,  porque  no  es  potencia  de  dos.  Requeriría  un  
hardware  de  traducción  de  direcciones  mucho  más  complejo  que  un  sistema  de  paginación  convencional:  
para  calcular  el  número  de  página,  no  basta  con  quedarse  con  los  bits  más  significativos  de  la  dirección,  
sino  que  hay  que  realizar  una  división.  
    FSO  -­‐  examen  20120615  -­‐  segunda  parte  -­‐  p2/5  
Nombre      

 
El  tamaño  de  16  bytes  tampoco  es  recomendable,  porque  genera  mucho  espacio  en  tablas  de  páginas.  Un  
programa   de   cuatro   megabytes   (un   tamaño   típico,   según   el   enunciado)   ocuparía   222   ÷   24   =   218   =   256  
Kpáginas,   que   necesitarían   en   torno   a   un   megabyte   de   espacio   (suponiendo   cuatro   bytes   por   cada  
entrada   de   la   tabla   de   páginas).   No   parece   sensato   dedicar   a   estructuras   de   gestión   una   cantidad   de  
memoria   similar   a   la   que   necesita   el   programa.   Además,   para   garantizar   una   tasa   de   aciertos   alta   en   la  
TLB,  ésta  probablemente  necesitaría  bastantes  entradas.  
Por  su  parte,  si  usamos  páginas  de  2048  bytes,  un  programa  de  cuatro  megabytes  requerirá  2048  páginas,  
128  veces  menos  espacio  que  en  el  caso  anterior.  El  único  inconveniente  de  este  tamaño  de  página  es  la  
mayor   fragmentación   interna,   pero   estamos   hablando,   en   el   peor   de   los   casos,   de   2047   bytes  
desperdiciados,  que  serían  menos  de  un  0,05%  de  un  programa  de  tamaño  típico  de  4  megas.  Es  decir,  
irrelevante.  
Así  que  la  mejor  opción  es  el  tamaño  de  2048  bytes.  

10. ¿En  que  consiste  la  anomalía  de  Belady?  Nombra  un  algoritmo  que  la  padezca  y  otro  que  no.  

La  anomalía  de  Belady  se  produce  en  determinados  algoritmos  de  tal  forma  que  al  aumentar  el  número  
de  marcos  de  página  no  necesariamente  disminuye  el  número  de  fallos  de  página,  sino  que  puede  incluso  
aumentar.   FIFO   es   uno   de   los   algoritmos   que   padecen   dicha   anomalía,   mientras   que   el   algoritmo   LRU,  
entre  otros,  está  libre  de  ella.  

 
2   (2   puntos)   Suponga  un  sistema  de  memoria  paginada  que  maneja  direcciones  de  memoria  
lógicas  de  24  bits  y  direcciones  físicas  de  32  bits.  El  tamaño  de  página  es  de  1Kbytes.  Se  pide:  

1) ¿Cuánta  memoria  puede  direccionar  un  proceso?  0.2p  

El  espacio  de  direccionamiento  de  un  proceso  es  de  24  bits,  por  tanto  puede  direccionar  2^24  bytes,  es  
decir,  16Megabytes  
2) ¿Cuántos  marcos  de  página  puede  llegar  a  tener  este  sistema?  0.2p  

2^32  /  2^10  =  2^22  =  4.194.304  marcos  de  página  


3) ¿Cuántas  páginas  diferentes  puede  llegar  a  tener  un  proceso?  0.3p  

2^24  /  2^10  =  2^14  =  16.384  páginas  


4) ¿Cuántas  páginas  ocuparía  un  proceso  que  consume  3  Megabytes  de  memoria?  0.3p  

3·∙2^20  /  2^10  =  3·∙2^10  =  3.072  páginas  


5) ¿Qué   explicación   puede   tener   que   las   direcciones   lógicas   y   físicas   sean   de   diferente  
tamaño?  0.2p  

En   esta   arquitectura,   el   espacio   lógico   (2^24   palabras)   es   bastante   más   pequeño   que   el   espacio   físico  
(2^32   palabras).   Esto   significa   que   un   proceso   no   puede   direccionar   al   mismo   tiempo   todo   el   espacio  
físico.   A   primera   vista,   esto   supone   una   limitación   arbitraria   que   restringe   fuertemente   la   capacidad   de  
direccionamiento  de  los  procesos.  Pero  puede  haber  algunas  justificaciones  a  este  esquema.  

  3  
Una   posible   explicación   a   esta   restricción   es   que   en   este   sistema   suele   haber   muchos   procesos   en  
ejecución   al   mismo   tiempo   con   distintos   espacios   lógicos   de   memoria,   de   manera   que   aunque   un   solo  
proceso   no   aprovecha   todo   el   espacio   disponible,   el   conjunto   de   todos   ellos   sí   lo   hace.   Las   direcciones  
lógicas   se   mantienen   cortas   y   así   el   código   máquina   es   algo   más   compacto   que   en   el   caso   de   tener  
direcciones  de  32  bits.  
Otro  posible  motivo  para  que  este  sistema  esté  así  configurado  es  que  los  procesos  ejecutan  código  de  
alguna   arquitectura   antigua   de   24   bits,   mientras   que   el   hardware   es   más   moderno   y   trabaja   con  
direcciones   de   memoria   más   anchas.   Sin   necesidad   de   recompilar   los   programas,   podemos   seguir  
ejecutándolos  y  aprovechar  mejor  la  memoria  física  de  32  bits  si  tenemos  multiprogramación.  Finalmente,  
esta   configuración   también   puede   verse   como   una   medida   (bastante   radical)   para   evitar   que   un   solo  
proceso  acapare  demasiada  memoria:  su  asignación  de  espacio  se  le  limita  físicamente  a  16  megabytes.  
6) ¿Qué   sistema   de   traducción   de   direcciones   te   parece   más   apropiado   para   este  
sistema:   paginado   con   un   solo   nivel   de   paginación   o   con   dos   niveles?   Justifica   la  
respuesta  0.3p  

En  este  sistema,  un  proceso  de  gran  tamaño  tendrá  una  tabla  de  páginas  que  puede  superar  con  creces  el  
kilobyte   que   ocupa   un   único   marco   de   página.   Por   ejemplo,   si   cada   entrada   de   la   tabla   ocupa   3   bytes,  
basta  con  que  el  proceso  tenga  400  páginas  para  que  la  tabla  necesite  consumir  dos  marcos.  
Si   la   tabla   de   páginas   consume   varios   marcos,   estos   deberán   ser   contiguos   para   que   la   MMU   pueda  
realizar  su  trabajo.  Y  como  necesitamos  asignar  varios  marcos  contiguos,  nos  aparece  el  problema  de  la  
fragmentación  externa,  que  es  lo  que  la  paginación  debería  resolver  definitivamente.  Este  es  exactamente  
el   motivo   por   el   cual   muchos   sistemas   paginan   la   tabla   de   páginas   y   por   tanto   utilizan   un   esquema   de  
varios   niveles   de   paginación.   Así   que   en   el   sistema   propuesto,   es   más   recomendable   trabajar   con   dos  
niveles   de   paginación,   con   el   fin   de   reducir   el   problema   de   la   fragmentación   cuando   se   asigna   espacio  
para  la  tabla  de  páginas.  
7) Suponiendo   que   el   sistema   trabaja   con   un   solo   nivel   de   paginación,   ¿cuántos  
elementos  como  máximo  puede  tener  la  tabla  de  páginas?  0.3p  

Tantos  como  páginas,  es  decir,  2^24  /  2^10  =  2^14  =  16.384  elementos  
8) En   un   momento   dado,   encontramos   un   proceso   que   direcciona   50   páginas   lógicas,  
pero   si   observamos   los   marcos   de   página,   solo   30   de   ellos   están   asignados   a   este  
proceso.   ¿cómo   es   posible   que   el   proceso   tenga   más   páginas   lógicas   que   marcos  
asignados?  0.2p  

Una   posible   explicación   es   que   el   proceso   está   compartiendo   marcos   de   página   con   otros   procesos,   o   con  
el   sistema   operativo.   Por   ejemplo,   algunas   de   las   páginas   lógicas   pueden   estar   apuntando   a   páginas   de  
código  de  una  DLL  que  ha  sido  asignada  a  otro  proceso,  o  a  datos  de  sólo  lectura  del  sistema  operativo,  
etc.  
Otra  explicación  es  que  algunas  de  las  páginas  lógicas  en  realidad  están  duplicadas,  es  decir,  que  varias  
páginas  lógicas  apuntan  al  mismo  marco  físico.  
Por  otra  parte,  en  el  enunciado  no  nos  indican  si  el  sistema  utiliza  el  bit  de  validez  y  por  tanto  el  concepto  
de  página  inválida.  Si  es  el  caso,  puede  ser  que  nuestro  proceso  direccione  50  páginas,  pero  sólo  30  de  
ellas   están   cargadas   en   memoria   principal,   mientras   que   el   resto   están   pendientes   de   cargar   (son  
inválidas).  
 
 
3   (1.5   puntos)   Sea  un  sistema  de  gestión  de  memoria  con  tres  niveles  de  paginación,  en  el  
que  cada  nivel  de  paginación  tiene  asociada  una  tabla  de  páginas  independiente  en  memoria.  
Sabiendo   que   el   tiempo   de   búsqueda   en   la   TLB   es   de   20   nanosegundos,   que   el   tiempo   de  
acceso   a   la   RAM   es   de   100   nanosegundos   y   que   el   tiempo   de   acceso   efectivo   en   este   sistema  
es  de  126  nanosegundos,  calcula  la  tasa  de  aciertos  de  la  TLB.  

    FSO  -­‐  examen  20120615  -­‐  segunda  parte  -­‐  p4/5  


Nombre      

 
Por  los  datos  del  problema  sabemos  que,  en  caso  de  acierto,  el  tiempo  de  acceso  a  memoria  es:  
20   +   100   =   120   ns,   20   ns   por   acceder   a   la   TLB   y   100   ns   para   acceder   al   dato   o   a   la   instrucción   en   la  
memoria  principal  
Sin  embargo,  en  caso  de  fallo  de  TLB,  el  coste  temporal  de  acceso  al  dato/instrucción  es:  
20  +  100  +  100  +  100  +  100  =  420  ns,  desglosados  de  la  siguiente  manera:  
  20  ns  :  acceso  a  la  TLB  
  100  ns:  acceso  a  la  tabla  de  páginas  de  primer  nivel,  que  está  en  la  memoria  principal  
  100  ns:  acceso  a  la  tabla  de  páginas  de  segundo  nivel,  que  está  en  la  memoria  principal  
  100  ns:  acceso  a  la  tabla  de  páginas  de  tercer  nivel,  que  está  en  la  memoria  principal  
  100  ns:  acceso  a  la  instrucción/dato,  que  está  en  la  memoria  principal  
Por  lo  tanto,  si  llamamos  k  a  la  tasa  de  aciertos:  
126  =  k·∙120  +  (1-­‐k)·∙420  -­‐-­‐>  k  =  294/300  =  0,98  =  98%  

  5  

 Calificación

2
Fundamentos de los Sistemas Operativos (Grado en Ing. Inf.)
Convocatoria extraordinaria
11 de Julio de 2012 3

Nombre Grupo
SOLUCIONES
Dispones de dos horas y media para completar el examen

1 (3 puntos. Todas las cuestiones puntúan lo mismo) Contestar
 de
 forma
 precisa
 a
 las

siguientes
cuestiones:


1. Defina con precisión los siguientes términos:


a) sistema operativo
b) núcleo
c) llamada al sistema

Solución: consultar esos términos en la bibliografía de la asignatura.

2. ¿Qué acciones realiza típicamente una CPU cuando recibe una señal de interrupción, en un sistema
con interrupciones vectorizadas?

Solución: lo habitual es que suspenda la ejecución de la instrucción actual y cambiará el contador


de programa al valor apuntado por la entrada del vector de interrupciones correspondiente con el
número asociado a la interrupción. Al variar el contador de programa, es habitual que conmute a
modo supervisor y que guarde el estado del proceso interrumpido (ej. valores de los registros).

3. En la gestión de procesos, ¿qué función tiene el planificador de largo plazo, también llamado de alto
nivel?

Solución: el planificador de largo plazo se encarga de alimentar de procesos recién llegados al


planificador de corto plazo. Es decir, actúa como un filtro de entrada inicial para los procesos que
pretenden ejecutarse, para lograr objetivos de eficiencia como impedir que se supere un máximo de
procesos en ejecución, un cierto nivel de consumo de recursos, cuotas de procesos por usuarios, etc.

4. En la planificación de procesos con Round Robin, ¿qué efecto se produce si el cuanto de tiempo se
vuelve demasiado largo?

Solución: el algoritmo tiende a parecerse a un FCFS, con lo cual el tiempo de respuesta aumenta,
se va perdiendo interactividad, se penaliza a los procesos intensivos en E/S y puede observarse el
efecto convoy por acaparamiento de los procesos intensivos en CPU.

5. ¿Por qué las operaciones de un semáforo deben de ser necesariamente atómicas?

Solución: deben serlo para evitar que la manipulación concurrente del valor asociado al semáforo dé
lugar a inconsistencias en el comportamiento esperado, por ejemplo que dos procesos realicen una
operación WAIT sobre el mismo semáforo con valor uno, y ambos procesos decidan no bloquearse al
no producirse el decremento del valor de forma secuenciada.

 
 FSO‐
examen
20120615
‐
primera
parte
‐
p1/7


6. ¿En qué consiste el problema de la fragmentación externa en la gestión de archivos?

Solución: consiste en la existencia de zonas de espacio libre, pero que no pueden ser asignadas a
procesos que lo solicitan, debido a que las zonas no están contiguas (están fragmentadas) y los
algoritmos de gestión no permiten conceder varios fragmentos para conceder una petición.

7. En las políticas de reemplazo de páginas, ¿qué ventaja tiene el algoritmo LRU sobre el FIFO?

Solución: la ventaja principal es que el algoritmo LRU es una mejor aproximación que el FIFO a la
política óptima: la página menos recientemente usada es más probable que sea la que más tiempo
se tarde en acceder, comparado con la página más vieja (que puede ser una página frecuentemente
accedida). Teniendo en cuenta esto, el LRU tenderá con el tiempo a darnos menos fallos de página
que el FIFO.

8. Tenemos un sistema de ficheros que trabaja con bloques de datos de 1Kbyte y utiliza asignación de
espacio indexada, con un solo bloque para los índices. Cada enlace ocupa 16 bits. Con estos datos,
obtenga el tamaño máximo que puede tener un archivo y cuál es el espacio máximo

Solución: Como cada enlace son 16 bits = 2 bytes, en el único bloque de índices caben 1024/2 =
512 enlaces. Por tanto un archivo puede llegar a tener 512 bloques = 512 Kbytes.
El espacio máximo direccionable viene dado por el tamaño del enlace, que nos da 2 16 combinaciones
= 65.536 bloques = 64 Mbytes.

9. Tenemos estos dos procesos que están continuamente accediendo a una variable compartida x, cuyo
valor inicial es cero:
loop
 loop



x
:=
x
+
1;
 

x
:=
x
‐
1;

end
loop;
 end
loop;

a) ¿Cuáles son los posibles valores que puede adquirir x a lo largo del tiempo?

Solución: en general, la variable x contendrá la diferencia de iteraciones entre los dos procesos,
tanto en positivo (ventaja para el proceso de la izquierda) como en negativo (ventaja para el de la
derecha). Cada uno de los dos procesos puede adelantarse al otro un número arbitrario de
iteraciones, ya que el enunciado no establece ninguna especificación sobre cómo se están
repartiendo el tiempo los procesos. Por tanto la variable x puede adquirir cualquier valor entero.
b) ¿Varía su respuesta dependiendo del número de procesadores que tenga el sistema?

Solución: El número de procesadores no influye en la respuesta anterior.

10. Mencione alguna diferencia significativa entre el proceso de traducción de direcciones de un sistema
basado en segmentación, respecto al proceso de traducción de un sistema paginado.

Solución: Algunas de las diferencias son:


1. Como un segmento puede iniciarse en una dirección arbitraria de la memoria, hay que realizar
una suma de la dirección base del segmento y del desplazamiento. En la paginación, las páginas
se ubican en marcos de posiciones fijas y la suma se realiza implícitamente con una mera
sustitución de bits.
2. Como un segmento puede tener un tamaño variable, durante la traducción se debería comprobar
que el desplazamiento dentro del segmento se encuentra dentro del rango permitido. Esta
comprobación no se hace en un sistema paginado simple.


 
 FSO‐
examen
20120615
‐
primera
parte
‐
p2/7

Nombre

 


2 (5 puntos. Todos los problemas puntúan lo mismo)




1. En la figura se representa los 16 primeros bloques de un dispositivo de almacenamiento secundario
(disco) de capacidad 1 Gb. El método que se utiliza para la asignación de espacio en disco es el
encadenamiento (enlazado). Cada bloque tiene 4Kb. En la figura también se representa un fichero
llamado examen. El último bloque del fichero se indica con el símbolo F:
0
 1
 2
 3
 
 Directorio


 
 
 


 6
 
 


 
 
 
 
 
 
 
 
 Examen

4
 5
 6
 7
 
 Bloq.Comienzo.:
11


 
 
 


 
 8
 


 
 
 
 
 
 
 
 
 Bloq.Final:
12

8
 9
 10
 11
 
 


 
 
 

9
 13
 
 14


 
 
 
 
 
 
 
 
 

12
 13
 14
 15
 
 


 
 
 

F
 12
 1
 


a) Calcular el tamaño máximo (en bytes) de los datos almacenados en el fichero examen. (0.5p)

Solución: Los bloques empleados en el fichero “Examen” son: 11-14-1-6-8-9-13-12. En total, 8


bloques. Por otro lado, el disco tiene una capacidad de 1Gb (2 30 bytes). Además cada bloque tiene
4Kbytes (212 bytes). Por tanto, dividiendo 230/212, tenemos que el número de bloques del disco sería
256 (28 bloques). Por tanto, de los 4096 bytes de cada bloque, 4095 se dedicarían a datos y 1 para
almacenar el enlace al siguiente bloque. Para el fichero “Examen”, la cantidad de datos que se
podrían almacenar es 8*4095= 32760 bytes.

b) ¿Es posible el acceso directo a los archivos de este sistema? ¿es rentable con esta organización de
disponer de este servicio? (0.5p)

Solución: No es posible ni rentable. Sería muchísimo mejor emplear la asignación indexada.

2. Deducir las expresiones y calcular el tiempo que es necesario para leer 5 bloques consecutivos de un
archivo en un sistema con:
a) Asignación contigua. (0.33p)

Solución:
t = tb + tr + (N * tt) = 15+ 10 + (5 * 1.2)

b) Asisgnación mediante listas enlazadas. (0.33p)

Solución:
t = N * (tb + tr + tt) = 5 * (15 + 10 + 1.2)

c) Asignación mediante indexación de un solo nivel. (0.33p)


 3


Solución:
t = (N + 1) * (tb + tr + tt) = 6 * (15+ 10 + 1.2)

Considerar que el tiempo de búsqueda es tb=15ms, el retardo rotacional tr=10ms, y el tiempo de


transferencia de los datos de un bloque tt=1,2ms.

3. La siguiente tabla recoge información de cinco procesos que se van a ejecutar en un sistema. Se pide
calcular el tiempo de retorno de cada uno de los trabajos y representar la ejecución en diagramas de
Gantt para los siguientes algoritmos:
a) SJF. (0.2p)
b) Round Robin con cuanto de 2 u.t. considerando que si el cuanto de un proceso en ejecución expira
a la vez que la llegada de un nuevo proceso, entonces el nuevo proceso se añade a la cola de
procesos en espera de ejecutarse antes que el proceso termine. (0.4p)
c) Ídem que el apartado anterior, pero considerando un Round Robin con prioridades, siendo 4 la
máxima prioridad y 1 la mínima. (0.4p)
Trabajo Tiempo de llegada Tiempo de ejecución (u.t.) Prioridad
A 1 8 2
B 2 2 4
C 3 1 3
D 4 2 4
E 5 5 1

Solución:
a) SJF
El diagrama de Gantt simplificado es:

b) El diagrama de Gantt correspondiente al apartado b es el siguiente:


 
 FSO‐
examen
20120615
‐
primera
parte
‐
p4/7

Nombre

 


c) El diagrama de Gantt correspondiente al apartado c es el siguiente:

Con la información de los diagramas pueden calcularse los tiempos de retorno:

Tiempo de retorno (u.t.)


Trabajo SJF RR (b) RR (c)
A 8 13 17
B 7 3 3
C 10 5 3
D 10 3 6
E 14 14 14

4. Supongamos un sistema de gestión de memoria virtual con paginación. Existe un proceso al que se le
asignan 4 marcos durante toda su ejecución y que hace referencia a la siguiente lista de páginas: 4 8 9 7
3 8 4 8 4 6 8 5 8. Indique cuantos fallos de página se originarán si se aplica:
a) El algoritmo de reemplazo de la segunda oportunidad. (0.5p)

Solución: Se generan 8 fallos de página.

4 8 9 7 3 8 4 8 4 6 8 5 8
* 41 * 41 * 41 * 41 30 30 30 30 30 * 30 * 30 51 51
81 81 81 * 80 * 81 80 81 81 81 81 * 81 * 81
91 91 90 90 41 41 41 41 41 41 41
71 70 70 * 70 * 70 * 70 61 61 61 61
F F F F F F F F


 5


b) Alguien afirma que aplicando el algoritmo LRU, tanto para esta cadena de referencia como para
cualquier otra, se generaría un número de fallos de página menor o igual que el obtenido al aplicar
el algoritmo de la segunda oportunidad. ¿Es cierta la afirmación anterior? Justifique su respuesta.
(0.5p)

Solución: Sí, el algoritmo de la segunda oportunidad es una aproximación a la política LRU en la que
para evitar sustituir páginas usadas recientemente, se emplea un bit de referencia en lugar de
mantener una ordenación de las páginas en función del momento en el que han sido accedidas,
política que sería mucho mas costosa de implementar.

5. Suponga un sistema operativo multitarea con gestión de memoria virtual que combina la segmentación
y la paginación. Las direcciones virtuales son de 32 bits, de los cuales 8 bits indican el número de
segmento, 12 bits indican la página lógica y 12 bits el desplazamiento.
a) ¿Cuál sería la dirección física asociada a la dirección virtual (20,83400) dada en el formato
(SEGMENTO, DEZPLAZAMIENTO) si el segmento 20 empieza en la dirección física 327680 y
todas sus páginas se encuentran situadas en memoria física de forma consecutiva, siendo el tamaño
de dicho segmento 86016 bytes? (0.6p)

Solución: En primer lugar es necesario comprobar que se trata de una dirección lógica válida. Con
los 8 bits que se emplean para indicar el número de segmento, se pueden direccionar 256
segmentos. Por tanto, el número de segmento 20 está dentro del rango posible. Por otro lado, el
desplazamiento 83400, no supera el tamaño del segmento, que es 86016. Por tanto se trata de una
dirección lógica válida.
Dado que el segmento 20 comienza en la dirección física 327680, y todas las páginas que componen
dicho segmento se encuentran de forma consecutiva a partir de dicha dirección, para obtener la
dirección física será necesario calcular el número de página lógica y desplazamiento correspondiente
a la dirección lógica 83400. En este caso sería, página lógica 20, desplazamiento 1480. Por tanto, la
dirección física correspondiente a la dirección lógica (20,83400) será 327680 + (20 * 4096) + 1480 =
411080.

b) En el sistema de gestión de memoria explicado, ¿tiene sentido hablar de fragmentación interna?,


¿cuánto sería el espacio perdido por fragmentación interna para el segmento lógico 20? (0.4p)

Solución: Efectivamente tiene sentido hablar de fragmentación interna a tratarse de un sistema


paginado, entiendo por fragmentación interna el posible desperdicio de memoria de la última página
de cada segmento como consecuencia de que el tamaño del segmento no sea un múltiplo exacto del
tamaño de página. En el caso del segmento 20, tenemos una fragmentación interna de 4096-1480 =
2616 bytes.

2 (2 puntos) Supongamos
 que
 tenemos
 5
 procesos
 de
 dos
 tipos
 :
 A1,
 A2,
 A3,
 B1
 y
 B2.

Implementar
un
programa
usando
semáforos
de
forma
que
los
procesos
siempre
terminen
en
el

orden:
A(cualquiera
de
ellos),
B(cualquiera
de
ellos),
A
(cualquiera
de
ellos),
A
y
B.
Teniendo
en

cuenta
el
código
que
se
muestra
a
continuación
de
los
dos
tipo
de
procesos,
la
salida
por
pantalla

debe
ser
la
siguiente:


Un proceso A ha terminado
Un proceso B ha terminado
Un proceso A ha terminado
Un proceso A ha terminado
Un proceso B ha terminado

 
 FSO‐
examen
20120615
‐
primera
parte
‐
p6/7

Nombre

 


Proceso Tipo A() { Proceso Tipo B(){


… …
… …
// Protocolo de salida // Protocolo de salida
printf(“Un proceso A ha printf(“Un proceso B ha
terminado\n”) terminado\n”)
} }

Solución:
// Variables globales
//Variable empleada para indicar que un proceso B ha
terminado
Bterminado = false;
//El semáforo semA funcionará como cola de espera para los
//procesos de tipo A. Se inicializa a 1 para que un
//proceso A pueda ser el primero en terminar
// El semáforo semB funcionará como cola de espera para
//los procesos de tipo B. Se inicializa a 0 de forma que
//todos los procesos B queden en espera inicialmente hasta
//que un proceso A termine
Semáforo semA=1, semB=0;

Proceso Tipo A() { Proceso Tipo B(){


… …
… …
// Protocolo de salida // Protocolo de salida
wait(semA); wait(semB);
printf(“Un proceso A ha printf(“Un proceso B ha
terminado\n”) terminado\n”)
if Bterminado { //Indicamos que un proceso B termina

//Si un proceso B ha terminado Bterminado=true;


//reseteamos Bterminado y despertamos //Despertamos a un proceso A
//a un proceso A Signal(semA);
Bterminado=false; }
signal(semA);
}
else
signal(semB);
}


 7

Calificación

 
 
1

2
FUNDAMENTOS DE LOS SISTEMAS OPERATIVOS
Grado en Ingeniería Informática [GII] 3

4
Convocatoria Extraordinaria Especial
28 de noviembre de 2012 5

 Nombre

Dispones de tres horas para completar el examen


1 (2.5 puntos) Contestar  de  forma  precisa  (máximo  5  líneas)  a  las  siguientes  cuestiones.  
                                                                       (La  puntuación  parcial  está  sobre  10):  
a) Explicar las distintas formas de conectarse los procesadores para formar un sistema
multiprocesador. (1 p)
b) ¿Qué ventajas tiene utilizar hilos como elemento básico de ejecución frente a los procesos
pesados? ¿Crees que tiene algún inconveniente? (1 p)
c) Se propone una nueva política de planificación en la que “la CPU se concede al proceso que
menos memoria RAM necesita”. ¿Ofrecería algún beneficio? ¿Algún efecto negativo?
¿Crees que es implementable? (1,5 p)
d) ¿Con qué finalidad se emplea la técnica de envejecimiento en la planificación del uso del
procesador? (1 p)
e) ¿Qué tipos de problemas son inherentes al uso de las memorias cachés? Comenta en qué
consisten. (1 p)
f) ¿Por qué es necesario establecer dos modos de ejecución de instrucciones de un procesador?
¿cuáles son? (1 p)
g) ¿Permite la técnica de buffering la posibilidad de ejecutar instrucciones de un proceso
solapadas con la ejecución de instrucciones de otro? Justifica la respuesta (1 p)
h) ¿En qué consiste el BootStrap? Explicarlo detalladamente indicando cómo quedaría la
memoria una vez finalice. (1 p)
i) Considérese la política de planificación, para el planificador a corto plazo, RR (Round
Robin) con un quantum de tiempo q. ¿Es posible que a un proceso se le asigne más de q
unidades de tiempo? ¿y asignarle menos? Razona la respuesta. (1,5 p)
 
2 (2  puntos)  Supongamos  que  tenemos  una  máquina  con  16  MB  de  memoria  principal  y  un  
esquema  de  gestión  de  memoria  virtual  paginado  con  páginas  de  4  KB.  Un  proceso  produce  
la   siguiente   secuencia   de   accesos   a   direcciones   de   memoria   (mostradas   aquí   en  
hexadecimal):  
02D4B8,  02D4B9,  02D4EB,  02D4EB,  02D86F,  F0B621,  F0B815,  F0D963,  F0B832,  F0BA23,  
D9D6C3,  D9B1A7,  D9B1A1,  F0BA25,  02D4C7,  628A31,  F0B328,  D9B325,  D73425.  
El  sistema  operativo  asigna  al  proceso  4  marcos  de  memoria  principal.  Se  pide:  
a) ¿Cuál  deberá  ser  el  formato  de  dirección  física  de  memoria?  (0,5  p)  
b) Dar  la  cadena  de  referencia  de  las  páginas  accedidas  por  el  proceso.  (0,5  p)  
c) Si   el   sistema   operativo   utiliza   4   marcos   de   memoria   principal,   describir   el  
comportamiento   del   gestor   de   memoria   utilizando   cada   uno   de   los   siguientes  
algoritmos  de  reemplazo  de  páginas,  indicando  cuántos  fallos  de  página  se  producen  
con  el  Algoritmo  de  la  segunda  oportunidad.  (1  p)  
 
  1  
3 (1,5   puntos)   Un  sistema  dispone  de  un  planificador  a  largo  plazo  (PLP)  y  de  otro  a  corto  
plazo   (PCP),   que   funcionan   de   la   siguiente   manera:   el   PCP   utiliza   un   algoritmo   con  
prioridades  expulsivas  y  el  PLP  utiliza  una  estrategia  FCFS.  Los  procesos  nuevos  entran  por  
el  PLP.  Se  admiten  en  memoria  un  máximo  de  tres  procesos.  El  PLP  pasa  un  proceso  al  PCP  
cuando  hay  menos  de  tres  procesos  ya  admitidos.  Partiendo  de  la  siguiente  tabla  de  procesos  
y  teniendo  en  cuenta  que  a  menor  número  más  prioridad.  
Proceso   t  de  llegada   t  de  CPU   Prioridad  
A   0   2   4  
B   1   4   3  
C   3   4   2  
D   5   1   1  
E   6   2   3  
Se  pide:  
a) Dar  el  diagrama  de  Gantt  (0,75  p)  
b) Tiempo  de  espera  medio  y  tiempo  de  retorno  medio  del  sistema  (0,75  p)  
 
 
 
4 (2  puntos)  Se  pide:  
a) Supongamos  que  tenemos  un  sistema  de  archivos  que  trabaja  con  bloques  de  datos  de  
1   kilobyte   y   que   utiliza   una   FAT   en   la   que   cada   enlace   ocupa   24   bits.   ¿Cuál   es   el  
tamaño  máximo  que  podría  tener  un  fichero  en  este  sistema?    (0,5  p)  
b) Supongamos  ahora  que  este  sistema  de  archivos  utiliza  un  bloque  de  índices,  en  lugar  
de  una  FAT.  ¿Cuál  sería  entonces  el  tamaño  máximo  de  un  fichero?    (0,5  p)  
c) Tenemos   un   sistema   de   archivos   que   utiliza   asignación   indexada   de   dos   niveles   de  
profundidad.   El   tamaño   de   bloque   es   de   2   kilobytes   y   cada   entrada   en   la   tabla   de  
índices  ocupa  2  bytes.  Un  fichero  que  necesita  siete  bloques  de  índices,  ¿qué  tamaño  
puede  tener?  (nota:  calcular  el  tamaño  mínimo  y  el  máximo  que  podría  tener).    (0,5  p)  
d) Tenemos  una  partición  de  disco  de  4  gigabytes  en  la  que  se  va  a  montar  un  sistema  de  
archivos   basado   en   FAT   y   que   usará   un   tamaño   de   bloque   de   datos   de   4   kilobytes.  
¿Cuántos   bits   deberían   usarse   en   cada   entrada   de   la   FAT   para   que   el   sistema   de  
archivos  pudiera  direccionar  toda  la  partición?  (0,5  p)  
 
 
 
5 (2   puntos)  Diseñar  una  solución  al  primer  problema  de  los  lectores  y  escritores  (prioridad  
para   los   lectores),   con   el   requisito   añadido   de   que   no   puede   haber   más   de   N   lectores  
simultáneos.  Como  herramienta  de  sincronización,  se  deberá  utilizar  semáforos.  
 
 
*    *    *    *    *  

  2  
Calificación

1
2
SISTEMAS OPERATIVOS (II-ITIS-ITIG)
Examen Final
9 de junio de 2011 - PRIMERA PARTE -

Nombre Titulación
*** SOLUCIÓN ***
Dispone de dos horas para realizar el examen
1 (7 puntos) Test. En cada uno de los siguientes apartados, señale cuál opción es correcta. En caso de que existan
varias opciones ciertas, se considerará como correcta la más completa o precisa. Las preguntas no contestadas no puntúan; las
contestadas erróneamente puntúan negativamente restando un tercio de su valor. Señale sus respuestas rodeando con un
círculo la opción correcta. Si se equivoca, tache la respuesta incorrecta y rodee la opción que considere correcta. Escriba
con tinta negra o azul. Las preguntas respondidas con lápiz o con varios círculos no tachados se considerarán no
contestadas.
1. ¿Cuál de estas técnicas no tiene como fin solapar la ejecución de instrucciones en CPU con la ejecución de
operaciones de entrada/salida?
a) Acceso directo a memoria (DMA)
b) Modo dual de operación
c) Procesamiento fuera de línea (off-line)
d) Spooling

2. El shell o intérprete de órdenes:


a) Es un programa del sistema y constituye la única forma de solicitar servicios al SO
b) Ejecuta las órdenes indicadas por el usuario y para ello hace uso a su vez de las llamadas al
sistema
c) Como es un programa del sistema, no necesita realizar llamadas al sistema
d) Siempre forma parte del núcleo del sistema operativo

3. ¿Cuál de las siguientes afirmaciones es correcta?


a) El modo dual de operación se ha diseñado para que los programas de usuario obtengan acceso pleno a
todos los recursos del sistema con total libertad.
b) Cuando se produce una interrupción, la CPU conmuta a modo privilegiado/supervisor.
c) Las instrucciones de desactivación de interrupciones se ejecutan normalmente en modo de usuario.
d) Las instrucciones de lectura del reloj del sistema normalmente deberían ser operaciones privilegiadas.

4. Un sistema multiprogramado:
a) Permite gestionar varias tareas interactivas
b) Evita el posible monopolio de la CPU por un proceso del sistema
c) Aumenta el rendimiento del sistema ya que los procesos se ejecutan en paralelo
d) Ninguna de las anteriores

5. La idea básica del mecanismo de E/S por interrupciones consiste en:


a) Disponer de un mecanismo acceso directo a memoria
b) Impedir que la CPU esté ociosa mientras espera por E/S
c) Buscar mecanismos de interactividad
d) Fijar un tiempo límite de servicio de E/S, superado el cual se interrumpe la operación pendiente

6. ¿Qué parte del sistema operativo se encarga habitualmente de atender las llamadas al sistema?
a) El despachador (dispatcher)
b) El intérprete de órdenes (shell)
c) El núcleo
d) El manejador de dispositivos

7. El planificador a corto plazo selecciona:


a) El proceso que pasa al estado activo de entre todos los procesos en estado preparado.
b) El trabajo que se admite en el sistema para su procesamiento.
c) La página en memoria que se debe sustituir por la página que se solicita cuando se produce un fallo de
página.
d) Entre las peticiones de E/S al disco aquella que minimiza el tiempo medio de búsqueda.

· SO – examen 20110609 – primera parte - p1/3


8. En los instantes 2 y 4 llegan los procesos P1 y P2, respectivamente, y en el instante 12 acaba P2 y en el instante 18
acaba P1. Entonces:
a) El tiempo de retorno medio es de 15 segundos
b) El tiempo de retorno medio es de 13 segundos
c) El tiempo de retorno medio es de 12 segundos
d) Faltan datos para calcular el tiempo de retorno medio

9. Se tienen 3 procesos: P1, P2 y P3, con tiempos de ejecución: 65, 45 y 120 ms, respectivamente. Si actúa el
planificador a corto plazo según el algoritmo SJF (Shortest Job First) se obtiene que:
a) Los procesos se encuentran en la lista de preparados en el orden: P2, P1 y P3.
b) Los procesos se ejecutan en el orden: P2, P1 y P3.
c) Los procesos se ejecutan en el orden de llegada al sistema: P1, P2 y P3.
d) Ninguna de las anteriores

10. El tiempo de retorno corresponde matemáticamente a


a) Porcentaje del tiempo medio de utilización
b) Al tiempo de espera menos el tiempo de ejecución
c) Al tiempo de ejecución más el tiempo de espera
d) Ninguna de las anteriores

11. La técnica de planificación Round-Robin:


a) En general, da mejores tiempos de espera que el FCFS.
b) Minimiza el tiempo medio de retorno.
c) Maximiza el rendimiento del sistema.
d) Permite acotar el tiempo de respuesta máximo.

12. El planificador a corto plazo según el algoritmo SJF es el mejor en


a) Minimizar el rendimiento del sistema
b) Maximizar la eficacia o tiempo de utilización de CPU
c) Minimizar el tiempo de espera de todos los procesos
d) Ninguna de las anteriores

13. ¿Qué algoritmo es equivalente al Round Robin?


a) SJF si el cuanto es suficientemente grande
b) FCFS si el cuanto es suficientemente pequeño
c) Prioridades si el cuanto es suficientemente grande
d) Ninguna de las anteriores

14. Para la siguiente tabla, determinar el tiempo de retorno y de espera para P2 al aplicar el algoritmo de planificación a
corto plazo Round Robin (Prioridad Circular) con cuanto de 3s.

Proceso   Tiempo  de  llegada  (s)   Tiempo  de  ejecución  (s)  


P1   0   9  
P2   1   5  
P3   2   2  
 
a) 13 y 8 s respectivamente
b) 14 y 9 s respectivamente
c) 12 y 7 s respectivamente
d) Ninguno de los anteriores

2 (3 puntos). Implemente utilizando semáforos una solución a esta variante del problema de los
filósofos. Hay F filósofos (F mayor o igual que cinco); y hay P palillos, que se pueden tomar en
cualquier orden (no están ordenados circularmente en la mesa). Cuando un filósofo quiere comer,
coge un par de palillos cualesquiera y cuando acaba de comer, los devuelve a la mesa.
La solución debe estar libre de interbloqueos.

· SO – examen 20110609 – primera parte - p2/3


 
Esta primera solución utiliza una variable contadora de palillos libres y para la sincronización, emplea el
algoritmo genérico de sincronización mediante semáforos binarios.
Obsérvese que el código es exactamente el mismo para cualquier filósofo, ya que no hay que mantener
ningún orden en los palillos.

variables  compartidas:  
npalillos  :  entera  =  P  
mutex  :  Semáforo  =  1  //  para  controlar  el  acceso  a  la  variable  npalillos  
cola  :  Semáforo  =  0  //  para  encolar  a  los  filósofos  en  espera  
espera  :  entera  =  0  //  número  de  filósofos  en  espera  por  palillos  
 
Código  de  cualquier  filósofo:  
loop  {  
 
     ...  pensar  ...  
 
     P(mutex)  
     while  (npalillos<2)  {  
           espera++  
           V(mutex)  
           P(cola)  
     }  
     npalillos  =  npalillos-­‐2  
     V(mutex)  
 
     ...  comer  ...  
 
     P(mutex)  
     npalillos  =  npalillos+2  
     if  (  espera>0  )  {  
           espera-­‐-­‐;  
           V(cola)  
     }  
     V(mutex)  
}  

Esta otra solución se basa en que los palillos siempre han de tomarse de dos en dos. Así que tenemos un
semáforo cuyo valor inicial es el número de parejas de palillos. Cada vez que un filósofo intenta comer,
hace una operación P o wait sobre este semáforo.
En esta solución se supone que el filósofo, una vez que se ha asegurado que hay palillos suficientes,
accede a algún recurso compartido para actualizar el número de palillos disponibles. Por eso es
necesario un semáforo "mutex" que debe tomarse antes de comer, y también después de comer.

parejas  :  Semáforo  =  entero(P/2)  


mutex  :  Semáforo  =  1  //  para  manejar  el  recurso  compartido  (los  palillos)  
 
loop  {  
   ...  pensar  ...  
 
   P(parejas)  
   P(mutex)  
   ...  coger  dos  palillos  cualesquiera  
   V(mutex)  
   ...  comer  ...  
   P(mutex)  
   ...  soltar  los  dos  palillos  
   V(mutex)  
   V(parejas)  
}

· SO – examen 20110609 – primera parte - p3/3


Calificación

1
2
SISTEMAS OPERATIVOS (II-ITIS-ITIG)
Examen Final 3
9 de junio de 2011 - SEGUNDA PARTE -

Nombre Titulación
*** SOLUCIÓN ***
Dispone de dos horas para realizar el examen
1 (5 puntos) Test. En cada uno de los siguientes apartados, señale cuál opción es correcta. En
caso de que existan varias opciones ciertas, se considerará como correcta la más completa o precisa. Las preguntas
no contestadas no puntúan; las contestadas erróneamente puntúan negativamente restando un tercio de
su valor. Señale sus respuestas rodeando con un círculo la opción correcta. Si se equivoca, tache la
respuesta incorrecta y rodee la opción que considere correcta. Escriba con tinta. Las preguntas
respondidas con lápiz o con varios círculos no tachados se considerarán no contestadas.
1. En un sistema operativo se utiliza una estructura de nodos-i parecida a la de Unix. El tamaño
de bloque es de 1024 bytes y tamaño de los punteros a bloques es de 32 bits. El nodo-i tiene
un cierto número de entradas de direccionamiento directo, una de direccionamiento indirecto
simple y otra de direccionamiento indirecto doble. Sabiendo que el tamaño máximo de un
archivo es de 65800 Kbytes, ¿cuántas entradas directas hay en el i-nodo?
a) 10
b) 12
c) 8
d) Ninguna de las anteriores

2. Un sistema de ficheros que usa asignación enlazada, con un tamaño de bloque de 1 Kbyte y
tamaño de enlace de 2 bytes permite un tamaño máximo de fichero de:
a) 2^16 bloques
b) 65536 Kbytes
c) 65408 Kbytes
d) a) y b) son ciertas

3. La operación de apertura de fichero sirve para:


a) Permitir que los dispositivos de entrada/salida inicien el controlador de DMA
b) El sistema operativo lleve el control de qué ficheros están siendo usados en
cada momento
c) El sistema operativo pueda traer a memoria la FAT
d) Todas las anteriores son falsas

4. ¿Qué tipo de directorios se emplean en Linux?


a) De dos niveles con bifurcación par
b) De árbol
c) De grafo general
d) De grafo acíclico

SO- examen 20110609 – segunda parte – p1/5

!
5. Para obtener un listado de los nombres de los ficheros que hay en un determinado directorio:
a) Hay que abrir uno a uno los ficheros para averiguar su nombre y después volverlos a
cerrar
b) Los nombres de los ficheros forman parte de las entradas del directorio; basta
con leerlos de él
c) Hay que acceder a la FAT para leer los nombres
d) Hay que acceder primero al i-nodo de cada fichero y después a la FAT

6. Un determinado sistema de ficheros usa el método asignación contigua de espacio en disco.


¿Cuál de los siguientes algoritmos de asignación de espacio no es adecuado para este tipo de
asignación?
a) Best fit
b) First fit
c) Unique fit
d) Worst fit

7. Al leer la documentación acerca del sistema de ficheros ISO 9660, usado en CDROMs,
DVDs y otros dispositivos ópticos, puede observarse que se habla de “extents” (extensiones).
¿Qué se deduce de esto?
a) ISO 9660 usa asignación por i-nodos
b) ISO 9660 usa asignación contigua
c) ISO 9660 usa asignación enlazada
d) Todas las anteriores son ciertas

8. En un sistema con gestión de memoria de particiones fijas de tamaño 500Kb si se aloja un


proceso de 450Kb:
a) Se produce una fragmentación interna de 50Kb
b) Se produce una fragmentación externa de 50Kb
c) Se crea una nueva partición libre de 50Kb
d) Se crea una nueva partición libre de 550Kb, al unirse el resto de 50Kb con la
adyacente libre de 500Kb

9. Para implementar el algoritmo de sustitución de segunda oportunidad (o del reloj) mejorado,


es necesario disponer de:
a) Los bits de referencia y de validez
b) Los bits de referencia y de modificación
c) Los bits de bloqueo y de modificación
d) Los bits de validez y de modificación

10. En la tabla de segmentos se encuentra que el segmento 0 tiene una base de 219 y una longitud
de 600. ¿A qué dirección física se corresponde la dirección virtual (0, 430) dada en el formato
(nº seg., desplazamiento dentro del seg.)?:
a) 219x0+430=430
b) 219+430=649
c) 219+430=649 ( como el máximo es 600 se produce: Error de direccionamiento)
d) Es necesario conocer el tamaño del marco
SO- examen 20110609 – segunda parte – p2/5

!
2 (2 puntos).Responda a las siguientes cuestiones sobre gestión de memoria. Use únicamente
el espacio dispuesto para ello.
a. En un sistema operativo multitarea, con 16Kb de espacio lógico de procesos, con páginas de 2
Kb y 32Kb de memoria física, sin memoria virtual. La dirección lógica está formada por A
bits para indicar la página y B bits para el desplazamiento.
Respuesta: A= 3 B= 11

b. En un sistema operativo multitarea con 2Mb de memoria virtual, 32Kb de espacio lógico de
los procesos, páginas de 4Kb y 32 Kb de memoria física, la dirección física está formada por
A bits para indicar el marco y B bits para el desplazamiento.
Respuesta: A= 3 B= 12

c. En la tabla de segmentos se especifica que el segmento 1 posee una dirección base de 520 y
una longitud de 300. ¿ A qué dirección física se corresponde la dirección virtual (1,400) dada
en el formato (número segmento, desplazamiento dentro del segmento?
Respuesta: 920, pero se produce un error de direccionamiento, al exceder el límite del
segmento

d. La anomalía de Belady la sufre el algoritmo de reemplazo FIFO y consiste en que, bajo ciertas
condiciones, añadiendo más marcos a la memoria física, el sistema genera más fallos de
página

e. El término reubicación se refiere a posibilidad de cargar y ejecutar un programa dado en un


lugar arbitrario de memoria V

f. Indique Verdadero o Falso para las siguientes afirmaciones:

V Con una política de asignación contigua del espacio de los procesos y particiones fijas se tiene
mas fragmentación interna que en una política de particiones variables
En un sistema de gestión de memoria paginada, la gestión de la memoria libre provoca que los
V procesos tengan fragmentación interna independientemente de cómo se realice la gestión del
espacio libre

SO- examen 20110609 – segunda parte – p3/5

!
3 (3 puntos). Sea un sistema de impresión que tiene dos impresoras, una de color y otra de
blanco y negro. Los procesos disponen de dos operaciones, una para cada tipo de impresora.
Cuando un proceso entrega un trabajo para imprimir, el trabajo se encola y el proceso continúa
su ejecución sin bloquearse.
La impresora de color, cuando se libera, intenta primero tomar un trabajo de la cola de color. Si
no hay ningún trabajo pendiente en la cola de color, toma un trabajo de la cola de blanco y negro.
Y si no hay ningún trabajo pendiente, la impresora se bloquea hasta que llegue algún trabajo de
cualquier tipo.
La impresora de blanco y negro, cuando se libera, toma un trabajo de su cola. Si la cola está vacía,
la impresora se bloquea hasta que llegue algún trabajo de blanco y negro.
Para implementar el sistema de impresión, se ha definido un monitor, cuyas especificaciones se
dan a continuación. Tiene usted que desarrollar la implementación del monitor, en lo que atañe a
la sincronización entre procesos (bloqueos y desbloqueos). No hay que implementar los detalles
de cómo se encolan o imprimen los trabajos, sólo marcar esas operaciones con comentarios o
seudofunciones.

monitor SistemaImpresión
{
// Envía un trabajo a la cola de color
public void ImprimeColor (string documento);

// Envía un trabajo a la cola de blanco y negro


public void ImprimeBN (string documento);

// toma un trabajo de alguna de las colas, con preferencia a la de color


// si las colas están vacías, espera a que haya algo
public void ImpresoraColorLibre();

// toma un trabajo de la cola de B/N


// si la cola está vacía, espera hasta que haya algo
public void ImpresoraBNLibre();
};

Respuesta:

monitor SistemaImpresión
{
int trabajosColor = 0;
int trabajosBN = 0;
condición colaEsperaImpresora;

public void ImprimeColor (string documento) {


// añade el trabajo a la cola de color
trabajosColor++;
colaEsperaImpresora.broadcast();
}

public void ImprimeBN (string documento) {


// añade el trabajo a la cola de BN
trabajosBN++;
colaEsperaImpresora.broadcast();
}

SO- examen 20110609 – segunda parte – p4/5

!
public void ImpresoraColorLibre() {
while ( trabajosColor+trabajosBN == 0 ) {
colaEsperaImpresora.wait();
}

if ( trabajosColor > 0 ) {
trabajosColor--;
// se pone a imprimir un trabajo de la cola
}
else if ( trabajosBN > 0 ) {
trabajosBN--;
// se pone a imprimir un trabajo de la cola
}
else { ERROR(); } // no debería entrar en este código

public void ImpresoraBNLibre() {


while ( trabajosBN == 0 ) {
colaEsperaImpresora.wait();
}

trabajosBN--;
// se pone a imprimir un trabajo de la cola
}
};

SO- examen 20110609 – segunda parte – p5/5

!
Calificación

1
2
Sistemas Operativos (II, ITIG, ITIS) 3
Fundamentos de Sistemas Operativos (Grado en Ing. Inf.) 4
Convocatoria extraordinaria, 7 de julio de 2011

Nombre Titulación
SOLUCIONES
Dispones  de  tres  horas  para  realizar  el  examen

1 (4  puntos)   TEST.  En  cada  una  de  estos  15  preguntas,  señala  cuál  opción  es  correcta.  En  caso  de  que  
existan  varias  opciones  ciertas,  se  considerará  como  correcta  la  más  completa  o  precisa.  Las  preguntas  no  
contestadas  no  puntúan;  las  contestadas  erróneamente  puntúan  negaOvamente  restando  un  tercio  de  su  valor.  
Señala  tus  respuestas  rodeando  con  un  círculo  la  opción  correcta.  Si  te  equivocas,  tacha  la  respuesta  incorrecta  
y  rodea   la  opción   que  considere  correcta.  Escribe  con  Onta.   Las  preguntas   respondidas  con  lápiz   o  con  varios  
círculos  no  tachados  se  considerarán  no  contestadas.
1. El  procesamiento  asimétrico  se  refiere  a:
a) Sistemas  en  los  que  la  velocidad  de  la  memoria  principal  es  mucho  mayor  que  la  de  la  memoria  
secundaria.
b) Máquinas  con   más   de   un   procesador   en   las   que   todos   los   procesadores   son   equivalentes   y   por   tanto  
pueden  realizar  las  mismas  tareas.
c) **Máquinas  con  más  de  un  procesador  en  las  que  no  todos  los  procesadores  son  equivalentes.
d) Sistemas  operaOvos  en  los  que  unos  procesos  pueden  tener  más  prioridad  que  otros.
2. ¿Qué   componente   del   sistema   operaOvo   permanece   en   la   memoria   principal   desde   que   se   arranca   la  
máquina  hasta  que  se  apaga?
a) El  despachador  (dispatcher).
b) **El  núcleo.
c) Las  llamadas  al  sistema.
d) el  DMA.
3. Cuando  un  proceso  en  modo  usuario  intenta  ejecutar  una  instrucción  privilegiada,  se  dispara:
a) Una  interrupción.
b) El  modo  dual  de  operación.
c) **Una  excepción.
d) Una  llamada  al  sistema.
4. Airbus   Industries   está   consultando   con   expertos   informáOcos   un   nuevo   sistema   operaOvo   para   el  
computador  que  maneja  la  aviónica  del  Airbus  A380.  Las  tareas  del  computador  incluyen  la  visualización  de  
los  datos  de  los  sensores  de  vuelo,  la  actuación  sobre  los  motores  de  la  aeronave,  el  control  de  la  presión  en  
cabina,  del  sistema  de  navegación,  etc.  Si  tuvieras  la  oportunidad  de  dar  tu  opinión  al  respecto,  ¿cuál  de  
estas  opciones  recomendarías?:
a) **Un  sistema  operaDvo  de  Dempo  real.
b) Un  sistema  operaOvo  de  Oempo  real  con  gesOón  de  memoria  virtual.
c) Un  sistema  operaOvo  distribuido.
d) Un  sistema  operaOvo  por  lotes  no  mulOprogramado.
5. Oyes  por  los  pasillos  de  la  Escuela  las  siguientes  afirmaciones  referidas  a  la  jerarquía  de  memorias  y  una  de  
ellas  te  hace  pensar  que  quien  la  realiza  no  ha  estudiado  suficiente  la  asignatura  de  Sistemas  OperaOvos.  
¿Cuál  es?
a) **La  memoria  más  rápida  es  la  caché  del  procesador.
b) La  aplicación  del  principio  de  caché  permite  mejorar  el  rendimiento  de  los  sistemas.
c) La  capacidad  de  memoria  es  mayor  a  medida  que  el  Oempo  de  acceso  es  mayor.
d) El  coste  por  bit  es  mayor  cuanto  más  rápida  es  la  memoria.
Sistemas Operativos – convocatoria extraordinaria, 7 de julio de 2011 pág. 2/5

6. Una  diferencia  entre  un  semáforo  binario  y  un  semáforo  general  es:
a) En  los  semáforos  binarios,  la  operación  «V»  o  «signal»  puede  llegar  a  bloquear,  bajo  determinadas  
circunstancias.
b) Un  semáforo  general  Oene  una  operación  broadcast,  de  la  que  carecen  los  semáforos  binarios.
c) Un  semáforo  binario  sólo  puede  inicializarse  a  valores  iguales  o  superiores  a  1.
d) **Un  semáforo  binario  sólo  puede  adoptar  los  valores  0  y  1.
7. Si  un  algoritmo  que  intenta  gesOonar  una  sección  críOca  no  cumple  la  condición  de  progreso:
a) **Se  corre  el  riesgo  de  inanición  de  uno  o  varios  procesos.
b) Se  corre  el  riesgo  de  que  haya  varios  procesos  ejecutando  código  de  sección  críOca.
c) Se  corre  el  riesgo  de  que  la  solución  no  sea  implementable  con  semáforos  ni  con  monitores.
d) Todas  las  anteriores  son  ciertas.
8. Las  llamadas  «instrucciones  atómicas»  del  hardware:
a) Evitan  que  exista  interbloqueo  en  los  algoritmos  de  sección  críOca.
b) **Facilitan  la  implementación  de  algoritmos  de  sección  críDca  y  de  sincronización  entre  procesos.
c) Permiten   soluciones   universales   a   los   problemas   de   sincronización,   ya   que   están   disponibles   en  
cualquier  procesador.
d) Dependen  del  Opo  de  procesador,  ya  que  hay  instrucciones  Opo  Mesa  y  otras  Opo  Hoare.
9. Imagina   un  sistema   de   archivos   como  el   de   Linux,   con   la  diferencia   de   que  no   se  permiten   enlaces   a  
archivos.  En  este  hipotéOco  caso,  la  organización  del  sistema  de  ficheros  sería:
a) De  dos  niveles  recursivos.
b) **De  árbol.
c) De  grafo  general.
d) De  grafo  acíclico.
10. Los  disposiOvos  de  cinta  magnéOca  son  de  naturaleza  secuencial.  Si  organizamos  un  sistema  de  archivos  
sobre  una  cinta,  ¿es  posible  realizar  accesos  directos  sobre  los  archivos?
a) **Es  posible,  pero  sería  extremadamente  ineficiente.
b) Sólo  es  posible  si  se  trata  de  cintas  en  cartucho  (Opo  casse3e),  no  en  bobina.
c) Sólo  es  posible  si  el  sistema  operaOvo  es  independiente  del  disposiOvo.
d) Es  imposible,  por  la  naturaleza  secuencial  del  disposiOvo.
11. En  un  sistema  de  planificación  por  prioridades  expropiaOvo  llega  un  proceso  en  el  instante  4  con   prioridad  
máxima.  Este  proceso  se  ejecuta  durante  2s,  después  realiza  una  operación  de  E/S  durante  3s  y  para  acabar  
se   ejecuta   durante   5   s.   ¿Cuál   es   el   Oempo   de   retorno   de   este   proceso?   (Despreciar   el   Oempo   de  
conmutación  de  tarea).
a) **10s
b) 14s
c) 17s
d) 23s
12. ¿Cuál  de  estas  transiciones  de  estados  de  un  proceso  jamás  se  produce  en  un  sistema  normal?
a) De  «bloqueado»  a  «preparado».
b) **De  «preparado»  a  «bloqueado».
c) De  «en  ejecución»  a  «preparado».
d) De  «en  ejecución»  a  «bloqueado».
13. ¿Cuál  de  las  siguientes  afirmaciones  es  falsa  en  un  sistema  mulOprogramado  con  un  solo  procesador?
a) Se  pueden  ejecutar  varios  procesos  concurrentemente.
b) **Se  pueden  ejecutar  varios  procesos  en  paralelo.
c) Se  pueden  tener  varios  procesos,  cada  uno  definido  según  su  bloque  de  control  de  proceso.
d) Se  pueden  tener  varios  procesos,  tantos  como  indique  el  grado  de  mulOprogramación.
14. Se  Oenen  dos  procesos:  P1  y  P2,  de  Oempos  de  ejecución  25  y  30  ms,  respecOvamente.  El  planificador  a  
corto  plazo  actúa  según  el  algoritmo  Round  Robin   con  cuanto  de  10  ms.  ¿Cuál  será  el  Oempo  medio  de  
retorno  de  P1  y  P2,  considerando  que  P1  está  en  el  primer  lugar  de  la  cola?
a) 45  ms
b) **50  ms
c) 65  ms
d) 80  ms
Sistemas Operativos – convocatoria extraordinaria, 7 de julio de 2011 pág. 3/5

15. El  planificador  de  medio  plazo  o  nivel  medio  selecciona  un  proceso:
a) De  entre  los  recién  llegados  para  pasar  a  la  cola  de  preparados.
b) De  entre  los  de  la  cola  de  preparados  para  pasar  a  ejecución.
c) De  entre  los  suspendidos  en  memoria  principal  para  pasar  a  la  cola  de  preparados.
d) **De  entre  los  suspendidos  en  memoria  secundaria  para  pasar  a  la  cola  de  preparados.

2 (2  puntos)  Responda  a  las  siguientes  cuesOones  sobre  gesOón  de  memoria.  UOlice  únicamente  el  
espacio  dispuesto  para  ello.
a.  Se  dispone  de  un  sistema  operaOvo  mulOtarea  con  gesOón  de  memoria  virtual  formada  por  la  
combinación  de  la  segmentación  y  la  paginación.  Si  el  tamaño  de  página  es  de  4Kb,  el  número  de  
marcos   de   página   direccionables   por   un   proceso   es   4096   y   el   número   de   segmentos   disOntos  
direccionables  es  256,  indique  la  estructura  de  la  dirección  lógica.
Número de segmento Número de página Desplazamiento
8 bits 12 bits 12 bits

b.  Dada  la  siguiente  cadena  de  referencias  a  páginas:  7,  0,  2,  0,  3,  4,  1,  2,  3,  4,  0,  1,  2,  5,  0,  7,  3,  0,  2.    
¿Cuántos   fallos  se  tendrían  al   aplicar  la  políOca   de  la   segunda  oportunidad  si  disponemos   de  cuatro  
marcos  de  página?

13

c.  La   políOca   de   gesOón   de   memoria   de   un   cierto   sistema   es   del   Opo   «paginación   por   demanda».   El  
tamaño   de   una   página   es   de   1   Kbyte,  el   tamaño   máximo   de   la  memoria   virtual   es  de   4  Mbytes   y   el  
tamaño  de  la  memoria  >sica  es  de  1  Mbyte.  
¿Cuántos  bits  necesita  como  mínimo  una  dirección  >sica?  20
¿Cuántos  marcos  de  página  hay  en  este  sistema?  1024
¿Cuántos  bits  de  la  dirección  >sica  se  emplean  para  el  desplazamiento  dentro  de  la  página?  10

d.  ¿Verdadero   o   falso?  Con   una   políOca   de   asignación   conOgua   del   espacio   de   los   procesos   y  
parOciones  fijas:
[  V  ]  Se  Oene  mas  fragmentación  interna  que  en  una  políOca  de  parOciones  variables.
[  F  ]  Todas  las  parOciones  tendrán  siempre  el  mismo  grado  de  ocupación
[  F  ]  Se  necesita  implementar  un  mecanismo  de  compactación  para  tener  un  sistema  eficiente
[  F  ]  Únicamente  se  podrá  implementar  si  se  Oene  reubicación  dinámica
Sistemas Operativos – convocatoria extraordinaria, 7 de julio de 2011 pág. 4/5

3 (2  puntos)  Tienes  que  modelar  el  comportamiento  de  un  transbordador  que  cruza  un  río,  siempre  
en  el  mismo  senOdo.  Las  personas  que  quieren  cruzar  el  río  se  esperan  en  el  pantalán  hasta  que  
aparece  el  transbordador  y  les  recoge.  El  transbordador  aparece  de  cuando  en  cuando.  Al  llegar  el  
transbordador,   recoge   a  la  gente  que  está  esperando,  y  sale   siempre  y  cuando  haya  al  menos  cinco  
personas  esperando.  De  lo  contrario,  el  transbordador  se  espera  hasta  que  se  alcance  el  cupo  de  
cinco  personas.
La  sincronización  de  las  personas  y  el  transbordador  se  quiere  realizar  con  un  monitor,  del  que  se  
hace  la  siguiente  especificación.  Tu  misión  es  implementar  el  cuerpo  y  las  operaciones  del  monitor.
monitor  Río
{
   // llega una persona para cruzar el río. Espera a que el transbordador
// llegue y salga del pantalán.
   public void cruzaPersona();

   // llega un transbordador.


// Se queda esperando si hay menos de 5 personas aguardando.
   public void llegaTransbordador();
}

Esta es una posible solución, con variables condición tipo Mesa:

Monitor  Río
{
   int  npersonas  =  0;
   Condition  personas,  transbordador;

   //  llega  una  persona  para  cruzar  el  río.  Espera  a  que  el  transbordador
   //  llegue  y  salga  del  pantalán.
   public  void  cruzaPersona()  {
       npersonas++;
       if  (  npersonas  ==  5  )  {  transbordador.signal();  }
       personas.wait();
   }

   //  llega  un  transbordador.  


   //  Se  queda  esperando  si  hay  menos  de  cinco  personas  aguardando.
   public  void  llegaTransbordador()  {
       while  (npersonas<5)  {  transbordador.wait();  }
       npersonas  =  0;
       personas.broadcast();
   }
}
Sistemas Operativos – convocatoria extraordinaria, 7 de julio de 2011 pág. 5/5

4 (2   puntos)   Responde   a   estas   preguntas   sobre   sistemas   de   archivos.   UOlice   únicamente   los  
espacios  dispuestos  para  ello.
a.  Sea  un   sistema  de  ficheros  con  asignación   de  espacio  mediante   i-­‐nodos,   donde  cada  i-­‐nodo  Oene  
10  entradas  para  acceso  directo,  3  para  acceso  indirecto  simple,  2  para  acceso  indirecto  doble  y  3  
para  acceso  indirecto  triple.  El  tamaño  de  bloque  es  de  2  Kbytes  y  el  tamaño  de  los  índices  es  de  64  
bits.  Rellena  la  siguiente  tabla  indicando  el  número  de  bloques  a  los  que  se  puede  acceder.

Tipo  de  acceso Número  de  bloques

Directo   10

Indirecto  simple 3 x 256 = 768

Indirecto  doble 2 x 2562 = 217

Indirecto  triple 3 x 2563 = 3 x 224

b.  Se  Oene  un  fichero  compuesto  por  5  registros  de  500  bytes  cada  uno.  El  fichero  está  almacenado  a  
parOr  del  bloque  1100  de  un  sistema  de  ficheros  con  asignación  de  espacio  conOgua  y  tamaño  de  
bloque  de   2  Kbytes.  Calcula  la   ubicación  exacta  del   úlOmo   registro  del   fichero,   diciendo   en  qué  
bloques  se  encuentra  y  en  qué  zonas  de  cada  uno  de  los  bloques  (p.ej.  bloque  x,  desde  el  byte  b1  
hasta  el  byte  b2,  ambos  incluidos).  Considera  que  el  primer  byte  de  un  bloque  es  el  byte  número  0.
El último registro comienza en el bloque 1100, desde el byte 2000 hasta el 2047, ambos
incluidos; y continúa en el bloque 1101, desde el byte 0 hasta el 451, ambos incluidos.

c.  Responde   a   la  misma   pregunta   del  apartado   anterior,  pero   considerando   que   ahora  el   fichero   se  
encuentra  almacenado  en  un  sistema  de  archivos  de  asignación  enlazada,  con  enlaces  de  32  bits  y  
sabiendo   que   el   primer   bloque   de  datos  que   se   asignó   al  fichero  fue   el   3100  y   que,   al   crecer  por   el  
final,  se  le  asignó  el  bloque  125.
La respuesta depende de dónde se ubican en este sistema los enlaces, ej. al principio de los
bloques o al final.
Si los enlaces van al principio del bloque, la respuesta sería: comienza en el bloque 3100, desde
el byte 2004 hasta el 2047; y continúa en el bloque 125, desde el byte 4 hasta el 459.
Si los enlaces van al final del bloque, la respuesta sería: comienza en el bloque 3100, desde el
byte 2000 hasta el 2043; y continúa en el bloque 125, desde el byte 0 hasta el 455.
Calificación

1
2
3
FUNDAMENTOS SISTEMAS OPERATIVOS (GI)
Convocatoria extraordinaria, 22 de julio de 2011 4

Nombre Titulación
SOLUCIONES
Dispone de tres horas para realizar el examen.
Para superar el examen es necesario tener una puntuación igual o superior a 1,7 en la pregunta 1.
Solo se corregirán las respuestas incluidas en el enunciado del examen en el espacio reservado para ello. Esto no se
aplica a la pregunta 4, cuya respuesta se debe adjuntar en un folio al enunciado entregado. Las justificaciones a las
respuestas de las preguntas 2 y 3 deben adjuntarse obligatoriamente al examen.
PARTE BÁSICA
1 (2,5
puntos) Responda a las siguientes cuestiones en el espacio reservado para ello.
1.- Gracias al uso de interrupciones, los dispositivos pueden avisar al sistema operativo de que
algo ha ocurrido mientras el procesador ejecuta cualquier tarea.

2.- Un búfer es un área de memoria principal para guardar datos durante transferencias de
entrada o salida.

3.- Con la técnica del spooling se utiliza el disco como un enorme búfer.

4.- La multiprogramación permite que varios programas residan en memoria principal al mismo
tiempo.

5.- Las excepciones son un tipo de interrupciones donde el causante es el propio sistema
operativo para, por ejemplo, registrar una división por cero, una violación en los límites de
memoria, etc.

6.- Las llamadas al sistema son un tipo de interrupciones de software que se producen cuando un
programa quiere utilizar un recurso del sistema.

7.- Con el fin de liberar a la CPU de trabajo, se ha desarrollado una técnica para los dispositivos
de entrada/salida orientados a transferencia por bloques, como los discos, que consiste en hacer
que los dispositivos puedan acceder directamente a memoria principal sin intervención de la
CPU. Esto es lo que se conoce como DMA o acceso directo a memoria.

8.- En el repertorio de instrucciones de la CPU se define un subconjunto de instrucciones


privilegiadas aquellas que tienen que ver con el manejo de la E/S, CPU o memoria del sistema.

9.- [ V | F ] Todo sistema operativo multiprogramado es de tiempo compartido y viceversa.

10.- [ V | F ] No es posible hablar de un sistema monotarea que sea de tiempo real.

11.- El tiempo transcurrido desde que un programa se presenta en el sistema para su ejecución
hasta que la finaliza se denomina tiempo de retorno.

12.- La estructura de datos del sistema operativo que almacena el estado de un proceso se llama
BCP o bloque de control de proceso.

FSO – examen 20110722 - p1/5


13.- La operación de salvar el estado de un proceso y restaurar el estado de otro para que siga
ejecutándose se denomina cambio de contexto.

14.- En el sistema operativo, una unidad de ejecución más elemental que el proceso es el hilo o
proceso ligero.

15.- El tiempo total que un proceso permanece en la cola de procesos listos se denomina tiempo
de espera.

16.- La construcción lingüística de alto nivel que consiste en un tipo abstracto de datos y que
además por definición garantiza la exclusión mutua en todos sus métodos o funciones miembro
se denomina monitor.

17.- Las políticas de planificación en las que es posible desalojar al proceso que está haciendo uso
de la CPU se denominan políticas expulsivas

18.- El planificador que decide si se debe desalojar un proceso de la memoria principal debido a
que el sistema está sobrecargado se denomina planificador de medio plazo o de nivel medio.

19.- La técnica consistente en aumentar gradualmente la prioridad de un proceso para evitar su


inanición , se denomina técnica de envejecimiento.

20.- [ V | F ] En un sistema multihilo, los hilos de un mismo proceso pesado comparten el mismo
código y tienen la ventaja de que la comunicación entre ellos es sencilla usando la pila, que es
compartida.

21.- La condición que debe cumplir cualquier solución válida al problema de la sección crítica y
que establece que solo los procesos que quieren entrar en sus secciones críticas son los que
intervienen en la elección de cuál entra y que dicha elección de debe realizar en un tiempo finito,
se denomina progreso.

22.- La condición que debe cumplir cualquier solución válida al problema de la sección crítica y
que establece que, una vez que un proceso solicita entrar en su sección crítica, a este no se le
postergará indefinidamente su entrada, se denomina espera limitada.

23.- La herramienta de sincronización variable condición posee entre sus operaciones una que
provoca el bloqueo incondicional del proceso que la invoca.

24.- La condición que debe cumplir cualquier solución válida al problema de la sección crítica y
que establece que solo un proceso puede estar ejecutándose en su sección crítica se denomina
exclusión mutua.

25.- Cuando una operación signal sobre una variable condición despierta a un proceso
bloqueado por haber realizado una operación wait sobre la variable condición y a su vez
bloquea al proceso que invoca dicha operación signal, entonces estamos ante una variable
condición que funciona según el estilo Hoare.

FSO – examen 20110722 - p2/5


2 (2,5
puntos) Responde a estas preguntas sobre sistemas de archivos. Utilice únicamente los
espacios dispuestos para ello.
a. Sea un sistema de ficheros con gestión de espacio enlazada que usa FAT. Dadas las siguientes
entradas de directorio y FAT:
Directorio
Nombre del fichero Primer bloque Último bloque
f1.txt 3 7
f2.txt 2 4

FAT
No. de entrada 0 1 2 3 4 5 6 7
No. de bloque 1 7 0 /
Nota: el símbolo / se usa en la FAT para indicar puntero nulo

1) Considerando que ya hay una copia de la FAT cargada en memoria y que la


información dada sobre el directorio se encuentra igualmente en memoria ¿cuántos
accesos a disco hay que realizar para leer el fichero f1.txt completo teniendo en cuenta
que en cada acceso es posible leer un bloque entero?
4

2) Rellena la parte de la FAT correspondiente al fichero f2.txt, sabiendo que si lo


recorremos secuencialmente accederemos a los bloques de disco 2, 5 y 4
sucesivamente
FAT
No. de entrada 0 1 2 3 4 5 6 7
No. de bloque 1 7 5 0 / 4 /

3) Si el tamaño de bloque es de 2Kbytes, ¿cuál es el tamaño máximo que podría tener el


fichero f1.txt en su estado actual? ¿y el mínimo?
Maxímo: 4*2048 bytes, Mínimo: 3* 2048 +1 bytes

b. Sea un sistema de ficheros con gestión de espacio enlazada, bloques de 512 bytes y enlaces de
32 bits:
1) En cada bloque ¿qué porcentaje de espacio se usa para los datos de usuario?

100*(512-4)/512 = 99,21865%

2) En un fichero de 10 Kilobytes, ¿cuántos bytes se desperdician debido a la


fragmentación interna?

21*508 – 10240 = 428 bytes

3) ¿y debido a la fragmentación externa?

Ninguno, no hay fragmentación externa en este tipo de gestión de espacio


FSO – examen 20110722 - p3/5


3 (2,5
 puntos) Responda a las siguientes cuestiones sobre gestión de memoria. Utilice
únicamente el espacio dispuesto para ello.
a. Se dispone de un sistema operativo multitarea con gestión de memoria virtual formada por la
combinación de la segmentación y la paginación. Si el tamaño de página es de 1Kb, el número
de segmentos distintos direccionables es 512 y el tamaño máximo de los segmentos es de
1Mb, indique la estructura de la dirección lógica.
Segmento: 9 bits Página: 10 bits Desplazamiento: 10 bits
b. Dada la siguiente cadena de referencias a páginas: 8, 1, 3, 1, 4, 5, 2, 3, 4, 5, 1, 2, 3, 6, 1, 8, 4, 1,
3. ¿Cuántos fallos se tendrían al aplicar la política de la segunda oportunidad si disponemos
de tres marcos de página?
17
c. La política de gestión de memoria de un cierto sistema es del tipo «paginación por demanda».
El tamaño máximo de la memoria virtual es de 8 Mbytes. La memoria física consta de
262.144 páginas y tiene un tamaño total de 1 Gbyte. Indique la estructura de una dirección
física.
Página: 18 bits Deslazamiento: 12 btis
d. ¿Verdadero o falso? Con una política de asignación contigua del espacio de los procesos y
particiones variables:
[ V | F ] Se tiene mas fragmentación interna que en una política de particiones fijas.
[ V | F ] Se tiene mas fragmentación externa que interna
[ V | F ] Solo es posible implementarlo si se implementa un mecanismo de compactación
[ V | F ] Si se implementa junto con un mecanismo de compactación disminuye el efecto
negativo de la fragmentación externa aunque se penaliza el rendimiento del sistema por el
tiempo requerido para llevar a cabo dicha tarea

4 (2,5
puntos) El siguiente algoritmo es una solución clásica al problema del búfer finito, que
utiliza semáforos generales para la sincronización. En el sistema hay múltiples procesos
productores que invocan repetidamente a la función produce(); también hay varios procesos
consumidores que invocan repetidamente a consume().

//
Variables
compartidas
…
un
búfer
con
N
elementos
Semáforo
huecos
=
N;
Semáforo
llenos
=

0;
Semáforo
mutex
=
1;


1. //
Rutina
del
productor
 10. //
Rutina
del
consumidor



2. void
produce
(
Cosa
ítem
)
 11. Cosa
consume
()

3. {
 12. {

4. 

P(huecos)
 13. 

P(llenos)

5. 

P(mutex)
 14. 

P(mutex)

6. 

…
inserta
el
ítem
en
el
 15. 

…
extrae
un
ítem
del
búfer
y
lo
pone

búfer
…
 en
“ítem”
...

7. 

V(mutex)
 16. 

V(mutex)

8. 

V(llenos)
 17. 

V(huecos)

9. }
 18. 

return
ítem;

19. }


En un momento dado, ocurre que uno de los procesos productores aborta justo antes de
ejecutarse la línea 6 del código fuente. ¿Qué consecuencias tendría eso en la ejecución del
sistema? ¿Seguiría ejecutándose el resto del sistema con normalidad? ¿Habría algún problema?
¿Por qué?
Responda a esas mismas preguntas considerando estos otros tres casos: que el proceso aborta
justo antes de ejecutar la línea 5; justo antes de la línea 7; y justo antes de la línea 8.

FSO – examen 20110722 - p4/5


Solución:

Proceso productor que aborta justo antes de la línea 6


Si esto ocurre, el semáforo «mutex» se queda con el valor cero, ya que el proceso abortado
acababa de apropiarse de él en la línea 5. La consecuencia es que cualquier otro proceso
que pretenda producir o consumir acabará bloqueado (en la línea 5 o en la línea 14). Por
tanto no se podrá realizar ninguna operación más sobre el búfer y todos los procesos que lo
intenten quedarán bloqueados.

Proceso que aborta justo antes de la línea 5


En este caso, el sistema podrá continuar funcionando, aunque como se ha ejecutado la
línea 4, se habrá consumido un crédito para producir, sin que realmente se haya insertado
nada en el búfer. La consecuencia es que el búfer funcionará a partir de ese momento como
si tuviera N-1 celdas: aparentará estar lleno incluso si queda un hueco libre.

Proceso que aborta justo antes de la línea 7


Las consecuencias son las mismas que haber abortado en la línea 6, ya que el proceso
aborta con el semáforo «mutex» a cero.

Proceso que aborta justo antes de la línea 8


En este caso, el productor ha podido insertar correctamente el elemento en el búfer, pero le
ha faltado señalizar a los consumidores a través del semáforo «llenos». Hay un elemento
nuevo en el búfer, pero no es reconocido por los consumidores. La consecuencia es que, en
lo sucesivo, cuando haya un único elemento en el búfer, los consumidores que vayan
llegando se quedarán bloqueados, pues el semáforo «llenos» valdrá cero en ese caso.
Salvo este problema, el sistema podrá seguir funcionando.

FSO – examen 20110722 - p5/5


Calificación

1
2
Fac. de Informática / Escuela Univ. Informática
3
SISTEMAS OPERATIVOS
Examen Parcial 4
9 de mayo de 2009

Nombre Titulación
*** S O L U C I O N E S ***
Dispone de tres horas para realizar el examen
1 (2.5 puntos) Comentar la validez de la siguiente solución al problema de la sección crítica para dos
procesos:
Variables compartidas
Int n1=0, n2=0;
process P1() { process P2() {
while (true) { while (true) {
//Sección no crítica //Sección no crítica
n1:=1; n2:=1;
n1:=n2+1; n2:=n1+1;
while(n2<>0) and (n2<n1) do null; while (n1<>0) and (n1<=n2) do null;
//Sección Crítica1; //Sección Crítica2;
n1:=0; n2:=0;
//Sección no crítica //Sección no crítica
} }
} }

Para demostrar que se trata de una solución válida al problema de la sección crítica vamos
a comprobar que se cumplen las propiedades de exclusión mutua, progreso y espera
limitada. Antes de ver cada una de estas tres propiedades conviene resaltar si analizamos el
preprotocolo y postprotocolo de ambos procesos que cada uno de ellos antes de entrar en la
sección crítica, inicializa una variable entera (n1 para P1 y n2 para P2) a 1. Estas variables
funcionan como indicadores a través de los cuales, cuando tienen un valor mayor que cero,
indican la intención de cada proceso de intentar acceder a la sección crítica. La intención de
entrar de cada proceso se manifiesta inicializando su correspondiente bandera a 1, para a
continuación asignarle el valor inmediatamente superior al del proceso opuesto. Dicho de
otra forma, cada proceso coge número antes de entrar, siendo este número el siguiente al
que tiene el proceso opuesto. En definitiva se trata de una versión del algoritmo de la
panadería para dos procesos.
- Exclusión mutua: veamos por ejemplo que ocurre si el proceso P1 accede a la sección
crítica y a continuación el proceso 2 realiza un intento de entrada. Si P1 ejecuta el
preprotocolo de la sección crítica, la variable n1 toma el valor 1 (asumiendo que n2 vale
0 al no haber ejecutado éste el preprotocolo). El proceso P1 rebasaría el bucle “while” ya
que cuando n2 vale 0 se entiende que el proceso P2 no tiene intención de entrar en la
sección crítica y por tanto no hay problema para la entrada del proceso P1. Si estando
P1 en SC el proceso P2 ejecuta el preprotocolo de entrada a la SC, vemos como n2
toma el valor 2 y por tanto el proceso 2 quedaría iterando en el bucle “while” de su
preprotocolo ya que su número es mayor que el del proceso P1 (n2>=n1) y n1 es distinto
de cero (n1<>0). Lo mismo ocurriría exactamente si entra en sección crítica P2 y fuera el
proceso P1 el que intentara entrar en SC.
- Progreso: Se puede ver claramente que si un proceso ejecuta el preprotocolo que para
entrar en SC y el otro proceso está en su sección NO crítica, su bandera sería 0 y ello no
impediría la entrada del proceso que tiene intención de ejecutar la SC. Por tanto la
decisión de entrar en la sección crítica depende exclusivamente de aquellos que quieren
entrar. Si ambos intentaran acceder a la SC concurrentemente y ejecutaran el
preprotocolo, la decisión de quien entra se toma en un tiempo finito dado que aunque los
dos podrían tener el mismo número (igual valor en n1 y n2), las condiciones del bucle
con diferentes: “n2<n1” en el proceso P1 y “n1<=n2” en el proceso P2 y por tanto en ese
caso entraría primero el proceso P1 y a continuación P2.
- Espera limitada: Si ambos procesos en un momento determinado manifiestan intención
de entrar y toman el mismo número, entrará primero el proceso P1 y después aunque
este intente acceder nuevamente a la SC, esperará a que entre P2 ya que tomaría un
número mayor del que dispone el proceso P2.

Por tanto, podemos decir que la solución planteada verifica las tres propiedades y se trata
de una solución por software válida al problema de la sección crítica para dos procesos.

2 (2.5 puntos) Una empresa de logística quiere llevar a cabo un control sistemático de su nave
en la que se almacenan los productos que distribuye. La nave se debe gestionar de la siguiente
manera:
• En la nave se almacenan existencias de un solo producto.
• A la nave acceden vehículos de proveedores y vehículos de compradores. Los vehículos
proveedores solicitan el depósito de la mercancía mediante la función
Solicito_Almacen(cantidad). Los vehículos clientes solicitan retirar un pedido
mediante la función Solicito_Pedido(cantidad). Siendo Cantidad un valor entero
positivo que especifica el número de unidades a depositar o retirar.
• Para que un vehículo proveedor pueda depositar su carga debe haber capacidad en el
almacén para recoger toda su carga. Si no hay capacidad suficiente, entonces el vehículo
debe quedar a la espera hasta que la haya.
• Para que un vehículo cliente pueda retirar su pedido en la nave debe haber existencias
para atender a la totalidad de su pedido. Si no hay existencias suficientes, entonces debe
esperar hasta que las haya.

Se pide que implemente las funciones Solicito_Almacen(cantidad)y


Solicito_Pedido(cantidad) empleando semáforos como herramienta de sincronización.
La solución que se muestra a continuación es uno de los muchos algoritmos posibles y no pretende ser la solución
más eficiente. Se trata de una propuesta que cumple los requisitos indicados en el enunciado. En el código
propuesto se ha supuesto que el almacén está inicialmente vacío siendo “N” la capacidad total del mismo.
Variables compartidas
Int Stock_Artículos = 0;
Int Huecos_Artículos = N;
Int proveedores_bloqueado=0;
Int compardores_bloqueados=0;
Semáforo bloqueo_proveedor ; // Valor inicial a 0
Semáforo bloqueo_comprador; // Valor inicial a 0
Semáforo mutex; // Valor inicial 1

Solicito_Alamcen( int cantidad ){ Solicito_Pedido(int cantidad) {


P(mutex); P(mutex);
while ( Huecos_Artículos < cantidad ) { while ( Stock_Artículos < cantidad ) {
Proveedores_bloqueados++; Compradores_bloqueados++;
V(mutex); V(mutex);
P(bloqueo_proveedor); P(bloqueo_comprador);
P(mutex); P(mutex);
} }
Stock_Artículos += cantidad; Stock_Artículos -= cantidad;
Huecos_Artículos -= cantidad; Huecos_Artículos + = cantidad;
while ( compradores_bloqueados > 0) { while ( proveedores_bloqueados > 0 ) {
V(bloqueo_comprador); V(bloqueo_proveedor);
Compradores_bloqueados--; Proveedores_bloqueados--;
} }
V(mutex); V(mutex);
} }

3 (2.5 puntos) Contestar brevemente a las siguientes cuestiones:


a) ¿Sería viable un sistema multiprogramado sin el uso de las interrupciones? (0.5p)
Si un sistema no posee interrupciones, entonces la detección de todos aquellos eventos
que son relevantes de cara a su funcionamiento se tendría que realizar mediante la técnica
de interrogación o comprando de forma permanente el valor de las variables de estado del
sistema. Además, en muchas ocasiones, estas detecciones se realizarían dando lugar a
situaciones de espera activa. Por tanto el sistema no tendría un funcionamiento eficiente.
Como en un sistema multiprogramado el manejo de eventos juega un papel crítico en su
eficiencia, entonces un sistema de este tipo sin interrupciones no sería viable debido a que
no tendría un rendimiento aceptable.

b) Estamos desarrollando un intérprete de órdenes o shell. Necesitamos escribir el código que


lanza el programa que el usuario le encarga ejecutar al shell. Para ello podemos elegir entre
lanzar un nuevo hilo, o bien lanzar un nuevo proceso pesado. ¿Cuál de las dos opciones le
parece más adecuada? (0.5p)
La opción correcta sería lanzar un nuevo proceso pesado, debido a que en general el
programa a ejecutar nada tendría en común (código y datos) con respecto a la unidad de
ejecución que lo crea. Por tanto, la facilidad para compartir datos y código, característica de
los hilos, no tendría sentido en esta situación.
c) En un sistema multiprocesador, para planificar procesos podemos, bien utilizar una única cola
de preparados compartida por todos los procesadores, o bien que cada procesador disponga
de su propia cola de preparados. ¿Qué ventajas e inconvenientes tiene cada una de estas dos
técnicas? En un ordenador tipo PC, ¿qué sistema escogería usted? (0.5p)
Si cada procesador dispone de su propia cola de preparados, debemos gestionar el
problema de que pueden darse desequilibrios en la carga de trabajo: un procesador podría
llegar a quedarse ocioso, sin procesos en cola, mientras que otro podría seguir cargado.
Este problema no ocurriría con una cola única, ya que cada vez que un procesador quedara
libre, tomaría uno de los procesos de la cola única y por tanto no se daría la situación de
tener a un procesador más cargado de trabajo que otro.
Por otra parte, el esquema de la cola única tiene el inconveniente de que se trata de un
recurso compartido por todos los procesadores y hay que controlar el acceso simultáneo a la
estructura, para evitar que se corrompa o que ocurran usos indebidos (p.ej. que varios
procesadores decidan ejecutar el mismo proceso). Este inconveniente es tanto más grave
cuanto mayor sea el número de procesadores del sistema y más frecuentes sean los
cambios de contexto.

En un PC multiprocesador y con la tecnología actual tenemos pocos procesadores (dos,


cuatro, a lo sumo ocho), así que probablemente el uso de una cola única es más eficiente,
ya que no hay demasiada competencia por la cola.

d) ¿Qué aporta la instrucción test-and-set para solucionar el problema de la sección crítica?


(0.5p)
La instrucción test-and-set permite realizar de forma atómica dos acciones sobre una
variable: recuperar su valor original y modificarlo. Gracias a la indivisibilidad de estas dos
acciones, podemos construir un algoritmo sencillo de entrada a la sección crítica en el que
utilizamos un indicador booleano global para marcar si la sección crítica está ocupada.
Como muestra, veamos este algoritmo de sección crítica que usa test_and_set:

a1. // variable global


a2. bool SC_Ocupada = false;
a3. while ( test_and_set (&SC_Ocupada) ) {}
a4. ... sección crítica ...
a5. SC_Ocupada = false;

El código anterior es equivalente algorítmicamente a este otro:


b1. // variable global
b2. bool SC_Ocupada = false;
b3. while ( SC_Ocupada ) {}
b4. SC_Ocupada = true;
b5. ... sección crítica ...
b6. SC_Ocupada = false;

La diferencia es que en el último ejemplo, las líneas b3 y b4 constituyen una sección crítica
que no está controlada y permite que varios procesos observen al mismo tiempo que la
variable SC_Ocupada está a false (línea b3) y por tanto escapen todos del bucle de espera
y entren simultáneamente en la sección crítica. En el código de ejemplo con test_and_set, la
evaluación y manipulación de SC_Ocupada ocurre en un solo paso indivisible (línea a3). Por
tanto, ante una multitud de procesos que quieran entrar en sección crítica estando
SC_Ocupada a false, sólo uno de ellos se la encontrará con ese valor y podrá escapar del
bucle.
Por tanto, la utilización de test_and_set permite simplificar el diseño de algoritmos que
regulan el acceso a secciones críticas, y ahorrarnos el esfuerzo de construir algoritmos
complejos de entender, ejecutar y mantener.

e) Se considera un algoritmo de planificación del tipo Round Robin de quantum q. ¿Puede


afirmarse entonces que todo proceso de la cola de preparados disfrutará de q unidades de
tiempo el recurso CPU? Asimismo, ¿puede ocurrir que un proceso llegue a utilizar la CPU n
unidades de tiempo sin interrupción, siendo n>q? (0.5p)
Realmente, no es correcta del todo la afirmación, o al menos no podemos asegurar que
siempre ocurra. Pueden darse los siguientes casos:
a) Que disfrute exactamente q instantes de tiempo de CPU.
b) Que disfrute menos de q instantes de tiempo debido a que el proceso finaliza antes de
finalizar su quantum asignado o se bloquea esperando por algún evento, por ejemplo,
una operación de entrada salida o una operación P sobre un semáforo cuyo valor es
cero.
c) Que disfrute más de q instantes de tiempo debido a que el proceso no ha finalizado aún y
que no hayan más procesos en la cola de preparados.
Luego, debido a la razón c) del apartado anterior, sí que puede ocurrir que un proceso
disfrute más de un número q de instantes de tiempo de CPU.

4 (2.5 puntos) Sea un algoritmo de planificación multicolas con realimentación donde la


primera cola (cola 0) se gestiona con un Round-Robin de cuanto q=1, y la segunda cola (cola 1)
se gestiona con un algoritmo SRTF. La planificación entre colas es del tipo prioridades expulsiva,
siendo la cola más prioritaria la 0. Un proceso pasará de la cola 0 a la 1 cuando se agote su cuanto
q sin finalizar su ejecución. Los procesos nuevos, y los procedentes del estado SUSPENDIDO,
entran por la cola 0. Suponiendo que el sistema operativo no consume tiempo y que las
operaciones de E/S se efectúan sobre el mismo dispositivo (gestionado de forma FCFS), se pide
obtener el diagrama de Gantt y los tiempos medio de retorno y espera al aplicar la siguiente carga
de trabajo:

Tiempo de Duración ráfaga de procesador y


Proceso llegada entrada/salida
A 0 4(CPU) + 2(E/S)+ 1(CPU)
B 2 2(CPU) + 1(E/S) + 2(CPU)
C 3 1(CPU) + 1(E/S) + 3(CPU)

1)Diagrama de Gantt

A B C

↓ ↓ ↓
tiempo 1 2 3 4 5 6 7 8 9 10 11 12 13
CPU A A B C B C B B A A C C A
Cola 0 A* B* C* C* B* A*
Cola 1 A* A2 B1,A2 B,*A2 A2 C2A2 B1*C2A2 C2A2* C2*
E/S - - - - C B - - - - A A -

El * representa el proceso que está en CPU, dentro de cada clase/cola.

2) Tiempo medio de espera


Tiempos de Espera
A 8-2 = 6
B 4-3 =1
C 10-6=4
Tiempos Medios (6+1+4)/3 = 3,67

3) Tiempo medio de retorno

Tiempos de Retorno
A 13-0=13
B 8-2=6
C 12-3=9
Tiempos Medios (13+6+9)/3=9,33
Calificación

1
2

SISTEMAS OPERATIVOS - PRIMERA PARTE


Examen Convocatoria Ordinaria, 18 de junio de 2009

Nombre Titulación

Dispone de dos horas para realizar el examen


SOLUCIONES
1 (7,5 puntos) Test. En cada uno de los siguientes apartados, señale cuál opción es
correcta. En caso de que existan varias opciones ciertas, se considerará como correcta
la más completa o precisa. Las preguntas no contestadas no puntúan; las contestadas
erróneamente puntúan negativamente restando un tercio de su valor. Señale sus
respuestas rodeando con un círculo la opción correcta. Si se equivoca, tache la
respuesta incorrecta y rodee la opción que considere correcta. Escriba con tinta. Las
preguntas respondidas con lápiz o con varios círculos no tachados se considerarán no
contestadas.

1. ¿Con cuál de las siguientes afirmaciones te quedarías?


a) Un sistema distribuido es un sistema multiprocesador, al que se suele hacer referencia
también como sistema débilmente acoplado.
b) Hablar de un sistema que emplea multiprocesamiento simétrico es equivalente a hablar de
un sistema paralelo en el que todos los procesadores son iguales y no existen unos
procesadores principales y otros subordinados.
c) En un sistema de tiempo real crítico existen eventos a los que es necesario responder en
un plazo límite por lo que no suelen soportar memoria virtual.
d) Todas las anteriores son ciertas.

2. ¿Con cuál de las siguientes afirmaciones te quedarías?


a) Las llamadas al sistema y las excepciones funcionan como interrupciones del
software: se gestionan igual que las interrupciones del hardware pero las provoca la
propia CPU.
b) Las llamadas al sistema se realizan mediante una instrucción especial que depende del
procesador y que sirve para que el sistema operativo cambie de modo supervisor a modo
usuario.
c) Si programamos en un lenguaje de alto nivel, generalmente nunca empleamos llamadas al
sistema que sólo son necesarias cuando programamos en un lenguaje de bajo nivel.
d) En el caso particular del Nachos, las llamadas al sistema se tratan como un caso particular
de excepción y se sabe el tipo de llamada al sistema a través del contenido del registro R4.

SO – examen 18620099 – segunda parte – pag. 1/5


3. ¿Cuál de las siguientes afirmaciones es verdadera en un sistema multiprogramado con
una única CPU?
a) Se pueden ejecutar N procesos concurrentemente y por tanto en un instante dado se
pueden estar ejecutando instrucciones de un proceso A y otro B.
b) Se trata de un sistema de tiempo compartido y por tanto se pueden ejecutar N procesos
concurrentemente.
c) Si la política de planificación fuera FIFO no hablaríamos de un sistema multiprogramado.
d) Podría ser un sistema multiprogramado y de tiempo compartido pero
monousuario.

4. ¿Con cuál de las siguientes afirmaciones te quedarías?


a) El intérprete de órdenes es un programa del sistema que permite a los programadores
realizar llamadas al sistema directamente.
b) El sistema operativo ofrece una gama de servicios a los procesos. A estos servicios se
accede a través de las excepciones.
c) Los programas del sistema constituyen la interfaz del intérprete de órdenes con el sistema
operativo y por ello siempre forman parte del núcleo del sistema operativo y son estos
programas los que realizan en última instancia las llamadas al sistema.
d) Todas las afirmaciones anteriores son falsas.

5. Con el concepto de “independencia de dispositivo” nos referimos a:


a) La construcción de dispositivos que sirvan para distintas máquinas.
b) Los dispositivos deberían tener independencia de los procesos de usuario.
c) La abstracción que algunos sistemas realizan del sistema de E/S.
d) Todas las anteriores son ciertas.

6. ¿Cuál de los siguientes mecanismos es prescindible si se desea implementar una política


de gestión de CPU de tipo Round-Robin?
a) Interrupciones.
b) Política de envejecimiento.
c) Temporizador (timer).
d) Planificador de CPU.

7. De los siguientes elementos, cuál no forman parte del bloque de control de procesos ni se
almacena nunca en él:
a) Contador de programa.
b) Identificador del proceso (PID).
c) Gestor de interrupciones.
d) Datos del contexto (registros de la CPU, puntero de pila, ...).

8. El despachador (dispatcher) de un sistema operativo se encarga de:


a) Planificar la CPU.
b) Gestionar las prioridades entre procesos.
c) Realizar los cambios de contexto.
d) Interrumpir la E/S cuando se produce una excepción.

9. El uso de hilos en un sistema operativo:


a) Agiliza los cambios de contexto pero dificulta la comunicación entre procesos pesados.
b) Permite la comunicación entre hilos del mismo proceso pesado, pero penaliza los cambios
de contexto entre hilos del mismo padre.
c) Impide el uso de paso de mensajes.
d) Facilita la programación de aplicaciones concurrentes cooperativas y agiliza los
cambios de contexto entre hilos del mismo proceso pesado.

SO – examen 18062009 – segunda parte – pag. 2/5


10. La empresa “Aguas Bóricas de Canarias, S.A.” te contrata para que diseñes un sistema
operativo para una computadora que controla en tiempo real una planta industrial
potabilizadora de agua. ¿Cuál de las siguientes magnitudes te preocuparías de mantener
siempre acotada?
a) Grado de multiprogramación del sistema.
b) Tiempo de respuesta.
c) Tiempo de retorno.
d) Utilización de la CPU.

11. Un proceso ejecuta una operación P sobre un semáforo y se queda bloqueado sin
finalizar la operación. ¿Qué conclusión podemos sacar?
a) El semáforo tenía valor cero en el momento de realizar la operación.
b) El semáforo tenía valor uno en el momento de realizar la operación.
c) El semáforo tenía un valor no nulo en el momento de realizar la operación.
d) No podemos concluir nada, ya que depende de si el semáforo está implementado con
espera activa o con colas de espera.

12. Un semáforo binario


a) Cuando se construye, está inicializado a uno.
b) Puede dejar bloqueado al proceso que realiza una operación SIGNAL, si el valor actual es
uno.
c) Sólo admite dos posibles valores.
d) Todas las anteriores son ciertas.

13. La operación BROADCAST de una variable condición


a) No puede implementarse correctamente si se adopta una semántica Mesa.
b) Asociado desbloquea a todos los procesos que esperan por entrar en el monitor.
c) Libera el cerrojo al monitor hasta que el proceso que realiza la llamada se desbloquea.
d) Desbloquea a todos los procesos que esperan en la variable condición.
 
14. Los monitores
a) Son semáforos binarios más variables de condición que se emplean para planificar la
ejecución de procesos concurrentes.
b) Son tipos abstractos de datos que aseguran la exclusión mutua en la ejecución
concurrente de sus operaciones.
c) Son colas de espera que garantizan la no inanición de los procesos que se encolan en ellas.
d) Son instrucciones atómicas con las que se pueden construir soluciones eficaces para el
problema de la sección crítica.

15. Cuando un algoritmo de sección crítica cumple con la condición de progreso, implica
que:
a) Se cumple también la condición de exclusión mutua.
b) Ningún proceso ve postergada continuamente su entrada en la sección crítica.
c) Si varios procesos solicitan entrar en la sección crítica estando esta libre, el sistema
deja entrar a uno de ellos en un tiempo finito.
d) Como mucho puede haber un proceso ejecutando código de sección crítica.
SO – examen 18062009 – segunda parte – pag. 3/5
2 (2,5 puntos, todas puntúan lo mismo) Responda a las siguientes cuestiones:

A. Explicar brevemente en qué consiste la implementación jerárquica de un sistema


operativo. Enumerar las capas o niveles que la componen. Dar un ejemplo de
sistema operativo que se ajusta a dicha implementación.
La implementación jerárquica de un sistema operativo está basada en el diseño modular y
consiste en tener, además de un kernel o núcleo, una serie de capas o niveles:

Cada nivel proporciona primitivas (operaciones) y objetos, de forma que los niveles no utilizan el
hardware directamente, sino las primitivas y objetos del nivel inferior.

B. Describir brevemente, y de la manera más general posible, en qué consiste el


problema de inanición de procesos en el algoritmo de planificación del
planificador a corto plazo. ¿En qué algoritmo aparece? ¿Cuál es la técnica que
permite atenuarlo?
Nos referimos al problema que puede producir, por ejemplo, el algoritmo de planificacion por
prioridades, en el que puede ocurrir que un proceso esté siempre esperando por CPU debido a
que los procesos que van inyectándose en la cola de preparados tienen siempre mayor prioridad
que él. Esto hace que al proceso no se le asigne CPU, sino que ha de esperar “mucho tiempo”
por dicho recurso.
Una técnica para eliminar este problema consiste en el “envejecimiento” que consiste en
incrementar la prioridad de los procesos que llevan un cierto tiempo en la cola de preparados,
demodo que éstos no esperen “eternamente” por CPU.

C. Se pretende definir un sistema operativo que gestione un vehículo submarino autónomo,


o sea un vehículo que no requiere de una persona para ser pilotado, que se utilizará para
encontrar tesoros. ¿qué tipo de servicios incluirías en el mismo? ¿qué tipo de servicios
crees que no deben incluirse? Razonar justificadamente la respuesta

Se asume que se trata de un sistema que, al no tener que interactuar con personas no requerirá
interfaces humanas y requerirá servicios que garanticen tiempos de respuesta estrictos, o sea un
sistema de tiempo real. Los sistemas de tiempo real se clasifican en críticos y no críticos. Este
vehículo va a ser manejado de forma autónoma por lo que las tareas que realice siempre
deberán cumplir plazos de terminación: si un sensor detecta un obstáculo, el vehículo deberá
RESPONDER de forma instantánea (o casi) de forma que el sistema operativo deberá ser simple
y de respuesta rápida.
Es por ello que este tipo de sistemas no deberán utilizar: manejo de archivos (o en su caso, uno
muy simple), no manejará gráficos, serán incompatibles con el tiempo compartido, pues
normalmente el proceso que esté en ejecución (navegador autónomo) requerirá toda la atención
SO – examen 18062009 – segunda parte – pag. 4/5
de la CPU. Tampoco utilizará memoria virtual por ser lenta y requerirán utilizar gran cantidad de
memoria principal que es mucho más rápida.

D. ¿Qué tipo de mecanismo utilizarías para evitar un abuso por parte de


determinados procesos de la CPU? Justificar la respuesta.

Un mecanismo perfecto para evitar abusos de CPU por parte de procesos podría ser un
temporizador, que mediante una política (por ejemplo) que utiliza un algoritmo de planificación a
corto plazo de un Round Robin, con q como quántum de tiempo, permita “desasignar” cada q
instantes de tiempo la CPU al proceso que la está utilizando. De esta forma lograremos que un
proceso, si existen más en la cola de preparados, no acapare la CPU más de q unidades de
tiempo.

E. ¿Para qué están destinados los sistemas operativos distribuidos? Indicar las
ventajas y las complicaciones de los mismos.
Los Sistemas Operativos Distribuidos son sistemas operativos diseñados para trabajar con
Sistemas Distribuidos, es decir, sistemas con múltiples procesadores conectados mediante una
red, donde varios sistemas informáticos se conectan de forma distribuida para realizar
determinadas funciones, rompiendo la barrera del espacio (los equipos no tienen por qué estar
físicamente juntos, incluso ni siquiera próximos). Estos sistemas están débilmente acoplados: los
procesadores no comparten memoria ni reloj.
Entre las ventajas de utilizar un sistema distribuido encontramos el compartir recursos dispersos.
Al no vernos limitados por el espacio aparece la posibilidad de realizar trabajo cooperativo de
equipos humanos, es decir, varios equipos de investigación situados en distintos laboratorio
pueden realizar partes de un mismo trabajo y compartir información. Así se obtiene un aumento
de velocidad y de la fiabilidad (la tolerancia a fallos es mayor al existir una alta disponibilidad de
equipos, puede suceder que una parte no funcione, y esto no afecta al trabajo que raliza el
resto).
Los sistemas distribuidos tienen varias complicaciones comparados con los sistemas
monoprocesadores, pues no comparten memoria, lo que obliga a que la comunicación sea más
compleja usándose por ejemplo mecanismos como la mensajería que son más lentos y no se
puede tener un estado global visible por todos los nodos al instante, al no tener una tabla global
de todos los sistemas, sino que cada sistema tiene únicamente información sobre sí mismo. El
uso de diferentes equipos produce una heterogeneidad de los nodos, teniendo los sistemas
informáticos distintas características hardware, distintos sistemas operativos y distinto software
de aplicaciones. Por último, otra complicación podría ser la no fiabilidad de la red utilizada como
medio de comunicación entre los nodos.

SO – examen 18062009 – segunda parte – pag. 5/5


Calificación

1
2
3

SISTEMAS OPERATIVOS - SEGUNDA PARTE


Examen Convocatoria Ordinaria, 18 de junio de 2009

Nombre Titulación

Dispone de dos horas para realizar el examen, todas las cuestiones puntúan lo
mismo
SOLUCIONES
1 Un museo tiene capacidad para albergar a N visitantes, si se alcanza ese número no
se permiten más visitante en sus instalaciones. Además dispone de D dispositivos que
reproducen explicaciones de las distintas piezas del museo. Cuando una persona desea
visitar el mueso lo solicita en la entrada, especificando además en su solicitud si desea
hacer la visita con uno de los dispositivos reproductores. Si el museo ha alcanzado su
capacidad, entonces espera en una cola de entrada. Si especifica que desea un
reproductor y éste no está disponible, entonces se queda esperando dentro del museo
en una cola; contabilizándose a la hora de verificar si el museo ha alcanzado su
capacidad máxima. A la hora de gestionar los dispositivos, estos se asignan siguiendo el
orden de llegada de las solicitudes. Desarrolle una solución al control de entrada y
salidas de visitantes del museo, así como de los dispositivos reproductores, usando
monitores.

Asumimos variables condición de tipo Hoare

Tipo museo = monitor

Variables globales
Condición: cola_entrada;
Condición: cola_reproductor;
Entera: visitantes = 0;
Entera: disp_reproductor=D; // Inicialmente hay D disponibles

/* Procedimiento Entrada; lo invocan los visitantes, si la variable


“quiero_reproductor” es verdadero, entonces indica que el visitante
quiere realizar la visita con un reproductor */
Procedimiento público Entrada( Booleana quiero_reproductor)
Si ( visitantes = N )Entonces
cola_entrada.wait
Fin si

SO – examen 18062009 – segunda parte – pag. 1/5


visitantes++;
Si ( quiero_reproductor = verdadero ) Entonces
Si ( rep_disponibles = 0 ) Entonces
cola_reproductor.wait;
Fin si
rep_disponibles--;
Fin si

Fin procedimiento Entrada

/* Procedimiento Finalizo_Visita; lo invocan los visitantes, la


variable “entrego_reproductor” si es verdadero indica que se entrega un
reproductor. Se asume que sólo entrega un reproductor quien previamente
ha cogido uno */
Procedimiento Finalizo_Visita( Booleana entrego_reproductor )
Si ( entrego_reproductor = verdadero ) Entonces
rep_disponibles++;
cola_reproductor.signal;
Fin si
visitantes--;
cola_entrada.signal;
Fin de procedimiento Finalizo_Visita

2 La política de gestión de memoria de un cierto sistema es del tipo demanda de


página. El tamaño de una página es de 1 Kbytes, el tamaño máximo de la memoria
virtual es de 4 Mbytes y el tamaño de la memoria física es de 1 Mbytes. Se pide:

A. Determinar el tamaño de cada uno de los campos de una dirección virtual y de


una dirección física.

Una dirección virtual consta de dos campos: número de página y desplazamiento en bytes
dentro de la página. El tamaño del campo número de página se deduce a partir del número de
páginas que ocupa la memoria virtual, que se calcula dividiendo el tamaño de la memoria virtual
entre el tamaño de una página:
4*210/210= 212 páginas
Luego se requieren 12 bits para distinguir entre las 212 páginas de que consta la memoria virtual.
Por otra parte, el desplazamiento corresponde al tamaño de la página 1024 bytes= 210 bytes,
luego el campo desplazamiento requiere 10 bits. Por lo tanto, los campos de una dirección virtual
poseen el siguiente tamaño:

12 bits 10 bits
Nº de página Desplazamiento

Una dirección física consta de dos campos: número de marco de página y desplazamiento en
bytes dentro del marco. Para obtener el tamaño del primer campo hay que calcular el número de
marcos de página en que se divide la memoria principal que se obtiene dividiendo la capacidad
de la memoria principal entre el tamaño de una página:
SO – examen 18062009 – segunda parte – pag. 2/5
220/210= 210 marcos de página
Luego se requieren 10 bits para distinguir entre las 210 marcos de páginas en que se divide la
memoria física. Por otra parte, el desplazamiento corresponde al tamaño del marco de página,
que es igual al de la página: 1024 bytes= 210 bytes, luego el campo desplazamiento requiere 10
bits. Por lo tanto, los campos de una dirección física poseen el siguiente tamaño:

10 bits 10 bits
Nº de marco de página Desplazamiento

B. Suponga un proceso que ocupa 8192 bytes y que tiene cargadas en memoria
principal las páginas lógicas 0 y 3 en los marcos 8 y 2 respectivamente. Dibujar
las tablas de páginas para ese proceso y calcular las direcciones físicas de las
siguientes direcciones virtuales: 3632 y 2648.

El tamaño del proceso es 8192 bytes. Como el tamaño de página es 1024 bytes, el proceso
ocupa 8 páginas. La tabla de páginas tendrá la siguiente información:

Marco de Bit de
página validez
8 1
X 0
X 0
2 1
X 0
X 0
X 0
X 0
Dirección física de la dirección lógica 3632:
La dirección lógica 3632 se corresponde con la página lógica 3, desplazamiento 560
(3632/1024). Según la tabla de página la página lógica 3 se encuentra en el marco 2, por tanto la
dirección base de este marcos es 2*1024= 2048 y la dirección física de la dirección virtual 3632
será 2048+560= 2608

Dirección física de la dirección lógica 2648:


La dirección lógica 2648 se corresponde con la página lógica 2, desplazamiento 600
(2648/1024). Según la tabla de página la página lógica 2 no se encuentra en memoria principal
por lo que se generará un fallo de página para ubicar la página lógica 2 en memoria principal. La
dirección física por tanto no es posible obtenerla con los datos del problema ya que dependerá
¡del marco donde se ubique

SO – examen 20070621 – segunda parte – pag. 3/5


C. Determinar la capacidad mínima que debe tener la tabla de páginas del proceso
de mayor tamaño que se puede ejecutar en el sistema. ¿Qué tanto por ciento de
la memoria principal ocuparía dicha tabla?

El proceso de mayor tamaño que se puede ejecutar sería aquel que ocupara toda la memoria
virtual, es decir, 4 Mbytes (212 páginas), parte de este espacio estaría dedicado a albergar
algunas estructuras de datos del SO como la propia tabla de páginas del proceso. Como la tabla
de páginas debe tener una entrada por cada página del proceso constará por tanto de 212
entradas. En un sistema con demanda de página una entrada de una tabla página debe tener
como mínimo dos campos: número de marco de página (10 bits) y bit de validez. Luego el
tamaño mínimo de una entrada es de 11 bits. Por lo tanto la capacidad mínima que debe tener la
tabla de páginas del proceso de mayor tamaño que se puede ejecutar en el sistema es

212 (entradas) * 11(bits por entrada) = 45056 bits

El tanto por ciento de la memoria principal que ocuparía esta tabla es

((212 * 11)/ (8* 220)) *100 = 1100/2048 = 0,54%

Nota: el espacio ocupado por las estructuras que el SO asocia a un proceso y que se
almacenan en el espacio direccionable del proceso no se ha tenido en cuenta en los cálculos.

D. Supóngase que las tablas de páginas se almacenan en memoria principal y que el


tiempo de acceso a la memoria es de 100 ns. Supóngase además que se dispone
de una memoria asociativa cuyo tiempo de acceso es de 75 ns y que el 80 % de
todas las referencias a las tablas de páginas se encuentran en la memoria
asociativa. ¿Cuál es el tiempo promedio de una referencia a memoria principal?

Si una referencia a memoria requiere acceder a una tabla de páginas almacenada a memoria
principal, habrá que realizar dos accesos a memoria, uno para leer dentro de la tabla de páginas
el número de marco donde está alojada la página y otro más para acceder a dicho marco. Luego
el tiempo empleado en este caso será 2·100=200 ns. Por el contrario si la tabla de páginas está
en la memoria asociativa, primero se accede a la memoria asociativa para leer dentro de la tabla
de páginas el número de marco donde está alojada la página y luego se accede a la memoria
principal para acceder al marco. Luego el tiempo empleado en este caso será 75+100=175 ns.
Como se sabe que el 80% por ciento de las referencias a las tablas de páginas se encuentran en
la memoria asociativa, entonces el tiempo promedio tr de una referencia a memoria principal es:

tr = 0,8 * 175 + (1-0,8) *200 = 180 ns

3 Suponga un sistema de archivos en el que cada bloque del sistema de archivos


tienen un tamaño de 1 Kbytes, al igual que el bloque físico de disco. Si el sistema de
archivos posee 16384 bloques, para acceder al byte ubicado en la posición 536000. Si
toda la información de control del sistema de archivos y del archivo a acceder está en
memoria, responda a las siguientes preguntas justificando sus respuestas:
A. ¿Cuántos accesos a disco se requieren, en el peor de los casos, si se trata de un
sistema de archivos tipo FAT? 
SO – examen 18062009 – segunda parte – pag. 4/5
 

El byte a acceder se encuentra en el bloque 524 del archivo, esto se obtiene al obtener el
redondeo superior de la división entre la posición del byte a acceder por el tamaño de bloque del
sistema de archivo, quedándome con el redondeo superior. Como se trata de un sistema tipo
FAT, que es una variante del esquema enlazado en el que los enlaces se almacenan en la
estructura FAT, entonces asumiendo que dicha estructura está cargada en memoria, el número
de accesos será 1.
 
B. ¿Cuántos accesos a disco se requieren, en el peor de los casos, si se trata de un
sistema de archivos tipo UNIX? 
El byte a acceder se encuentra en el bloque 524 del archivo, esto se obtiene al obtener el
redondeo superior de la división entre la posición del byte a acceder por el tamaño de bloque del
sistema de archivo, quedándome con el redondeo superior. Como se trata de un sistema tipo
UNIX, tendremos que obtener cuántos niveles de indexación serán necesarios recorrer para
llegar al bloque 524 y para ello será necesario calcular cuántos índices se almacenan en cada
bloque de índices. Como el sistema de archivos posee 16384, entonces necesitaremos, al
menos, 2 bytes para codificar los índices. Por tanto, cada bloque del sistema de archivo podrá
albergar 512 índices, por ello podemos afirmar que:
Los 10 primeros bloques del archivo se accederán de manera directo, es decir con un solo
acceso (bloques relativos del 0 al 9).
Los siguientes 512 boques (bloques relativos 10 al 521) se accederán mediante una indexación
a un solo nivel, por ello se requerirán dos accesos.
Los siguientes 512 * 512 bloques (bloque 522 al 522 + (512*512) -1) se accederán mediante
una indexación doble, por tanto se requerirán tres accesos. Por tanto, como el bloque 524 se
encuentra en ese rango, el número de accesos serán tres.
 
C. ¿Cuántos accesos a disco se requieren, en el peor de los casos, si se trata de un
sistema de archivos que gestiona el espacio de manera encadenada con enlace
simple? 
Como se trata de un sistema encadenado con enlace simple, tendremos que obtener el tamaño
del enlace que se encuentra en cada bloque. Como el sistema de archivos posee 16384,
entonces necesitaremos, al menos, 2 bytes para codificar los enlaces. Por tanto, cada bloque del
sistema de archivo podrá albergar 1022 bytes de datos, por lo que el byte acceder se encuentra
en el bloque 524, que resulta al calcular el redondeo superior de la división entre la posición del
byte a acceder y 1022 (tamaño efectivo de bloque del sistema de archivo). Por tanto se
requerirán 525 accesos para acceder al bloque deseado desde el primer bloque del archivo.

SO – examen 20070621 – segunda parte – pag. 5/5


Calificación

1
2
3

SISTEMAS OPERATIVOS, 10 de septiembre de 2009


Examen Convocatoria Extraordinaria

Nombre Titulación

Dispone de dos horas para realizar el examen

1 (6 puntos) Test. En cada uno de los siguientes apartados, señale cuál opción es
correcta. En caso de que existan varias opciones ciertas, se considerará como correcta
la más completa o precisa. Las preguntas no contestadas no puntúan; las contestadas
erróneamente puntúan negativamente restando un tercio de su valor. Señale sus
respuestas rodeando con un círculo la opción correcta. Si se equivoca, tache la
respuesta incorrecta y rodee la opción que considere correcta. Escriba con tinta. Las
preguntas respondidas con lápiz o con varios círculos no tachados se considerarán no
contestadas.

1. ¿Por qué un ejecutable preparado para un Linux sobre PC no puede ejecutarse directamente en un
sistema Windows, a pesar de que el código máquina que contiene está preparado para ejecutarse
en un ordenador tipo PC?
a) Porque mientras que el Windows sólo se ejecuta sobre máquinas PC, el Linux también
está preparado para otras arquitecturas tales como el Mac y por tanto contiene
instrucciones de máquina totalmente ajenas al PC
b) Porque el formato del ejecutable Linux no es reconocible en Windows
c) Porque el código máquina de PC es interpretado por distintos núcleos, según se trate de
Windows o Linux
d) Porque el fichero donde está el ejecutable jamás podrá ser localizado dentro de un sistema
Windows

2. El intérprete de órdenes (shell) de un sistema operativo es fundamental para que:


a) Las aplicaciones en ejecución puedan comunicarse con el núcleo del sistema operativo
b) Los computadores de un sistema distribuido puedan interactuar entre ellos
c) Los procesos del sistema puedan solicitar recursos al sistema operativo
d) Los usuarios y administradores puedan interactuar manualmente con el sistema
operativo

SO – examen 20090910 – septiembre – pag. 1/6


3. A continuación se presentan cuatro posibles motivos por los que en un sistema informático debe
haber un componente responsable de gestionar el acceso de los procesos a los recursos del
sistema. Uno de los cuatro motivos no es válido. Señale cuál.
a) El código máquina de los procesos normalmente no dispone de instrucciones
apropiadas para acceder a los recursos
b) Los recursos son escasos, tienen una capacidad limitada
c) Los recursos pueden almacenar datos privados de los usuarios
d) El propietario del sistema puede desear establecer limitaciones al uso de los recursos, por
motivos políticos o sociales

4. ¿Con cual de las siguientes afirmaciones te quedarías?


a) La instrucción de wait sobre un semáforo duerme al proceso llamador
b) Si se ejecuta una operación signal sobre un semáforo cuyo valor actual es 2, deja un valor
de 3 en el semáforo excepto si existen procesos en espera por el mismo, en cuyo caso se
queda con 2
c) Los semáforos son herramientas que se emplean únicamente para resolver el problema de
la exclusión mutua y para ello basta con emplear un semáforo inicializado a 1
d) La implementación de las operaciones wait y signal puede incurrir en espera activa

5. El siguiente código pretende gestionar la exclusión mutua en el acceso a una sección crítica,
usando la instrucción atómica swap(a,b) (“bloqueo” es una variable global booleana inicializada a
“false” y “flag” es una variable booleana local a cada proceso).
flag := true;
repeat
swap (bloqueo, flag);
until flag = false;

/* Sección crítica */
bloqueo := false;

La solución propuesta:
a) Cumple las propiedades de exclusión mutua, progreso y espera limitada.
b) Cumple la propiedad de exclusión mutua y progreso pero no la propiedad de
espera limitada.
c) Cumple las propiedades de exclusión mutua y progreso pero presenta el inconveniente de
que solo es válida para dos procesos.
d) Para que cumpla el progreso y la espera limitada, la variable flag debe ser también global.

6. Supongamos que para resolver cierto problema de concurrencia empleamos un monitor y


variables condición.
a) Una operación wait sobre una de las variables condición empleadas en dicho monitor
provocará que el proceso que la realice se bloquee solo si se emplea la semántica del estilo
Mesa.
b) Una operación signal sobre una de las variables condición empleadas en dicho monitor
provocará el desbloqueo de otro proceso que haya realizado una operación wait sobre
dicha variable condición y ambos continuarán su ejecución dentro del monitor.
c) Una operación signal despierta a un proceso bloqueado por haber realizado una
operación wait sobre dicha variable condición y provoca el bloqueo del proceso
que realiza el signal si se emplea la semántica del Estilo Hoare.
d) Todas las anteriores son falsas.
SO – examen 2000910 – septiembre – pag. 2/6
7. En un sistema operativo multitarea, con 8 Kbytes de espacio lógico de proceso, con páginas de 1
Kbytes y 32 Kbytes de memoria física y sin memoria virtual, la tabla de páginas ocupará
a) 8*5 bits
b) 32*5 bits
c) 8*3 bits
d) 32*3 bits

8. Con el sistema de gestión de memoria mediante particiones fijas de distinto tamaño se produce:
a) Fragmentación interna
b) Fragmentación de tablas
c) Fragmentación externa
d) No se produce fragmentación

9. En la tabla de segmentos se encuentra que el segmento 0 tiene una base de 219 y una longitud de
600. ¿A qué dirección física se corresponde la dirección virtual (0, 430) dada en el formato (nº
seg., desplazamiento dentro del seg.)?
a) 219*0+430 = 430
b) 219+430 = 649
c) 219+430 = 649 > 600 : Error de direccionamiento
d) Es necesario conocer el tamaño del marco

10. Se tienen 3 procesos: P1, P2 y P3, con tiempos de ejecución: 85, 45 y 118 ms, respectivamente. Si
actúa el planificador a largo plazo según el algoritmo SJF (Short Job First) se obtiene que:
a) Los procesos se encuentran en la lista de preparados en el orden de llegada: P1, P2 y P3
b) Los procesos se encuentran en la lista de preparados en el orden: P2, P1 y P3
c) Los procesos se ejecutan en el orden de llegada: P2, P1 y P3
d) Los procesos se ejecutan según la prioridad que posean los procesos

11. Sean dos procesos: P1 con tiempo de ejecución de 20ms y P2 con 15ms. El planificador a corto
plazo actúa según un Round Robin con quanto de 10ms y tiempo de conmutación de tarea de
5ms. Marcar el tiempo de retorno (regreso) de P1.
a) 30 ms
b) 40 ms
c) 45 ms
d) 50 ms

12. ¿Cuál de estas transiciones de estados de un proceso jamás se produce en un sistema normal?
a) De “bloqueado” a “preparado”
b) De “preparado” a “bloqueado”
c) De “activo” a “preparado”
d) Pueden darse cualquiera de las situaciones anteriores

SO – examen 20090910 – septiembre – pag. 3/6


13. Un usuario está tecleando un documento y decide guardarlo cuando tiene exactamente 1536 bytes.
Si el sistema de ficheros en el que se guardará el fichero tiene un tamaño de bloque de 512 bytes y
usa asignación de espacio enlazada y sabiendo que cada enlace ocupa 4 bytes. ¿Cuántos bloques
ocupará el documento cuando se guarde?
a) 3 bloques
b) 4 bloques
c) 5 bloques
d) 512 bytes no es un tamaño válido de bloque

14. Al ejecutar el comando ls -l en cierto directorio de sopa.dis.ulpgc.es aparece en pantalla lo


siguiente:
-rw-r--r-- 1 sopa01 grp01 480068 abr 16 13:38 fich1.dat
-rw-r--rw- 1 sapo99 grp99 99013 may 9 10:44 fich2.dat
-rw------- 1 sapo99 grp01 109318 feb 6 13:55 fich3.dat
-rw-r--r-- 1 sopa01 grp99 2083 feb 13 15:23 fich4.dat

Si mantenemos los permisos tal y como aparecen en el listado anterior, ¿cuál de esos ficheros
podrá borrar el usuario sopa01, sabiendo que pertenece a los grupos grp01 y grp99?
a) Todos los ficheros
b) Todos, excepto fich3.dat
c) Todos, excepto fich2.dat y fich3.dat
d) Sólo el fichero fich1.dat

15. Un sistema de ficheros que utiliza asignación de espacio enlazada por clusters:
a) Tiene mayor fragmentación interna que uno sin agrupación
b) Mejora el rendimiento del disco
c) Requiere menos espacio para la administración de la lista de espacio libre
d) Todas las anteriores son ciertas

SO – examen 2000910 – septiembre – pag. 4/6


2 (1,5 puntos) La arquitectura del procesador Motorola 68360 utiliza un sistema
paginado a cuatro niveles, en el que cada nivel de paginación tiene asociada una tabla de
páginas independiente en memoria. Si el tiempo de búsqueda en la TLB es de 20
nanosegundos y se requieren 100 nanosegundos para acceder a memoria ¿Cuál será el
tiempo de acceso efectivo para una tasa de aciertos de la TLB del 98%?

Primer nivel de Segundo nivel Tercer nivel de Cuarto nivel de Desplazamiento


paginación de paginación paginación paginación

SOLUCIÓN:

En un sistema de memoria paginada dotado además de TLB, el tiempo efectivo de


acceso se obtiene aplicando la siguiente fórmula:

TEA = PTLB * (TAT + TAM) + (PTP * 5 * TAM)


Siendo:
Tiempo efectivo de acceso (TEA)
Tiempo de acceso a memora (TAM)
Tiempo de acceso a la TLB (TAT)
Probabilidad de acierto de la TLB (PTLPB)
Probabilidad de fallo de la TLB, o sea, probabilidad de que la traducción se tenga
que realizar usando las tablas de páginas (PTP). Esta probabilidad es 1 - PTLB.

El 5 del segundo paréntesis se debe a que el sistema utiliza una paginación de cuatro
niveles, por tanto, para acceder a una palabra referenciada por una dirección del espacio
direccionable utilizando las tablas de páginas, se deberán realizar 5 accesos a memoria
(un acceso por cada tabla de páginas más el acceso a memoria una vez obtenida la
dirección de memoria real).

Por tanto, al sustituir los datos que nos dan en el enunciado, se tendrá que:

TEA = 0,98 * (20 + 100) + (0,02 * 5 * 100)

SO – examen 20090910 – septiembre – pag. 5/6


3 (2,5 puntos) Una empresa ofrece un servidor de descargas para que sus clientes
puedan bajarse a sus equipos locales películas, música y toda clase de archivos. Para
controlar el proceso de descarga, se quiere emplear un monitor que ofrece la siguiente
interfaz:

*monitor* ServidorDescargas {
public void iniciarDescarga (string nombreArchivo);
public void descargaCompleta (string nombreArchivo);

private long Tamaño (string nombreArchivo);


}

Cada archivo almacenado en el sistema tiene un nombre que consiste en una ristra de
caracteres (string). El protocolo para descargar el archivo es invocar primero a
"iniciarDescarga()", realizar la descarga en sí (con otras rutinas que la empresa ya tiene
implementadas) y a continuación llamar a "descargaCompleta()".
El sistema tiene una restricción, y es que no puede haber descargas simultáneas que
sumen más de 30 gigabytes. Si un proceso intenta iniciar una descarga cuando ese límite
esté rebasado, quedará esperando hasta que se abra hueco suficiente. El monitor debe
ser el responsable de garantizar que se cumple este límite.
Para conocer la longitud de un archivo del servidor, el monitor ofrece la función
"Tamaño()", que supondremos ya implementada.

Debes implementar las operaciones iniciarDescarga() y descargaCompleta().

SOLUCIÓN:
monitor ServidorDescargas {
Condition cola;
long cargaActual = 0;
const long LIMITE = 30 * unGiga;

public void iniciarDescarga (string nombreArchivo) {


long tamañoArchivo = Tamaño(nombreArchivo);
while ( cargaActual + tamañoArchivo > LIMITE ) {
cola.Wait();
}
cargaActual += tamañoArchivo;
}

public void descargaCompleta (string nombreArchivo) {


cargaActual -= Tamaño(nombreArchivo);
cola.Broadcast();
}

private long Tamaño (string nombreArchivo) { ... }


}
SO – examen 2000910 – septiembre – pag. 6/6
Calificación

1
2
Fac. de Informática / Escuela Univ. Informática
3
SISTEMAS OPERATIVOS
Examen Parcial 4
26 de abril de 2008

Nombre Titulación
*** S O L U C I O N E S ***
Dispone de tres horas para realizar el examen
1 (2.5 puntos) Se propone la siguiente solución al problema de los lectores/escritores:
Variables compartidas
Semaphore mutex1(1), mutex2(1);
Semaphore lectores(1), escritores(1);
Int n_lectores=0; int n_escritores=0;

Procesos Lectores() { Procesos Escritores() {


While (true) { While (true) {
Lectores.wait(); Mutex2.wait();
Mutex1.wait(); n_escritores++;
n_lectores++; if (n_escritores==1)
if (n_lectores==1) lectores.wait();
escritores.wait(); mutex2.signal();
mutex1.signal(); escritores.wait();
lectores.signal();
Escritura en el recurso
Lectura del recurso
Escritores.signal();
Mutex1.wait(); Mutex2.wait();
n_lectores--; n_escritores--;
if (n_lectores==0) if (n_escritores==0)
escritores.signal(); lectores.signal();
mutex1.signal(); mutex2.signal();
} }
} }

a) ¿Cumple esta solución las especificaciones básicas del problema, es decir, permite la lectura
simultánea de varios lectores e impide que puedan acceder al recurso lectores y escritores o
múltiples escritores en un instante dado? Razona la respuesta indicando trazas concretas que
apoyen tus argumentos. (1.5p)
b) ¿A quién da preferencia el algoritmo anterior: a los lectores, a los escritores o no establece
ninguna preferencia? ¿Es posible la inanición de algún tipo de proceso? (1p)

Solución:
a) Sí. Se trata de una solución que cumple las especificaciones básicas del
problema. Se puede ver fácilmente que si un lector entra, cierra el paso a los
escritores al realizar una operación wait sobre el semáforo “escritores”. Esto hace
que en caso de algún intento de escritura por parte de algún escritor, dicho
escritor quedará bloqueado en la operación de wait sobre el semáforo
“escritores”. Del mismo modo, si existe un escritor escribiendo en el recurso, los
lectores quedarán bloqueados en la operación wait sobre el semáforo “lectores”,
ya que el primer escritor que consigue entrar a escribir al recurso, habrá
ejecutado la operación de wait sobre el semáforo “lectores”. Por tanto, es
imposible que existan lectores y escritores simultáneamente accediendo al
recurso.
Por otro lado, en caso de entrar algún escritor al recurso, se puede observar
fácilmente como nuevos escritores que intenten acceder para escribir quedarán
bloqueados en la operación wait sobre el semáforo “escritores”, impidiendo de
esta forma que puedan estar múltiples escritores escribiendo en el recurso
compartido.
Además, en caso de que exista un lector leyendo del recurso, este no impide el
acceso de nuevos lectores.
b) El algoritmo establece una preferencia clara hacia los escritores. Se puede ver
como al llegar un escritor, si se trata del primero, éste realizará una operación
wait sobre el semáforo “lectores”, lo que provocará el bloqueo de nuevos
procesos lectores en el wait sobre el semáforo “lectores”. Por tanto, en caso de
que lleguen escritores sin cesar, se puede producir claramente inanición de los
procesos lectores.

2 (1.5 puntos) Suponga que se lanzan concurrentemente los procesos P1, P2, P3, P4, P5 y P6:
Proceso Pi() {
//Código del proceso Pi
}

Definir, inicializar y utilizar los semáforos necesarios en el cuerpo de cada proceso de


forma que se fuerce a que se verifiquen todas las relaciones de precedencia siguientes:
• P1 debe terminar antes que P2 y P3 empiecen.
• P2 debe terminar antes que P4 y P5 empiecen.
• P3 debe terminar antes que P5 empiece y
• P6 debe empezar después que P3 y P4 terminen.

Solución

Variables globales e inicializaciones


Semaphore sem12(0), sem13(0), sem24(0), sem25(0), sem35(0), sem46(0), sem36(0)

Proceso P1() { Proceso P4() {


Sem24.wait();
// Código del proceso P1 // Código del proceso P4
sem12.signal(); Sem46.signal();
sem13.signal(); }
} Proceso P5() {
Proceso P2() { Sem25.wait();
sem12.wait(); Sem35.wait();
// Código del proceso P2 // Código del proceso P5
Sem24.signal();
Sem25.signal(); }
} Proceso P6() {
Proceso P3() { Sem36.wait();
Sem13.wait(); Sem46.wait();
// Código del proceso P3 // Código del proceso P6
sem35.signal();
Sem36.signal(); }
}
3 (3 puntos) Contestar brevemente a las siguientes cuestiones:
a) ¿Qué es el grado de multiprogramación de un sistema? ¿Qué beneficios y qué problemáticas
supone para el usuario y para el sistema de cómputo aumentar el mismo? (0.6p)
Se entiende grado de multiprogramación como el máximo número de procesos que están
ejecutándose en un sistema de cómputo en un momento determinado. Si se aumenta el
grado de multiprogramación de un sistema puede ocurrir lo siguiente:
- Desventajas : Habrá menos memoria libre en el sistema, con lo cual habrá menos
memoria para cada uno de los procesos. Además existirá la posibilidad de más cambios
de contexto debido a que existen más procesos compitiendo por CPU. Al haber más
procesos en la cola de preparados, el planificador puede además tomarse más tiempo
en decidir cuál es el siguiente proceso a utilizar la CPU.
- Ventajas: el usuario tendrá más posibilidades de ejecutar más procesos al mismo tiempo
en el sistema, con lo cuál el usuario “tendrá la percepción” de tener más “procesadores”
a su disposición, cosa que no es real pues perfectamente el sistema puede ser
monoprocesador

b) Considérese un teléfono móvil convencional. ¿Crees que es necesario dotarlo de un sistema


operativo? Justificar la respuesta. En caso afirmativo, ¿debe estar multiprogramado? ¿debe ser
multiusuario? (0.6p)
Las preguntas que se formulan pueden tener varias respuestas correctas, incluso
contradictorias entre sí. Lo que se valora de la respuesta no es la contestación final (si es o
no multiprogramado un móvil), sino la argumentación que se da para respaldar esa
contestación.
Lo primero es delimitar de qué dispositivo se está hablando. Durante el examen aclaramos
que se trataba de un móvil «de gama media», aunque esta definición puede variar
dependiendo del tiempo y el lugar. En fin, decidir si el móvil debe tener o no sistema
operativo es debatible. Desde luego, podemos instalar el software controlador del móvil en
una ROM y olvidarnos del sistema operativo. Es técnicamente factible, por lo tanto no es
absolutamente necesario que tenga un sistema operativo, sino una única aplicación que
gestione todos sus servicios. Pero eso dificultaría enormemente la implementación de los
servicios que un móvil actual proporciona. Por ejemplo, hoy día los móviles permiten bajarse
aplicaciones de terceros y ejecutarlas (ej. juegos). Si un móvil permite ejecutar una
aplicación escrita por terceros, es que tiene un software **cargador**. Y debe tener, por
tanto, una mínima capacidad de gestionar recursos del sistema (como mínimo la memoria
libre). Y seguramente ofrecerá a los desarrolladores de esas aplicaciones una API para
poder acceder a los servicios básicos que el móvil lleva preinstalado. Todas esas son
características definitorias de un sistema operativo.

También se pregunta si el móvil debe ser multiprogramado. Tal y como funcionan los
móviles actualmente, es mejor que el sistema sea multiprogramado, puesto que en muchas
ocasiones ocurre que mientras estamos ejecutando una tarea (ej. escribiendo un mensaje
SMS) ocurren eventos asíncronos que se atienden de inmediato (ej. se recibe una llamada,
o un SMS entrante). Un sistema no multiprogramado no permitiría atender de inmediato
estos eventos, o bien haría el desarrollo de aplicaciones para móviles tremendamente
complicado, puesto que el software que gestiona la escritura de un SMS debería ser capaz
de atender también una llamada entrante (teóricamente posible, pero inviable desde un
punto de vista práctico). Otro ejemplo mucho más evidente es que un móvil con reproductor
de música o con radio permite oír el audio mientras estamos realizando otras tareas (ej.
escribiendo un mensaje).

Por último, se pregunta si este móvil debe ser multiusuario. Este es un asunto más
debatible que los anteriores, y depende mucho de la definición que empleemos para
"multiusuario". En clase hemos utilizado más o menos esta: un sistema que distingue
diferentes privilegios de acceso a los recursos dependiendo de la identidad del usuario que
solicita las operaciones. Según esta definición, un teléfono móvil podría considerarse
multiusuario partiendo del hecho de que tiene un mecanismo para distinguir qué usuario
está utilizando el aparato (la tarjeta SIM) y se le tarifica de forma diferente según qué tarjeta
sea. Esta diferencia entre usuarios es más acusada si estamos usando una tarjeta dual: las
operaciones se pueden realizar con diferentes identidades, y pueden tener distintas
configuraciones e incluso restricciones de uso (ej. una cuenta que sólo puede hacer
llamadas a un grupo cerrado de números de teléfono).

En fin, todo lo anterior no es sino un posible desarrollo (bastante extenso) de las preguntas
formuladas, pero no debe considerarse como la «solución correcta». En esta pregunta no se
trata de llegar a un resultado concreto, sino de cuál es el **camino** que has seguido para
llegar a ese resultado.

c) En un equipo se ha observado la carga del planificador de procesos y resulta que en los


últimos diez minutos se han estado ejecutando cien procesos. Todos ellos siguen sin finalizar
en el momento actual. Por su parte, el tamaño medio de la cola de preparados ha sido de 0,17
procesos durante ese intervalo. Habiendo tantos procesos activos, ¿cómo se puede explicar
un tamaño tan pequeño para la cola de preparados? (0.6p)
En realidad, el tamaño de la cola de preparados no tiene por qué ser proporcional al número
de procesos activos. No olvidemos que un proceso a lo largo de su vida activa puede estar
en tres estados: en ejecución (en la CPU), preparado (en la cola de preparados) y
bloqueado (en alguna otra cola de espera). Si un proceso se pasa el 90% de su vida
bloqueado, casi nunca ocupará la cola de preparados ni la CPU. Y eso le ocurre a los
procesos intensivos en E/S, que pasan casi toda su existencia bloqueados en espera de un
evento de E/S. En un sistema interactivo típico, podríamos tener varios usuarios que suman
esos cien procesos, que sólo de vez en cuando necesitan ejecutar instrucciones en CPU. La
cola de preparados estará vacía casi todo el tiempo, y cuando alguno de estos procesos
intensivos en E/S quiera ejecutar instrucciones, será muy poco probable que tenga que
competir con otro proceso por la CPU. De ahí una media tan baja en la ocupación de la cola
de preparados.

d) ¿Por qué crees que deben separarse los mecanismos de las políticas? Justifica debidamente la
respuesta con ejemplos. (0.6p)
Los mecanismos determinan el cómo hacer algo; por el contrario las políticas determinan
qué hacer. Por ejemplo: el temporizador es un mecanismo para asegurar la protección de la
CPU, pero la decisión de cuáles deben ser los datos de temporización para un usuario
concreto es una decisión de política. Las decisiones sobre políticas son importantes para la
asignación de recursos. Cuando es necesario decidir si un recurso se asigna o no, se debe
tomar una decisión de política. Cuando la pregunta es cómo en vez de qué, es un
mecanismo lo que hay que determinar.
Fundamentalmente, deben separarse los mecanismos de las políticas para poder permitir
una mejor portabilidad de un sistema: así en un diseño de un sistema operativo definiremos
las políticas a utilizar (independientes de los dispositivos, genéricos, en dónde se vayan a
ejecutar los sistemas), para obtener un buen rendimiento del mismo, y en la fase de
implementación decidiremos qué mecanismos utilizar dependiendo del tipo de sistema en
donde lo vayamos a ejecutar (aquí ya utilizaremos recursos no genéricos sino específicos).

e) ¿Qué diferencias hay entre una excepción y una interrupción? ¿Pueden generarse excepciones
intencionadamente mediante un programa de usuario? Justificar la respuesta. (0.6p)
Las interrupciones son un tipo de mecanismo que permiten al sistema operativo recibir una
señal (un evento que pueden ser de diversos tipos) para posteriormente tratarla. Podemos
clasificarlas en :
• Interrupciones del hardware, son los eventos producidos por el hardware de los
controladores de los dispositivos de entrada salida, como teclado, floppy, disco duro,
CDROM, tarjeta de sonido etc.
• Interrupciones por software. Destacaremos dos tipos:
o Llamadas al sistema, son un tipo de interrupciones software, que se producen
cuando un programa quiere utilizar un recurso; por ejemplo un programa quiere
leer de un fichero, la instrucción de lectura provocará una llamada al sistema para
que se realice la lectura del fichero. Es el propio sistema quien debe interrumpir
lo que está realizando y atender esta llamada; esto provoca que se ejecute una
instrucción de bajo nivel.
o Excepciones, con este nombre se conoce un tipo de interrupciones donde el
causante es el propio sistema; por ejemplo la CPU detecta una división por cero
en sus registros, o se produce una violación en los límites de memoria, este tipo
de eventos también provoca una interrupción que causa que se ejecute una
instrucción de bajo nivel que provoca un salto al vector de interrupciones.
Por otro lado, un usuario puede perfectamente lanzar una Excepción intencionada
para obligar a que el sistema operativo tome el control. Como ejemplo puede utilizar
las directivas Try y Throw para simular algo en un programa y hacer que se atienda
la excepción que se produce, mediante las rutinas pertinentes de atención a las
excepciones. Ejem: Qué hacer si se produce una división por cero? Pues podríamos
capturar la excepción (si se produjera) para realizar alguna acción posterior, en vez
de utilizar elementos del tipo “if cociente == 0 then … “!

4 (3 puntos) Considérese un sistema multitarea en el que se pretende que la planificación del


procesador cumpla con los siguientes principios:
• Se debe minimizar el número de cambios de contextos.
• Los procesos que se ejecutan en modo sistema tienen prioridad absoluta sobre los que se ejecutan
en modo usuario y deben ejecutarse lo antes posible.
• Los procesos que se ejecutan en modo sistema se gestionan priorizando a aquél que se estime que
consumirá menos tiempo del procesador. Éstos se dividen en dos clases: los que se deben ejecutar
sin que deban ser interrumpidos, que identificamos como tipo A, y los que pueden ser
interrumpidos durante su ejecución, que identificamos como de tipo B. Los procesos que no
deben ser interrumpidos tienen prioridad absoluta sobre el resto de procesos del sistema y deben
ejecutarse lo antes posible.
• Los procesos que se ejecutan en modo usuario, que identificamos de tipo C, no deben acaparar el
procesador más de 3 unidades de tiempo consecutivas, y se planifican penalizando a aquellos que
hayan consumido más tiempo del procesador. Inicialmente estos procesos poseen la misma
prioridad.
Se pide:
a) Proponer una política de planificación que cumpla con los principios descritos. (1.5p)
b) Obtener el diagrama de Gantt y los tiempos medio de retorno y espera al aplicar su diseño a
la siguiente carga de trabajo: (1.5p)

Tiempo de Duración ráfaga


Proceso Tipo llegada de procesador
0 C 0 7
1 B 1 6
2 A 2 5
3 A 3 2
4 C 4 3

RESPUESTA:

Según los principios que debe cumplir el planificador, se deduce que:


• Se planificará mediante un modelo múltiples colas. Concretamente una para cada tipo de
de procesos:
Cola A: para los procesos que se deben ejecutar sin ser interrumpidos en modo sistema.
Cola B: los procesos que se ejecutan en modo sistema y que pueden ser interrumpidos.
Cola C; para los procesos en modo usuario.

• Como en los procesos que se ejecutan en modo sistema se debe priorizar a aquellos
que se estiman que consumirán menos tiempo del procesador, entonces las colas A y B
se gestionarán siguiendo una política “primero el más corto”. Además como los de cola A
se deben ejecutar sin que se interrumpan, entonces en la política de gestión de esta cola
será no expulsiva, en cambio los de la cola B se planificarán mediante una política
expulsiva.

• Como en los procesos que se ejecutan en modo usuario se deben penalizar a aquellos
que más consuman tiempo del procesador, además no se debe permitir que consuman
más de tres unidades consecutivas de tiempo de procesador y además se deben
minimizar los cambios de contexto, entonces la cola C se planificaría mediante una
variante de Round-Robin, consistente en asignar rodajas de tiempo de duración de tres
unidades de tiempo y gestionando la cola de espera con prioridades dinámicas de forma
que a medida que consume más tiempo del procesador se le disminuye su prioridad que
inicialmente es la misma para todos.

• Como los procesos que se ejecutan en modo sistema deben ejecutarse lo antes posible
y además los de la cola A tienen prioridad sobre el resto y los de la cola B tienen
prioridad sobre los de la cola C, entonces la planificación entre colas es expulsiva (o con
apropiación).

Por tanto, el diagrama de Gant para la carga propuesta será:

Tiempo de Duración de ráfaga


Proceso Tipo
llegada de procesador
0 C 0 7
1 B 1 6
2 A 2 5
3 A 3 2
4 C 4 3

Diagrama de Gantt:
t 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
P 0 1 2 2 2 2 2 3 3 1 1 1 1 1 4 4 4 0 0 0 0 0 0

Tiempos de retorno y espera


Proceso Tiempo de retorno Tiempo de espera
0 23 16
1 13 7
2 5 0
3 6 4
4 13 10
Tiempos
12 u.t. 7,4 u.t.
medios
Calificación

1
2
3
SISTEMAS OPERATIVOS
Convocatoria de junio, 18 de junio de 2008 – PRIMERA PARTE

Nombre Titulación
Ingeniero
*** S O L U C I O N E S *** en Informática

Dispone de dos horas para completar el examen

1 (6 puntos) Test. Marque las opciones correctas de cada apartado. En caso de que existan
varias opciones ciertas, se considerará como correcta la más completa o precisa. Las
preguntas no contestadas no puntúan; las mal contestadas puntúan negativamente restando un
tercio de su valor. Marque la opción correcta rodeándola con un círculo. Si se equivoca, tache
la respuesta equivocada y rodee la opción correcta. Escriba con tinta. Las preguntas
respondidas con lápiz o con varios círculos no tachados se considerarán no contestadas.
1. Tenemos varios procesos que intentan acceder a secciones críticas sobre una zona de datos, y
observamos que varios de ellos se quedan detenidos indefinidamente al intentar entrar en su
sección crítica, tanto si hay otros procesos en sección crítica como si está libre. Eso significa
que la solución a la sección crítica en este sistema es:
a) inválida porque no cumple la condición de exclusión mutua
b) inválida porque no cumple la condición de progreso
c) *inválida porque no cumple la condición de espera indefinida
d) inválida porque no cumple la condición de no interbloqueo
2. ¿Cuál de estas combinaciones de procesos pesados e hilos no se puede dar, en el caso
general?
a) *10 procesos pesados y 5 hilos
b) 5 procesos pesados y 10 hilos
c) 10 procesos pesados y 10 hilos
d) no se puede dar ninguna de las anteriores combinaciones
3. ¿Cuál es la política de gestión de la cola de espera de un semáforo?
a) FIFO
b) prioridades
c) prioridades expulsivas
d) *depende de cómo esté implementado el semáforo
4. Cuando el sistema operativo termina de atender una interrupción:
a) devuelve el control al proceso que estaba activo en el momento de ocurrir la
interrupción
b) devuelve el control al proceso que estaba activo en el momento de ocurrir la
interrupción, salvo que éste pase al estado de bloqueado por causa de la interrupción
que se acaba de atender
c) *devuelve el control a algún proceso que se encuentre en estado preparado
d) devuelve el control a algún proceso que se encuentre en estado bloqueado
5. Suponga un computador de control de un automóvil, encargado de funciones tales como
realizar el sistema antibloqueo de las ruedas, la detonación del airbag cuando hay una
deceleración brusca y visualizar en el salpicadero los datos básicos de la conducción
(velocidad, temperatura del motor, etc.) ¿Qué tipo de sistema operativo sería más adecuado
para este computador?
a) un sistema por lotes
b) un sistema de tiempo compartido
c) *un sistema de tiempo real
d) un sistema distribuido
6. En un planificador de procesos nos encontramos en un momento dado con los siguientes
procesos en estado de preparado: un proceso intensivo en E/S y veinte procesos intensivos en
CPU. Ante este escenario, ¿cuál de las siguientes políticas garantizará una atención más rápida
al proceso intensivo en E/S?
a) FCFS
b) SJF no expulsivo
c) *SJF expulsivo
d) Round Robin
7. Un sistema multiprogramado:
a) permite gestionar varias tareas interactivas
b) evita el acaparamiento de la CPU por un único proceso
c) debe realizar el control de la sincronización entre procesos
d) *ninguna de las afirmaciones es correcta
8. Si varios procesos concurrentes se ejecutan en un sistema, ocurre que:
a) *para su ejecución compiten por el uso de uno o de varios procesadores
b) se ejecutan sobre un sistema operativo multiusuario
c) comparten el mismo código
d) necesitan sincronizarse para acceder a los datos que comparten
9. ¿Cuál de estas llamadas al sistema es menos necesaria en un sistema no multiprogramado?
a) cargar y ejecutar un programa
b) leer la fecha y hora actuales
c) abrir un fichero
d) *crear un semáforo
10. Suponga un planificador de procesos por prioridades expulsivo, en el que a menor número de
prioridad mayor prioridad, y que en caso de igualdad de prioridades se planifica según la política
primero el más corto. Tenemos que el proceso A llega en el instante 0 con prioridad 2 y se prevé
un consumo de CPU de 500 u.t, el proceso B llega en el instante 200 con prioridad 3 y se prevé
un consumo de CPU de 300 u.t, el proceso C llega en el instante 300 con prioridad 1 y se prevé
un consumo de CPU de 400 u.t., el proceso D llega en el instante 500 con prioridad 3 y se prevé
un consumo de CPU de 1000 u.t y el el proceso E llega en el instante 700 con prioridad 2 y se
prevé un consumo de CPU de 600 u.t. Entonces, el tiempo medio de retorno es de:
a) 1000 u.t.
b) 1100 u.t.
c) *1200 u.t.
d) 1300 u.t.
11. Para el mismo caso anterior, el tiempo medio de espera es de:
a) *640 u.t.
b) 650 u.t.
c) 660 u.t.
d) 670 u.t.
12. El núcleo del sistema operativo
a) está construido como un bloque monolítico de software
b) *atiende las interrupciones de los periféricos
c) atiende a los programas del sistema, pero no a los programas de usuario
d) atiende a los programas de usuario, pero no a los programas del sistema
13. ¿Cuál de las siguientes afirmaciones es correcta?
a) Un mecanismo puede utilizarse para implementar políticas completamente diferentes
b) Una política se puede implementar con mecanismos completamente diferentes
c) Un sistema operativo puede ser capaz de aplicar varias políticas diferentes para
gestionar el mismo recurso
d) *todas las anteriores son ciertas
14. En un sistema por lotes, ¿cuál es el objetivo que más importancia tiene de los aquí mostrados?
a) *aumentar la productividad del procesador
b) lograr que los usuarios disfruten de un entorno interactivo
c) garantizar un plazo de ejecución máximo para todos los procesos
d) ofrecer servicios para ejecutar aplicaciones de forma distribuida
Nombre

15. Si un semáforo binario tiene valor cero y un proceso ejecuta una operación V:
a) el proceso se bloquea hasta que otro proceso ejecuta una operación P
b) el proceso se bloquea hasta que otro proceso ejecuta una operación V
c) el proceso se bloquea mientras el valor del semáforo se mantenga a cero
d) *el proceso no se bloquea

2 (2 puntos) Un sistema tiene los siguientes recursos: una CPU, dos discos
(DISC1, DISC2) y una impresora (IMP). Existen dos tipos de trabajos según las
necesidades de utilización de los recursos:

Suponiendo que en el sistema hay un trabajo de cada tipo, calcule la utilización de


la CPU, el tiempo medio de retorno en el sistema y el tiempo de espera para cada
trabajo con los siguientes algoritmos de planificación de CPU:
a) FCFS
b) Round-Robin (q=1)

Suponga que el resto de las colas se gestionan con un algoritmo FCFS y que el
primer proceso en el sistema es de tipo 1.
3 (2 puntos) Desarrolle en menos de quinientas palabras (aprox. dos páginas) el
siguiente tema: qué son las llamadas al sistema, cómo se utilizan y qué beneficios
ofrecen a los programadores de aplicaciones.
Si quiere acompañar su exposición con ejemplos, recuerde que puede recurrir al
sistema Nachos utilizado en las prácticas de la asignatura.

Se trata de desarrollar el tema propuesto. Consultar la bibliografía para conocer qué


es una llamada al sistema y cómo se utiliza.
En cuanto a los beneficios para el programador, en el fondo se está preguntando por
los beneficios que tiene la existencia de un SO para el programador de aplicaciones:
se ofrece una interfaz estandarizada para programar servicios de uso frecuente,
como acceso a la E/S, carga y ejecución de programas, trabajo con archivos, etc. El
programador de aplicaciones no debe implementar estos servicios, sino nada más
que aprender a utilizar la API que le ofrece el SO. Además, esta API se supone que
es en mayor o menor medida independiente del hardware, con lo cual se aumenta la
portabilidad del código que escribe el programador (ej. no hay que estar
reescribiendo la aplicación si sustituimos el dispositivo de almacenamiento que usa
el computador).
Calificación

1
2
3
4
SISTEMAS OPERATIVOS, 3 de diciembre de 2009 5
Examen de la Convocatoria Especial

¡Error!No
se
encuentra
el
origen
de
la
referencia.
Nombre Titulación
***
S
O
L
U
C
I
O
N
E
S
***

Dispone
de
tres
horas
para
realizar
el
examen

1 
(1,5
puntos)
Responda
de
forma
concisa
y
jusOficada
a
estas
preguntas.
a. (0,5
puntos)
Gracias
a
la
mulOprogramación,
es
posible
que
dos
procesos
se
completen

en
un
Oempo
menor
que
si
se
ejecutaran
de
forma
secuencial,
incluso
en
un
computador

con
un
solo
procesador.
Explique
por
qué
esto
es
posible,
si
el
procesador
sólo
puede

ejecutar
una
instrucción
en
cada
instante.
Esto es posible porque mientras un proceso está ejecutando instrucciones en el procesador, el
otro puede estar realizando alguna operación con un periférico, o simplemente realizando una
espera que tuviera programada. Como se solapa la actividad del procesador con los
periféricos, el resultado es que la ejecución conjunta de los dos procesos tarda menos que una
ejecución secuencial.
b. (0,5
puntos)
¿Pueden
estar
ejecutándose
simultáneamente
varios
sistemas
operaOvos
en

un 
 mismo 
 computador? 
 ¿Qué 
 uOlidad 
 podría 
 tener? 
 ¿Cuáles 
 podrían 
 ser 
 los

inconvenientes?
Sí es posible, y un ejemplo actual lo podemos ver con las máquinas virtuales como VMWare o
Xen. Sobre un sistema operativo se puede instalar una máquina virtual que ejecute un segundo
sistema operativo al mismo tiempo. La utilidad de la convivencia simultánea de varios sistemas
operativos es la posibilidad de ejecutar aplicaciones preparadas para distintas plataformas.
Dentro de los inconvenientes que hay que resolver, encontramos que ambos sistemas
compiten por el acceso directo a los recursos del equipo y emplearán políticas diferentes de
gestión de recursos. Esto puede dar lugar a importantes conflictos, que sólo podemos resolver
si uno de los sistemas operativos se convierte en el principal y el resto recurren a él de forma
subordinada. En el caso particular de las máquinas virtuales, un inconveniente es la
penalización en el rendimiento que acarrea la emulación de la máquina.
c. (0,5
puntos)
Defina
los
siguientes
conceptos:
llamada
al
sistema;
núcleo
o
kernel;
sistema

distribuido;
vector
de
interrupciones.
Son conceptos básicos cuya definición puede consultarse en cualquier texto sobre Sistemas
Operativos.

SO
–
examen
20091203
–
diciembre
–
pag.
1/6
2 (2,5
puntos) 
Un
sistema
con
un
solo
procesador
y
con
memoria
virtual
con
paginación

bajo
demanda
posee
un
espacio
direccionable
máximo
de
4
GBytes
y
uOliza
páginas
de
128
bytes.

Actualmente
el
sistema
dispone
de
128
Mbytes
de
memoria
principal.
El
Oempo
de
acceso
a

memoria
es
de
150
nanosegundos,
la
tasa
de
fallos
de
página
es
del
5%
y
el
Oempo
medio
de

servicio
de
fallo
de
página
es
de
6
milisegundos.
La
políOca
de

reemplazo
es
local,
uOliza
la
LRU
y

permite 
 un 
 tamaño 
 máximo 
 de 
 área 
 de 
 trabajo 
 por 
 proceso 
 de 
 tres 
 marcos 
 de 
 página. 
 La

búsqueda
de
marcos
libres
se
realiza
mediante
una
búsqueda
lineal
empezando
por
el
marco

cero.
El
núcleo
del
sistema
operaOvo
Oene
un
tamaño
de
134
216
448
bytes
y
está
ubicado
de

forma
conOgua
a
parOr
del
primer
marco
de
página
de
la
memoria.
En
el
sistema
aquí
descrito
se
ha
ejecutado
un
único
proceso
que
Oene
un
tamaño
de
5300
bytes

y
ha
generado
las
siguientes
direcciones
de
memoria
principal:
898,
100,
150,
260,
127,
400,
110,

515,
180,
420,
120,
425,
256,
175,
270.
A
parOr
de
estos
datos,
responda
a
las
siguientes
cuesOones:

a. ¿Cuál
es
la
estructura
de
una
dirección
virtual
en
este
sistema?
32 bits en total, de lo cuales 25 bits son para el número de página y 7 bits para el
desplazamiento de la página.
b. ¿Cuál
es
el
número
máximo
de
entradas
que
tendrá
la
tabla
de
páginas
de
un
proceso?
El número máximo de páginas es 225 , o sea 33 554 432 páginas.
c. ¿Cuántas
entradas
Oene
la
tabla
de
marcos
de
página?
Como la memoria principal posee 128 Mbytes, se requerirán 1 048 576 marcos de página, con
lo que la tabla de marcos tendrá ese mismo número de entradas.
d. ¿Qué 
 páginas 
 del 
 proceso 
 estarán 
 en 
 memoria 
 principal 
 en 
 cada 
 momento 
 de 
 su

ejecución?
Si el tamaño de cada página es 128 bytes, la secuencia de referencias a páginas es la
siguiente:
7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2
Se nos dice que la política es la LRU y se permite un tamaño máximo de área de trabajo de 3
marcos, o sea que un proceso puede ocupar como máximo tres marcos de memoria principal,
por tanto el número de fallos de páginas es 10.

Referencias
7 0 1 2 0 3 0 4 2 3 0 3 2 1 2
Estado
de
los
marcos
7 7 7 2 2 2 2 4 4 4 0 0 0 1 1
0 0 0 0 0 0 0 0 3 3 3 3 3 3
1 1 1 3 3 3 2 2 2 2 2 2 2

e. ¿En
qué
estado
se
encuentra
la
tabla
de
páginas
del
proceso
después
del
úlOmo
acceso
a

memoria?
Si el sistema tiene 128 Mbytes de memoria principal, entonces requerirá 1 048 576 marcos de
páginas. Como el núcleo del SO ocupa 134 216 448 bytes, ocupará los primeros 1 048 566
marcos de página, o sea desde el marco 0 hasta el marco 1 048 565 (ya que se nos dice que
se carga de forma contigua a partir del primer marco del sistema). Por tanto, quedarán

SO
–
examen
20091203
–
dicOembre
–
pag.
2/6
disponibles para el programa 10 marcos, concretamente los últimos 10 marcos, desde el
marco 1 048 566 hasta el marco 1 048 575. Como el programa tiene un tamaño de 5300 bytes,
se requerirían 42 marcos para albergar a todo el programa, pero se dispone sólo de 10 marcos
libres. Si el sistema no soportase memoria virtual, no se podría ejecutar el programa. Pero se
nos dice que sí soporta la memoria virtual, disponiendo cada programa de tres marcos como
máximo para su ejecución. Suponiendo que cuando se requiere un marco para albergar a una
página de un programa, el sistema hace una búsqueda de marcos libres a partir del marco 0, la
tabla de páginas del proceso quedaría organizada según se muestra en la siguiente tabla:

Instante
del
úl<mo
Página Marco Bit
de
validez
uso
de
la
página
0 1.048.566 0 10
1 1.048.566 1 13
2 1.048.568 1 14
3 1.048.567 1 11
4 1.048.566 0 7
5 ‐ 0 ‐
6 ‐ 0 ‐
7 1.048.566 0 0
8 ‐ 0 ‐
9 ‐ 0 ‐
10 ‐ 0 ‐

3 (2
puntos)
Responda
a
las
siguientes
preguntas
sobre
sistemas
de
ficheros:
a. (0,75
puntos)
Un
determinado
sistema
de
archivos
uOliza
bloques
de
datos
de
1
kilobyte.

Considere
una
parOción
de
disco
que
Oene
4
gigabytes
disponibles
para
datos.
Si
se
uOliza

una
FAT
para
direccionar
esa
parOción,
¿qué
tamaño
mínimo
en
bits
debería
tener
cada

entrada
de
la
FAT?
Tamaño del sistema de archivos: 4 × 230 = 232 bytes
El bloque tiene 1024 = 210 bytes, por tanto el número de bloques que debe gestionar la FAT es:
232 / 210 = 222 bloques
Así pues, para direccionar los 4 gigabytes de datos se necesitaría una FAT con entradas de al
menos 22 bits.
b. (1,25 
 puntos) 
Un 
 sistema 
 de 
 archivos 
 uOliza 
 asignación 
 indexada 
 como 
 método 
 de

asignación
de
espacio.
En
cada
inodo
hay
10
referencias
a
bloques
directos,
3
referencias
a

un
bloque
indirecto
sencillo,
2
referencias
a
un
bloque
indirecto
doble
y
1
referencia
a
un

bloque
indirecto
triple.
El
sistema
de
archivos
permite
un
máximo
de
1024
inodos.
El

tamaño
del
bloque
es
de
1KB
y
el
tamaño
de
las
direcciones
a
bloques
de
disco
es
de
64

bits.
¿Cuántos
bloques
debería
tener
una
parOción
para
permiOr
que
todos
los
ficheros

ocuparan
el
máximo
tamaño
posible?
Hay que calcular cuánto ocupa como máximo un fichero, tanto los datos como el inodo y
los bloques índice.

SO
–
examen
20090910

–
sepOembre
–
pag.
3/6
Cada bloque índice tiene capacidad para apuntar a 8·1024 / 64 = 128 bloques
Cada inodo puede direccionar 2 130 314 bloques de datos:
 10 bloques de forma directa
 3 · 128 bloques de forma indirecta sencilla
 2 · 128 · 128 bloques de forma indirecta doble
 1 · 128 · 128 · 128 bloques de forma indirecta triple
Total = 10 + 3·128 + 2·1282 + 1283 = 2 130 314 bloques

Cada inodo ocupa como máximo 16 775 bloques:


 1 bloque para sí mismo
 3 bloques indirectos simples
 2 · (1+128) bloques indirectos dobles
 1 + 128 + (128 · 128) bloques indirectos triples
Total = 1 + 3 + 2·129 + 1282 + 128 + 1= 16 775 bloques

Por lo tanto, cada fichero ocupa como máximo 16 775 + 2 130 314 = 2 147 089 bloques
Como puede haber 1024 ficheros, el número total de bloques necesarios para albergarlos
es:
2 147 089 · 1024 = 21 986 191 360

4 (2
puntos)
Tenemos
tres
procesos
que
simulan
una
planta
embotelladora
de
bebidas:
 Un
proceso
embotellador
UnLitro,
que
conOnuamente
prepara
botellas
de
un
litro
y
las

deposita
en
una
caja
con
capacidad
de
10
litros.
 Un 
 proceso 
 embotellador 
DosLitros, 
igual 
 que 
 el
 anterior,
 salvo 
 que 
 las 
 botellas
 que

prepara
son
de
dos
litros.
 Un
proceso
Empaquetador,
que
se
encarga
de
empaquetar
las
cajas
que
se
van
llenando
y

de
reponer
las
cajas
a
medida
que
se
empaquetan.
Cada
vez
que
un
proceso
embotellador
prepara
una
botella,
esta
se
coloca
en
una
caja,
que
Oene

una
capacidad
de
10
litros.
Si
al
colocar
la
botella
la
caja
queda
llena,
se
envía
una
señal
al

proceso
Empaquetador,
el
cual
toma
la
caja,
la
sella
y
la
guarda
en
un
almacén.
El
Empaquetador

deposita
una
nueva
caja
de
10
litros,
totalmente
vacía.

Cuando
un
proceso
está
manipulando
la
caja,
ningún
otro
proceso
puede
estar
actuando
sobre

ella.
En
alguna
ocasión
el
proceso
DosLitros
puede
observar
que
sólo
queda
un
litro
libre
en
la

caja.
En
este
caso,
se
debe
esperar
hasta
que
se
añada
una
botella
de
un
litro
y
el
empaquetador

coloque
una
nueva
caja
vacía.
Debe 
 escribir 
 el 
 código 
 de 
 los 
 tres 
 procesos, 
 resolviendo 
 los 
 problemas 
 de 
 sincronización

mediante
semáforos.

SO
–
examen
20091203
–
dicOembre
–
pag.
4/6
//
Regula
el
acceso
en
exclusión
mutua
a
la
caja
Semáforo
caja(1);

//
Para
señalizar
al
empaquetador
Semáforo
empaqueta(0);

//
Litros
disponibles
en
la
caja
int
litros
=
10;

//
Para
controlar
que
el
proceso
"DosLitros"
está
//
esperando
por
un
hueco
de
dos
litros
bool
espera2L
=
false;
Semáforo
despierta2L(0);


Proceso
UnLitro
()
{


loop
{





...
prepara
una
botella
de
1L





caja.P();





...
coloca
la
botella
en
la
caja





litros
=
litros‐1;




if
(
litros
==
0
)
{






empaqueta.V();




}




else
{






caja.V();




}


}
}

Proceso
DosLitros
()
{


loop
{




...
prepara
una
botella
de
2L





caja.P();





if
(
litros
==
1
)
{






espera2L
=
true;






caja.V();






despierta2L.P();




}





...
coloca
la
botella
en
la
caja





litros
=
litros‐2;




if
(
litros
==
0
)
{

SO
–
examen
20090910

–
sepOembre
–
pag.
5/6






empaqueta.V();




}




else
{






caja.V();




}


}
}

Proceso
Empaquetador
()
{


loop
{




empaqueta.P();





...
empaqueta
la
caja
actual




...
pone
una
caja
nueva
vacía





litros
=
10;




if
(
espera2L
)
{






espera2L
=
false;






despierta2L.V();




}




else
{






caja.V();




}



}
}

5 (2
puntos)
Un
algoritmo
de
planificación
de
procesos
consta
de
cuatro
clases
de
prioridad

numeradas
del
0
al
3.
El
algoritmo
de
planificación
es
Round‐Robin
para
las
clases
0,
1
y
2;
y
es

FCFS
para
la
clase
3.
La
clase
más
prioritaria
es
la
0.
Los
cuantos
de
Oempo
para
las
clases
0,
1
y
2

son
respecOvamente
1,
2
y
3
unidades
de
Oempo.
El
algoritmo
de
planificación
entre
colas
es

expulsivo.

Los
procesos
que
entran
en
el
sistema
son
admiOdos
inicialmente
en
la
clase
más
prioritaria
(0).

Existe
un
mecanismo
de
degradación
de
la
prioridad
de
tal
forma
que
un
proceso
permanece
en

su
clase
hasta
que
ha
consumido
dos
cuantos
de
Oempo,
tras
lo
cual
es
degradado
a
la
clase
de

prioridad
inmediatamente
inferior.
Todo
proceso
que
llega
a
la
clase
3
permanece
en
ella
hasta

que
termina
su
ejecución.
Se
pide
calcular
el
Oempo
de
retorno
y
la
clase
en
que
terminan
tres
procesos,
P1,
P2,
P3,
que

llegan
en
el
instante
cero
(en
el
orden
P1,
P2,
P3)
y
cuyas
duraciones
respecOvas
son
4,
8
y
12.

Esta es la solución:
P1 P2 P3
Tiempo 8 18 24
retorno
Clase 1 2 2

SO
–
examen
20091203
–
dicOembre
–
pag.
6/6
Calificación

1
2

SISTEMAS OPERATIVOS - SEGUNDA PARTE


Examen Convocatoria Ordinaria, 18 de junio de 2008

Nombre Titulación

Dispone de dos horas para realizar el examen

1 (7,5 puntos) Test. En cada uno de los siguientes apartados, señale cuál opción es
correcta. En caso de que existan varias opciones ciertas, se considerará como correcta
la más completa o precisa. Las preguntas no contestadas no puntúan; las contestadas
erróneamente puntúan negativamente restando un tercio de su valor. Señale sus
respuestas rodeando con un círculo la opción correcta. Si se equivoca, tache la
respuesta incorrecta y rodee la opción que considere correcta. Escriba con tinta. Las
preguntas respondidas con lápiz o con varios círculos no tachados se considerarán no
contestadas.

1. Un computador gestiona la memoria mediante un esquema paginado de doble nivel con una
estructura de direcciones de 32 bits. Si se tienen 10 bits para páginas de un primer nivel, 11 para el
segundo y 11 para el desplazamiento en la página ¿Qué tamaño máximo tendrá el espacio
direccionable de los programas?
a) 2 Gbytes
b) 4 Gbytes
c) 6 Gbytes
d) No puedo afirmar nada sobre el tamaño de dicho espacio

2. Ninguna arquitectura actual implementa tamaños de página entre 800 bytes y 1000 bytes. ¿A qué
cree que es debido?
a) A que los fabricantes de chips de memoria paginan sus bloques de memoria físicos con
unos tamaños prefijados y por tanto no se puede decidir libremente el tamaño de la página
b) Estos tamaños de página obligarían a diseñar una MMU mucho más compleja que
la que se utiliza para trabajar con los tamaños usados realmente
c) Debido al tamaño que tienen las aplicaciones actuales, originan demasiada fragmentación
interna
d) El número de páginas que tendría la tabla de páginas en una arquitectura de 32 bits o de
64 bits sería enorme, y por ello las arquitecturas de memoria prefieren trabajar con
tamaños mayores

SO – examen 20080618 – segunda parte – pag. 1/5


3. Suponga un disco con 200 pistas y se tiene el siguiente conjunto de peticiones a disco: 99, 184, 38,
123, 15, 125, 66 y 68. Si la cabeza acaba de atender una petición en la pista 54 moviéndose en
sentido ascendente y se aplica una política SCAN ¿Qué petición se atendería en octavo lugar?
a) 15
b) 68
c) 38
d) 66

4. En un sistema operativo multitarea, con 32 Kb de espacio lógico de procesos, con páginas de 1


Kbytes y 64 Kbytes de memoria física, la dirección física está formada como mínimo por:
a) 16 bits
b) 16 bytes
c) 15 bits
d) Ninguna de las anteriores

5. Dada la siguiente cadena de referencias a páginas: 7, 0, 2, 0, 3, 4, 1, 2, 3, 4, 0, 1, 2, 5, 0, 7, 3, 0, 2.


¿Cuántos fallos se tendrían al aplicar la política de la segunda oportunidad si disponemos de
cuatro marcos de página?.
a) 8
b) 9
c) 13
d) 14

6. Suponga que un archivo posee 50 bloques del sistema de ficheros. Cada bloque posee un tamaño
de 1024 bytes. Si se necesita acceder a un registro de 100 bytes que empieza en el byte 1000 del
archivo y se utiliza un política contigua de gestión del espacio en disco, ¿cuántos accesos a bloques
del sistema de ficheros debo realizar asumiendo que la información del directorio donde se
encuentra el fichero está en memoria?
a) 1
b) 2
c) 3
d) 4

7. Si un sistema de archivos tipo FAT posee 65536 clusters, entonces el tamaño mínimo de la FAT
será de:
a) 32 Kbytes
b) 64 Kbytes
c) 128 Kbytes
d) 256 Kbytes

8. En un sistema de memoria virtual y de cara a minimizar el tiempo de traducción de direcciones, es


mejor soportar el área de intercambio usando:
a) Una partición del disco específicamente dedicada para tal fin
b) Ficheros haciendo accesos directo
c) Ficheros haciendo accesos secuenciales
d) Ficheros haciendo accesos indexados
SO – examen 20080618 – segunda parte – pag. 2/5
9. Suponga un disco con 200 pistas y se tiene el siguiente conjunto de peticiones a disco: 99, 184, 38,
123, 15, 125, 66 y 68. Si la cabeza acaba de atender una petición en la pista 54 moviéndose en
sentido ascendente y se aplica una política C-LOOK. ¿Qué petición se atendería en séptimo lugar?
a) 15
b) 68
c) 38
d) 66

10. Para una dirección lógica con el formato [número de segmento (2 bits), número de página (16
bits), desplazamiento de la página (8 bits)]:
a) El número de páginas por segmento es 224
b) El número de segmentos totales es 2 y el tamaño máximo del segmento es 224 bytes
c) El espacio lógico de direcciones es de 64Mbytes
d) El número de páginas por segmento es 216 pero el tamaño de página depende del tamaño
del segmento

11. Suponga que un archivo posee 50 bloques del sistema de ficheros. Cada bloque posee un tamaño
de 1024 bytes. Si se necesita acceder a un registro de 100 bytes que empieza en el byte 1019 del
archivo y se utiliza un política encadenada de gestión del espacio en disco utilizando doble
encadenamiento con enlaces de 4 bytes ¿cuántos accesos a bloques del sistema de ficheros debo
realizar asumiendo que la información del directorio donde se encuentra el fichero está en
memoria??
a) 1
b) 2
c) 3
d) 4

12. La tabla de páginas de un determinado proceso indica que la página 2 tiene asociado el marco 7.
El tamaño de la memoria física es de 65536 bytes. Si en el sistema tenemos 32 marcos de página,
¿Cuál es la dirección lógica asociada a la dirección física 14661?
a) 7*2*2*1024+325
b) 7*2*1024+1676
c) 2*2*1024+325
d) 7*2*1024+325

13. Conociendo el tamaño de página, entonces el tamaño de la memoria principal lo podría obtener a
partir de:
a) La tabla de páginas
b) La tabla de marcos de páginas
c) La tabla de franjas de página
d) Todas las anteriores son falsas

SO – examen 20070621 – segunda parte – pag. 3/5


14. El esquema de control de acceso a archivos en Linux es:
a) Una aproximación al esquema de protección por clave
b) Una aproximación al esquema de protección por criptografía
c) Una aproximación al esquema de protección por listas y grupos de acceso
d) No es una aproximación de las anteriores, es un tipo de esquema propio

15. El esquema de gestión de memoria que más facilita la compartición de zonas de memoria es:
a) Contiguo con particiones de tamaño fijo
b) Contiguo con particiones de tamaño variable
c) Segmentado
d) Segmentado - Paginado

3 (2,5 puntos) En una estación de servicio existen tres surtidores, uno para gasolina,
otro para gasoil y otro para biocombustible. En cada surtidor se puede atender a un
solo vehículo en cada instante, estando ubicados en vías de capacidad finita para los
vehículos en espera, específicamente la vía para la gasolina tiene capacidad Cg
vehículos, la del gasoil Cd y la del biocombustible Cb. El reportaje es realizado por el
propietario del vehículo, de forma que cuando un vehículo llega a la estación este
solicita el repostar (Solicitar_Repostaje) mediante una petición en la que especifica el
tipo de combustible que necesita, si la vía asociada al tipo de combustible requerido
está llena, entonces debe irse inmediatamente, en caso contrario deberá esperar si otro
vehículo está respostando o repostar inmediatamente si no hay vehículo repostando. Al
terminar informa de la finalización del repostaje (Finalizar_Repostaje). Los vehículos
deben ser procesos concurrentes. Utilizando monitores (estilo mesa) plantee una
solución que permita el repostaje de los vehículos cumpliendo los requisitos
expresados.

SO – examen 20080618 – segunda parte – pag. 4/5


Type surtidor = Monitor

type t_combustible is (gasoil, gasolina, biocombustible);


type t_estado_surtidor is (ocupado, disponible);

// contadores, equivalen a Nd, Ng, Nb


en_cola : array(t_combustible) of natural := (0,0,0);

capacidad : array(t_combustible) of natural := (Cd,Cg,Cb);


surtidor : array (t_combustible) of t_estado_surtidor := (disponible, disponible, disponible);
cola : array (t_combustible) of Condición;

Procedure entry Solicito_Repostar( combustible : t_combustible, Ha_Repostado : out boolean )


begin
If en_cola(combustible) = capacidad(combustible) then
Ha_Repostado := false;
else
if surtidor(combustible) = OCUPADO then
en_cola(combustible) := en_cola(combustible)+1;
cola(combustible).WAIT;
en_cola(combustible) := en_cola(combustible) – 1;
else
surtidor(combustible) := OCUPADO;
end if;
Ha_Repostado := true;
end if;
end;

Procedure entry Fin_Repostaje( combustible : t_combustible)


begin
If en_cola(combustible) > 0 then
cola(combustible).SIGNAL();
else
surtidor(combustible) : = DISPONIBLE;
end if;
end;

end

SO – examen 20070621 – segunda parte – pag. 5/5


Calificación

1
2
3
SISTEMAS OPERATIVOS 4
Convocatoria de junio, 19 de junio de 2008 – PRIMERA PARTE

Titulación
Nombre

*** S O L U C I O N E S ***
Dispone de dos horas para completar el examen

1 (6 puntos) Test. Marque las opciones correctas de cada apartado. En caso de que existan
varias opciones ciertas, se considerará como correcta la más completa o precisa. Las
preguntas no contestadas no puntúan; las mal contestadas puntúan negativamente restando un
tercio de su valor. Marque la opción correcta rodeándola con un círculo. Si se equivoca, tache
la respuesta equivocada y rodee la opción correcta. Escriba con tinta. Las preguntas
respondidas con lápiz o con varios círculos no tachados se considerarán no contestadas.
1. ¿Cuál de estas políticas es más aconsejable para implementar un sistema de tiempo real
crítico?
a) FCFS
b) Round Robin
c) *Prioridades expulsivo
d) Prioridades no expulsivo
2. Tenemos varios procesos que intentan acceder a secciones críticas sobre una zona de datos, y
observamos que el algoritmo sólo funciona bien cuando hay tres o más procesos interesados en
entrar en su sección crítica al mismo tiempo: si sólo hay dos procesos intentando entrar en la
sección crítica, el algoritmo los deja esperando hasta que se incorpora un tercero.
En este caso, este algoritmo es:
a) válido, suponiendo que aparte de esta incidencia, cumple con la exclusión mutua,
progreso y espera indefinida
b) *inválido, porque no cumple la condición de progreso
c) inválido, porque no cumple la condición de espera indefinida
d) inválido, porque no cumple la condición de exclusión mutua
3. Cuando existen varios procesos en espera por un semáforo y éste queda disponible, ¿cuál de
los procesos en espera se desbloquea?
a) el que lleva más tiempo esperando
b) el que tenga más prioridad
c) el que tenga más prioridad, y en caso de empate, el que lleve más tiempo esperando
de los empatados
d) *depende de la implementación del semáforo
4. Una interrupción se puede atender...
a) sólo si cuando la interrupción ocurre, el procesador se encuentra en modo privilegiado
b) sólo si cuando la interrupción ocurre, el procesador se encuentra en modo usuario
c) *tanto si el procesador se encuentra en modo privilegiado como en modo
usuario, pero al atenderla, el procesador conmuta a modo privilegiado
d) ninguna de las anteriores es cierta
5. ¿Cuál de estas políticas consigue un mejor tiempo medio de espera?
a) FCFS
b) *SJF (expulsivo o no)
c) Round Robin
d) Multicola FCFS + Round Robin
6. Suponga un computador que va instalado dentro de una sonda espacial destinada a explorar la
superficie de Marte. Este computador se encarga del desplazamiento de la sonda, ejecutando
tareas tales como accionar las ruedas, detener la sonda si el nivel eléctrico es bajo y reaccionar
ante choques con obstáculos imprevistos. ¿Qué tipo de sistema operativo sería más adecuado
para este computador?
a) un sistema por lotes
b) un sistema de tiempo compartido
c) *un sistema de tiempo real
d) un sistema distribuido
7. Un sistema multiusuario:
a) debe tener la capacidad para la ejecución concurrente de varios procesos
b) permite que varios usuarios trabajen al mismo tiempo sobre él
c) debe repartir la memoria principal entre los distintos usuarios
d) *ninguna de las afirmaciones es correcta en todos los casos
8. ¿Cuál de estas llamadas al sistema considera usted más esencial en un sistema operativo no
multiprogramado?
a) crear un semáforo
b) solicitar un bloque de memoria libre
c) regresar a la cola de preparados (Yield)
d) *cargar y ejecutar un programa
9. A un planificador de procesos que tiene la cola de preparados vacía llegan al mismo tiempo seis
procesos, todos de duración 2 u.t. Si no ocurren más eventos externos mientras se atiende a
estos seis procesos, ¿cuál será el tiempo medio de espera para este conjunto de procesos?
a) 5 u.t. para FCFS
b) 5 u.t. para FCFS y SJF
c) *5 u.t. para FCFS, SJF y RR con cuanto igual a 2 u.t.
d) 5 u.t. para cualquier algoritmo de planificación
10. Para el caso del apartado anterior, suponga que le añadimos la restricción de que existe un
planificador de largo plazo que no permite que existan más de tres procesos ejecutándose en el
planificador de corto plazo. ¿Variaría en algo la respuesta anterior?
a) *no, la respuesta correcta seguiría siendo la misma
b) la respuesta correcta sería diferente, ya que el tiempo medio de espera sería siempre
mayor que 5 u.t. para cualquier algoritmo
c) la respuesta correcta sería diferente, ya que el RR con cuanto igual a 2 u.t. daría un
tiempo de espera mayor
d) la respuesta correcta sería diferente, ya que el orden de ejecución de los procesos
variaría en los algoritmos planteados en el anterior apartado
11. Gracias a la utilización de máquinas virtuales,
a) podemos hacer que el núcleo de nuestro sistema operativo sea más eficiente, ya que
se utilizan menos pasos intermedios para resolver una llamada al sistema
b) *podemos hacer coexistir simultáneamente varios sistemas operativos sobre el
mismo hardware
c) podemos construir sistemas operativos más resistentes a los fallos del hardware,
especialmente de los periféricos de E/S
d) todas las afirmaciones anteriores son ciertas
12. ¿Cuál de las siguientes afirmaciones es correcta?
a) El modo dual de operación se ha diseñado para que los programas de usuario
obtengan acceso pleno a todos los recursos del sistema con total libertad.
b) *Cuando se produce una interrupción, la CPU conmuta a modo
privilegiado/supervisor.
c) Las instrucciones de desactivación de interrupciones se ejecutan normalmente en
modo de usuario.
d) Las instrucciones lectura del reloj del sistema normalmente deberían ser operaciones
privilegiadas.
13. ¿Cuáles de estas parejas de algoritmos no se pueden combinar para construir un sistema
multicola?
a) FCFS con Round-Robin
b) Un algoritmo expulsivo con un algoritmo basado en prioridades
c) Round-Robin con un algoritmo basado en prioridades
d) *todas las anteriores combinaciones se pueden utilizar
14. ¿Qué módulo del sistema operativo se encarga habitualmente de atender las llamadas al
sistema?
a) la API
b) el dispatcher o despachador
c) el intérprete de órdenes o shell
d) *el núcleo
15. Si un proceso ejecuta una operación P sobre un semáforo binario,
a) el proceso se bloquea hasta que otro proceso invoque una operación P
b) el proceso se bloquea hasta que otro proceso invoque una operación V
c) *el proceso se bloquea solamente si el semáforo tiene valor cero
d) el proceso se bloquea solamente si el semáforo tiene valor uno

2 (2 puntos) En relación con las soluciones al problema de la sección crítica:


¿Es posible que exista un algoritmo que cumpla el requisito de exclusión mutua, pero que no
cumpla el requisito de progreso?
El requisito de exclusión mutua se puede cumplir perfectamente con un algoritmo
que no permita entrar NUNCA a ningún proceso en su sección crítica. Como nunca
hay nadie en sección crítica, siempre se verifica que no hay más de un proceso en
Nombre

ella. Pero ese algoritmo trivial no cumple el requisito de progreso, ya que,


obviamente, el sistema nunca toma una decisión de dejar entrar a nadie.
Hay otros algoritmos menos triviales que sólo cumplen el requisito de
exclusión mutua. Uno que hemos presentado en la asignatura es la solución para
dos procesos basada en la variable «turno», que va alternando el derecho de entrar
en sección crítica entre un proceso y otro. En esta solución, un proceso que quiere
entrar en su sección crítica y que no tenga el turno debe esperar a que su
compañero entre en la sección crítica; si el compañero no está interesado, no se
cumple el requisito de progreso, ya que se está impidiendo a un proceso entrar en
sección crítica aunque no haya conflicto.

¿Y es posible que exista un algoritmo que cumpla los requisitos de exclusión mutua y de
progreso, pero que no cumpla el de espera limitada?
Un algoritmo de sección crítica que cumpla exclusión mutua y progreso, pero no
espera indefinida puede ser la solución básica con instrucciones atómicas (test-and-
set o swap). Este es el algoritmo básico con test-and-set:

while test-and-set (cerrojo) { NADA; }


... sección crítica ...
cerrojo = false;

El algoritmo consigue exclusión mutua: si varios procesos intentan acceder al mismo


tiempo al cerrojo, sólo uno de ellos consigue ponerlo a «true», debido a que «test-
and-set» se ejecuta de forma indivisible. Además, si uno o varios procesos intentan
entrar en sección crítica estando libre, sabemos que uno de ellos acabará saliendo
del bucle «while», así que se cumple el requisito de progreso. Sin embargo, este
algoritmo no garantiza una espera limitada, ya que en caso de que varios procesos
compitan por la sección crítica, el ganador puede ser uno cualquiera de ellos, sin que
se respete la antigüedad de los contendientes o el número de veces que han
conseguido entrar en el pasado. O sea que un proceso puede verse postergado
indefinidamente y no entrar jamás en sección crítica, situación improbable en la vida
real pero teóricamente posible, y que por tanto incumple el requisito de espera
limitada.

Otro algoritmo que no cumple la condición de espera limitada es la solución básica


con semáforos, en determinadas circunstancias:

P (cerrojo)
... sección crítica ...
V(cerrojo)

Esta solución funciona bien a grandes rasgos, pero el cumplimiento de la espera


limitada depende de cómo esté implementado el semáforo y cuál sea la política de
gestión de los procesos que esperan en la «P». Si el semáforo se gestiona como una
cola FIFO no hay problema. Pero si el semáforo se gestiona como una cola de
prioridades, no podemos garantizar espera limitada de un proceso con muy baja
prioridad. Ocurre lo mismo si la operación «P» se implementa con un bucle de
espera activa (spinlock), ya que en caso de espera simultánea de varios procesos,
no podemos asegurar quién se libera cuando la sección crítica queda libre.

¿Por qué la solución consistente en desactivar las interrupciones mientras dura la sección
crítica no se considera una solución universalmente aceptable?
Porque es una solución que depende de la existencia de un sistema centralizado de
control de interrupciones, que no está disponible en todas las arquitecturas. En
particular, esta solución no es aplicable en muchos entornos multiprocesadores, en
los que cada procesador dispone de su propia línea de interrupciones. Cada
procesador puede desactivar sus propias interrupciones, pero no puede hacerlo
simultáneamente en todos los otros procesadores. Como la desactivación
generalizada de las interrupciones en todos los procesadores no será atómica, no
sirve de base para construir una solución a la sección crítica.

3 (1 punto) Para planificar procesos en un sistema multiprocesador podemos implementar


las colas de preparados de dos formas: o bien utilizamos una única cola de preparados
compartida por todos los procesadores; o bien hacemos que cada procesador disponga de su
propia cola de preparados. ¿Qué ventajas e inconvenientes tiene cada una de las dos
técnicas?
Si empleamos una única cola de preparados, tenemos el inconveniente de que
debemos tratar adecuadamente el acceso simultáneo a dicha cola por parte de los
procesos del sistema. Para evitar que la cola se corrompa, debemos garantizar
exclusión mutua en las operaciones más básicas, como la inserción y extracción. Por
el contrario, si cada procesador trabaja con su propia cola, no hay conflictos de uso.
Si cada procesador tiene su propia cola, el problema del acceso simultáneo ya no
existe, pero nos surge un inconveniente más complicado de tratar: el desequilibrio de
la carga de trabajo. Un procesador puede tener su cola completamente vacía y al
mismo tiempo otro procesador puede estar saturado de trabajo. Si queremos
aprovechar al máximo los procesadores, estamos obligados a transportar procesos
de un procesador a otro si alguno de ellos queda ocioso. Este problema no existe si
sólo hay una cola, ya que cuando un procesador queda libre, sólo tiene que acudir a
la cola para dar servicio a otro proceso.

4 (1 punto) Suponga que tenemos un sistema con una cantidad de procesadores infinita.
¿Seguiría teniendo sentido que el sistema operativo se preocupe por gestionar este recurso de
capacidad infinita? ¿Qué algoritmos de planificación aplicaría usted en este sistema?
Si el número de procesadores fuera ilimitado, no tendríamos que preocuparnos por
repartir cada procesador entre varios procesos, ni aprovechar el tiempo ocioso de un
procesador cuando el proceso actual se bloquea. Es decir, cada proceso podría tener
asignado un procesador para él en exclusiva, sin límites de tiempo, prioridades
respecto a sus compañeros, etc. El algoritmo de planificación para este sistema
puede ser tan sencillo como dejar ejecutarse de inmediato a cualquier proceso que
pase al estado de preparado. El procesador se le puede asignar en el arranque del
proceso. No haría falta ni siquiera llevar una lista de procesadores libres u ocupados:
tan sólo haría falta numerarlos y concederlos a los procesos en orden ascendente.
En el supuesto sólo nos han mencionado que los procesadores son infinitos, pero no
se nos indica nada al respecto de otros recursos, como por ejemplo la memoria. Si
hubiera recursos escasos, sí que tendría sentido aplicar políticas convencionales de
planificación, para evitar que se sature alguno de esos recursos. Por ejemplo, si la
memoria tiene un tamaño limitado, el número de procesos que pueden estar
presentes también es limitado y por tanto, cuando llega un nuevo proceso, tiene
sentido aplicar una política que limite su ejecución en función de parámetros como su
prioridad, consumo estimado de memoria, etc.
Calificación

1
2

SISTEMAS OPERATIVOS - SEGUNDA PARTE


Examen Convocatoria Ordinaria, 19 de junio de 2008

Nombre Titulación

Dispone de dos horas para realizar el examen

1 (7,5 puntos) Test. En cada uno de los siguientes apartados, señale cuál opción es
correcta. En caso de que existan varias opciones ciertas, se considerará como correcta
la más completa o precisa. Las preguntas no contestadas no puntúan; las contestadas
erróneamente puntúan negativamente restando un tercio de su valor. Señale sus
respuestas rodeando con un círculo la opción correcta. Si se equivoca, tache la
respuesta incorrecta y rodee la opción que considere correcta. Escriba con tinta. Las
preguntas respondidas con lápiz o con varios círculos no tachados se considerarán no
contestadas.

1. La tabla de páginas de un determinado proceso indica que la página 2 tiene asociado el marco 7.
El tamaño de la memoria física es de 65536 bytes. Si en el sistema tenemos 32 marcos de página,
¿Cuál es la dirección física asociada a la dirección virtual 4421?
a) 7*2*2*1024+325
b) 7*2*1024+1676
c) 2*2*1024+325
d) 7*2*1024+325

2. Suponga que desea almacenar un fichero de 35MB de datos para posteriormente realizar un
acceso secuencial al mismo:
a) Emplearía asignación contigua ya que ocuparía el menor espacio en el sistema y
además el acceso es más eficiente
b) Lo mejor sería emplear asignación indexada de un nivel ya que ocuparía el mismo espacio
que en la asignación contigua al ser el fichero muy pequeño
c) Emplearía asignación enlazada con FAT ya que permite el acceso directo si mantenemos
la FAT en memoria y en el caso de archivos pequeños ocupa el mismo espacio que con
asignación contigua
d) Todas las anteriores son ciertas

SO – examen 20080619 – segunda parte – pag. 1/6


3. Un computador gestiona la memoria mediante un esquema paginado de doble nivel con una
estructura de direcciones de 32 bits. Si se tienen 10 bits para páginas de un primer nivel, 11 para el
segundo y 11 para el desplazamiento en la página ¿Qué tamaño máximo tendrá el espacio
direccionable de los programas?
a) 2 Gbytes
b) 4 Gbytes
c) 6 Gbytes
d) No puedo afirmar nada sobre el tamaño de dicho espacio

4. En relación a la gestión de memoria:


a) Una política de asignación contigua del espacio de los procesos y particiones fijas tiene
más fragmentación interna que una política de particiones variables
b) En un sistema de gestión de memoria paginada se produce fragmentación interna
independientemente de cómo se realice la gestión del espacio libre
c) La fragmentación externa corresponde al hecho de que una partición disponible no se
utiliza porque es muy pequeña para cualquiera de los procesos que esperan cargarse en
memoria
d) Todas las anteriores son ciertas

5. En un sistema de archivos que utiliza asignación encadenada con FAT y tamaño de bloque de
1Kb, ¿Cuántos accesos a disco son necesarios para acceder al byte 7000 de un fichero?
(suponiendo que tanto la tabla de archivos abiertos como la FAT se encuentran en memoria)
a) 2
b) 6
c) 1
d) 7

6. Ninguna arquitectura actual implementa tamaños de página entre 800 bytes y 1000 bytes. ¿A qué
cree que es debido?
a) A que los fabricantes de chips de memoria paginan sus bloques de memoria físicos con
unos tamaños prefijados y por tanto no se puede decidir libremente el tamaño de la página
b) Estos tamaños de página obligarían a diseñar una MMU mucho más compleja que
la que se utiliza para trabajar con los tamaños usados realmente
c) Debido al tamaño que tienen las aplicaciones actuales, originan demasiada fragmentación
interna
d) El número de páginas que tendría la tabla de páginas en una arquitectura de 32 bits o de
64 bits sería enorme, y por ello las arquitecturas de memoria prefieren trabajar con
tamaños mayores

7. Un sistema posee una memoria física de 64 Kb dividida en marcos de página de 512 bytes. Un
programa tiene un código de tamaño 32800 bytes, datos de 16386 bytes y una pila de 15870 bytes.
¿ Se puede cargar este programa en memoria?
a) Imposible
b) Solo el código
c) Posible
d) Se puede si no se carga la pila

SO – examen 20080619 – segunda parte – pag. 2/6


8. Considere un computador que utiliza paginación de nivel único. El tiempo medio de acceso a
memoria principal es de 80 nseg. El procesador posee una TLB cuyo tiempo de acceso es de 10
nseg. ¿Cuál es la tasa de aciertos mínima que ha de tener la TLB para que el tiempo medio de
acceso a un dato sea inferior a 100 nseg?
a) 85,7%
b) 87,5%
c) Los datos del enunciado no tienen sentido
d) Ninguna de las anteriores

9. La interrupción de fallo de página la puede producir:


a) El proceso que está en ejecución (activo)
b) El proceso que está en el estado preparado
c) El proceso que está bloqueado, esperando una página de disco
d) Desde cualquier estado de los anteriores

10. En la tabla de segmentos se especifica que el segmento 0 tiene como base 500 y longitud 500, el
segmento 3 tiene como base 2634 y longitud 650. ¿A qué direcciones físicas corresponden las
direcciones virtuales (3:558) y (0:950), dadas en el formato (nº de segmento:desplazamiento)?
a) 3192 y error de direccionamiento respectivamente
b) Error de direccionamiento y 1450 respectivamente
c) 3192 y 1450 respectivamente
d) Error de direccionamiento en ambos casos

11. En un sistema operativo multitarea, con 8 Kb de espacio lógico de procesos, con páginas de 1Kb
y 32 Kb de memoria física, sin memoria virtual, la tabla de páginas ocupará como mínimo:
a) 8*5 bits
b) 32*5 bits
c) 8*3 bits
d) 32*3 bits

12. En un sistema operativo se utiliza una estructura de nodos-i similar a la de Unix. Los bloques son
de 2048 bytes. Las entradas en los nodos-i dedican 64 bits al tamaño del archivo y 32 bits a los
punteros de los bloques. El nodo-i tiene 8 entradas de direccionamiento directo, una de
direccionamiento indirecto simple y otra de direccionamiento indirecto doble. La entrada de
archivos abiertos tiene una entrada para cada archivo con un campo de 64 bits que indica el
desplazamiento. En este sistema, el tamaño máximo de un archivo que utiliza todo el disco es:
a) 262664 bloques
b) 232 bloques
c) 253 bloques
d) 264 bloques

SO – examen 20080619 – segunda parte – pag. 3/6


13. El termino reubicable se refiere a:
a) La asignación a un programa de un conjunto fijo de direcciones de memoria especificadas
en tiempo de ejecución
b) La posibilidad de cargar y ejecutar un programa dado en un lugar arbitrario de
memoria
c) Las operaciones de eliminar de la memoria principal procesos suspendidos, llevarlos a
disco y cargar del disco a la memoria principal procesos para su ejecución
d) Las tareas del sistema operativo realizadas en tiempo de ejecución

14. Dada la siguiente cadena de referencias a páginas: 2, 4, 5, 4, 6, 7, 4, 2, 1, 4, 7, 3. Si el sistema


dispone de cuatro marcos de memoria principal:
a) Se generan 9 fallos de página si se aplica un algoritmo FIFO para el reemplazo de páginas
b) Se generan 8 fallos de página si se aplica el algoritmo de segunda oportunidad para el
reemplazo de páginas
c) Se generan 9 fallos de página para ambos algoritmos, FIFO y segunda oportunidad
d) La a y la b son ciertas

15. Suponga un sistema de archivos que utiliza asignación indexada de espacio en disco donde la
representación de espacio libre se lleva a cabo mediante un mapa o vector de bits. Si se reduce el
tamaño de bloque del sistema de archivos
a) Aumentará la fragmentación externa
b) Disminuirá la fragmentación interna
c) Dismunuirá el tamaño del mapa de bits
d) Ninguna de las anteriores es cierta

2 (2,5 puntos) En una fábrica se tienen dos tipos de procesos que modelan una planta
embotelladora de bebidas, y que trabajan en paralelo:
• Los procesos "Embotelladores" se encargan de preparar botellas de un litro.
• Un proceso "Empaquetador" se encarga de empaquetar y reponer las cajas
donde se van colocando las botellas.
Cada vez que los embotelladores preparan una botella, ésta se coloca en una caja, que
tiene una capacidad de N litros. Si al colocar la botella, la caja queda llena, se envía una
señal al empaquetador, que toma la caja, la sella y la guarda en un almacén. El
empaquetador deposita una nueva caja de N litros, totalmente vacía. Mientras el
empaquetador está haciendo su labor, los embotelladores no pueden colocar sus
botellas, ya que en esos momentos no hay una caja disponible. Encontrar una solución
basada en monitores que sincronice el problema de concurrencia citado.

SO – examen 20080619 – segunda parte – pag. 4/6


Monitor Gestor_Recurso
{
boolean empaquetadoravisado;
condition empaquetador, embotelladores;
int litros;

Procedure entry PonerBotella() {


// Si no hay hueco
while (litros == 0) {
if (!empaquetadoravisado) { // Si el empaquetados no está avisado
empaquetadoravisado = true;
empaquetador.signal(); // Aviso al empaquetador
}
embotelladores.wait(); // Espero por una caja vacía
}
// Coloco la botella en la caja
litros--;
}
}

Procedure entry RetirarLlenaPonerVacia()


{
if (!empaquetadoravisado) // Si la caja no está llena
empaquetador.wait(); // Espero a que se llene
empaquetadoravisado = false;
litros = N; //Pongo una caja vacía
embotelladores.broadcast(); // Aviso a todos los embotelladores esperando
}

// Código de inicialización
litros = N;
empaquetadoravisado = false;
}

SO – examen 20080619 – segunda parte – pag. 5/6


Gestor_Recurso ControlCajas;

Proceso Embotellador() {
while (dure la jornada de 65 horas semanales) {
// Voy a la fuente a llenar la botella
ControlCajas.PonerBotella();
// Cojo aire para volver a la fuente
}
}

Proceso Empaquetador() {
while (dure la jornada de 65 horas semanales) {
// Me tomo un respiro para cargar la caja y poner una vacía
ControlCajas.RetirarLlenaPonerVacia();
//Llevo la caja al almacén, que está cerca, a 1 KM
}
}

SO – examen 20080619 – segunda parte – pag. 6/6


Calificación

1
2
3
4
SISTEMAS OPERATIVOS, 11 de setiembre de 2008 5
Examen Convocatoria Extraordinaria Especial

Nombre Titulación
SOLUCION

Dispone de tres horas y media para completar el examen

1 (3 puntos) Test. Marque las opciones correctas de cada apartado. En caso de que existan
varias opciones ciertas, se considerará como correcta la más completa o precisa. Las preguntas no
contestadas no puntúan; las mal contestadas puntúan negativamente restando un tercio de su valor.
Marque la opción correcta rodeándola con un círculo. Si se equivoca, tache la respuesta equivocada
y rodee la opción correcta. Escriba con tinta. Las preguntas respondidas con lápiz o con varios
círculos no tachados se considerarán no contestadas.

1. A la hora de buscar n bloques libres en un sistema de archivos, en general el esquema de


representación de los bloques libres más eficiente es
a. El vector, o mapa, de bits.
b. La lista encadenada.
c. La lista encadenada con agrupamiento.
d. La lista encadenada con recuento.
2. Si una solución al problema de la sección crítica cumple la propiedad de espera limitada:
a. Cumplirá también el progreso ya que al garantizarse que la espera es limitada, la
decisión se toma en un tiempo finito tal y como indica la propiedad de progreso.
b. Cumplirá tanto el progreso como la propiedad de exclusión muta.
c. Indica que la decisión sobre el proceso que entra se toma en un tiempo finito.
d. Ninguna de las anteriores es cierta.
3. Un sistema operativo independiente de dispositivo:
a. Indica que el sistema operativo está liberado de realizar la gestión de E/S.
b. La gestión de E/S no es capaz de distinguir entre los diferentes periféricos.
c. Designa de manera uniforme a cada uno de los dispositivos, por ejemplo, en
Unix se referencian como archivos.
d. No utiliza manejadores de dispositivo, sólo de interrupciones.
4. De las siguientes estructuras de datos ¿cuál se utiliza para representar tanto los bloques libres
de un sistema de archivos como para obtener los bloques pertenecientes a un fichero?
a. El vector, o mapa, de bits.
b. La FAT.
c. El directorio.
d. La lista encadenada con agrupamiento.

5. La anomalía de Belady consiste en que:


a. Al aumentar el grado de multiprogramación, aumentan los fallos de página.
b. Al aumentar el número de marcos de página para asignación, aumentan los
fallos de página.
c. Al disminuir el número de marcos de página para asignación, aumentan los fallos de
página.
d. Al disminuir el tamaño de las páginas, aumentan los fallos de página.
6. La generación de direcciones físicas en un sistema de memoria segmentada le corresponde a este
componente:
a. El compilador.
b. El enlazador (linker).
c. El cargador.
d. La MMU.
7. Las llamadas al sistema:
a. Son servicios del sistema operativo que no pueden ser invocados por los procesos de
usuario ya que deben ejecutarse en modo privilegiado.
b. Son órdenes del intérprete de órdenes.
c. Son programas del núcleo del sistema operativo.
d. Ninguna de las anteriores es cierta.
8. Un sistema operativo que permite compartir recursos distribuidos, pero que no llega a ofrecer
una visión uniforme y transparente de esos recursos se denomina:
a. Sistema operativo distribuido.
b. Sistema operativo de red.
c. Sistema operativo centralizado.
d. Ninguno de los anteriores.
9. ¿Cuál de estas políticas de reemplazo de páginas es menos costosa de implementar?
a. LRU.
b. Algoritmo del reloj.
c. Óptima.
d. FIFO.
10. ¿Cuál de las siguientes afirmaciones es falsa en un sistema multiprogramado con una única CPU?
a. Se pueden ejecutar N procesos concurrentemente.
b. Se pueden ejecutar N procesos en paralelo.
c. Se pueden tener N procesos, tantos como indique el grado de multiprogramación.
d. Se pueden tener N procesos, cada uno definido según su bloque de control de procesos.
Nombre

11. El planificador a medio plazo selecciona un proceso


a. De entre los recién llegados para pasar a la cola de preparados.
b. De entre los de la cola de preparados para pasar a ejecución.
c. De entre los suspendidos en memoria principal para pasar a la cola de preparados.
d. De entre los suspendidos en memoria secundaria para pasar a la cola de
preparados.
12. ¿Cuál de estas técnicas de gestión de memoria no padece fragmentación interna?
a. Paginación.
b. Segmentación.
c. Particiones múltiples de tamaño fijo (MFT).
d. Todas las anteriores padecen algún tipo de fragmentación interna.
13. Se denomina intercambio o swapping
a. El hecho de que una tarea reemplace a otra en el estado de ejecución siguiendo una
estrategia de expropiación.
b. El hecho de que una tarea reemplace a otra en el estado de ejecución de acuerdo con el
planificador a corto plazo.
c. El hecho de salvar una tarea suspendida en memoria secundaria.
d. La aplicación de cualquier algoritmo de sustitución de páginas cuando se produce un
fallo de página.
14. El problema de la sección crítica aparece porque:
a. En los sistemas multiprocesadores actuales, varios procesos concurrentes pueden
acceder a un mismo conjunto de datos.
b. En los sistemas multiprogramados, varios procesos concurrentes pueden acceder
a un mismo conjunto de datos.
c. El sistema operativo debe acceder a tablas privilegiadas que pertenecen a varios
procesos.
d. Todas las anteriores son ciertas.
15. En un sistema multihilo,
a. Los cambios de contexto entre hilos de diferentes procesos pesados son en general más
costosos que los cambios de contexto entre hilos de un mismo proceso pesado.
b. Los hilos pueden estar soportados e implementados por el propio sistema operativo o
bien pueden ser implementados a nivel de usuario.
c. Los hilos de un mismo proceso pesado comparten las variables globales y por tanto la
comunicación entre ellos se puede realizar mediante variables compartidas.
d. Todas las anteriores son ciertas.
2 (1,75 puntos) Suponga un sistema de memoria paginada que maneja direcciones de memoria
lógicas de 24 bits y direcciones físicas de 32 bits. El tamaño de página es de un kilobyte.
a) ¿Cuánta memoria puede direccionar un proceso? (0.16 puntos)
b) ¿Cuántos marcos de página puede llegar a tener este sistema? (0.16 puntos)
c) ¿Cuántas páginas diferentes puede llegar a tener un proceso? (0.15 puntos)
d) ¿Cuántas páginas ocuparía un proceso que consume 3 megabytes de memoria? (0.16
puntos)
e) ¿Qué explicación puede tener que las direcciones lógicas y físicas sean de diferentes
tamaños? ¿Tiene esto alguna utilidad? (0.35 puntos)
f) ¿Qué sistema de traducción de direcciones le parece más apropiado para este sistema: un
solo nivel de paginación, o dos niveles de paginación? (0,21 puntos)
g) Suponiendo que el sistema trabaja con un solo nivel de paginación, ¿cuántos elementos
como máximo puede tener la tabla de páginas? (0,21 puntos)
h) En un momento dado, encontramos un proceso que direcciona 50 páginas lógicas, pero si
observamos los marcos de página, sólo 30 de ellos están asignados a este proceso. ¿Cómo
puede ser que el proceso tenga más páginas lógicas que marcos asignados? (0.35 puntos)

SOLUCIÓN:
a) 2^24 = 16 megabytes.

b) 2^32 / 2^10 = 2^22 = aprox. 4 millones.

c) 2^24 / 2^10 = 2^14 = 16.384 páginas.

d) 3 mebagytes = 3 x 2^20 bytes = 3 x 2^20 / 2^10 páginas = 3 x 2^10 páginas = 3.072 páginas.

e) En esta arquitectura, el espacio lógico (2^24 palabras) es bastante más pequeño que el espacio
físico (2^32 palabras). Esto significa que un proceso no puede direccionar al mismo tiempo todo el
espacio físico. A primera vista, esto supone una limitación arbitraria que restringe fuertemente la
capacidad de direccionamiento de los procesos. Pero puede haber algunas justificaciones a este
esquema.
Una posible explicación a esta restricción es que en este sistema suele haber muchos procesos en
ejecución al mismo tiempo con distintos espacios lógicos de memoria, de manera que aunque un
solo proceso no aprovecha todo el espacio disponible, el conjunto de todos ellos sí lo hace. Las
direcciones lógicas se mantienen cortas y así el código máquina es algo más compacto que en el
caso de tener direcciones de 32 bits.
Otro posible motivo para que este sistema esté así configurado es que los procesos ejecutan código
de alguna arquitectura antigua de 24 bits, mientras que el hardware es más moderno y trabaja con
direcciones de memoria más anchas. Sin necesidad de recompilar los programas, podemos seguir
ejecutándolos y aprovechar mejor la memoria física de 32 bits si tenemos multiprogramación.
Finalmente, esta configuración también puede verse como una medida (bastante radical) para
evitar que un solo proceso acapare demasiada memoria: su asignación de espacio se le limita
físicamente a 16 megabytes.
Nombre

f) En este sistema, un proceso de gran tamaño tendrá una tabla de páginas que puede superar con
creces el kilobyte que ocupa un único marco de página. Por ejemplo, si cada entrada de la tabla
ocupa 3 bytes, basta con que el proceso tenga 400 páginas para que la tabla necesite consumir dos
marcos.
Si la tabla de páginas consume varios marcos, estos deberán ser contiguos para que la MMU
pueda realizar su trabajo. Y como necesitamos asignar varios marcos contiguos, nos aparece el
problema de la fragmentación externa, que es lo que la paginación debería resolver
definitivamente. Este es exactamente el motivo por el cual muchos sistemas paginan la tabla de
páginas y por tanto utilizan un esquema de varios niveles de paginación. Así que en el sistema
propuesto, es más recomendable trabajar con dos niveles de paginación, con el fin de reducir el
problema de la fragmentación cuando se asigna espacio para la tabla de páginas.

g) Como máximo, un proceso puede tener 2^24 / 2^10 = 2^14 = 16.384 páginas. Este número es la
máxima cantidad de elementos que podría llegar a tener una tabla de páginas

h) Una posible explicación es que el proceso está compartiendo marcos de página con otros
procesos, o con el sistema operativo. Por ejemplo, algunas de las páginas lógicas pueden estar
apuntando a páginas de código de una DLL que ha sido asignada a otro proceso, o a datos de sólo
lectura del sistema operativo, etc.
Otra explicación es que algunas de las páginas lógicas en realidad están duplicadas, es decir, que
varias páginas lógicas apuntan al mismo marco físico.
Por otra parte, en el enunciado no nos indican si el sistema utiliza el bit de validez y por tanto el
concepto de página inválida. Si es el caso, puede ser que nuestro proceso direccione 50 páginas,
pero sólo 30 de ellas están cargadas en memoria principal, mientras que el resto están pendientes
de cargar (son inválidas).

3 (1,75 puntos) Suponga un archivo formado por 5 registros de tamaño fijo, siendo dicho tamaño
de 250 bytes. Para cada una de las políticas básicas de gestión del espacio de disco (contigua,
enlazada e indexada), asumiendo que cada bloque del sistema de archivos es de tamaño de 1 Kbyte
y que todos los datos de control del archivo ya se encuentran en memoria, obtenga qué bloques de
sistemas de archivos hace falta acceder para leer el contenido del quinto registro del archivo. Para
cada bloque que se requiera acceder, especifique cuántos bytes forman parte del registro a leer.
Para el caso de la política contigua asuma que el primer bloque asignado al archivo es el 1000. Para
el caso de la política enlazada, o encadenada, asuma que el tamaño del enlace al siguiente bloque del
archivo es de 4 bytes y que al archivo se le asignó en primer lugar el bloque 1000 y posteriormente,
al crecer, el bloque 3000. Por último, para el caso de la política indexada asuma que el primer
bloque asignado al archivo fue el bloque 300 y posteriormente, al crecer, el bloque 245.
SOLUCIÓN:

Asignación contigua
El quinto registro del archivo se encuentra en el bloque relativo:
Br = Parte entera [(4*250) / 1024] = Parte entera [ 1000 / 1024 ] = 0
La posición en ese bloque del primer byte del registro es:
Pr = Resto[(4*250) / 1024] = Resto[ 1000 / 1024 ] = 1000
Por tanto para acceder a todos los bytes del quinto registro necesitaremos acceder a los dos
bloques de datos de sistema de archivos que tiene asignado el fichero. Como es asignación
contigua y nos dicen que el primer bloque es el 1000, entonces se tendrá que acceder al bloque
1000 y 1001.

Asignación encadenada (bloques de datos de sistema de archivos de 1kbyte y tamaño de


enlace de 4 bytes)
El quinto registro del archivo se encuentra en el bloque relativo:
Br = Parte entera [(4*250) / 1020] = Parte entera [ 1000 / 1020 ] = 0
La posición en ese bloque del primer byte del registro es:
Pr = Resto[(4*250) / 1020] = Resto[ 1000 / 1020 ] = 1000
Por tanto para acceder a todos los bytes del quinto registro necesitaremos acceder a los dos
bloques de datos de sistema de archivos que tiene asignado el fichero. Como es asignación
encadenada y nos dicen que el primer bloque es el 1000, entonces se tendrá que acceder al bloque
1000 para leer los primeros 16 bytes del registro y para obtener la dirección del siguiente bloque
que nos dicen que es el bloque 3000 y en el bloque 3000 se leerán el resto de bytes del registro
solicitado.

Asignación indexada
El quinto registro del archivo se encuentra en el bloque relativo:
Br = Parte entera [(4*250) / 1024] = Parte entera [ 1000 / 1024 ] = 0
La posición en ese bloque del primer byte del registro es:
Pr = Resto[(4*250) / 1024] = Resto[ 1000 / 1024 ] = 1000
Por tanto para acceder a todos los bytes del quinto registro necesitaremos acceder a los dos
bloques de datos de sistema de archivos que tiene asignado el fichero. Como es asignación
indexada y nos dicen que el primer bloque es el 300 y el segundo es el 245, entonces del bloque
300 se leerán los primeros 24 bytes del registro y del bloque 245 el resto de bytes del registro.
Nombre

4 (1,75 puntos) Llegadas las fiestas del barrio toca celebrar el tradicional torneo de envite (para
los que no lo conozcan se trata de un juego de cartas). El problema es que para empezar una
partida se necesitan 8 personas según las normas del torneo. La organización dispone de una mesa
con 8 sillas de forma que a medida que llegan posibles jugadores (una vez anunciado
convenientemente mediante megafonía por todo el barrio), estos toman asiento si existe hueco libre.
En caso de que todas las sillas estén ocupadas, implica que ha comenzado una partida y los nuevos
jugadores que lleguen deberán esperar a que termine la partida y todos los jugadores hayan
abandonado su silla. Proponga una solución al problema anterior mediante semáforos especificando
el código que ejecutarían los posibles jugadores del torneo.
NOTA: Puede asumir que la duración de la partida es finita, es decir, las personas una vez que
pasa un tiempo y termina la partida, liberarán su asiento.

SOLUCIÓN:
// Variables globales
int sillasocupadas=0; // Sillas ocupadas por jugadores
int njesperando=0; // numero de jugadores esperando para jugar
bool jugandopartida=false; // indica si existe una partida en juego
Semaphore mutex(1), esperaturno(0);

Jugador-i() {

// El jugador llega a la asociación e intenta coger sitio
mutex.P();
// Si hay una partida empezada debe esperar
while (jugandopartida==true) {
njesperando++;
mutex.V();
esperaturno.P();
mutex.P();
}
sillasocupadas++;
// El último jugador que completa los equipos indica el comienzo de la
// partida (ver también ANEXO 1)
if (sillasocupadas==8)
jugandopartida=true;
mutex.V();

// En cuanto ocho jugadores se encuentren en este punto empieza la partida


// Jugar partida

// Al terminar la partida, los jugadores liberan sus sillas


mutex.P();
sillasocupadas--;
// El último jugador indica que la partida ha terminado y despierta
// a todos los jugadores que se encuentren esperando para tomar asiento
if (sillasocupadas==0) {
jugandopartida=false;
while (njesperando>0) {
esperaturno.V();
njesperando--;
}
}
mutex.V()
ANEXO 1
En la solución propuesta hemos supuesto que cuando los jugadores llegan al
punto de JUGAR PARTIDA todos esperan hasta que existan 8 para empezarla sin que
esta condición esté garantizada en el código. Esto no lo hemos considerado como
obligatorio en la solución del ejercicio, aunque una posible solución para
llevar a cabo dicha sincronización sería cambiar el código sombreado en gris en
la solución anterior por este otro bloque:

if (sillasocupadas==8) {
jugandopartida=true;
for(i=1;i<=7;i++)
empiezaLaPartida.V();
mutex.V();
} else {
mutex.V();
empiezaLaPartida.P();
}

donde empiezaLaPartida es un semáforo global inicializado a 0.

5 (1,75 puntos) Supónganse los siguientes procesos, de los que definimos el momento de su
creación y los tiempos de ejecución completos, detallando la duración de las ráfagas alternas de
CPU y E/S:

PROCESO CREACIÓN RÁFAGAS (CPU-E/S)


P1 0.25 [1.5 , 0.25 , 0.5]
P2 0.5 [0.25 , 1.0 , 0.25]
P3 1.0 [0.25 , 0.25 , 0.25]

Se pide:
a. Calcular los tiempos de espera y de retorno de cada uno de ellos, el porcentaje de
uso de la CPU y la productividad del sistema aplicando la estrategia de planificación
SRTF (Shortest Remaining Time First). (1,25 puntos)
b. ¿A qué conclusiones llegas? (0,5 puntos)

SOLUCIÓN:

Todo proceso preparado tiene entre paréntesis el tiempo de CPU que requiere en la siguiente
ráfaga de uso. El proceso en ejecución tiene entre paréntesis el tiempo de CPU que le queda a la
ráfaga de CPU que está utilizando. En caso de empate usaremos FCFS.
Nombre

PROCESOS Tiempo de espera Tiempo de retorno


(0.75-0.5) + (1.25-1) + (2-1.5)
P1 3.5 – 0.25 = 3.25
= 1.0
P2 0 2.0 – 0.5 = 1.5
P3 0 1.75 – 1.0 = 0.75

Productividad (número de procesos / tiempo de finalización de todos los procesos):


3 / 3.5 = 0.86

Porcentaje de uso de la CPU:


(2.0 + 0.5 + 0.5) # 100 / 3.5 = 85.71 %

Conclusiones: Los tiempos de espera de los procesos P2 y P3 son ambos cero debido al escaso
uso de CPU que hacen en sus correspondiente ráfagas en comparación con el proceso P1, lo que
hace que la estrategia de planificación SRTF les atienda enseguida y deje P1 para más adelante. La
CPU no se está utilizando al 100 %, aunque no se debe a una mala planificación con la estrategia
SRTF, pues siempre que no hay un proceso con menor uso de CPU, P1 es atendido. En el
momento inicial la CPU permanece inactiva debido a que no hay ningún proceso que pueda ser
planificado, y entre el instante de tiempo 2.75 (en el que el proceso P1 pide una E/S) y el instante
de tiempo 3.0 (en el que se produce el fin de la E/S del proceso P2) la CPU también permanece
inactiva, debido en este caso a que sólo hay un proceso y éste está suspendido. Es posible utilizar
ese tiempo en el que la CPU permanece inactiva para que el sistema operativo pueda solucionar
problemas de fragmentación de memoria (por ejemplo, compactación de memoria, etc).

 Calificación


 1

2

SISTEMAS OPERATIVOS
5 de diciembre de 2008
Examen Convocatoria Extraordinaria Especial

Nombre Titulación
* * * * SOLUCIONES * * * *

Dispone de tres horas para completar el examen

1. (8 puntos) Marque las opciones correctas de cada apartado. En caso de que


existan varias opciones ciertas, se considerará como correcta la más completa o precisa.
Las preguntas no contestadas no puntúan; las mal contestadas puntúan negativamente
restando un tercio de su valor. Marque la opción correcta rodeándola con un círculo. Si
se equivoca, tache la respuesta equivocada y rodee la opción correcta. Escriba con tinta.
Las preguntas respondidas con lápiz o con varios círculos no tachados se considerarán
no contestadas.

1. Dada la siguiente secuencia de referencias: 8, 1, 2, 3, 1, 4, 1, 5, 3, 4, 1, 4, 3, 2, 3, 1, 2,


8, 1, 2. Si se disponen de tres marcos de página (inicialmente vacíos) y se utiliza la
política de reemplazo LRU ¿Cuántos fallos de páginas se producirán al resolver todas las
referencias de la secuencia?
a) 10
b) 12
c) 11
d) 13

2. Un estudio sobre políticas de reemplazo en sistemas paginados de memoria expone lo


siguiente: “Al observar el efecto del número de marcos de páginas disponibles para los
procesos, para una cadena de referencia dada, se observa que al aplicar la política de la
segunda oportunidad es posible que al aumentar el número de marcos disponibles
aumente el número de fallos de página”. Entonces ¿a qué conclusión llegaría?
a) Que está describiendo la anomalía de Belady.
b) Que está describiendo el fenómeno de hiperpaginación.
c) Que el estudio es erróneo.
d) Que está describiendo una peculiaridad de la política de las segunda oportunidad.

3. Suponga la función matemática f(M) que devuelve el número de fallos de página de una
política, dado el número M de marcos de página disponibles. A medida que M aumenta, la
pendiente de f(M)...
a) Tiende a Infinito.
b) Tiende al valor 1
c) Tiende al valor ½
d) Tiende al valor 0.
4. Sea un sistema de memoria virtual con las siguientes especificaciones: el tiempo de
acceso a memoria es de 100 nanosegundos, el tiempo de acceso efectivo es de 25
microsegundos y la tasa de fallos de páginas de 5%, entonces los fallos de páginas se
procesan con un tiempo de:
a) (0,000025 - 0,000000095)/0,05
b) (0,000025 + 0,000000095)/0,05
c) (0,000025 - 0,000000095)/0,05
d) 0,000025 - 0,000000095 + 0,05

5. En un sistema de memoria virtual que utiliza un esquema combinado de segmentación y


paginación, entonces un fallo de página implicará en el peor de los casos:
a) Una transferencia de entrada/salida.
b) Dos transferencias de entrada salida.
c) Tres o más de tres transferencias de entrada/salida.
d) Ninguna transferencia de entrada/salida.

6. ¿Cuál de las siguientes técnicas es más adecuada para tratar el problema de la


hiperpaginación?
a) La técnica consistente en asignar a cada proceso una cantidad de marcos de página
proporcional al tamaño de su especio direccionable.
b) La asignación global.
c) La técnica basada en el modelo de área activa.
d) La técnica basada en el control de la frecuencia de fallos de páginas.

7. Si una solución al problema de la sección crítica cumple la propiedad de progreso:


a) Cumplirá también la espera limitada ya que al garantizarse que la decisión sobre quién
entra en la sección crítica se toma en un tiempo finito, se garantiza que en ningún
caso será postergado indefinidamente.
b) Cumplirá tanto la espera limitada como la propiedad de exclusión muta.
c) Indica que la decisión sobre el proceso que entra se toma en un tiempo
finito.
d) Ninguna de las anteriores es cierta.

8. El planificador a corto plazo selecciona un proceso


a) De entre los recién llegados para pasar a la cola de preparados.
b) De entre los de la cola de preparados para pasar a ejecución.
c) De entre los suspendidos en memoria principal para pasar a la cola de preparados.
d) De entre los suspendidos en memoria secundaria para pasar a la cola de preparados.

9. En un sistema multihilo,
a) Los cambios de contexto entre hilos de un mismo proceso pesado son en general más
costosos que los cambios de contexto entre hilos de diferentes procesos pesados.
b) Los hilos pueden estar soportados e implementados por el propio sistema
operativo o bien pueden ser implementados a nivel de usuario.
c) Los hilos de un mismo proceso pesado comparten las variables globales y por tanto la
comunicación entre ellos se puede realizar mediante la pila.
d) Todas las anteriores son ciertas.

10. Un lote de 4 procesos A, B, C y D se lleva a ejecución en un sistema informático. Los


tiempos de llegada son respectivamente 0, 1, 3, y 5. Las duraciones estimadas son
respectivamente 6, 3, 2 y 4. El tiempo de espera medio si el planificador de corto plazo
emplea un RR con cuanto igual a 3 es:
a) 4
b) 4,25
c) 4 o 4,25
d) 3


 2

Nombre

 * * * * SOLUCIONES * * * *


11. Un lote de 5 procesos A, B, C, D y E se lleva a ejecución en un sistema informático. Los


tiempos de llegada son respectivamente 0, 1, 3, 9 y 12. Las duraciones estimadas son
respectivamente 3, 5, 2, 5 y 5. Si el planificador de corto plazo emplea una política SRTF
(SJF expulsivo), el tiempo de espera medio y el tiempo de retorno medio son
respectivamente:
a) 8/5 y 28/5
b) 28/5 y 8/5
c) 11/5 y 31/5
d) 16/5 y 36/5

12. Con cual de las siguientes afirmaciones se quedaría:


a) Los métodos multicolas con realimentación solo permiten pasar los procesos a la
misma cola en la que originalmente ingresó
b) Es perfectamente posible implementar un sistema de tiempo compartido con políticas
no expulsivas
c) las políticas basadas en prioridades siempre tienen riesgo de inanición, incluso si se
emplean técnicas de envejecimiento
d) Todas las anteriores son falsas

13. El fabricante de un sistema operativo realiza un cambio de versión en su producto. ¿Qué


tipo de cambios en el núcleo normalmente requeriría hacer modificaciones en las
aplicaciones de usuario?
a) Añadir una nueva llamada al sistema para ofrecer un nuevo servicio.
b) Modificar la interfaz de una llamada al sistema, p.ej. cambiar la cantidad de
parámetros que se pasan y su tipo.
c) Modificar la implementación de una llamada al sistema sin cambiar la interfaz, p.ej.
para hacerla más eficiente.
d) Cambiar la política de planificación de procesos en el núcleo del sistema operativo.

14. Acaba de lanzarse al mercado «todOS», un sistema operativo cuyos creadores afirman
que es capaz de ejecutar al mismo tiempo aplicaciones nativas de Linux, Windows XP y
Mac OS X. ¿Cuál de las siguientes técnicas de construcción de sistemas operativos cree
usted menos probable que se haya empleado en el desarrollo de «todOS»?
a) diseño monolítico
b) diseño por capas
c) micronúcleos
d) máquinas virtuales

15. Llega una interrupción procedente de un dispositivo de E/S mientras un proceso de


usuario se está ejecutando. ¿Qué suele ocurrir justo a continuación?
a) Se conmuta a modo supervisor y se ejecuta la rutina de servicio de
interrupción correspondiente.
b) Se conmuta a modo usuario para que el proceso dialogue con la E/S de acuerdo con
sus necesidades.
c) Se ignora la interrupción, ya que el sistema está ejecutando código en modo usuario y
si se atiende aquella, podría haber problemas de seguridad.
d) Se atiende la interrupción de forma inmediata, en el modo de operación en el que se
encontraba el procesador en el momento de ocurrir la operación.


 3

16. A continuación se muestran cuatro posibles servicios que podría ofrecer un sistema
operativo multiusuario para arquitectura PC. Debe usted quedarse solamente con tres y
excluir necesariamente uno de ellos. ¿Cuál descartaría?
a) sistema de protección de memoria
b) sistema de archivos
c) planificador de procesos
d) sistema de gestión de interrupciones

17. El mapa de bits para mantener el espacio libre en el disco ocupará:


a) Tantos bits como bloques tenga el disco
b) Tantos bits como bloques libres tenga el disco
c) Tantos bits como bloques tenga el disco multiplicado por el número de registros que
tenga cada bloque
d) El mapa de bits sólo se usa para la gestión de la memoria principal

18. El método de listas enlazadas para la asignación del espacio en disco presenta el siguiente
inconveniente:
a) Es necesario conocer el tamaño máximo de archivo en el momento de su creación.
b) La fragmentación externa resultante en el disco.
c) El acceso aleatorio a un archivo es extremadamente lento.
d) La pérdida de espacio debido a las tablas de índices.

19. Se tiene un sistema que utiliza gestión de memoria paginada. El espacio de


direccionamiento virtual es de 10 páginas de 1024 palabras (1 palabra = 2 bytes). La
memoria física está dividida en 32 marcos. ¿Cuántos bits componen una dirección virtual?
a) 14 bits
b) 15 bits
c) 16 bits
d) El resultado depende de si el desplazamiento se expresa en palabras o en
bits.

20. La fragmentación externa corresponde


a) al espacio interno de una partición que se malgasta cuando el bloque de datos
cargado es más pequeño que la partición.
b) al hecho de que una partición disponible no se utiliza porque es muy
pequeña para cualquiera de las tareas que esperan cargarse en memoria.
c) a las particiones desperdiciadas cuando se carga un nuevo proceso.
d) a la circunstancia de bloquear un proceso al no disponer de espacio en memoria.

2 (2 puntos) Una guagua turística espera en su estación de salida. La guagua saldrá


de la parada cuando su capacidad esté completa (20 plazas) o cuando llegue su hora
prevista de salida, lo primero que ocurra. Para saber si ha llegado la hora prevista, hay
un operario en la estación que avisa al chófer.
Resuelva la sincronización de la guagua usando un monitor. La especificación
general del monitor se da a continuación. Lo único que debe usted hacer es implementar
el monitor, no se preocupe de cómo y cuándo se invocan a estas operaciones.
monitor Guagua {
// esta operación es la que deja bloqueada a la guagua hasta que
// se cumplen las condiciones del problema
public MueveGuagua();
// esta operación la invoca cada viajero cuando se sienta en la guagua
public LlegaViajero();
// esta operación la invoca el operario cuando llega la hora de salida
public AvisaHoraSalida();
};


 4

Nombre

 * * * * SOLUCIONES * * * *



Solución con el monitor:

monitor Guagua {
bool esHoraDeSalir = false;
int viajerosEsperando = 0;
const int CapacidadGuagua = 20;

Condition esperaGuagua;

public MueveGuagua() {
// esperar a que se den las condiciones para moverse
while ( viajerosEsperando < CapacidadGuagua && ! esHoraDeSalir ) {
esperaGuagua.wait();
}
// reiniciar las variables de estado para una futura llegada
viajerosEsperando = 0;
esHoraDeSalir = false;
}

public LlegaViajero() {
viajerosEsperando++;
if ( viajerosEsperando >= CapacidadGuagua ) {
esperaGuagua.signal();
}
}

public AvisaHoraSalida() {
esHoraDeSalir = true;
esperaGuagua.signal();
}
}


 5

Calificación

1
Fac. de Informática / Escuela Univ. Informática 2
SISTEMAS OPERATIVOS 3
Examen Primer Parcial 4
5 de mayo de 2007

Nombr Titulació
SOLUCIONES

Dispone de tres horas para realizar el examen

1(3 puntos) Contestar brevemente a las siguientes cuestiones:


a) En un sistema de planificación por prioridades expulsivo llega un
proceso en el instante 4 con prioridad máxima. Este proceso se
ejecuta durante 2ut. Después realiza una operación de E/S durante
3ut y para acabar se ejecuta durante 5ut. ¿Cuál es el tiempo de
retorno de este proceso? (Despreciar los tiempos de conmutación
de tareas) (0.25p)
Si no existen más procesos en la cola, la planificación de P1 sería así:
P1 E/S P1 Tiempo de retorno =
4 6 9 14 = 14 – 4 = 10 ut

El tiempo de retorno podría ser mayor, si otro proceso con prioridad máxima se
encuentra en la CPU cuando P1 llega al sistema o cuando finaliza su E/S. En ese
caso, P1 debe esperar por el proceso que está en CPU. Así que la respuesta
correcta es al menos 10 unidades de tiempo.

b) Definición de proceso y de hilo. ¿Qué diferencias hay entre ellos?


¿Qué ventajas tiene uno sobre el otro? Indicar qué ventajas e
inconvenientes puede tener que el sistema operativo maneje hilos o
que sea el usuario quien los implemente. (0.75p)
Un proceso pesado es un proceso (programa en ejecución) que contiene uno o
varios hilos que comparten la misma memoria y recursos.
Un hilo (thread) o proceso ligero es una unidad básica de ejecución, con su
propio contador de programa, registros de CPU y pila. Los hilos de un mismo
proceso comparten código y memoria.
Los hilos tienen características que son ventajosas:
- El BCP de un hilo es muy pequeño en comparación con el de un proceso
pesado.
- Dado que todos los hilos de un proceso pesado comparten los recursos, un
proceso pesado podría contener decenas de hilos sin mucho coste adicional
(sólo los pequeños BCP de sus hilos).
- La comunicación entre los hilos del proceso es más sencilla que entre procesos
pesados (usando la memoria que comparten).
- El cambio de contexto entre hilos de un mismo proceso pesado es menos
costoso.
Todo ello consigue los siguientes beneficios:
- Se facilita la escritura de aplicaciones concurrentes cooperativas, es decir,
aplicaciones en la que múltiples procesos colaboran entre sí para llevar a cabo
un objetivo común.
- Se pueden lanzar centenares de actividades concurrentes sin que el sistema se
resienta.

El soporte a los hilos puede darlo el propio sistema operativo o, en caso


contrario, deberá ser el propio usuario quién implemente (simule) su
implementación.
a) Si lo implementa el SO: en este caso hablaríamos de una implementación a
nivel de núcleo o bien pueden ser implementados mediante una
biblioteca/librería. El SO es capaz, por ejemplo, de asignar tiempo a cada hilo
como si cada uno de los mismos fueran un proceso del sistema.
b) Si lo implementa el usuario: a nivel de usuario (en este caso, el SO no
entiende ni conoce de hilos): las estructuras de datos y el código de la librería se
encontrarán en el espacio de usuario, de forma que el usuario hará uso de ellas
como cualquier módulo propio desarrollado. En este caso el proceso pesado es
lo que será capaz de distinguir el SO por lo que el tiempo que le asigne el mismo
a dicho proceso deberá ser repartido por el usuario a cada uno de los hilos que lo
conforman.

c) Definir: (1p)
a. BootStrap Planificador a medio plazo
b. Procesadores a. Concurrencia
débilmente b. Efecto convoy
acoplados c. Sección crítica
c. Tiempo de
respuesta
d.
a. BootStrap: programa encargado de leer el sistema operativo desde el
dispositivo donde se encuentra, ubicarlo en memoria principal y ejecutarlo.
b. Procesadores débilmente acoplados: (o sistemas distribuidos) : múltiples
procesadores conectados mediante una red, donde varios sistemas
informáticos, escalable hasta millones de procesadores (ej. Internet), se
conectan de forma distribuida para realizar determinadas funciones,
rompiendo la barrera del espacio, no es necesario que los equipos estén
físicamente juntos, ni siquiera próximos. En estos sistemas los procesadores
no comparten memoria ni reloj.
c. Tiempo de respuesta: tiempo que un proceso bloqueado tarda en entrar en
CPU, desde que ocurre el evento que lo bloquea.
d. Planificador a medio Plazo (PMP): El planificador de medio plazo (PMP) se
encarga de gestionar situaciones en las que el sistema queda escaso de
recursos, normalmente porque los procesos consumen toda la memoria
disponible. En estos casos, suele ocurrir que existen procesos en estado
“bloqueado”, que no van a ejecutar instrucciones en mucho tiempo, y que sin
embargo están ocupando memoria. El PMP se encargará de copiar la imagen
de estos procesos en memoria secundaria (disco) y dejar disponible la
memoria principal que ocupaban para otros procesos que sí necesitan
ejecutar instrucciones.
e. Concurrencia: En informática se habla de concurrencia cuando hay una
“existencia simultanea de varios procesos en ejecución”. Conviene

2 de 8
resaltar el término “existencia simultánea …”, claramente diferente al término
“ejecución simultánea …”. Es decir, hablamos de concurrencia o
multiprogramación (emplearemos ambos términos como sinónimos) cuando
tenemos varios procesos cargados en la memoria del computador.
f. Efecto Convoy : fenómeno indeseable en un sistema por el que un proceso
intensivo en CPU acapara el procesador y hace que otros procesos
intensivos en E/S esperen por éste recurso, motivando en general una baja
utilización de los distintos recursos del sistema.
g. Sección crítica: se define sección crítica de un proceso como un conjunto de
instrucciones que acceden a un dato que es compartido por al menos otro
proceso del sistema de forma que al menos uno de ellos puede modificar la
variable.

e) ¿Qué crees que ha hecho necesaria la aparición de la


multiprogramación en la evolución de los ordenadores? (0.5p)
La multiprogramación se hizo necesaria porque la velocidad de funcionamiento
de la CPU superaba ya en varios órdenes de magnitud a la velocidad de los
dispositivos de E/S, y resultaba inadmisible mantener la CPU desocupada
durante la realización de este tipo de operaciones.

f) Indicar las formas que conozcas para que un sistema operativo


pueda averiguar qué recurso del sistema ha realizado una
interrupción. (0. 5p)
Podemos encontrar dos técnicas implementadas: la primera conocida como
polling es la propia CPU la que pregunta a todos los dispositivos que pueden
haber provocado la interrupción y la segunda técnica consiste en que el
dispositivo, además de interrumpir, envía un número por el bus, conociéndose
esta técnica de uso mas frecuente con el nombre de interrupciones vectorizadas.

2 (2,5 puntos) Suponga un recurso que debe ser usado de manera


exclusiva por parte del proceso que lo utiliza. En el sistema se ejecutan
siempre los mismos procesos que son N, identificándose cada uno de
ellos por un valor entero cuyo rango es de 1 a N. Estos procesos
necesitan para cumplir con su cometido hacer uso del recurso
compartido. Cuando un proceso necesita utilizar el recurso lo solicita
mediante la función:
void Solicito_Recurso( int Mi_Id_Proc)
de forma que si el recurso está ocupado deberá esperar hasta que
quede libre. Cuando varios procesos solicitan el uso del recurso,
entonces se le concederá a aquél proceso cuyo identificador es el
menor. Cuando se libera el recurso, el proceso que lo libera lo hace con
la función:
void Libero_Recurso(int Mi_Id_Proc)
Implementar las funciones Solicito_Recurso y Libero_Recurso
empleando semáforos.

Class Gestionador {
Public:
Gestionador( );

3 de 8
~Gestionador();
void Solicito_Recurso( int Mi_Id_Proc );
void Libero_Recurso( int Mi_Id_Proc );
Private:
Semáforo *cerradura, *me_bloqueo[N];
Boolean ocupado, espero[N];
}

Gestionador:: Gestionador()
{
int i;
cerradura = new Semáforo(1);
for ( i=0; i<N; i++) {
me_bloqueo[i] = new Semáforo(0);
espero[i] = false;
}
ocupado = false;
}

Gestionador::~Gestionador()
{
int i;
delete cerradura;
for (i=0; i<N; i++)
delete me_bloqueo[i];
}

void Gestionador::Solicito_Recurso( int Mi_Id_Proc)


{
cerradura->P();
if ( ocupado == false ) {
ocupado = true;
cerradura->V();
}
else {
espero[Mi_Id_Proc] = true;
cerradura->V();
me_bloqueo[Mi_Id_Proc]->P();
}
}

void Gestionador::Libero_Recurso( int Mi_Id_Proc)


{
int i=0;
cerradura->P();
espero[Mi_Id_Proc] = false;
while (i<N) {
if ( espero[i] == true ) {
me_bloqueo[i]->V();
break;
}
i++;
}

4 de 8
if ( i == N ) {
ocupado = false;
}
cerradura->V();
}

3(2 puntos) Seguidamente se muestra una propuesta de solución al


problema de la sección crítica para n procesos. ¿Crees que es una
propuesta válida? Justifica tu respuesta.
// Variables globales e inicializaciones
var
esperando: array [0..n-1] of boolean; // Inicializada a false
m: boolean; // Inicializada a false

Proceso Pi
llave: boolean; //Inicializada a false
j: integer;
begin
repeat
SECCION NO CRITICA
esperando[i]:=true;
llave:=false;
repeat
llave:=Test_and_Set(m);
until (not esperando[i] or llave);
esperando[i]:=false;
SECCION CRITICA
j:=(i+1) mod n;
while (j<>I and not esperando[j]) do
j:=(j+1) mod n;
if (j=i) then
m:=false;
else
esperando[j]:=false;
until false
end.

Para demostrar que se trata de una solución válida al problema de la sección


crítica para n procesos debemos demostrar que se cumplen las propiedades de
exclusión mutua, progreso y espera limitada.
Exclusión Mutua
La exclusión mutua no se cumple en la solución propuesta. Se puede observar
que un proceso Pi que desee entrar en su sección crítica, al llegar a la ejecución
de la instrucción Test_and_Set colocaría m a true y devolvería inicialmente
false (valor inicial de m). Sin embargo, en su segunda iteración en el bucle,
Test_and_Set devolverá true y colocará m nuevamente a true por lo que
saldría del bucle y pasaría a ejecutar la porción de código contenida en la
sección crítica. Si estando el proceso Pi en su sección crítica, otro proceso Pj
desea pasar a ejecutar la sección crítica, podemos comprobar fácilmente que
rebasaría el preprotocolo sin mayores problemas, ya que la ejecución la
instrucción Test_and_Set devolverá true y colocará m nuevamente a true

5 de 8
por lo que saldría del bucle y pasaría a ejecutar la porción de código contenida
en la sección crítica, teniendo por tanto dos procesos ejecutando la sección
crítica. En realidad podrían entrar todos lo que quisieran sin ningún tipo de
trabas.
Por tanto, al no cumplir la exclusión mutua, podemos afirmar que no se trata de
una solución válida al problema de la sección crítica.

4(2,5 puntos) Un sistema dispone de un planificador a largo plazo


(PLP) y de otro a corto plazo (PCP) que funcionan de la siguiente forma:
el PCP utiliza un algoritmo con prioridades expulsivas y el PLP utiliza la
estrategia FCFS. Los procesos nuevos entran por el PLP. Se admiten en
memoria un máximo de tres procesos. El PLP pasa un proceso al PCP
cuando hay menos de tres procesos ya admitidos. Partiendo de la
siguiente tabla de procesos y teniendo en cuenta que a menor número
más prioridad:
Duración de Tiempo
IdProce Priorid
ráfaga de
so ad
del procesador llegada
A 2 4 0
B 4 3 1
C 4 2 3
D 1 1 5
E 2 3 6
F 1 1 14

Obtener el diagrama de Gantt, así como los tiempos medios de espera


y de retorno de cada proceso en el sistema, indicando además el
rendimiento de la CPU.

SOLUCIÓN:

Estado de la memoria:

t = 0 ⇒ entra A
Proceso Prioridad t CPU restante

A #4 2

t = 3 ⇒ entra C
t = 1 ⇒ entra B Proceso Prioridad t CPU restante
Proceso Prioridad t CPU restante
A #4 1
A #4 1 B #3 2
B #3 4 C #2 4

6 de 8
En t = 5, entra en cola del PLP el proceso D y en t = 6 el proceso E. Estos dos
procesos no pueden entrar de inmediato en la memoria, ya que hasta t=7 continúan
tres procesos en memoria: A, B y C.

t = 7 ⇒ sale C, entra D t = 8 ⇒ sale D, entra E


Proceso Prioridad t CPU restante Proceso Prioridad t CPU restante

A #4 1 A #4 1
B #3 2 B #3 2
D #1 1 E #3 2

En este punto, B y E tienen la misma prioridad. El PCP tomará B pues ha llegado


primero a la cola de preparados.
A partir de ahora los procesos irán saliendo de memoria a medida que van
terminando. El último proceso, tal y como se indica en el diagrama de Gantt, saldrá
en el instante 13. En el instante 14 llega el último proceso F quedando la memoria
como sigue:
t = 14 ⇒ entra F
Proceso Prioridad t CPU restante

F #1 1

El problema nos pide:

a) Diagrama de Gantt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

A B C D B E A F

b) Tiempo de retorno:
A B C D E F
(13-0) (10-1) (7-3) (8-5) (12-6) (15-14)
13 9 4 3 6 1

 1394361 
TRetorno Medio = = 6 u.t.
6

c) Tiempo de espera:
La respuesta en este caso depende de la definición que se maneje para el concepto
de «tiempo de espera».
Si se utiliza la definición de «tiempo que un proceso permanece en la cola de
preparados», los resultados son los siguientes:

A B C D E F
(11) (6-1) (0) (7-5)-2 (10-6)-2 (0)
11 5 0 2 4 0

7 de 8
 1150020 
TEspera Medio = = 3 u.t.
6
Si se utiliza la definición de «tiempo que un proceso permanece en espera por el
procesador», hay que contabilizar el tiempo en cola de preparados (PCP) y el tiempo
en la cola de admisión del PLP. Los resultados serán:
A B C D E F
(11) (6-1) (0) (7-5) (10-6) (0)
11 5 0 2 4 0

 1150240 
TEspera Medio = = 3,67 u.t.
6
Ambas respuestas son válidas.
d) Rendimiento de la CPU:
Debido a que el último proceso F llega en el instante 14 y el sistema acaba con la
ejecución de todos los procesos en el instante 13, hay 1 u.t. en la que la CPU está
idle (ociosa, sin trabajar). Con lo cual en el momento 15 u.t. en el que acaban todos
los procesos de ejecutarse, la CPU ha trabajado 14 u.t. Esto hace que el rendimiento
de la CPU podamos mediarla como:

14
Rend CPU = = 0,933, por lo que el rendimiento de la CPU es de un 93,33 %
15

* * * * *

8 de 8
Calificación

1
2
3

SISTEMAS OPERATIVOS - SEGUNDA PARTE


Examen Convocatoria Ordinaria, 21 de junio de 2007

Nombre Titulación
SOLUCION

Dispone de dos horas para realizar el examen

1 (6 puntos) Test. En cada uno de los siguientes apartados, señale cuál opción es
correcta. En caso de que existan varias opciones ciertas, se considerará como correcta
la más completa o precisa. Las preguntas no contestadas no puntúan; las contestadas
erróneamente puntúan negativamente restando un tercio de su valor. Señale sus
respuestas rodeando con un círculo la opción correcta. Si se equivoca, tache la
respuesta incorrecta y rodee la opción que considere correcta. Escriba con tinta. Las
preguntas respondidas con lápiz o con varios círculos no tachados se considerarán no
contestadas.

1. La tabla de páginas de un determinado proceso indica que la página 2 tiene asociado


el marco 5. El tamaño de página es de 2kB. ¿Cuál es la dirección física asociada a la
dirección virtual 4748?
a) 5*2*2*1024+652 =21132
b) 5*2*1024+1676 = 12940
c) 5*2*1024+652 = 10892
d) 2*2*1024+652 = 4748

2. En un sistema con memoria virtual, cuando una página es elegida como víctima y
guardada en disco por el paginador, al volver a ser invocada
a) Se producirá un fallo de página y se reubicará en algún marco de la memoria
perteneciente a otro proceso
b) Se producirá un fallo de página y se reubicará en el mismo marco que ocupaba
previamente
c) Se producirá un fallo de página y se reubicará en el marco que ocupe otra
página víctima
d) No se producirá ningún fallo de página ya que la página sigue en memoria

SO – examen 20070621 – segunda parte – pag. 1/6


3.Si la dirección virtual y su correspondiente física coinciden:
a) El sistema no es multiprogramado
b) El espacio lógico del proceso es el mismo que el espacio físico
c) El sistema no tienen memoria virtual
d) Todas las anteriores son correctas

4.El hardware de un determinado sistema incorpora 1 bit de validez, 1 bit de bloqueo y


1 bit de referencia en la tabla de páginas ¿qué posibles algoritmos de reemplazo podrá
implementar el sistema operativo?
a) Cualquiera de los siguientes: FIFO, conteo LFU, conteo MFU
b) Cualquiera de los siguientes: FIFO, LRU 2ª oportunidad
c) Cualquiera de los siguientes: FIFO, LRU 2ª oportunidad, LRU 2ª oportunidad
mejorado
d) Cualquiera de los siguientes: FIFO, conteo LFU, conteo MFU, LRU 2ª
oportunidad, LRU 2ª oportunidad mejorado

5. Suponga que desea almacenar un fichero de 20MB de datos. ¿Con cuál de los
siguientes métodos de asignación ocuparía el menor espacio en el sistema de
almacenamiento?
a) Asignación contigua
b) Asignación enlazada
c) Asignación enlazada con FAT
d) Asignación indexada de un nivel

6. En la tabla de segmentos se especifica que el segmento 0 tiene como base 900 y


longitud 350. ¿a qué dirección física corresponde la dirección virtual (0, 825), dada en
el formato (nº de segmento, desplazamiento)?
a) 825
b) 1725
c) 1175
d) Se produce un error de direccionamiento

7. Considere un sistema de memoria paginado de un solo nivel. En este sistema:


a) Sólo puede producirse fragmentación externa
b) Sólo puede producirse fragmentación interna
c) Puede producirse fragmentación, tanto interna como externa
d) No puede producirse fragmentación, pues cada página corresponde a un marco
de la memoria

SO – examen 20070621 – segunda parte – pag. 2/6


8. Considérese un sistema de paginación por demanda donde el grado de
multiprogramación está fijado a 4. Se analiza el porcentaje de utilización de la CPU
(17%) y del disco de paginación (97%) ¿Cuál de las siguientes decisiones podrían
tomarse para mejorar el rendimiento?
a) Incrementar el grado de multiprogramación
b) Disminuir el grado de multiprogramación
c) Mantener el grado de multiprogramación y aumentar el tamaño del disco de
paginación
d) Mantener el grado de multiprogramación y aumentar el tamaño de página

9.Tenemos un sistema de gestión de memoria paginada de un nivel que utiliza una


TLB. Se tienen los siguientes tiempos medios:
· Tiempo de acceso a la TLB: 4 nseg. (1 nseg = 10-9 seg.)
· Tiempo medio de acceso a memoria principal: 33 nseg.
Suponiendo que la tasa de aciertos de la TLB se mantiene en el 85% ¿cuál es
tiempo medio de acceso a memoria a partir de una dirección lógica?
a) 74.95 nseg.
b) 50.3 nseg.
c) 46.9 nseg.
d) Ninguna de las anteriores

10. Suponga un sistema de archivos que utiliza asignación indexada de espacio en disco
donde la representación de espacio libre se lleva a cabo mediante un mapa o vector de
bits. Si se reduce el tamaño de bloque del sistema de archivos
a) Disminuirá la fragmentación externa
b) Aumentará la fragmentación interna
c) Aumentará el tamaño del mapa de bits
d) Aumentará el tamaño máximo que puede ocupar un archivo en disco

11. En un sistema de archivos que utiliza asignación encadenada con FAT y tamaño de
bloque de 512 bytes, donde no existe tabla de archivos abiertos ¿Cuántos accesos a
disco son necesarios para acceder al byte 3120 de un fichero? (suponiendo que la
FAT se encuentra en memoria)
a) 2
b) 3
c) 1
d) 8

SO – examen 20070621 – segunda parte – pag. 3/6


12. Se dispone de 4 marcos de página en memoria inicialmente libres. Dada la siguiente
cadena de referencias: 8,5,4,0,8,7,5,4,1,3,9,8, el número de fallos de página que
tendrán lugar utilizando el algoritmo de segunda oportunidad es
a) 10 y si aumentamos el número de marcos para la misma cadena de referencias, el
número de fallos será igual o mayor
b) 10 y si aumentamos el número de marcos para la misma cadena de referencias, el
número de fallos será igual o menor
c) 9 y si aumentamos el número de marcos para la misma cadena de
referencias, el número de fallos será igual o menor
d) 9 y si aumentamos el número de marcos para la misma cadena de referencias, el
número de fallos será igual o mayor

2 (2 puntos) Un sistema de archivos utiliza asignación indexada por inodos como


método de asignación de espacio. En el inodo hay 10 referencias a bloques directos, 1
referencia a un bloque indirecto sencillo, 1 referencia a un bloque indirecto doble y 1
referencia a un bloque indirecto triple. El tamaño del bloque es de 1KB y el tamaño de
las direcciones a bloques de disco es de 32 bits
a) ¿Cuál es el número máximo de bloques que ocupará un fichero en disco?
(incluyendo los bloques de índices) (0.5 puntos)
b) ¿Qué tamaño ocupará un fichero con 500 bytes de datos? (0.5 puntos)
c) ¿Cuántos accesos a disco serán necesarios para acceder al byte 67.382.000? (1
punto)

Direcciones de 32 bits → en un bloque de índices caben


1024/4 = 256 referencias a bloques

a)
Número máximo de bloques índices:

Inodo
+ bl. indirecto sencillo
+ (bl. indirecto doble + 256 bl. indirectos sencillos)
+ (bl. indirecto triple + 256 bl. indirectos dobles + 256 * 256 bl. indirectos sencillos)
=
1 + 1 + (1+256) + (1+256 + 256*256) = 66052 bloques

Número máximo de bloques de datos:


10+ 256 + 256*256 + 256*256*256 = 16843018 bloques

Total máximo de bloques = 16843018 + 66052 = 16909070 bloques

SO – examen 20070621 – segunda parte – pag. 4/6


b)
Número de bloques de datos:
RedondeoSuperior( 500/1024 ) = 1
Número de bloques índices:
Para apuntar a un único bloque de datos se utiliza la primera de las 10
referencias directas a bloques de datos del inodo, por lo que el único bloque
índice necesario es el inodo

Total bloques = inodo + bloques de datos = 2


Tamaño total del fichero = 2 * 1024 = 2KBytes

c)
Dada la organización del inodo, se accederá a los bloques de datos de la siguiente
forma:
Bloques del 0 al 9 → a través de los enlaces directos
Bloques del 10 al 265 → a través del bloque indirecto sencillo
Bloques del 266 al 65801 → a través del bloque indirecto doble
Bloques del 65802 al 16843018 → a través del bloque indirecto triple

Dato 67382000 → bloque 67382000/1024=65802

El acceso al bloque 65802 se realiza a través del bloque indirecto triple, por lo
que son necesarios 1 acceso al inodo, 1 acceso al bloque indirecto triple, 1
acceso al correspondiente doble, 1 acceso al correspondiente sencillo y
finalmente al dato. Total: 5 accesos

3 (2 puntos) Suponga un recurso que debe ser usado de manera exclusiva por parte del
proceso que lo utiliza. En el sistema se ejecutan siempre los mismos procesos que son
N, identificándose cada uno de ellos por un valor entero cuyo rango es de 1 a N. Estos
procesos necesitan para cumplir con su cometido hacer uso del recurso compartido.
Cuando un proceso necesita utilizar el recurso lo solicita mediante la función:
Solicito_Recurso( int Mi_Id_Proc)
De forma que si el recurso está ocupado deberá esperar hasta que quede libre. Cuando
varios procesos solicitan el uso del recurso, entonces se le concederá a aquél proceso
cuyo identificador es el menor. Cuando se libera el recurso, el proceso que lo libera lo
hace con la función:
Libero_Recurso(int Mi_Id_Proc)

Implementar un monitor que gestione el mencionado recurso según lo expuesto.

SO – examen 20070621 – segunda parte – pag. 5/6


Monitor Gestor_Recurso
{
boolean proceso_esperando[N], ocupado;
condition bloqueo[N];
int nprocesos_esperando;

Procedure entry Solicito_Recurso( int Mi_Id_Proc )


{
if ( ocupado == verdadero ) {
proceso_esperando[Mi_Id_Proc] = verdadero;
nproceso_esperando++;
bloqueo[Mi_Id_Proc].wait;
proceso_esperando[Mi_Id_Proc] = falso;
nprocesos_esperando--;
}
ocupado = verdadero;
}

Procedure entry Libero_Recurso( int Mi_id_Proc )


{
int i;
if ( nprocesos_eperando > 0 ) {
for (i=0; i<N; i++) {
if ( proceso_esperando[i] == verdadero ) {
bloqueo[i].signal;
break;
}
}
}
else {
ocupado = falso;
}
}

// Código de inicialización
ocupado = falso;
nprocesos_esperando = 0;
for (i=0; i<N; i++)
proceso_esperando[i]= falso;

SO – examen 20070621 – segunda parte – pag. 6/6


Calificación

1
2
3
SISTEMAS OPERATIVOS
Convocatoria de septiembre, 12 de septiembre de 2007

Nombre Titulación

SOLUCIONES
Dispone de tres horas para completar el examen

1 (5 puntos)  Test.  Marque   las   opciones   correctas   de   cada   apartado.   En   caso   de   que 
existan varias opciones ciertas, se considerará como correcta la más completa o precisa. Las 
preguntas no contestadas no puntúan; las mal contestadas puntúan negativamente restando un 
tercio de su valor. Marque la opción correcta rodeándola con un círculo. Si se equivoca, tache la 
respuesta equivocada y rodee la opción correcta. Escriba con tinta. Las preguntas respondidas 
con lápiz o con varios círculos no tachados se considerarán no contestadas.
 1. Un sistema multiprogramado:
 a) permite gestionar varias tareas interactivas
 b) evita el posible monopolio de la CPU por un proceso del sistema
 c) debe realizar el control de la sincronización
 d) **ninguna de las afirmaciones es correcta

 2. Si varios procesos concurrentes se ejecutan en un sistema, ocurre que:
 a) ** para su ejecución compiten por el uso de uno o de varios procesadores
 b) se ejecutan sobre un sistema operativo multiusuario
 c) comparten el mismo código
 d) necesitan sincronizarse para acceder a los datos que comparten

 3. El bloque de control de proceso (BCP) contiene, al menos:
 a) el grado de multiprogramación de un proceso
 b) el código, los datos y la pila de un proceso
 c) **el estado y el identificador de un proceso
 d) todas las afirmaciones anteriores son correctas

 4. ¿cuál de las siguientes afirmaciones es correcta?
 a) Los   sistemas   multiprogramados   son   sistemas   de   tiempo   compartido   que   permiten 
conmutar los trabajos presentes en el sistema.
 b) **Los sistemas de tiempo compartido son sistemas multiprogramados en los que 
se reparte el uso de la CPU entre los procesos existentes a intervalos regulares 
de tiempo.
 c) Un sistema de tiempo real es un sistema con tiempos medios de respuesta óptimos
 d) Ninguna de las afirmaciones anteriores es correcta

 5. Supongamos   que   para   resolver   cierto   problema   de   concurrencia   empleamos   un   monitor   y 
variables condición. En este caso:
 a) Una operación  wait  sobre una de las variables condición empleadas en dicho monitor 
provocará que el proceso que la realice se bloquee siempre que no exista otro proceso 
en el monitor previamente.
 b) Una operación signal sobre una de las variables condición empleadas en dicho monitor 
provocará el desbloqueo de otro proceso que haya realizado una operación wait  sobre 
cualquiera de las variables condición del monitor.
 c) Una operación signal nunca provoca el bloqueo del proceso que la realiza.
 d) **Todas las anteriores son falsas.
 6. ¿Cuál de las siguientes afirmaciones es correcta?
 a) El modo dual de operación se ha diseñado para que los programas de usuario obtengan 
acceso pleno a todos los recursos del sistema con total libertad.
 b) **Cuando   se   produce   una   interrupción,   la   CPU   conmuta   a   modo 
privilegiado/supervisor.
 c) Las instrucciones de desactivación de interrupciones se ejecutan normalmente en modo 
de usuario.
 d) Las  instrucciones lectura del  reloj  del  sistema normalmente  deberían ser operaciones 
privilegiadas.

 7. A un planificador de procesos que tiene la cola vacía llegan al mismo tiempo ocho procesos de 
idéntica duración. Entonces:
 a) Si se utiliza SJF, todos los procesos tendrán el mismo tiempo de retorno
 b) Si se utiliza un Round Robin con cuanto igual a  1 u.t., se obtendrá un mejor tiempo de 
retorno medio que con el SJF
 c) Si se utiliza un Round Robin con cuanto igual a  8 u.t., se obtendrá un mejor tiempo de 
retorno medio que con el SJF
 d) **Si  se  utiliza  FCFS,   cada  proceso  tendrá  un  tiempo   de espera  diferente  a  los 
demás

 8. ¿Qué cambio de estado no se puede dar durante la vida de un proceso?
 a) de «preparado» a «en ejecución»
 b) de «en ejecución» a «preparado»
 c) **de «preparado» a «bloqueado»
 d) de «bloqueado» a «preparado»

 9. ¿Qué dos características no se pueden combinar en un algoritmo de planificación?
 a) expulsividad y prioridades
 b) prioridades y rodajas de tiempo limitadas
 c) expulsividad y envejecimiento (aging)
 d) **todas las anteriores combinaciones son posibles

 10. Un sistema de memoria paginado utiliza direcciones lógicas de 32 bits y tamaño de página 1 
kbyte. Cada entrada en la tabla de páginas ocupa 4 bytes. ¿cuál es el número máximo de marcos 
de página que se necesitarán para almacenar por completo una tabla de páginas en memoria?
 a) 4 ∙ 232 marcos
 b) 4 ∙ 222 marcos
 c) ** 16 ∙ 210 marcos
 d) 4 ∙ 210 marcos
direcciones lógicas de  32 bits
tamaño de página de 1 Kbyte=210 bytes → se necesitan 10 bits para el desplazamiento 
El número máximo de páginas será de 2(32­10)= 222 páginas
La tabla de páginas ocupará como máximo 222.4 bytes= 16Mbytes
En total haría falta 16Mbytes/1Kbyte=16.210 páginas o marcos
 11. Tenemos un sistema de gestión de memoria paginada de un nivel que utiliza una TLB. Se tienen 
los siguientes tiempos medios:  tiempo de acceso a la TLB: 3 nseg; tiempo medio de acceso a 
memoria principal: 42 nseg. Se desea que el tiempo de medio de acceso a memoria a partir de 
una dirección lógica sea inferior a 48 nseg. ¿Cuál es la tasa de aciertos mínima de la TLB que lo 
garantizaría?
 a) ** 93%
 b) 97%
 c) 85%
 d) 90%
t acierto= 3+42=45ns
t fallo=3+42+42=87ns
87 *(1­p)+45*p<48
42p>39 → p>0.928 → tasa de aciertos mayor que 93%

 12. Cuando realizamos una operación V sobre un semáforo:
 a) Se despertará siempre al primer proceso que realizó una operación  P, y por tanto, el 
proceso que realiza la V se bloquea ya que no es posible que continúen su ejecución dos 
procesos por la propiedad de exclusión mutua.
 b) En  caso  de  existir  algún  proceso  bloqueado,  se  despertará  a  uno  de   ellos  según   la 
política definida en la implementación del semáforo, y por tanto, el proceso que realiza la 
V  se bloquea ya  que  no  es  posible  que  continúen su  ejecución  dos  procesos  por  la 
propiedad de exclusión mutua.
 c) **En caso de existir algún proceso bloqueado, se despertará a uno de ellos según 
la política definida en la implementación del semáforo.
 d) Lo dicho en la (c), y además en caso de no existir ningún proceso bloqueado el valor del 
semáforo no se alterará.

 13. Suponga un archivo perteneciente a un sistema de archivos tipo FAT32 cuyos bloques de datos 
poseen  un  tamaño  de  512  bytes.  Asumiendo  que:  el  archivo  ya  ha  sido  abierto  con  éxito;  el 
puntero  de acceso  al  archivo posee  el  valor  0; y la FAT  se encuentra  totalmente cargada en 
memoria principal, ¿cuántos accesos a disco se requerirán para leer un registro de tamaño de 
1024 bytes que comienza en el byte 2048 del archivo?
 a) un acceso
 b) **dos accesos
 c) cuatro accesos
 d) seis accesos

 14. Suponga un sistema de archivos que soporta las políticas básicas de gestión del espacio en disco. 
En este hipotético sistema cuando un usuario crea un archivo, especifica qué política se aplica. 
Para un archivo que contendrá las copias de seguridad de los archivos propiedad del usuario 
¿qué tipo de política elegiría?
 a) **contigua
 b) encadenada
 c) indexada
 d) segmentada

 15. Suponga   un   sistema   de   archivos   que   utiliza   una   política   de   gestión   del   espacio   en   disco 
encadenada   con  doble  encadenamiento  que   contiene  65536   bloques  de   sistema   de   archivo, 
teniendo cada bloque un tamaño de 1024 bytes. Si un archivo posee 7 bloques, ¿cuál será su 
tamaño efectivo máximo?
 a) 7168
 b) ** 7140
 c) 7154
 d) 7156
65536 = 216  , por lo que se necesitan 16 bits (2 bytes) para direccionar los 65536 
bloques.   Dado   que   nos   indican   que   la   gestión   es   encadenada   con   doble 
encadenamiento, en cada bloque de 1024 bytes se emplearan 4 bytes (2 bytes para 
cada puntero) para el encadenamiento de bloques, quedando por tanto 1020 bytes 
efectivos para almacenar datos en cada bloque. Por tanto, en un archivo de 7 bloques 
se podrán almacenar 1020*7= 7140 bytes de datos.

2 (2,5 puntos) Tenemos un sistema de memoria virtual paginada, con estas características:
● tamaño de página: 1024 bytes
● marcos disponibles en memoria física: 5
● algoritmo de reemplazo: LRU local
Dos  procesos  A  y  B  se  están  ejecutando   en  el  sistema,   que  le   asigna  un  máximo   de  tres 
marcos a A y un máximo de dos marcos a B. Sus tablas de páginas contienen ahora mismo la 
siguiente información:
Proceso A Proceso B
marco bit validez marco bit validez
0 i
0 i
1 0 v
1 4 v
2 i
2 i 3 i
3 3 v 4 2 v
4 i
5 i
6 i
7 i

Las   últimas   referencias   a   memoria   que   han   ocurrido   en   el   sistema   son   estas  direcciones 
lógicas: (B:1500),  (A:3333). Tras ello,  se  realizan los siguientes accesos:  (B:2109),  (A:207), 
(A:4444), (B:2222), (A:2345), (B:3471), (A:88), (B:2000), (A:1055), (B:1093), (B:5008), (A:7815).
Se   pide   aplicar   el   algoritmo   de   reemplazo   para   esta   secuencia   de   accesos   y   mostrar   lo 
siguiente (nota: cada apartado puntúa por un tercio del valor de la pregunta).
a. Cómo quedan las tablas de páginas de A y B al final de la secuencia.
b. Calcular   las   direcciones   físicas   a   las   que   dan   lugar   las   direcciones   lógicas   de   la 
secuencia.
c. Calcular   cuántos   fallos   de   página   se   provocan   e   indicar   cuáles   son   los   accesos 
responsables de esos fallos.

 a.
Proceso A Proceso B
marco bit validez marco bit validez
0 i
0 1 v
1 2 v
1 4 v
2 i
2 i 3 i
3 i 4 0 v
4 i
5 i
6 i
7 3 v

b. 
Dirección lógica (página:desplazamiento) Dirección Física

B:2109 ­> 2:61 2048 + 61 = 2109

A:207 ­> 0:207 1024 + 207 = 1231

A:4444 ­>4:348 4096 + 348 = 4444 

B:2222 ­> 2:174 2048 + 174 =   2222

A:2345 ­> 2:297 3072 + 297 = 3369

B:3471 ­> 3:399 0 + 399 = 399

A:88 ­> 0:88 1024 + 88 = 1112

B:2000 ­> 1:976 2048 + 976 = 3024

A:1055 ­> 1:31 4096 + 31 = 4127

B:1093 ­> 1:69 2048 + 69 = 2117

B:5008 ­> 4:912 0 + 912 = 912

A:7815 ­> 7:647 3072 + 647 = 3719
c.
accesos  valor  B:2109 A:207 A:4444 B:2222 A:2345 B:3471
inicial 2:61 i
0:207 4:348 2:174 2:297 3:399

marco 0 B:1 B:1 B:1 B:1 B:1 B:1 B:3

marco 1 A:0 A:0 A:0 A:0 A:0

marco 2 B:4 B:2ii B:2 B:2 B:2 B:2 B:2

marco 3 A:3 A:3 A:3 A:3 A:3 A:2 A:2

marco 4 A:1 A:1 A:1 A:4iii A:4 A:4 A:4

FPiv x x x x x

(continuación)
 
accesos A:88 B:2000 A:1055 B:1093 B:5008 A:7815
0:88 1:976 1:31 1:69 4:912 7:647

marco 0 B:3 B:3 B:3 B:3 B:4 B:4

marco 1 A:0 A:0 A:0 A:0 A:0 A:0

marco 2 B:2 B:1 B:1 B:1 B:1 B:1

marco 3 A:2 A:2 A:2 A:2 A:2 A:7

marco 4 A:4 A:4 A:1 A:1 A:1 A:1

FP x x x x

Por tanto se generan en total nueve fallos de página.

(i)Dirección lógica en formato página:desplazamiento.
(ii)Se sustituye la página lógica 4 ya que el ultimo acceso de B se realizó a la página lógica 1 
(dirección lógica 1500 según dato del enunciado).
(iii)Se sustituye la página lógica 1 ya que los ultimos accesos de B se realizaron a las páginas 
lógicas 3 y 0.
(iv)FP = fallo de página
3 (2,5 puntos)  Un   desarrollador   implementa   un   programa   en   C++   para   contar   cuántos 
elementos   de   un   vector   tienen   valor   negativo.   Como   el   programa   se   va   a   ejecutar   en   un 
multiprocesador, decide implementarlo con varios hilos concurrentes que realizan búsquedas 
parciales en segmentos del vector. Y así queda el código:

// El vector donde se realizará la búsqueda


const int N = 10000;
int vector [N];

// Esta variable contendrá la cantidad de valores negativos


// que se vayan encontrando en el vector
int negativos_encontrados = 0;

// Rutina que ejecutan los hilos concurrentes


void buscar_negativos ( int inf, int sup ) {
int mis_negativos = 0;
for ( int k=inf; k<sup; k++ ) {
if ( vector[k] < 0 ) {
mis_negativos = mis_negativos + 1;
}
}
negativos_encontrados = negativos_encontrados + mis_negativos;
}

// Rutina principal
main () {
rellenar_vector(); // introduce valores en “vector”
for ( int i=0; i<N; i+=100 ) {
Thread* hilo = new Thread();
hilo->Fork ( buscar_negativos, i, i+100 );
}
printf ( “El vector contiene %d valores negativos\n”,
negativos_encontrados );
}

El lanzamiento de los hilos se realiza con una sintaxis similar a la de Nachos. El efecto que 
tiene   cada   llamada   a  hilo->Fork  es   que   se   crea   un   hilo   que   ejecuta   una   llamada   a 
buscar_negativos(i,i+100), de forma totalmente concurrente y asíncrona con el resto del 
código.

Primera parte (1 punto)


¿Cuántos hilos diferentes lanza este programa?
El programa lanza los hilos en el bucle «for» del main, que realiza exactamente N/100 
iteraciones, en cada una de las cuales se lanza un nuevo hilo. Como N=10000, se 
lanzará  un   total   de   100   nuevos   hilos,   que   habría   que   añadir   al   hilo   principal  ya 
existente.
¿Aumentará   la   velocidad   de   ejecución   de   este  programa   concurrente,   con   respecto   a   una 
implementación   completamente   secuencial?   (tenga   en   cuenta   que   se   ejecutará   en   un 
multiprocesador). ¿Serviría de algo añadir más hilos?
La velocidad sólo podrá aumentar si se consigue que uno o varios hilos se ejecuten en 
procesadores diferentes, consiguiendo una ejecución en paralelo de varios flujos del 
programa. Por tanto, dependemos de que el sistema operativo sea capaz de gestionar 
adecuadamente el multiprocesador. En cualquier caso, el límite máximo de aumento 
de velocidad vendrá dado por el número de procesadores físicos del sistema: si hay 
cuatro procesadores, el lanzamiento de diez o cien hilos no va a reducir más el tiempo 
de  ejecución  que  si  lanzamos  sólo  tres  o  cuatro  hilos.   Incluso  podría  penalizar  el 
tiempo   de   ejecución,  ya   que   las   actividades   de   gestión   de   los   hilos   (cambios  de 
contexto, etc.) consumen su tiempo.
También   habría   que   analizar   el   algoritmo   para   verificar   que   se   puede   ejecutar 
realmente en paralelo. Tal y como está escrito, así es, puesto que cada hilo trabaja 
independientemente de los demás con su porción del vector, con lo cual los hilos no 
tienen que esperar por resultados de sus compañeros.

Segunda parte (1,5 puntos)


Al ejecutar el programa, se imprime por pantalla un número incorrecto, casi siempre 0 (cero), 
incluso cuando todos los elementos del vector son negativos. El programador se da cuenta de 
que hay algunos fallos graves en el programa, por una inadecuada sincronización entre los 
hilos. ¿Cuáles son esos fallos y dónde se encuentran? ¿Cómo se podrían solucionar? 
El   problema   radica   en   el   uso   de   la   variable  «negativos_encontrados».   Cada   hilo 
concurrente, al final de su búsqueda, actualiza el valor de esa variable con la cantidad 
de   valores   negativos   que   ha   encontrado   en   su   porción  del   vector.   Si   varios   hilos 
intentan   modificar   simultáneamente   «negativos_encontrados»,   podemos   tener 
inconsistencias   (p.ej.   perder   modificaciones   de   algún   hilo).   Esa   línea   donde   se 
incrementa la variable es una sección crítica que se debe ejecutar atómicamente. 
Además de lo anterior, hay un problema grave de sincronización entre el hilo principal 
(el   «main»)   y   los   hilos   lanzados.   El  printf  final   escribe   el   valor   de   la   variable 
«negativos_encontrados»  sin   haber   comprobado   que   los   hilos   que   actualizan   esa 
variable han terminado de recorrer el vector. Para que el programa fuera correcto, ese 
printf debería esperar a que todos los hilos lanzados en el bucle hayan finalizado. Es 
un caso típico de operación join.
Escriba un esquema de la solución, utilizando la herramienta de sincronización que prefiera 
(semáforos, cerrojos, variables condición, etc.)
La sección crítica sobre «negativos_encontrados» se puede resolver con cualquiera de 
las soluciones de sección crítica que se han visto en la asignatura. Por ejemplo, se 
puede utilizar un semáforo inicializado a cero para regular el control de la variable:

Semáforo mutex = 1; // variable global


...
P (mutex);
negativos_encontrados = negativos_encontrados + mis_negativos;
V (mutex);

La  sincronización  entre  hilos  lanzados  y   el   «main»  también   se  puede   resolver   de 
múltiples   formas.   Una   de   ellas   la   hemos   expuesto   en   las   clases   prácticas   de   la 
asignatura, y consiste en utilizar un contador para saber cuántos hilos han finalizado. 
A continuación se muestra una solución completa que utiliza esta técnica y resuelve 
también el acceso concurrente a «negativos_encontrados». Todo ello con semáforos. 
En azul está el código añadido.
// El vector donde se realizará la búsqueda
const int N = 10000;
int vector [N];

// Esta variable contendrá la cantidad de valores negativos


// que se vayan encontrando en el vector
int negativos_encontrados = 0;

// Semáforo para controlar el acceso a negativos_encontrados


Semáforo mutex = 1;

// Semáforo para sincronizar los hilos con el main


Semáforo join = 0;

// Variable que indica cuántos hilos están pendientes de terminar


int hilos_pendientes = N / 100;

// Rutina que ejecutan los hilos concurrentes


void buscar_negativos ( int inf, int sup ) {
int mis_negativos = 0;
for ( int k=inf; k<sup; k++ ) {
if ( vector[k] < 0 ) {
mis_negativos = mis_negativos + 1;
}
}
// Sección crítica
P (mutex);
negativos_encontrados = negativos_encontrados + mis_negativos;
hilos_pendientes = hilos_pendientes – 1;
if ( hilos_pendientes == 0 ) {
V (join);
}
V (mutex);
}

// Rutina principal
main () {
rellenar_vector(); // introduce valores en “vector”
for ( int i=0; i<N; i+=100 ) {
Thread* hilo = new Thread();
hilo->Fork ( buscar_negativos, i, i+100 );
}
// Espera a que todos los hilos finalicen
P (join);
printf ( “El vector contiene %d valores negativos\n”,
negativos_encontrados );
}

Por último, mostraremos la misma solución utilizando un monitor. El monitor obliga a 
una mejor organización del código a través de la definición de un tipo abstracto de 
datos que regula el acceso a la variable «negativos_encontrados». La solución es más 
elaborada, pero al mismo tiempo más modular.
Como el C++ no soporta monitores, utilizaremos una sintaxis ficticia para especificar el 
monitor, similar en sintaxis a una clase de C++, pero con la semántica de un monitor. 
Esta solución es válida con semánticas Hoare y Mesa.
// El vector donde se realizará la búsqueda
const int N = 10000;
int vector [N];

// Monitor que encapsula negativos_encontrados


Monitor NegativosEncontrados {

// Variable condición para sincronizar al hilo principal


private: Condition join;

// convertimos la variable global en un campo privado del monitor


private: int negativos_encontrados;

// variable que indica cuántos hilos están pendientes de terminar


private: int hilos_pendientes;

// Constructor
public: NegativosEncontrados() {
negativos_encontrados = 0;
hilos_pendientes = N / 100;
}

// Operación para leer el resultado del programa


public: int Valor() { return negativos_encontrados; }

// Operación que invocan los hilos cuando terminan de rastrear el vector


public: void Incrementa (int cuantos) {
negativos_encontrados += cuantos;
hilos_pendientes--;
if ( hilos_pendientes == 0 ) {
join.Signal();
}
}

// Operación de sincronización del hilo principal


public: void Espera () {
if ( hilos_pendientes > 0 ) {
join.Wait();
}
}
}

// Rutina que ejecutan los hilos concurrentes


void buscar_negativos ( int inf, int sup ) {
int mis_negativos = 0;
for ( int k=inf; k<sup; k++ ) {
if ( vector[k] < 0 ) {
mis_negativos = mis_negativos + 1;
}
}
// escribe en el monitor los resultados
NegativosEncontrados.Incrementa (mis_negativos);
}

// Rutina principal
main () {
rellenar_vector(); // introduce valores en “vector”
for ( int i=0; i<N; i+=100 ) {
Thread* hilo = new Thread();
hilo->Fork ( buscar_negativos, i, i+100 );
}
// Espera a que todos los hilos finalicen
NegativosEncontrados.Espera();
printf ( “El vector contiene %d valores negativos\n”,
NegativosEncontrados.Valor() );
}
Calificación

1
2
3

SISTEMAS OPERATIVOS,10 de diciembre de 2007


Examen Convocatoria Extraordinaria Especial

Nombre Titulación
SOLUCION

Dispone de tres horas para completar el examen

1 (5 puntos) Test. Marque las opciones correctas de cada apartado. En caso de que existan
varias opciones ciertas, se considerará como correcta la más completa o precisa. Las preguntas
no contestadas no puntúan; las mal contestadas puntúan negativamente restando un tercio de
su valor. Marque la opción correcta rodeándola con un círculo. Si se equivoca, tache la
respuesta equivocada y rodee la opción correcta. Escriba con tinta. Las preguntas respondidas
con lápiz o con varios círculos no tachados se considerarán no contestadas.

1. Suponga un sistema de archivos tipo FAT en el que cada cluster posee 2048 bytes y cada entrada
de directorio posee un tamaño de 32 bytes, si el directorio raíz posee 10 archivos y el directorio
“/Mis_Aplicaciones” posee 23 archivos. Si la FAT ya está cargada totalmente en memoria
¿Cuántos accesos a disco se requerirían en el peor de los casos para abrir un archivo ubicado en
“/Mis_Aplicaciones”?
a. Un acceso
b. Dos accesos
c. Veintitrés accesos
d. Treinta y tres accesos

2. Cuando realizamos una operación V sobre un semáforo:


a. Se despertará siempre al primer proceso que realizó una operación P.
b. En caso de existir algún proceso bloqueado, se despertará a uno de ellos según la
política definida en la implementación del semáforo.
c. Ningún otro proceso puede estar en mitad de la ejecución de otra operación V sobre
dicho semáforo, aunque si es posible que exista otro proceso en mitad de la ejecución de
una operación P sobre el mismo semáforo.
d. Todas las anteriores son ciertas.

3. Supongamos que para resolver cierto problema de concurrencia empleamos un monitor y


variables condición. En este caso:
a. Una operación wait sobre una de las variables condición empleadas en dicho
monitor provocará que el proceso que la realice se bloquee incondicionalmente.
b. Una operación signal sobre una de las variables condición empleadas en dicho monitor
provocará el desbloqueo de otro proceso que haya realizado una operación wait sobre
cualquiera de las variables condición del monitor.
c. Una operación signal nunca provoca el bloqueo del proceso que la realiza.
d. Todas las anteriores son falsas.
4. ¿Cuál es la duración del cuanto de tiempo (timeslice) más apropiado para un sistema operativo que
utiliza Round-Robin para garantizar interactividad? Como dato adicional, se sabe que en el peor
caso habrá 20 procesos en la cola de preparados.
a. un segundo
b. una décima de segundo
c. un milisegundo
d. un microsegundo

5. Supongamos una política de planificación que actúa de la siguiente forma: cada vez que la CPU
queda libre, se escoge a un proceso al azar de la cola de preparados. ¿Qué podemos afirmar sobre
esta política?
a. el tiempo medio de respuesta de esta política es similar al de un Round-Robin
b. esta política tiene cierto riesgo de inanición
c. esta política perjudica a los procesos con ráfagas de CPU muy largas
d. esta política es expulsiva

6. Suponga un sistema con memoria virtual en el que el área de intercambio se soporta mediante un
archivo de intercambio. Si el sistema permite establecer la política de asignación de espacio en
disco de forma individual cada vez que un archivo se crea ¿qué política utilizaría para el archivo de
intercambio?
a. Asignación contigua
b. Asignación encadenada
c. Asignación indexada
d. Asignación tipo FAT

7. Considere un sistema de archivos tipo UNIX nativo en el que el tamaño de bloque de sistema de
archivo es de 1024 bytes; además dicho tamaño coincide con el tamaño de bloque físico. Para un
archivo con registros de 256 bytes y que posee 2500 registros, acceder al registro 47 requeriría en
el peor de los casos de:
a. Un acceso
b. Dos accesos
c. Veintitrés accesos
d. Cuarenta y seis accesos

8. El modo dual de operación:


a. Permite ejecutar dos procesos concurrentemente
b. Proporciona un mecanismo de protección de software
c. Permite al usuario ejecutar una instrucción privilegiada mediante una llamada al
sistema
d. Ninguna de las anteriores

9. La tabla de páginas indica que la página 2 tiene asociado el marco número 5. ¿Cuál es la dirección
física para la dirección virtual (5,215) dada en el formato (nº Pág., desplazamiento en la Pág):
a. 5+215
b. 5*1024+215
c. Con los datos del enunciado no es posible obtenerla
d. Si el tamaño del marco es T, la dirección física es 5 x T + 215
Nombre

10. En un sistema operativo multitarea, con 16Kb de espacio lógico de procesos, con páginas de
512bytes y 64 marcos de página, sin memoria virtual. La dirección lógica está formada por:
a. 6 bits para indicar la página y 9 bits para el desplazamiento.
b. 9 bits para indicar la página y 6 para el desplazamiento.
c. Dado que tenemos 16Kb de espacio lógico de procesos y 64 marcos, no tiene sentido
indicar que se trata de un sistema sin memoria virtual.
d. 5 bits para indicar la página y 9 bits para el desplazamiento.

11. ¿En qué nivel de planificación de procesos se encuentra el componente llamado despachador o
dispatcher?
a. en el planificador de corto plazo
b. en el planificador de medio plazo
c. en el planificador de largo plazo
d. dependiendo del sistema operativo, puede estar en el de medio plazo o en el de largo plazo
12. Supongamos que en un momento dado llegan a un sistema N procesos, cada uno de ellos con una
sola ráfaga de CPU y todos ellos con exactamente la misma duración. Cuando se planifica esta
carga de trabajo, dependiendo de la política, podemos afirmar lo siguiente sobre el tiempo medio
de espera:
a. el tiempo medio de espera con SJF y RR será el mismo
b. el tiempo medio de espera con FCFS y SJF será el mismo
c. el tiempo medio de espera con FCFS, SJF y RR será el mismo
d. como las duraciones son iguales, el tiempo medio de espera será el mismo, cualquiera que
sea la política de planificación empleada.
13. Un sistema multiprogramado:
a. Permite gestionar varias tareas interactivas
b. Evita el posible monopolio de la CPU por un proceso del sistema
c. Aumenta el rendimiento del sistema ya que los procesos se ejecutan en paralelo
d. Ninguna de las anteriores
14. La idea básica de mecanismo de E/S por interrupciones consiste en:
a. Disponer de un mecanismo acceso directo a memoria
b. Eliminar el bucle de espera
c. Buscar mecanismos de interactividad
d. Ninguna de las anteriores
15. Los búferes de E/S son:
a. Un dispositivo de gestión de las entradas y salidas de datos al computador
b. El espacio de memoria principal que s reserva para el almacenamiento intermedio
de datos procedentes o con destino a los periféricos
c. E/S controlada por programa
d. Ninguna de las anteriores
16. Un manejador de dispositivos es:
a. Hardware que controla un dispositivo
b. Software que controla un dispositivo
c. Un programa de usuario
d. Ninguna de las anteriores
2 (2,5 puntos) Un computador utiliza gestión de memoria virtual segmentada. La memoria
disponible para los procesos es de 64 bytes y el máximo tamaño de segmento es 32 bytes. En
este computador vamos a ejecutar un proceso cuya imagen de memoria tiene 4 segmentos. En
un determinado instante, la tabla de segmentos indica la siguiente información:
Nº de Segmento Dirección Base Tamaño (bytes)
1 56 = 3816 8
3 16 = 1016 32 = 2016
El segmento 0 tiene un tamaño de 16 bytes y el segmento 2 un tamaño de 24 bytes.
Se realiza la siguiente secuencia de referencias virtuales a memoria: 3016, 0C16, 6E16, 4F16 y 2716.
Teniendo en cuenta que no hay más procesos en el sistema, se pide:
a) ¿Podemos asegurar un formato de dirección virtual y de dirección física? Justificar la
respuesta indicando una propuesta para cada caso. (0.5p)
b) Indicar (con la mayor claridad posible) el contenido de las tablas que se utilizan para
realizar la traducción dinámica de direcciones mediante traducción directa, indicando
además cuándo hay que actualizar cada una de ellas, y el contenido de las mismas antes
de realizar los accesos a memoria. (0.25p)
c) Calcular las direcciones reales correspondientes. Indicar el contenido de las tablas y
estructuras de datos utilizadas en el apartado mientras se ejecuta el proceso. (1p)
d) Calcular la tasa de aciertos de la secuencia de referencias citada. (0.25p)
SOLUCIÓN:
a) Por un lado, como la memoria es de 64 bytes, para direccionarla necesitaremos de 64 = 26, 6
bits para la dirección física de la memoria.

Dirección física de memoria


6 bits

Como el tamaño de segmento máximo es de 32 bytes, necesitaremos 5 bits para direccionarlo


(como mucho). Por otro lado, debido a que la longitud máxima del segmento es 32 bytes, como
mínimo necesitaremos 1 bit para el segmento, y como en el problema el proceso ocupa 4
segmentos, como mínimo necesitaremos 2 bits para direccionar el segmento.

Direcci—n virtual dememoria


M’nimo 2 bits M‡ximo 5 bits
N m. segmento desplazamiento

De todas formas, con la información del ejercicio, sólo podemos asegurar un mínimo de bits para
el segmento, que sería 2, pero no una cantidad fija, pues no nos proporciona en ningún lado del
enunciado el número de segmentos máximos a direccionar por los procesos.
Nombre

b) Tablas para la traducción directa de direcciones:


Segmento ¿está en memoria? Tamaño Dirección memoria
0 NO 16 bytes ----
1 SI 8 bytes 111000
2 NO 24 bytes ----
3 SI 32 bytes 010000
TS: Tabla de Segmentos del proceso
Memoria
principal
0
Libre
16

Seg. 3

Libre 48
56
Seg. 1 64

La tabla de segmentos cambiará cuando carguemos un segmento en memoria.


c) Al traducir las direcciones es necesario comprobar que el desplazamiento es menor que el
tamaño del segmento, pues en caso contrario producirá un error por desbordamiento de segmento.
Además, puesto que en el enunciado no se especifica ningún dato en relación a la política de
asignación de espacio y reemplazo, dicha elección queda a criterio del alumno. En este caso
hemos optado por ubicar el segmento 0 en memoria en un hueco libre y en el caso del segmento 2
se ha reemplazado por el 3.

Dir. Hex. Segmento Desplazamiento Dir. Física memoria Observaciones


2bits 5bits 6bits
3016 01 10000 ---- ERROR
FALLO
0C16 00 01100 001100
(sin sustitución)
6E16 11 01110 011110 ACIERTO
FALLO
4F16 10 01111 011111
(con sustitución)
2716 01 00111 111111 ACIERTO
Traducciones de direcciones de memoria
La tabla de segmentos estaría como sigue:
Segmento ¿está en memoria? Tamaño Dirección memoria
0 SI 16 bytes 000000
1 SI 8 bytes 111000
2 SI 24 bytes 010000
3 NO 32 bytes ----
TS: Tabla de Segmentos del proceso

Memoria
principal
0
Seg. 0
16

Seg. 2

Libre 40
56
Seg. 1 64

núm.aciertos 2
d) Tasa de aciertos = =
núm.accesos 5

3 (2,5 puntos) Escoja y resuelva uno de los dos problemas de concurrencia que se
describen a continuación.
OPCION A. Implemente un monitor que resuelva el primer problema de los lectores y escritores
(prioridad para los lectores, posible inanición de los escritores). La solución deberá utilizar UNA
SOLA variable condición.
Suponga una semántica Mesa. Si lo prefiere, puede utilizar la operación Broadcast().
El monitor deberá tener esta especificación:
monitor BaseDatos
{
public abreLectura (); // cuando un lector quiere empezar a leer
public cierraLectura (); // cuando un lector termina de leer
public abreEscritura (); // cuando un escritor quiere empezar a escribir
public cierraEscritura (); // cuando un escritor termina de escribir
}

NOTA: Sólo hay que implementar las operaciones del monitor, no hay que implementar los
procesos lectores y escritores.

Esta es una posible solución con una sola cola para lectores y escritores.
monitor BaseDatos
{
int lectores = 0;
bool escribiendo = false;
Condition cola;
Nombre

public abreLectura () {
while ( escribiendo ) {
cola.Wait();
}
lectores++;
}

public cierraLectura () {
lectores--;
cola.Signal();
}

public abreEscritura () {
while ( escribiendo || lectores>0 ) {
cola.Wait();
}
escribiendo = true;
}

public cierraEscritura () {
escribiendo = false;
cola.Broadcast();
}
}

OPCION B. Vamos a simular un conjunto de N procesos que juegan al famoso juego adolescente-
alcohólico del «marcianito». En este juego, un grupo de personas se reúnen en círculo; cada una tiene
un número entre 1 y N. El número 1 agita sus dos manos al lado de su cabeza al grito de «marcianito
número 1 llamando a marcianito número XXX», a lo que la persona con el número XXX debe
contestar con un mensaje similar «marcianito número XXX llamando a marcianito número YYY», y
así hasta que alguien se despiste.

Se trata de hacer una simulación del sistema usando semáforos, en la que cada proceso i tendrá la
siguiente estructura (i será un número entre 1 y N):
while (true) {
marcianito ( i, random(1..N) );
}

La rutina marcianito(i,j) debe funcionar así: el proceso i espera a que alguien le ceda el turno; una vez
que le han cedido el turno, imprime por pantalla «marcianito número i llamando a marcianito número
j». Y a continuación, cede el turno al proceso j, que hasta ese momento habrá estado bloqueado
dentro de la rutina marcianito(j,otro_proceso).

Además, el marcianito número 1 es el que arranca el sistema. Es decir, que en su primera iteración, el
proceso 1 no debe esperar a que nadie le ceda el turno.

NOTA: lo que hay que implementar es únicamente la rutina marcianito(i.j).

El problema es muy sencillo de resolver. Cada proceso tiene asociado un semáforo inicializado a
cero en el que se bloquea cada vez que se ejecuta la rutina marcianito. Cuando alguien le cede el
turno, se invoca una operación V() sobre ese semáforo.
El semáforo del proceso 1 se inicializa a uno, para que pueda empezar a caminar sin que nadie le
avise.
// El marcianito i esperará en el semáforo turno[i]
// espera[1] está inicializado a 1, para que el marcianito 1
// pueda iniciar su ejecución sin esperar por nadie
espera : array [1..N] of Semáforo := { 1=>1, others=>0 };

marcianito (i,j)
{
P( espera[i] );
print "marcianito número " + i + "llamando a marcianito número " + j;
V( espera[j] );
}
Calificación:

Universidad de Las Palmas de Gran Canaria


Escuela Universitaria de Informática
1
Facultad de Informática
2

Sistemas Operativos 3
Examen Parcial, 29 de abril de 2006 4
5

Nombre Titulación
SOLUCIONES
Dispone de tres horas para realizar el examen

1 (2 puntos) [Conceptos Generales]Test. En cada uno de los siguientes apartados,


señale cuál opción es correcta. En caso de que existan varias opciones ciertas, se considerará como
correcta la más completa o precisa. Las preguntas no contestadas no puntúan; las contestadas
erróneamente penalizan un tercio de su valor. Señale sus respuestas rodeando con un círculo la
opción correcta. Si se equivoca, tache la respuesta incorrecta y rodee la opción que considere
correcta. Escriba con tinta. Las preguntas respondidas con lápiz o con varios círculos no tachados
se considerarán no contestadas.
1.El modo dual de operación consigue que el sistema informático sea:
a) más veloz
b) más fácil de usar
c) más seguro
d) ninguna de las anteriores
2.El fenómeno de espera activa por operaciones de entrada/salida se puede evitar utilizando:
a) interrupciones
b) instrucciones privilegiadas
c) acceso directo a memoria (DMA)
d) un pareja de registros base y límite
3.El núcleo del sistema operativo...
a) es un proceso que se ejecuta en modo supervisor
b) contiene el código del programa de usuario, pero no sus datos
c) contiene el código de los programas del sistema
d) reside permanentemente en memoria principal
4.Multiprogramación implica:
a) Tiempo compartido
b) Procesamiento en lote
c) Interactividad
d) Todas las anteriores son falsas
5.¿Cuál de estas técnicas NO tiene como fin solapar la ejecución de instrucciones en CPU con
la ejecución de operaciones de entrada/salida?
a) acceso directo a memoria (DMA)
b) modo dual de operación
c) procesamiento fuera de línea ( off-line)
d) spooling
6.Cuando un proceso en modo usuario intenta ejecutar una tarea privilegiada, ocurre:
a) una interrupción
b) una excepción
c) una llamada al sistema
d) un avatar

1/8
7.Un sistema operativo distribuido
a) permite gestionar recursos dispersos por medio de una máquina central que controle
al resto
b) sólo tiene sentido si el sistema consta de máquinas heterogéneas
c) permite la ejecución de un servicio en una máquina diferente a aquélla donde fue
solicitado
d) todas las anteriores son ciertas
8.¿ Cuál de estos sistemas informáticos no se puede dar ?
a) un sistema monoprogramado por lotes multiusuario.
b) un sistema multiprogramado por lotes monousuario.
c) un sistema monoprogramado de tiempo compartido multiusuario.
d) un sistema multiprogramado de tiempo compartido monousuario.
9.Para garantizar la integridad y la protección de un sistema informático, estas funciones han
de estar necesariamente implementadas en circuitería:
a) temporizador (timer) del sistema
b) guardar en la pila el estado del procesador
c) sistema de ficheros
d) acceso directo a memoria
10.Un sistema operativo nunca...
a) pretende simplificar las tareas del usuario
b) ha de disminuir la capacidad ofrecida por los recursos del hardware
c) permite utilizar directamente los periféricos
d) realiza trabajo productivo para el usuario
11.El modo dual de operación significa o implica que
a) no se puede acceder a la memoria del sistema operativo
b) el sistema protege los ficheros de distintos usuarios
c) determinadas operaciones han de ser privilegiadas
d) se genera una excepción siempre que se pretende acceder a los datos de otro usuario
12. La técnica de buffering permite que:
a) Un proceso no espere debido a que un recurso no compartido esté asignado a otro
proceso.
b) Un proceso nunca espere debido a al lentitud de los dispositivos de E/S.
c) Se solapen operaciones de CPU de un proceso con operaciones de E/S de otro
proceso.
d) Todas las afirmaciones anteriores son falsas.
13. La independencia del dispositivo significa o implica que...
a) el usuario no debe conocer características propias de cada clase de dispositivo.
b) el juego de caracteres empleados por una terminal de caracteres ha de ser ASCII.
c) los dispositivos deberían tener independencia de los procesos de usuario.
d) los procesos de usuario deberían trabajar indirectamente con los dispositivos.
14.¿Con cuál de las siguientes afirmaciones te quedarías?
a) El diseño de un S.O. siguiendo una estructura monolítica permite que se pueda
realizar un mantenimiento y depuración sencillos del mismo.
b) En general, el diseño por capas tiende a ser menos eficiente que el monolítico.
c) El modelo cliente-servidor es equivalente a un sistema que sigue el enfoque
jerárquico donde las capas pueden cambiar su nivel en la jerarquía.
d) El enfoque micronúcleo tiene como dos de sus mejores virtudes la portabilidad y el
menor tamaño del sistema operativo.
15.El intérprete de órdenes:
a) Es un programa del sistema y constituye la única forma de solicitar servicios al SO
b) Ejecuta las órdenes indicadas por el usuario y para ello hace uso a su vez de las
llamadas al sistema
c) Al ser un programa del sistema, no necesita realizar llamadas al sistema
d) Siempre forma parte del núcleo del sistema operativo

2/8
Nombre

2 (2,5 puntos) A continuación se muestran las demandas de CPU de un


[Procesos]
conjunto de procesos que llegan a un sistema de cómputo. En cada casilla se muestra el
tiempo requerido para completar una petición de CPU, el tiempo de llegada de cada
proceso al sistema, así como la prioridad de cada uno de ellos (a menor número, mayor
prioridad).
El planificador a corto plazo utiliza la siguiente política de planificación: se dispone de un
temporizador programado para interrumpir cada 3 unidades de tiempo. Cuando el
temporizador interrumpe al sistema, el planificador elige el proceso que mayor prioridad
tiene en ese momento (de forma expulsiva). El planificador NO ACTÚA EN NINGÚN
OTRO MOMENTO. En caso de que dos procesos tengan la misma prioridad, el
planificador escogerá al que lleve más tiempo sin usar CPU.
Además, el sistema evita la inanición de procesos de la siguiente forma: cada vez que el
planificador actúa, se disminuye en una unidad la prioridad de los procesos de la cola de
preparados, justo antes de hacer la elección del proceso que entra en CPU.
NOTA: supondremos que el temporizador inicia su actividad en el instante cero. Además,
en caso de que el planificador deba decidir en el momento de la llegada del proceso, se
tomará que primero llega el proceso antes de la toma de decisión.

t llegada Prioridad CPU


P1 0 5 7
P2 5 3 4
P3 8 2 5
P4 12 1 4
P5 17 4 6
Se pide:
a) Obtener el diagrama de Gantt, el tiempo de retorno y el tiempo de espera de cada
proceso, así como los tiempos medios de retorno y de espera.
b) ¿Cuántas unidades de tiempo queda ociosa la CPU? Proponer alguna solución para
minimizar dicho tiempo.
Solución:
En los siguientes diagramas se muestran, por filas los procesos, y por columnas los
recuadros indican tiempo de CPU utilizada, y dentro de cada recuadro, subrayada, la
prioridad del proceso.
Para el problema planteado existen varias alternativas válidas de solución.
Alternativa 1: (Primero entra el proceso en la cola de preparados y luego se reevalúan
las prioridades)
tret tresp actuación⇒ 0 3 6 9 12 15 18 21 24 27 30 33
planificador

25 18 P1 4 3 2 1 0 -1 -2

11 7 P2 3→2 2 1 0 0

12 7 P3 2→1 1 0 -1 -1

10 6 P4 1→0 0 -1 -2 -2

16 10 P5 4→3 2 1 0

14,8 9,6
u.t. u.t.

3/8
Para el problema planteado, existen dos alternativas más, también válidas.
Alternativa2: (Primero se reevalúan las prioridades y luego entra el proceso en la cola
de preparados). En este caso hay dos variantes: en el instante 15, existen
dos procesos con la misma prioridad y el mismo tiempo de espera en
CPU, así que tenemos dos alternativas.
Altenativa2-a: Elegimos primero el proceso P3.

tret tresp actuación⇒ 0 3 6 9 12 15 18 21 24 27 30 33


planificador

25 18 P1 5 4 3 2 1 0 -1

8 4 P2 3 2 1

9 4 P3 2 1 0

10 6 P4 1 0 --1

16 10 P5 4 3 2 1 0

13,6 8,4
u.t. u.t.

Altenativa2-b: Elegimos primero el proceso P4.

tret tresp actuación⇒ 0 3 6 9 12 15 18 21 24 27 30 33


planificador

25 18 P1 5 4 3 2 1 0 -1

8 4 P2 3 2 1 1

-1
12 7 P3 2 1 0

10 6 P4 0 0 -1

16 10 P5 4 3 2 1 0

14,2 9
u.t. u.t.

El número de unidades de tiempo que la CPU está ociosa (cuadros sombreados) será
de 7. Para minimizarlo podríamos proponer que el planificador actuara también cuando
un proceso acaba totalmente, de forma que no queden instantes en los que la CPU no
trabajase.

3 (2.5 puntos) Responder y justificar brevemente cada una de las siguientes cuestiones:

a) ¿Puede darse el efecto convoy en un sistema que planifica el


[Procesos]
procesador con una política de “primero el más corto” no expulsivo?
En un sistema con planificación de “Primero el más corto no expulsivo”
sería poco probable que se produjera el efecto convoy debido a que el
origen de este fenómeno es permitir el acaparamiento del procesador
por un proceso limitado en CPU. En esta política se penaliza a este tipo
de procesos. Se podría producir en el caso en que la entrada del
proceso intensivo en CPU se realizara cuando la cola de preparados
estuviese vacía.
b) [Procesos]Supongamos que nos dicen que debemos diseñar una política de
planificación del procesador para un sistema que utiliza tiempo compartido.
Además nos especifican que dicha política debe favorecer a los procesos que
4/8
Nombre

menos tiempo del procesador hayan consumido. Proponer una política que se ajuste
a lo solicitado, especificando sus principios de funcionamiento.

Una posible política sería una variante del Round-Robin que consistiría
en ordenar la cola de unidades de ejecución en estado listo utilizando
como criterio de ordenación el tiempo del procesador ya consumido. A
igual tiempo consumido, entonces una ordenación FIFO, o sea, por
tiempo de llegada a la cola.
c) Menciona cinco ejemplos de recursos lógicos o virtuales que
[Conceptos Generales]
ofrece el SO y que no existen físicamente en el hardware.
Archivos, carpetas o directorios, memoria virtual, procesadores
virtuales (lo que se consigue con la multiprogramación),
volúmenes lógicos, cuentas de usuario, semáforos... casi
cualquier recurso que ofrece el s.o. es un recurso virtual.
d) [Conceptos Generales] ¿En qué consiste la estructura de los sistemas operativos
por capas? ¿Qué ventajas y desventajas tienen? Pon un ejemplo de algún
sistema que utilice esta estructura, señalando las distintas capas que lo
componen.
La estructura por capas de un sistema operativo consiste en la
descomposición en varios estratos (niveles), cada uno de ellos
construidos sobre capas inferiores. La capa inferior (capa 0) es el
hardware; la más alta (capa N) es la interfaz con el usuario.
La principal ventaja es la modularidad. Las capas se seleccionan de tal
manera que cada una utilice funciones (operaciones) y servicios
exclusivamente de capas de niveles inferiores. Este enfoque simplifica
la depuración y la verificación del sistema.
La principal desventaja radica en la definición apropiada de las
diferentes capas. Dado que cada nivel sólo puede usar los servicios de
los niveles inferiores, es necesario realizar una planificación cuidadosa.
Además, las implementaciones por niveles tienden a ser menos
eficientes que otros tipos de implementación. Esto es debido a que el
sistema pierde tiempo en la comunicación entre las capas pertinentes.
Ejemplo: Sistema THE con seis niveles: L5: programas, L4: buffering,
L3: consola del operador, L2: gestión de memoria paginada, L1:
planificación de procesos, L0: hardware.
e) [Conceptos Generales] ¿Definir e indicar las diferencias entre los sistemas
fuertemente acoplados y los sistemas débilmente acoplados.
Los sistemas débilmente acoplados son sistemas de procesadores que
no comparten memoria o reloj. En su lugar, cada procesador tiene su
propia memoria local. Los procesadores se comunican entre ellos
mediante varias líneas de comunicación, como buses de alta velocidad
o líneas Telefónicas. Se les llaman también sistemas distribuidos.
Los sistemas fuertemente acoplados son sistemas multiprocesadores
que tienen más de un procesador, compartiendo el bus, el reloj y en
ocasiones la memoria y periféricos.

5/8
4 (1,5 puntos) En una fábrica se tienen dos procesos que modelan una
[Concurrencia]
planta embotelladora de bebidas, y que trabajan en paralelo:
Un proceso "Embotellador" se encarga de preparar botellas de un litro.

Otro proceso "Empaquetador" se encarga de empaquetar y reponer las cajas donde se van

colocando las botellas.
Cada vez que el embotellador prepara una botella, ésta se coloca en una caja, que tiene una
capacidad de 10 litros. Si al colocar la botella, la caja queda llena, se envía una señal al
empaquetador, que toma la caja, la sella y la guarda en un almacén. El empaquetador deposita una
nueva caja de 10 litros, totalmente vacía. Mientras el empaquetador está haciendo su labor, el
embotellador no puede colocar sus botellas, ya que en esos momentos no hay una caja disponible.
Encontrar una solución basada en semáforos que sincronice el problema de concurrencia citado.

Semáforo empaqueta(0);
Semáforo embotella(0);
int litros = 10;
Embotellador () Empaquetador ()
{ {
loop { loop {
... prepara una botella empaqueta.P();

... coloca la botella en la caja ... empaqueta la caja actual


... pone una caja nueva vacía
litros = litros-1;
if ( litros == 0 ) { litros = 10;
empaqueta.V(); embotella.V();
embotella.P();
} }
} }
}

5 (1,5 puntos) [Concurrencia] Seguidamente se muestra una propuesta de solución al


problema de la sección crítica. ¿Crees que es una propuesta válida? Justifica tu respuesta.
var
elección: array [0..n-1] of boolean;
numero: array[0 .. n-1] of integer;
j: 0..n
repeat
elección[i] = true;
número[i] = mín(número[0],número[1],…, número[n-1])+1;
elección[i] = false;
for j:=0 to n-1 do
begin
while elección[j] do no-operar;
while número[j] != 0 and (número([j],j) < (número[i],i) do no-operar
end;

Sección crítica

número[i] := 0;

Sección restante

Until false

6/8
Nombre

Siendo:
N: número de procesos que intervienen en el problema de sección crítica
i: indica el proceso que quiere entrar en la sección crítica
mín(v0, v1, …, vn) : función que devuelve el valor mínimo
(a,b) < (c,d) : devuelve true si se cumple a<c o ((a=c) and (b<d)), en caso contrario
devuelve false;

La solución propuesta es una versión errónea del «algoritmo de la panadería» de


Leslie Lamport. La elección del número de turno del algoritmo original se hace dándole
al proceso el máximo valor de los turnos de sus compañeros, más uno. Aquí se ha
cambiado el máximo por el mínimo. Esto conduce a un algoritmo totalmente inútil y
absurdo.
Puede comprobarse que cuando el proceso calcula su numero[i] a partir del mínimo de
los valores de número[], se devolverá siempre un uno. Esto ocurre porque el mínimo
encontrado siempre es cero, que es el valor que precisamente tenía numero[i] antes
de empezar a buscar el mínimo.
Lo anterior significa que los valores de numero[i] sólo pueden ser:
- cero (el proceso no está interesado en entrar en sección crítica)
- uno (el proceso quiere entrar en sección crítica).

A su vez, eso significa que la línea


while número[j] != 0 and (número([j],j) < (número[i],i) do no-operar;
realmente es equivalente a:
while número[j] ==1 and j<i do no-operar;
O sea, que un proceso I espera por otro proceso J si y solo si el proceso J quiere
entrar en sección crítica y el identificador de J es menor que el de I. Esto significa que
si el proceso 10 está dentro de la sección crítica y el proceso 5 está interesado en
entrar, este último NO esperará por el proceso 10 y entrará sin más en sección crítica.
Es más, si llega el proceso 3, también entrará en sección crítica, porque no esperará ni
por el 5 ni por el 10. Por tanto se viola flagrantemente el requisito de exclusión
mutua.

Al no verificarse la exclusión mutua, no tiene sentido examinar las propiedades de


progreso o espera limitada. La solución no es válida.

Esto puede verse con más claridad si reducimos el problema a N=2 procesos. El
código de los dos procesos quedaría como sigue:
Proceso 0. Proceso 1.
elección[0] := true elección[1] := true
número[0] := 1 número[1] := 1
elección[0] := false elección[1] := false
while elección[1] do no-operar; while elección[0] do no-operar;
Sección Crítica while número[0]==1 do no-operar;
Sección Crítica
número[0] := 0 numero[1] := 0
Sección Restante Sección Restante

7/8
Puede verse que el proceso 0 no tiene en cuenta al proceso 1 para entrar en sección
crítica (sólo se podría bloquear brevemente mientras elección[1] sea cierto, cosa que
sólo ocurre fugazmente, mientras el proceso 1 está fijando el valor de número[1]). En
otras palabras, el proceso 0 entra en la sección crítica cuando quiere, incluso si el
proceso 1 está dentro.
Progreso. Si la cumple ya que, por un lado, sólo los que quieren entrar en la sección
crítica influyen en la elección de quién entra (tendrán sus elementos de número
asociados a valores distinto de cero), y por otro lado, la elección siempre se realiza en
un tiempo finito (en caso de existir varios con un mismo valor de número, entonces
entra el que posea un menor identificador de proceso).
Espera limitada. No la cumple ya que existe la posibilidad de que varios procesos
posean un mismo valor de número debido a la fórmula empleada para su obtención
(que no tiene en cuenta el orden de petición). De hecho, los únicos valores de número
son 0 ó 1. Si esto ocurriese siempre entraría aquél con un identificador menor, por
tanto, se podrían producir un “castigo” a aquellos procesos que posean identificadores
mayores.

* * * * *

8/8
Calificación

1
2

SISTEMAS OPERATIVOS - PRIMERA PARTE


Examen Convocatoria Ordinaria, 22 de junio de 2006

Nombre Titulación
SOLUCIONES

Dispone de una hora y media para realizar el examen

1 (7.5 puntos) Test. En cada uno de los siguientes apartados, señale cuál opción es
correcta. En caso de que existan varias opciones ciertas, se considerará como correcta la
más completa o precisa. Las preguntas no contestadas no puntúan; las contestadas
correctamente puntúan 0,5 puntos y las contestadas erróneamente penalizan 0,25 puntos.
Señale sus respuestas rodeando con un círculo la opción correcta. Si se equivoca, tache la
respuesta incorrecta y rodee la opción que considere correcta. Escriba con tinta. Las
preguntas respondidas con lápiz o con varios círculos no tachados se considerarán no
contestadas.

1.¿Con cuál de las siguientes afirmaciones te quedarías?


a) La instrucción de wait o espera sobre un semáforo duerme siempre al proceso
llamador.
b) Si se ejecuta un operación signal o señal sobre un semáforo cuyo valor actual es 6,
deja un valor de 7 en el semáforo excepto si existen procesos en espera por el mismo,
en cuyo caso se queda con 6.
c) Para resolver el problema de la sección crítica, basta con emplear un semáforo
inicializado a uno.
d) Para lograr la ejecución de manera exclusiva de una porción de código basta con
emplear un semáforo inicializado a uno.

2.¿Con cuál de las siguientes afirmaciones te quedarías?


a) Un sistema distribuido es un sistema multiprocesador, al que se suele hacer
referencia también como sistema estrechamente acoplado.
b) Hablar de un sistema que emplea multiprocesamiento simétrico es equivalente a
hablar de un sistema paralelo en el que todos los procesadores son iguales y no
existen unos procesadores principales y otros subordinados.
c) En un sistema de tiempo real crítico existen eventos a los que es necesario responder
en un plazo límite, por lo que es necesario que estos sistemas implementen tiempo
compartido y memoria virtual.
d) Todas las anteriores son ciertas.

3.Un proceso en estado de bloqueo:


a) Siempre espera por la ocurrencia de un evento.
b) Siempre espera por la conclusión de una actividad de E/S.
c) Reside en la cola de preparados en espera de entrar nuevamente en la CPU.
d) Reside en la cola de procesos de baja prioridad.
4.¿Con cuál de las siguientes afirmaciones te quedarías?
a) Las interrupciones evitan que la CPU esté continuamente interrogando a los
dispositivos de E/S para saber si han concluido las operaciones de E/S pendientes.
b) Cuando se van a transferir grandes volúmenes de datos es mejor disponer de DMA
(acceso directo a memoria) que tener una E/S dirigida por interrupciones.
c) En un sistema de tiempo compartido con una gestión de la E/S dirigida por
interrupciones, cuando se produce una interrupción de un dispositivo de E/S mientras
se ejecutan instrucciones en modo usuario, esta será atendida cuando el proceso
finalice su cuanto de CPU.
d) Cuando un dispositivo genera una interrupción, se salva el estado del proceso
actualmente en ejecución (A), se atiende la interrupción mediante la rutina de
servicio de interrupción correspondiente y se restaura el estado del proceso (X) que
estaba pendiente de la finalización de dicha operación de E/S, siendo por tanto dicho
proceso (X) el que dispondrá de la CPU para reanudar su ejecución.

5.¿Con cuál de las siguientes afirmaciones te quedarías?


a) Las llamadas al sistema y las excepciones funcionan como interrupciones del
software: se gestionan igual que las interrupciones del hardware pero las provoca la
propia CPU.
b) Las llamadas al sistema se realizan mediante una instrucción especial que depende
del procesador y que sirve para que el usuario cambie voluntariamente a modo
privilegiado.
c) Si programamos en un lenguaje de alto nivel, generalmente escribimos la llamada al
sistema como una subrutina, y el compilador la sustituye por la instrucción de
máquina correspondiente.
d) Todas las afirmaciones anteriores son ciertas.

6.¿Cuál de las siguientes afirmaciones es falsa en un sistema multiprogramado con una única
CPU?
a) Se pueden ejecutar N procesos concurrentemente.
b) Es posible que sea un sistema de tiempo compartido y además multiusuario.
c) Es posible que sea un sistema de tiempo compartido en el que se pueden ejecutar
N procesos en paralelo.
d) Podría ser un sistema multiprogramado y de tiempo compartido pero monousuario.

7.¿Con cuál de las siguientes afirmaciones te quedarías?


a) El intérprete de órdenes es un programa del sistema que permite a los programadores
realizar llamadas al sistema directamente.
b) El sistema operativo ofrece una gama de servicios a los procesos. Los procesos
acceden a estos servicios a través de llamadas al sistema.
c) Los programas del sistema constituyen la interfaz de los usuarios con el sistema
operativo y por ello siempre forman parte del núcleo del sistema operativo y son
estos programas los que realizan en última instancia las llamadas al sistema.
d) Toda las afirmaciones anteriores son ciertas.

8.¿Con cuál de las siguientes afirmaciones te quedarías?


a) El diseño de un S.O. siguiendo una estructura monolítica dificulta el mantenimiento
del mismo pero facilita su depuración.
b) El diseño por capas de un S.O. hace que éste sea más eficiente que el monolítico.
c) Una de los problemas que se presenta al seguir un diseño jerárquico es establecer
una definición adecuada de las distintas capas y la interacción entre ellas.
d) El enfoque micronúcleo es básicamente igual al diseño monolítico con la salvedad del
tamaño final del núcleo.
Nombre

9.Los búferes de E/S son:


a) Un dispositivo de gestión de las entradas y salidas de datos al computador.
b) El espacio de la memoria principal que se reserva para el almacenamiento
intermedio de datos procedentes (o con destino) a los periféricos.
c) La parte del disco utilizada para gestionar de forma intermedia los accesos de
entrada y salida.
d) La parte del disco utilizada para gestionar de forma intermedia los accesos de
entrada y salida con los dispositivos muy lentos.

10.¿Con cuál de las siguientes afirmaciones te quedarías?


a) El planificador a corto plazo que nunca provocará inanición entre los procesos es
aquél que emplea una planificación por prioridades.
b) El planificador a corto plazo según el algoritmo SJF es el que maximiza el tiempo
medio de utilización de CPU.
c) Con el algoritmo SJF expulsivo, la llegada de un nuevo proceso al sistema provoca
siempre el desalojo del proceso actualmente en ejecución.
d) Cuando en un sistema operativo se emplea el algoritmo de Turno Rotatorio (Round
Robin) y la duración del cuanto es similar al tiempo invertido en la conmutación
de procesos, el rendimiento es bajo.

11.¿Con cuál de las siguientes afirmaciones te quedarías?


a) Un proceso pesado contiene uno o varios hilos que comparten los diferentes recursos
salvo la memoria.
b) Los hilos son siempre soportados e implementados por el sistema operativo.
c) La comunicación entre los hilos de un proceso pesado se puede realizar fácilmente ya
que comparten memoria y por tanto esta comunicación se puede realizar a través de
la pila.
d) El cambio de contexto entre hilos de diferentes procesos pesados es más costoso
que entre hilos de un mismo proceso pesado.

12.Un sistema operativo es:


a) Un programa o conjunto de programas que sirve de intermediario entre los
usuarios y el hardware de un sistema informático.
b) Un administrador de los recursos físicos (ficheros, memoria, dispositivos de
entrada/salida, …) y lógicos (semáforos, monitores…) de un sistema informático.
c) Un programa más de un sistema informático.
d) Todas las anteriores son ciertas.

13.El siguiente código pretende gestionar la exclusión mutua en el acceso a una sección
crítica, usando la instrucción atómica swap(a,b) (“bloqueo” es una variable global
booleana inicializada a “false” y “flag” es una variable booleana local a cada proceso).

flag := true;
repeat
swap (bloqueo, flag);
until flag = false;

/* Sección crítica */

bloqueo := false;
La solución propuesta:
a) Cumple las propiedades de exclusión mutua, progreso y espera limitada.
b) Cumple la propiedad de exclusión mutua pero padece el problema de la espera
activa.
c) Cumple las propiedades de exclusión mutua y progreso pero presenta el inconveniente
de que sólo es válida para dos procesos.
d) Cumple la propiedad de exclusión mutua y progreso pero padece el problema de la
espera activa.

14.Con el concepto de “independencia de dispositivo” nos referimos a:


a) La construcción de dispositivos que sirvan para distintas máquinas.
b) La utilización de las funciones del sistema operativo específicas para cada uno de los
dispositivos.
c) La abstracción que algunos sistemas realizan del sistema de E/S.
d) Los sistemas de E/S que dependen únicamente del sistema operativo.

15.¿Con cuál de las siguientes afirmaciones te quedarías?


a) El modo dual de operación es posible gracias a que el sistema operativo distingue dos
modos de ejecución: modo usuario y modo núcleo, sin que sea necesario ningún
soporte por parte del hardware.
b) El modo dual de operación nos proporciona los medios para proteger el sistema
operativo de los usuarios que puedan causar errores. Esta protección se consigue
designando como instrucciones privilegiadas a aquellas instrucciones de máquina
que pueden causar daño.
c) Las instrucciones que permiten la gestión del temporizador (por ejemplo, la
operación de lectura del temporizador) deberían ser privilegiadas.
d) Cuando un sistema se encuentra en modo usuario, no debería permitir la ejecución de
instrucciones privilegiadas, a menos que el usuario que las ejecute sea el usuario
administrador de la máquina.

2 (2.5 puntos) Un sistema dispone de una CPU y dos dispositivos de entrada/salida: un


disco y una impresora. Existen tres procesos que para ejecutarse necesitan emplear los
distintos recursos del sistema tal y como aparece en esta tabla:

Proceso Duración Llegada CPU disco CPU impresora CPU


P1 8 0 2 1 1 2 2
P2 8 1 3 1 2 1 1
P3 8 2 1 2 2 1 2

De modo que, el proceso 1 necesita 2 unidades de tiempo la CPU, a continuación 1 unidad


de tiempo el disco, luego 1 u.t. en CPU, luego 2 u.t. en la impresora y termina con 2 u.t. en
CPU.

Represente en un diagrama de Gantt la planificación de estos tres procesos, considerando


estas dos políticas de planificación de CPU y calcule el tiempo de espera medio y el
tiempo de retorno medio en el que se ha incurrido:
a. FCFS.
b. Round Robin con un cuanto de 2 unidades de tiempo.
Nombre

NOTAS: El disco y la impresora son recursos no compartidos y se planifican siempre


mediante un FCFS. Si varios procesos llegan a una cola al mismo tiempo, se considera que
ha llegado antes el proceso con mayor número.

a) FCFS
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
cpu p1 p1 p2 p2 p2 p3 p1 p2 p2 p3 p3 p1 p1 p2 p3 p3
disco p1 p2 p3 p3
impresora p1 p1 p2 p3
espera P1 x x x x x
espera P2 x x x
x x
espera P3 x x x x x x
cola CPU p2 p3 p3 p3 p1 p2 p3 p1 p1 p2 p2 p3
p1 p1 p2 p3

tiempo de espera p1 p2 p3 media


5 5 6 5.33

tiempo de retorno p1 p2 p3 media


12 12 13 12.33

b) RR, q=2
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
cpu p1 p1 p2 p2 p3 p1 p2 p3 p3 p2 p2 p1 p1 p3 p3 p2
disco p1 p3 p3 p2
impresora p1 p1 p3 p2
espera P1 x x x x x
espera P2 x x x x x x x
espera P3 x x x x x
cola CPU p2 p2 p3 p1 p2 p2 p1 p1 p3 p3 p2 p2
p3 p1 p2 p1 p3 p2

tiempo de espera p1 p2 p3 media


5 7 5 5.67

tiempo de retorno p1 p2 p3 media


12 14 12 12.67
Calificación

1
2
3
SISTEMAS OPERATIVOS - SEGUNDA PARTE
4
Examen Convocatoria Ordinaria, 22 de junio de 2006

Nombre Titulación
SOLUCIONES

Dispone de dos horas y media para realizar el examen

1 (2.5 puntos) Supongamos que tenemos una máquina con 16 MB de memoria principal y
un esquema de gestión de memoria virtual paginado con páginas de 4 KB. Un proceso
produce la siguiente secuencia de accesos a direcciones de memoria (mostradas aquí en
hexadecimal):
02D4B8, 02D4B9, 02D4EB, 02D4EB, 02D86F, F0B621, F0B815, F0D963, F0B832,
F0BA23, D9D6C3, D9B1A7, D9B1A1, F0BA25, 02D4C7, 628A31, F0B328, D9B325,
D73425.
El sistema operativo asigna al proceso 4 marcos de memoria principal. Se pide:
a) Dar la cadena de referencia de las páginas accedidas por el proceso. (1 p)
b) Si el sistema operativo utiliza 4 marcos de memoria principal, describir el
comportamiento del gestor de memoria utilizando cada uno de los siguientes
algoritmos de reemplazo de páginas, indicando cuántos fallos de página se
producen con cada algoritmo:
b.1) Algoritmo FIFO. (0.75 p)
b.2) Algoritmo de la segunda oportunidad. (0.75 p)

Solución:

a) A partir del tamaño y organización de la memoria, se calcula el formato de una


dirección física:

16 MB = 224 bytes, es decir, se requieren 24 bits para direccionar la memoria física.


Como además se nos indica que el tamaño de página es de 4 KB, tendremos que

4 KB = 212 bytes, por lo que se necesitan 12 bits para direccionar un byte de una
página.

Por tanto, el formato de una dirección física de memoria será:

página desplazamiento
12 bits 12 bits

Dado que la cadena de referencias viene dada en hexadecimal, y para expresar un


número hexadecimal se necesitan 4 bits en binario, para direccionar la página se
necesitan 3 dígitos hexadecimales y otros 3 para el desplazamiento. Por tanto la una
dirección física queda expresada según el siguiente formato:

página desplazamiento
12 bits 12 bits
hex hex hex hex hex hex
0 2 D 4 B 8

Así, la secuencia de páginas que formará la cadena de referencias es:


02D, F0B, F0D, F0B, D9D, D9B, F0B, 02D, 628, F0B, D9B, D73

b.1) FIFO

02D F0B F0D F0B D9D D9B F0B 02D 628 F0B D9B D73
02D 02D 02D 02D F0B F0D D9D D9B 02D
F0B F0B F0B F0D D9D D9B 02D 628
F0D F0D D9D D9B 02D 628 F0B
D9D D9B 02D 628 F0B D73
F F F F F F F F F

En total se producen 9 fallos de página.

b.2) Segunda Oportunidad

02D F0B F0D F0B D9D D9B F0B 02D 628 F0B D9B D73
02D1 02D1 02D1 02D1 D9B1 D9B1 D9B1 D9B1 D9B1 D731
F0B1 F0B1 F0B1 F0B0 F0B1 F0B0 F0B0 F0B1 F0B0
F0D1 F0D1 F0D0 F0D0 02D1 02D1 02D1 02D0
D9D1 D9D0 D9D0 D9D0 6281 6281 6280
F F F F F F F F

En total se producen 8 fallos de página.


Nombre

2 (2.5 puntos) Considérese el siguiente estado seguro de un sistema donde existen cinco
procesos (A, B, C, D, E) y cuatro recursos (r1, r2, r3, r4) con un total, respectivamente, de
(6, 7, 12, 12) ejemplares:

recursos asignados recursos que aún se necesitan


r1 r2 r3 r4 r1 r2 r3 r4
A 0 0 1 1 A 0 0 0 1
B 2 0 0 0 B 0 7 5 0
C 0 0 3 4 C 6 6 2 2
D 2 3 5 4 D 2 0 0 2
E 0 3 3 2 E 0 3 2 0

Se pide:
a) Si el proceso C solicita un recurso del tipo r1 y otro del tipo r2, ¿cuál sería la
respuesta del sistema si sabemos que utiliza el algoritmo del banquero para tomar
su decisión? (0.75 p)
b) A continuación, el proceso B termina. ¿Qué acciones tomaría el sistema? Una vez
realizadas dichas acciones, ¿quedaría el sistema en un estado seguro? (1.75 p)

a) A partir de los datos del enunciado, teniendo en cuenta los recursos asignados de
cada tipo (4,6,12,11) y los ejemplares totales de cada tipo (6,7,12,12), podemos
determinar el número de ejemplares disponibles (2,1,0,1).

Si se concediera la petición del proceso C (1,1,0,0), la situación que tendríamos sería


la siguiente:

recursos asignados Necesidades máximas


r1 r2 r3 r4 r1 r2 r3 r4
A 0 0 1 1 0 0 0 1
B 2 0 0 0 0 7 5 0
C 1 1 3 4 5 5 2 2
D 2 3 5 4 2 0 0 2
E 0 3 3 2 0 3 2 0

Quedando disponibles (1,0,0,1) y para determinar si se le concede será necesario


encontrar al menos una secuencia segura. Con los recursos disponibles y las
necesidades máximas dadas, el único proceso que podría terminar sería el proceso A.
En ese caso, los ejemplares disponibles asumiendo que tomamos A como primer
proceso de la secuencia segura serían (1,0,1,2). Con este número de ejemplares no
es posible encontrar ningún otro proceso que pueda terminar por lo que podemos
concluir que no existe ninguna secuencia segura y por tanto, el sistema operativo no
asignaría los recursos al proceso C, dejándolo bloqueado hasta que sea posible
atender dicha solicitud de recursos.

b) Al terminar el proceso B, los recursos asignados a dicho proceso (2,0,0,0) pasarían


a estar disponibles:
(2,1,0,1) [disponibles antes de terminar B] + (2,0,0,0) [liberados por B] = (4,1,0,1)

Ante esta nueva situación, el sistema se debería replantear la posibilidad atender la


solicitud pendiente del proceso C. Por tanto la nueva situación asumiendo que dicha
petición es atendida sería la siguiente:

recursos asignados Necesidades máximas


r1 r2 r3 r4 r1 r2 r3 r4
A 0 0 1 1 0 0 0 1
C 1 1 3 4 5 5 2 2
D 2 3 5 4 2 0 0 2
E 0 3 3 2 0 3 2 0

Quedando disponibles (3,0,0,1). En este caso si existiría la siguiente secuencia segura


{A, D, E, C}

recursos asignados Disponibles


r1 r2 r3 r4 r1 r2 r3 r4
A 0 0 1 1 3 0 1 2
D 2 3 5 4 5 3 6 6
E 0 3 3 2 5 6 9 8
C 1 1 3 4 6 7 12 12

Por tanto el sistema quedaría en un estado seguro y la solicitud del proceso C sería
atendida en este momento, quedando dicho proceso listo para ejecución cuando el
planificador lo decida.

3 (2.5 puntos) En el nuevo parque que recientemente se ha inaugurado en Siete Palmas y


debido a la gran aceptación se ha establecido un aforo máximo de usuarios (N) por razones
de seguridad. Para ello se han instalado unos torniquetes a la entrada y a la salida que
controlan en todo momento el número de personas en el parque. Cuando el aforo está
completo, se debe esperar en la entrada hasta que alguien salga del parque. La afluencia de
gente es tal que se forman largas colas de espera, por lo que se ha decidido crear una
entrada preferente para los vecinos residentes en la zona, de forma que cuando el parque
está lleno, tienen preferencia sobre los no residentes a la hora de acceder a las instalaciones.
Se pide realizar, mediante monitores y variables condición, el código de entrada y salida del
parque, de forma que cuando alguien abandona el parque, en caso de que existan personas
esperando debido a que el cupo esté agotado, tendrán preferencia los residentes frente a los
no residentes.
Nombre

En la implementación que se muestra se ha asumido que las variables condición están


implementadas siguiendo la semántica del estilo Hoare.

const int N=…; //Aforo del parque


Monitor ControlParque {
Public:
ControlParque(int capacidad);
~ControlParque();
void Entra_Residente();
void Entra_NoResidente();
bool Salir();
Private:
condition: *espera_residentes, *espera_noresidentes;
int nper; // Número de personas dentro del parque
int aforo; // Aforo del parque
int nresbloq; // Número de personas residentes esperando
int nnresbloq; // Número de personas no residentes esperando
};

ControlParque:: ControlParque( int capacidad) {


aforo = capacidad;
nper = 0;
nresbloq = 0;
nnresbloq = 0;
espera_residentes = new condition;
espera_noresidentes = new condition;
}

ControlParque:: ~ ControlParque () {
delete espera_residentes;
delete espera_noresidentes;
}

ControlParque:: Entra_Residente () {
if ( nper == aforo ) {
nresbloq++;
espera_residentes->wait();
nresbloq--;
}
nper++;
}
ControlParque:: Entra_NoResidente () {
if (nper == aforo) {
nnresbloq++;
espera_noresidentes->wait();
nnresbloq--;
}
nper++;
}

ControlParque:: Salir () {
nper--;
if (nresbloq>0)
espera_residentes->signal();
else if (nnresbloq>0)
espera_noresidentes->signal();
}

ControlParque miParque(N);
Código de las personas residentes {

// Sección de entrada al parque
miParque.Entra_Residente();
… //Jugar en el parque
// Sección de salida del parque
miParque.Salir();
}

Código de las personas no residentes {


// Sección de entrada al parque
miParque.Entra_NoResidente();
… //Jugar en el parque
// Sección de salida del parque
miParque.Salir();
}

4 (2.5 puntos) Responder cada una de las siguientes cuestiones sobre ficheros:
a) Supongamos que tenemos un sistema de archivos que trabaja con bloques de
datos de 1 kilobyte y que utiliza una FAT en la que cada enlace ocupa 24 bits.
¿Cuál es el tamaño máximo que podría tener un fichero en este sistema?
Si cada enlace de la FAT ocupa 24 bits, se admiten 224 valores posibles. Si todos los
valores representan direcciones de bloque, tenemos que se pueden referenciar como
máximo 224 bloques de 1 kilobyte, lo que equivale a un fichero que ocupa 224 × 210 =
234 bytes. Es decir, 16 gigabytes.
Nombre

En realidad, el tamaño máximo permitido será algo menor, porque algunos de los
valores en la entrada de la FAT se usarán para indicar otras circunstancias: final de
fichero, bloque dañado, etc.

b) Supongamos ahora que éste mismo sistema de archivos utiliza un bloque de


índices, en lugar de una FAT. ¿Cuál sería entonces el tamaño máximo de un
fichero?
Si se utiliza un bloque de índices, el tamaño máximo del archivo está condicionado por
el número de entradas que caben en dicho bloque. Tenemos que cada entrada ocupa
24 bits, que son 3 bytes. Por tanto, en un bloque de datos de 1 kilobyte caben 1024 / 3
= 341 entradas (sobra un byte, que no se puede aprovechar). Así pues, el fichero más
grande que podemos referenciar tiene 341 bloques de 1 kilobyte, que suman un total
de 341 kilobytes.

c) Tenemos un sistema de archivos que utiliza asignación indexada de dos niveles


de profundidad. El tamaño de bloque es de 2 kilobytes y cada entrada en la
tabla de índices ocupa 2 bytes. Un fichero que necesita siete bloques de índices,
¿qué tamaño puede tener? (nota: calcular el tamaño mínimo y el máximo que
podría tener).
Si un fichero tiene asociados siete bloques de índices, necesariamente uno de ellos
será el bloque de primer nivel y los otros seis, los bloques de segundo nivel.
Cada bloque de índices es capaz de albergar 2048 / 2 = 1024 apuntadores a bloques.
Por tanto, los seis bloques de segundo nivel son capaces de referenciar 1024 × 6 =
6144 bloques. Si todas esas entradas estuvieran al completo, el fichero tendría un
tamaño de 6144 × 2048 = 1024 × 6 × 2048 = 210 × 6 × 211 = 6 × 221 = 12 × 220 = 12
megabytes.
El fichero más pequeño que debe consumir seis bloques de segundo nivel sería uno
que ocupara cinco bloques de índices completos y sólo una entrada del sexto bloque.
En este caso, serían 1 + (1024 × 5) = 5121 bloques. Como estamos hablando del
fichero más pequeño posible, tenemos que suponer que del último bloque de datos
sólo se utiliza un byte, Por tanto, el tamaño ocupado por el fichero sería: lo que ocupan
los primeros 5120 bytes, más un byte del último bloque. Es decir, 1 + 5120 × 2048 =
1 + (10 × 29 × 211) = 1 + 10 × 220 = 10 megabytes más un byte.
Así pues, el fichero puede tener un tamaño entre 10 y 12 megabytes (exactamente,
de 10 485 761 bytes a 12 582 912 bytes).

d) Tenemos una partición de disco de 4 gigabytes en la que se va a montar un


sistema de archivos basado en FAT y que usará un tamaño de bloque de datos
de 4 kilobytes. ¿Cuántos bits deberían usarse en cada entrada de la FAT para
que el sistema de archivos pudiera direccionar toda la partición?
Cuatro gigabytes son 4 × 230 = 232 bytes. Los bloques son de 4 kilobytes, es decir 4 ×
210 = 212 bytes.
Por tanto, el sistema manejará en torno a 232 / 212 = 220 bloques de datos.
Eso significa que las entradas de la FAT deberían tener como mínimo 20 bits.
Este resultado dependería también de cuántos bloques de datos realmente quedarán
disponibles para ser utilizados por ficheros, y de los valores reservados de la FAT para
señalar otra información que no sean enlaces.
Universidad de Las Palmas de Gran Canaria
Calificación
Facultad de Informática
1

Sistemas Operativos 2
Examen de la convocatoria de junio, 7 de julio 3
de 2006 4
Parte I: Conceptos generales sobre sistemas 5
operativos 6
7
8
9
10
Nombre Titulación

Dispone de una hora como máximo para realizar esta parte

1 (1,5 puntos, cada cuestión vale lo mismo) Cuestiones. Defina cada uno
de los siguientes términos utilizando 5 líneas como máximo.
1. Monitor residente
Conjunto de módulos software que realizaban tareas comunes (manejo de dispositivos
de E/S, control automático de tareas, control de errores, control del tiempo de
ejecución de tareas) con el objeto de que fueran más eficiente los primeros sistemas
de procesamiento por lotes. Se considera el primer caso de sistema operativo en la
historia de la informática.

2. Procesamiento asimétrico
Modelo de procesamiento con múltiples procesadores, en el que a cada procesador se
le asigna una tarea específica, existiendo un procesador maestro que controla el
sistema y es el responsable de asignar tareas al resto de procesadores.

3. Espera activa
Espera en la que incurren los programas cuando necesitan conocer la ocurrencia de
un evento en el sistema y lo hacen interrogando permanentemente al procesador, de
esta forma y mientras no ocurra el evento, el programa no avanza y hace que el
procesador esté ocupado permanentemente.

4. Confiabilidad
Propiedad característica de los sistemas distribuidos, consistente en tener la
capacidad de sustituir los recursos proporcionados por una de las estaciones del
sistema, debido a un fallo de esta, por los de de otra.

5. Spooling
Técnica de procesamiento de operaciones de E/S que permite que equipos de E/S de
naturaleza no compartida sean tratados por los programas como equipos compartidos.
Esto se consigue utilizando espacio en disco como almacén intermedio de los datos de
E/S. Con esta técnica se permite solapar operaciones de E/S de una tarea con
operaciones de CPU de otra.

1/10
6. Vector de interrupciones
Estructura de datos del núcleo del sistema operativo, que se utiliza para la gestión de
interrupciones. Cada elemento del vector está asociada a una interrupción del sistema
y contiene todos los elementos necesarios para su tratamiento: estado de la
interrupción y dirección a la rutina de tratamiento.

7. Multiprogramación
Modo de procesamiento en los sistemas informáticos consistente en tener varios
programas en memoria que se ejecutan compartiendo los recursos del sistema y
soportando la ejecución concurrente de los programas.

8. Objetivo de independencia de dispositivo de entrada/salida


Objetivo que consiste en dar a los programas canales genéricos de E/S en los que
éstos realizan sus operaciones de E/S mediante primitivas genéricas. De esta manera,
los programadores están liberados de hacer referencias a dispositivos concretos, por
lo que los programas no dependen de dispositivos concretos de E/S.

9. Gestor de llamadas al sistema


Elementos del núcleo del sistema operativo responsable de tratar en primera instancia
cualquier llamada al sistema. Este tratamiento consiste en conmutar de modo de
ejecución (modo usuario a modo sistema), analizar los parámetros suministrado por la
llamada al sistema y volver a conmutar de modo de ejecución.

10. Cargador del sistema operativo


Elemento del sistema operativo que es el responsable de cargar los primero módulos
del sistema desde disco a memoria principal, estos módulos son los que
posteriormente permiten la carga y arranque del sistema operativo.

2/10
Universidad de Las Palmas de Gran Canaria
Calificación
Facultad de Informática
1

Sistemas Operativos 2
Examen de la convocatoria de junio, 7 de julio
de 2006
Parte II: Procesos

Nombre Titulación

Dispone de una hora como máximo para realizar esta parte

1. (1,5) Problema.
Sea la siguiente carga de procesos a ejecutar:
Proceso Duración de ráfaga del Prioridad Tiempo
procesador de llegada
0 8 1 0
1 5 3 1
2 2 1 2
3 7 2 3

Obtenga el diagrama de Gant y tiempos medios de espera, al ejecutar cada una de las
siguientes políticas:
a. Planificación por prioridades expulsivo (con apropiación). La prioridad más alta es
la que posee un número de prioridad menor.
b. Primero el más corto expulsivo
Diagramas de Gant
Planificación por prioridades
0 0 0 0 0 0 0 0 2 2 3 3 3 3 3 3 3 1 1 1 1 1

Tiempo de espera del proceso 0 es 0, del 1 es 16, del 2 es 6 y del 3 es 7. El tiempo


medio de espera será la suma de los tiempos de espera de cada uno dividido por 4.

Planificación “primero el más corto explulsivo”


0 1 2 2 1 1 1 1 0 0 0 0 0 0 0 3 3 3 3 3 3 3

Tiempo de espera del proceso 0 es 7, del 1 es 2, del 2 es 0 y del 3 es 12. El tiempo


medio de espera será la suma de los tiempos de espera de cada uno dividido por 4.

2. (1 punto) Cuestión
Suponga un sistema que planifica el procesador con una política de Round-Robin, entonces
si se produce una interrupción indicando que una operación de entrada/salida ha finalizado
¿cuántos procesos podrán cambiar de estado y en qué consistirán estos cambios de estado?

3/10
Cambiarán dos procesos de estado. Concretamente, el proceso que se ejecuta se
detendría para que se trate la finalización de la operación de entrada salida
(tratamiento de la interrupción asociada), por lo tanto, pasaría de estado “en ejecución”
a estado de “listo”. El otro proceso que cambiaría de estado sería el proceso que
solicitó la operación de entrada/salida, éste cambiaría de estado “bloqueado” a “listo”.

4/10
Universidad de Las Palmas de Gran Canaria
Facultad de Informática
Calificación
1
Sistemas Operativos
Examen de la convocatoria de junio, 7 de julio 2
de 2006 3
Parte III: Concurrencia e interbloqueo

Nombre Titulación

Dispone de una hora como máximo para realizar esta parte

1. (1,5) Problema.

Utilizando regiones críticas condiciones escriba una solución al problema de los filósofos
comensales que garantice que no se produce interbloqueo.
var Filósofo: shared record
Palillo: array [0 .. 4] of bolean;
// Inicialmente todos a “true”
end;

// Sección de entrada para comer el filósofo i


region filósofo when (Palillo[i] == true and Palillo[(i+1) mod
5] == true) do
begin
Palillo[i] = false;
Palillo[(i+1) mod 5] = false;
end

Filósofo i come

// Sección de fin de comida


region filósofo do
begin
Palillo[i] = ture;
Paliffo[(i+1) mod 5 ) = true;
end

2. (1 punto) Cuestión
¿Explique la diferencia entre las variables condición tipo Hoare y tipo Mesa?
La diferencia radica en que una operación de signal sobre una variable tipo
condición, según el estilo de Hoare, implica el bloqueo del proceso invocador, en el
caso de que existan proceso bloqueados por haber realizado previamente una
operación wait, además el proceso despertado toma el control del monitor. En
cambio en el estilo de Mesa, el proceso invocador no se bloquea y el proceso que
despierta, por haber hecho ejecutado una operación de wait previamente sobre la
variable condición, debe competir nuevamente por el control del monitor.
5/10
3. (1 punto) Problema

Suponga un sistema en el que existen tres tipos de recurso (A, B, C) con 4, 3 y 4


posibilidades para cada tipoy tres procesos. Suponga el siguiente estado:
• El proceso 0 declaró que como máximo utilizará 4, 1 y 2 de cada tipo. Actualmente
posee 1 posibilidad del tipo de recurso A, y 1 del tipo B.
• El proceso 1 declaró que como máximo utilizará 2, 3, 2 de cada tipo. Actualmente
posee 1 posibilidad del tipo B y 2 del tipo C.
• El proceso 2 declaró que como máximo utilizará 2, 1 y 2 de cada tipo. Actualmente
posee 1 posibilidad de tipo A.

Si el sistema utiliza el algoritmo del banquero, ¿el estado actual es seguro o inseguro?
Justifique su respuesta.

El estado sería seguro pues existen dos secuencias seguras:


(P2, P0, P1) y (P2, P1, P0)
Para comprobarlo se deben obtener el vector DISPONIBLE, que representa los
recursos disponibles en este instante de tiempo, y la matriz NECESIDADES que
representa los recursos que aún pueden ser solicitados por los procesos, en función
de lo que declararon como necesidades máximas.

6/10
Universidad de Las Palmas de Gran Canaria
Facultad de Informática
Calificación
1
Sistemas Operativos
Examen de la convocatoria de junio, 7 de julio 2
de 2006
Parte IV: Memoria y archivos

Nombre Titulación

Dispone de una hora como máximo para realizar esta parte

4. (1,5) Problema.
Suponga un sistema con memoria virtual paginada. Describa de forma algorítmica el
proceso de traducción de una dirección lógica a una física. En su descripción deberá
especificar los recursos físicos requeridos, las estructuras de control empleadas,
especificando los campos que las componen y su significado, y las políticas que se utilizan.
En un sistema con memoria paginada y con memoria virtual, se requieren los
siguientes recursos:
Hardware
TLBs. Tabla de registros asociativo que tiene por finalidad acelerar el proceso de
traducción de direcciones. En casa registro se representa una página y el marco en
memoria principal que la alberga. Existe un repertorio de TLBs por procesador.
Registro que contiene la dirección base de la tabla de páginas del programa que se
ejecuta (RBTP)
Registro límite de la tabla de página (RLTP). Este registro se utiliza para verificar que
los números de pagina existentes en las direcciones no van más allá de las páginas
existentes en el espacio de direcciones lógicas.
Área de intercambio en disco. Esta área es una zona de disco estructurada en bloques
de igual tamaño al de una página y cada bloque contiene a una página de un
programa en ejecución.

Software:
Tabla de páginas (TP). Se trata de una tabla que representa el estado de cada una de
las páginas que forman parte del espacio lógico de direcciones del programa. Por
tanto, cada programa que se ejecuta posee una. Cada entrada está asociada a una de
las páginas del programa y posee los al menos los siguientes campos:
Marco que la contiene.(M)
Bit de validez que indica si la página está en memoria o no lo está. (V)
Bit de modificación, que indica si la página ha sido modificada desde que se cargó en
memoria. (W)
Franja de página que contiene la ubicación de la página en el área de intercambio del
sistema. (F)

Tabla de marcos de página. Se trata de una única tabla que es manejada por el
sistema operativo con el fin de conocer en todo momento el estado de la memoria
principal, o sea, de los marcos. Existirá una entrada por cada marco de memoria
existente.

7/10
Proceso de traducción
En un sistema paginado, toda dirección posee la siguiente estructura:

Número de páginas Desplazamiento (D)


(P)

Algoritmo:
La dirección física a obtener la llamamos A

Utilizando RLTP, verificar que P es una página correcta.


Si no es una página correcta Entonces
Generar excepción de error de dirección
Fin si

Buscar P en la TLB // Esta búsqueda se realiza en paralelo con


la búsqueda en TP
Si P está representada en la TLB Entonces
A = (dirección base del marco) + D
Fin del proceso de traducción
Fin si

Sea TP[P] la entrada de la página P en TP


Si TP[P].V indica página válida Entonces
A = (dirección base del marco TP[P].M) + D
Actualizar TLB
Fin del proceso de traducción
Fin si

// Si se llega a este punto entonces es que la página P es


inváida
Obtener un marco para P
Si se obtiene un marco para P Entonces
Cargar P en el marco
Actualizar TP[P], concretamente :
TP[P].M = Número de marco asignado
TP[P].V = 1 // Indica página válida
TP[P].W = 0 // Indica página no modificada
TP[P].F = Dirección del boque, en el área de intercambio,
que contiene P
A = (dirección base del marco TP[P].M) + D

Actualizar TLB
Fin del proceso de traducción

Fin si

// Si se llega a este punto es que no se ha podido asignar un


marco a la página

8/10
// Suponemos que la póliticaca de sustitución es local
Ejecutar política de sustitución que nos elige a una página
víctima Q
TP[Q].V = 0 // página inválida
Si TP[Q].W es igual a 1 Entonces
Salvar la página Q en el bloque TP[Q].F del área de
intercambio
Fin si

Cargar la página P en el marco que se le ha quitado a Q


Actualizar TP[P], concretamente :
TP[P].M = Número de marco asignado
TP[P].V = 1 // Indica página válida
TP[P].W = 0 // Indica página no modificada
TP[P].F = Dirección del boque, en el área de intercambio, que
contiene P
A = (dirección base del marco TP[P].M) + D
Actualizar TLB
Fin del proceso de traducción

5. 1 punto) Problema
Suponga un sistema de ficheros tipo FAT. Describa algorítmicamente como9 se traduce
una dirección de registro lógico de archivo, expresada de la siguiente forma (COMIENZO,
LONGITUD), a una dirección de sistema de archivo. Siendo:
COMIENZO: desplazamiento desde el origen del primer byte del registro
LONGITUD: tamaño expresado en número de bytes

El sistema de archivos tipo FAT utiliza una variante del esquema encadenado de
gestión del espacio de disco para ficheros. Básicamente, esta variante consiste en
agrupar los enlaces de los bloques del sistema de archivos, llamados clusters, en una
estructura con forma de tabla llamada FAT. Esta estructura de datos posee tantas
entradas como cluster existan en el sistema de archivos, de forma que cada entrada
se asocia a un cluster. Los cluster se identifican mediante un número entero mayor o
igual que cero. Por ejemplo, el primer cluster tendrá el identificador 0, el segundo el 1 y
así sucesivamente. El número identificador de un cluster se utiliza como índice en la
tabla FAT, de forma que para recorrer los cluster que pertenecen a un archivo se entra
en la FAT a partir del cluster de comienzo del fichero (que se registra en su entrada de
directorio) y luego se recorre la lista siguiendo los enlaces almacenados en la FAT y
que están asociados a la secuencia de cluster pertenecientes al fichero. Entonces para
obtener el primer cluster relativo que contiene datos del registro, se calcula:
CL0 = Parte Entera(COMIENZO/LC)
Siendo LC la longitud expresada en bytes de un cluster.

La posición del primer byte del registro en el cluster CL0, se calcula:


D0 = Resto(COMIENZO/LC)

Análogamente para obtener el último cluster que contiene bytes del registro, se
calcula:
CL1 = Parte Entera[(COMIENZO+LONGITUD)/LC]
9/10
Y para la posición del último byte del registro en el cluster CL1:
CL1 = Resto[(COMIENZO+LONGITUD)/LC]

Si CL0 es igual a CL1, entonces todos los bytes del registro están en el mismo cluster
y la solución al problema sería:
(Cluster_absoluto,D0,D1)

Si CL0 es distinto de CL1, entonces los bytes del registro se encuentran en varios
cluster. Para obtener el cluster_absoluto se procede de la siguiente manera:

Dir=Cluster absoluto almacenado en la entrada de directorio


i = 0
Dir1 = -1
Dir0 = -1
Repetir
Si (i es igual a CL0) entonces
Dir0 = Dir
Fin si
Si (i es igual a CL1 ) entonces
Dir1 = Dir
Fin si
Dir = FAT[Dir]
i = i + 1

Mientras ( Dir1 y Dir0 sean distintos de -1)

Las solución es (Dir0, D0) para el primer cluster y (Dir1,D1) para el segundo
LONGITUD tamaño expresado en número de bytes.

10/10
Calificación

1
2
3
4
SISTEMAS OPERATIVOS 5
Examen Convocatoria Extraordinaria Especial 6
11 de diciembre de 2006

Nombre Titulación

Dispone de dos horas y media para realizar el examen

1 (3 puntos) Contestar brevemente a las siguientes cuestiones:

a) El intérprete de órdenes (command interpreter) puede ser una aplicación independiente (ej.
UNIX), o puede estar implementado dentro del núcleo del sistema operativo (ej.
CP/M). ¿Qué ventajas o inconvenientes observa usted en cada alternativa? (0.5p)
a) Ventajas del intérprete en el núcleo: Dado que es una aplicación de uso
muy frecuente, si se tiene el código en el núcleo, la ejecución de las
aplicaciones puede ser más rápida (no hay que cargarla del disco).
b) Inconvenientes del intérprete en el núcleo: El núcleo crece de tamaño.
Cuando no se está utilizando el intérprete de órdenes, se está ocupando
memoria con código que no se emplea. El sistema es menos flexible, ya
que si quisiéramos cambiar la versión del intérprete de órdenes,
tendríamos que reinstalar el núcleo del s.o.

c) Suponga un sistema que emplea el algoritmo del banquero para evitar caer en una
situación de interbloqueo. En un instante dado y ante unas solicitudes de recursos, el
sistema lanza el algoritmo y detecta que si concede los recursos se encontraría en un
estado inseguro. Si, a pesar de esto, el sistema decide conceder los recursos solicitados,
¿puede afirmarse que el sistema se encuentra en
interbloqueo? (0.5p) Estados inseguros
No necesariamente. El conjunto de estados en
los que podríamos afirmar que el sistema se Estados de
interbloqueo
encuentra en una situación de interbloqueo
constituyen un subconjunto de los estados
inseguros; es decir, un estado de interbloqueo
es un estado inseguro pero no todos los
estados inseguros son estados de interbloqueo
(ver figura).
Estados seguros

1 de 6
d) ¿Con qué finalidad se emplea la técnica de envejecimiento en la planificación del uso
del procesador? (0.5p)
Para evitar el riesgo de inanición existente cuando se lleva a cabo una
planificación por prioridades.

e) Un sistema de memoria virtual ha de escoger a una página víctima. Existen tres páginas
candidatas, que sólo se diferencian en el estado del proceso que las posee: hay una
página cuyo proceso está en estado de ejecución; otra cuyo proceso está en estado de
bloqueo; y el proceso de la tercera página está en estado de preparado. ¿Qué página
sería más recomendable escoger como víctima? (0.75p)
Es conocido que la política óptima consiste en escoger como víctima
aquella página que más tiempo tarde en usarse. De las tres candidatas, la
página que más probablemente tarde en accederse es la del proceso que está
en estado de bloqueo. Las otras dos páginas pertenecen a procesos que muy
probablemente hagan accesos a memoria en un futuro inmediato, mientras que
el proceso bloqueado no hará ningún acceso en tanto persista su situación de
bloqueo. Así que esa es la mejor apuesta.

f) Un sistema de archivos utiliza una política de asignación de espacio indexada. En este


sistema, los bloques de datos de un archivo, ¿se pueden ubicar de forma contigua? ¿Es
necesario que los bloques estén ubicados de forma contigua? ¿Da igual que lo estén?
Justifique con mucha claridad su respuesta. ¿Cambiaría en algo su contestación si la
asignación de espacio fuera enlazada? (0.75p)
La asignación indexada permite que los bloques de datos de un archivo se
encuentren dispersos por el disco, pero evidentemente no obliga a ello. Así que
los bloques de un archivo indexado pueden estar contiguos.
Sin embargo, no es indiferente el que los bloques estén contiguos. Los
accesos secuenciales al archivo serán más eficientes en ese caso, porque el
desplazamiento de los cabezales del disco será menor, comparado con el
recorrido que tendría que hacer el cabezal si los bloques estuvieran
desperdigados por la superficie del disco. La contigüidad ocasiona un menor
tiempo de acceso. En el mejor caso, todos los bloques del archivo estarían en
un mismo cilindro y la cabeza lectora no tendría que hacer ningún movimiento
para leer el archivo completo.
Si la asignación de espacio fuera enlazada, la respuesta sería similar.
Incluso tendría más impacto en el rendimiento el hecho de que los bloques
estén contiguos, ya que en la asignación enlazada cualquier acceso al archivo,
ya sea secuencial o ya sea directo, exige recorrer los enlaces de los bloques.
Si los bloques están contiguos, el cabezal del disco hará un recorrido más
pequeño.

2 (2 puntos) En un garaje hay vehículos automáticos pequeños y grandes, cada uno de


ellos representado por un proceso concurrente. Estamos interesados en controlar la
entrada de dichos vehículos en un montacargas, en el que caben hasta 4 vehículos
pequeños o 2 pequeños y 1 grande. Resolver el problema usando monitores.

2 de 6
enum tipo_vehiculo {grande, pequeno};
Monitor Montacarga {
Public:
Montacarga();
~Montacarga();
void Montacarga_Subir( enum tipo_vehiculo vehiculo);
bool Montacarga_Lleno();
Private:
condition: *espera_subir, *espera_bajar;
int: vp, vg; //Cuenta vehiculos grandes (vg) y pequeños (vp)
};
Montacarga:: Montacarga() {
espera_subir = new condition;
espera_bajar = new condition;
vp = 0;
vg = 0;
}
Montacarga:: ~Montacarga() {
delete espera_subir;
delete espera_bajar;
}
Montacarga:: Montacarga_Lleno () {
if (((vp==2) && (vg==1)) || (vp==4))
return true;
else
return false
}
Montacarga:: Montacarga_Subir (tipo_vehiculo vehiculo) {
if (vehiculo == grande) {
while (vp>2)
esperar_subir->wait();
vg=1;
}
else
vp++;
if (Montacarga_Lleno()) {
vp=vg=0;
esperar_bajar->broadcast();
}
else
esperar_bajar->wait();
}
Montacarga mi_montacarga;
Código de los vehiculos {
enum tipo_vehiculo vehiculo;

// Vehiculo circulando
mi_montacarga.Montacarga_Subir(vehiculo)
} // Vehiculo circulando

3 de 6
3 (1.5 puntos) Sea la siguiente carga de procesos a ejecutar:
Duración de ráfaga Tiempo
IdProceso Prioridad
del procesador de llegada
0 8 1 0
1 5 3 1
2 2 1 2
3 7 2 3

Obtener el diagrama de Gantt, así como los tiempos medios de espera y de retorno, al
ejecutar cada una de las siguientes políticas:
a. Primer el más corto no expulsivo.
b. Round-Robin con quántum de 3 u.t.

A) Primero el más corto sin expropiación:


Solución
P0 P0 P0 P0 P0 P0 P0 P0 P2 P2 P1 P1 P1 P1 P1 P3 P3 P3 P3 P3 P3 P3
0 8 10 15 22

Tiempo de Tiempo de
Proceso
retorno espera

P0 8 0

P1 10-1 10-1

P2 15-2 8-2

P3 22-3 15-3

Media 12,25 6,75

B) Round-Robin q=3ut.
P0 P0 P0 P1 P1 P1 P2 P2 P3 P3 P3 P0 P0 P0 P1 P1 P3 P3 P3 P0 P0 P3
0 3 6 8 11 14 16 19 22

Tiempo de Tiempo de
Proceso
retorno espera

P0 21 8+5

P1 16-1 3+8-1

P2 8-2 6-2

P3 22-3 8+5+2-3

Media 15,25 9,75


Notar que en ambos casos (ambos apartados) no se nos ha pedido el uso de la
prioridad asignada a cada proceso del sistema.

4 (1.5 puntos) Suponga un sistema de memoria paginada en el que se tiene la siguiente


serie de referencias a páginas de un proceso: 0, 1, 2, 3, 0, 1, 4, 0, 1, 2, 3, 4. Si el sistema
permite un conjunto de trabajo de 3 páginas por proceso, describa el comportamiento de
las siguientes políticas de sustitución: Óptima, LRU (Menos recientemente utilizada).

4 de 6
a) Óptima con 3 marcos:
0 1 2 3 0 1 4 0 1 2 3 4
0 0 0 0 0 2 2
1 1 1 1 1 3
2 3 4 4 4
F F F F F F F
Lo que hace un total de 7 fallos de página.

b) LRU (last recently used) con 3 marcos:


0 1 2 3 0 1 4 0 1 2 3 4
0 0 0 3 3 3 4 2 2 2
1 1 1 0 0 0 0 3 3
2 2 2 1 1 1 1 4
F F F F F F F F F F
Lo que hace un total de 10 fallos de página.

5 (2 puntos) En la figura se presentan los 15 primeros bloques de un dispositivo de


almacenamiento secundario (disco) que en total dispone de 30000 K bytes. El método que
se utiliza para la asignación de espacio en disco es el encadenamiento (enlazado). Cada
bloque tiene 512 bytes. En la figura también se representa un fichero llamado examen:
0 1 2 3 14 4 Directorio
Examen
5 3 6 7 12 8 9 Bloq.Comienzo.: 7
Bloq.Final: 14
10 11 12 5 13 14 -1

a) Calcular, para cada bloque, cuántos bytes se podrán asignar a datos y cuántos a
punteros a otros bloques. (0.75p)
El disco contiene un total de 30000K bytes, o lo que es lo mismo : 30000 * 1024 bytes
= 30.720.000 bytes
Como los bloques son de 512 bytes, el número de bloques total en el disco es =
30.720.000/512 = 60000 bloques. Como 215 = 32.768 y 216 = 65.536, necesitaremos 16
bits para poder direccionar todos los bloques, o sea 2 bytes. Esto supone que dentro
de un bloque de 512 bytes, 2 bytes serán para los punteros a bloques, y el resto, 510
serán bytes para datos.

b) Calcular el tamaño máximo (en bytes) de los datos almacenados en el fichero


examen. (0.25p)
Los sectores que ocupa el fichero examen es : 7 – 12 – 5 – 3 – 14 , que hace un total
de 5 bloques. Como disponemos de 510 bytes para cada bloque, esto hace un total de
5 * 510 bytes = 2550 bytes.

5 de 6
c) ¿Qué problema presenta el uso de este tipo de asignación de espacio? ¿Qué método
de asignación lo soluciona? Para este método: ¿Varía el tamaño máximo de los
datos que pueden estar ahora almacenados? ¿Existe pérdida de espacio? Si es así,
calcúlelo. (1p)
El problema más relevante es el tipo de acceso a datos del tipo aleatorio (directo). Así,
para leer el bloque k deben leerse previamente los k-1 para ir accediendo a los
punteros que apuntan al siguiente bloque.
Un tipo de asignación que lo soluciona es el método de asignación indexado. En este
método, el directorio contiene la dirección del bloque donde están los índices a los
bloques de datos del archivo.
Para este tipo de acceso, los bloques no necesitan apuntar a otros bloques,
con lo cual podemos aprovechar todos los 512 bytes de cada bloque para datos. En
nuestro caso, para el archivo examen ocuparía 5 * 512 bytes = 2560 bytes.
La asignación mediante indexación presenta sin embargo pérdida de espacio.
Si la tabla de índices se le asigna un bloque entero, como los índices son de 2 bytes,
el bloque está ocupado por 5 índices x 2 bytes = 10 bytes. Por lo que en el bloque está
desaprovechado : 512 – 10 = 502 bytes para este fichero en concreto.

* * * * *

6 de 6
Universidad de Las Palmas de Gran Canaria
Calificación
Escuela Universitaria de Informática
1
Facultad de Informática
2
Sistemas Operativos 3
Examen Parcial, 7 de mayo de 2005 4
5

Nombre Titulación
SOLUCIONES
Dispone de tres horas para realizar el examen

1 (2,5 puntos) Test. En cada uno de los siguientes apartados, señale cuál opción es
correcta. En caso de que existan varias opciones ciertas, se considerará como correcta la
más completa o precisa. Las preguntas no contestadas no puntúan; las contestadas
erróneamente penalizan un tercio de su valor. Señale sus respuestas rodeando con un
círculo la opción correcta. Si se equivoca, tache la respuesta incorrecta y rodee la opción
que considere correcta. Escriba con tinta. Las preguntas respondidas con lápiz o con varios
círculos no tachados se considerarán no contestadas.

1.- El fenómeno de espera activa por operaciones de entrada/salida se puede evitar


utilizando:
a) interrupciones
b) instrucciones privilegiadas
c) acceso directo a memoria (DMA)
d) un pareja de registros base y límite
2.- En un sistema multihilo
a) un proceso pesado puede tener varios hilos con distintos espacios de memoria
b) un proceso pesado tiene uno o más hilos con distintos conjuntos de
registros
c) por lo general, el tiempo de cambio de contexto es mayor entre hilos que entre
procesos pesados
d) dos hilos de un mismo usuario comparten el mismo espacio de memoria
3.- Sobre planificación de procesos:
a) todos los métodos basados en prioridades tienen riesgo de inanición
b) los métodos multicolas están concebidos para planificar sistemas multiprocesadores
c) el algoritmo FCFS perjudica a los procesos intensivos en CPU
d) los enunciados a, b y c son todos falsos
4.- Una llamada al sistema es:
a. un servicio del sistema operativo
b. un programa del núcleo del sistema operativo
c. una orden del intérprete de órdenes
d. un tipo especial de programa del sistema
5.- La técnica de planificación Round-Robin:
a) en general, da mejores tiempos de espera que el FCFS
b) minimiza el tiempo medio de retorno
c) permite acotar el tiempo de espera máximo
d) permite acotar el tiempo de respuesta máximo
6.- La técnica de Buffering permite que:
a) Un proceso no espere debido a que un recurso no compartido esté asignado a otro
proceso.
b) Un proceso nunca espere debido a al lentitud de los dispositivos de E/S.
c) Se solapen operaciones de CPU de un proceso con operaciones de E/S de otro
proceso.
d) Todas las afirmaciones anteriores son falsas.
1/7
7.- La independencia del dispositivo significa o implica que...
a) el usuario no debe conocer características propias de cada clase de
dispositivo.
b) el juego de caracteres empleados por una terminal de caracteres ha de ser ASCII.
c) los dispositivos deberían tener independencia de los procesos de usuario.
d) los procesos de usuario deberían trabajar indirectamente con los dispositivos.
8.- La técnica del spooling...
a) exige comprobar periódicamente la aparición de ficheros en el directorio de spool.
b) solapa la ejecución en CPU de un proceso con la E/S de otros ya terminados.
c) crea un dispositivo virtual dedicado a partir de uno compartido.
d) En general, son ciertas a,b y c.
9.- ¿ Cuál de estos sistemas informáticos no se puede dar ?
a) un sistema monoprogramado por lotes multiusuario.
b) un sistema multiprogramado por lotes monousuario.
c) un sistema monoprogramado de tiempo compartido multiusuario.
d) un sistema multiprogramado de tiempo compartido monousuario.
10.- El modo dual de operación en los sistemas es posible gracias a
a) Que existe el sistema operativo
b) Que las instrucciones máquina están divididas en privilegiadas y no
privilegiadas
c) Que la memoria está dividida en memoria del sistema y de usuario
d) Que se dispone de llamadas al sistema
11.- ¿Con cuál de las siguientes afirmaciones te quedarías?
a) El diseño de un S.O. siguiendo una estructura monolítica permite que se pueda
realizar un mantenimiento y depuración sencillos del mismo
b) En general, el diseño por capas tiende a ser menos eficiente que el
monolítico
c) El modelo cliente-servidor es equivalente a un sistema que sigue el enfoque
jerárquico donde las capas pueden cambiar su nivel en la jerarquía
d) El enfoque micronúcleo tiene como dos de sus mejores virtudes la portabilidad y el
tamaño final del sistema operativo, siempre menor que el que se obtiene siguiendo
cualquier otro esquema
12.- El interprete de órdenes,
a) Es un programa del sistema y constituye la única forma de solicitar servicios al SO
b) Ejecuta las órdenes indicadas por el usuario y para ello hace uso a su vez de
las llamadas al sistema
c) Al ser un programa del sistema, no necesita realizar llamadas al sistema
d) Siempre forma parte del núcleo del sistema operativo
13.- En un sistema informático, los procesos recién creados entran en una cola de
espera. Entran en la cola de preparados sólo cuando se ve que la utilización de
la CPU cae por debajo del 20%. Este sistema...
a) utiliza planificación expulsiva
b) utiliza planificación de largo plazo o alto nivel
c) aplica envejecimiento de procesos
d) aplica multicola de dos niveles con realimentación
14.- El controlador de E/S y la memoria intercambian datos directamente, sin la
intervención de la CPU, cuando se tiene:
a) E/S controlada por programa.
b) E/S por interrupciones.
c) DMA.
d) Ninguna de las anteriores.
15.- El tiempo de cambio de contexto
a) es constante para dos hilos cualesquiera
b) es menor entre dos hilos pertenecientes a la misma tarea, comparado con
hilos de distintas tareas.
c) es mayor cuanto más grande es el cuanto de tiempo, si planificamos con un Round
Robin.
d) todas son falsas

2/7
Nombre

2 (2,5 puntos) A continuación se muestran las demandas futuras de CPU y E/S de un conjunto
de procesos secuenciales que arriban simultáneamente a un ordenador con un solo procesador. En
cada casilla se muestra el tiempo requerido para completar una petición de CPU o E/S, en unidades
de tiempo arbitrarias. Las casillas vacías indican que no hay peticiones futuras.
Por ejemplo, el proceso 3 demanda 2 unidades de tiempo de CPU, luego pedirá 4 unidades de
E/S, tras lo que necesita 1 unidad de tiempo de CPU, atendida la cual finaliza.
CPU E/S CPU E/S CPU
Proceso 1 7 1 6 1 7
Proceso 2 4 4 4 4 4
Proceso 3 2 4 1
Proceso 4 1 7 1 10 2
Obtener el diagrama de Gantt, el tiempo medio de retorno y el tiempo medio de espera al aplicar las
siguientes políticas de planificación:
a) SJF
b) Round-Robin con cuanto igual a 3 unidades de tiempo.
En el caso de dos o más peticiones simultáneas, indique el criterio que ha seguido en la elección.
Considere a la E/S como un recurso compartido de capacidad ilimitada.

Ver respuesta al final del documento.

3 (2,5 puntos) Resolver el problema del búfer limitado empleando únicamente semáforos
binarios.
class Productor-Consumidor {
Public:
Productor-Consumidor();
~Productor-Consumidor();
void productor( struct registro *dato );
void consumidor( struct registro *dato);
Private:
semaforo: *mutex, *hay_hueco, *nuevo_producto;
integer: huecos_libres, inserto, extraigo;
integer: productores_esperan, consumidores_esperan;
};
Productor-Consumidor:: Productor-Consumidor() {
mutex = new semáforo(1);
hay_hueco = new semáforo(0);
nuevo_producto = new semáforo(0);
huecos_libres = N; // Inicialmente el buffer está vacío;
inserto = 0;
extraigo = 0;
productores_esperan = 0;
consumidores_esperan = 0;
}

3/7
Productor-Consumidor:: ~Productor-Consumidor() {
delete mutex;
delete hay-hueco;
delete nuevo_producto;
}
void productor( struct registro *dato ) {
mutex->espera();
while ( huecos-libres == 0 ) {
productores_esperan++;
mutex->señal();
hay-hueco->espera();
mutex->espera();
productores-esperan--;
}
buffer[inserto] = *dato;
inserto = (inserto+1)%N;
huecos-libres--;
if ( consumidores_esperan > 0 ) nuevo-producto->señal();
mutex->señal();
}
void consumidor( struct registro *dato ) {
mutex->espera()
while ( huecos_libres == N ) {
consumidores_esperan++;
mutex->señal();
nuevo-producto->espera();
mutex->espera();
consumidores_esperan--
}
*dato = buffer[extraigo];
extraigo = (extraigo+1)%N;
huecos-libres++;
if ( productores_esperan > 0 ) hay_hueco->señal();
mutex->señal();
}
Productor-Consumidor buffer;
Código de los productores {

// Producir dato
buffer.productor(dato)
}
Código de los consumidores {
buffer.consumidor(dato)
// Consumir dato

}

4/7
Nombre

4 (1 punto) Comentar la validez del algoritmo de exclusión mutua del programa siguiente:
int flag1, flag2;
void Proceso_1() void Proceso_2()
{ {
while (true) { { while (true) {
// SECCION NO CRITICA // SECCION NO CRITICA
flag1=0; flag2=0;
while (flag2==0) { while (flag1==0){
flag1=1; flag2=1;
while (flag2==0) while (flag1==0)
NULL; NULL;
flag1=0; flag2=0;
} }
// SECCION CRITICA // SECCION CRITICA
flag1=1; flag2=1;
// SECCION NO CRITICA // SECCION NO CRITICA
} }
} }

El algoritmo propuesto cumple la condición de exclusión mutua, debido a que cuando


un proceso quiere entrar en su sección crítica, lo indica mediante su variable flag, y
entra dependiendo del valor que posee la variable flag del otro proceso, si indica que
quiere entrar, entonces no entra hasta que cambie el valor.
El que cumpla la condición de exclusión mutua no es suficiente para servir como
solución al problema de la sección crítica, de hecho no es una solución válida debido a
que no cumple la condición de progreso; ya que si los dos procesos se ejecutan de
manera paralela, o incluso, alternando sentencia a sentencia el protocolo de entrada,
entonces se produciría una situación de bloqueo entre ellos.

5 (1,5 puntos) Justificar brevemente cada una de las siguientes cuestiones:


a) Ventajas e Inconvenientes de que los hilos sean implementados por el
Sistema Operativo o por los programas de usuario.
Algunas ventajas e inconvenientes importantes son:
e. Los cambios de contexto entre hilos de un mismo proceso son más rápidos en
el caso de que los hilos estén implementados por el sistema operativo. Esto es
debido a que los BCP de los hilos son más simples pues los hilos pueden
compartir elementos como datos, código, etc …
f. Los hilos creados por usuarios no necesitan del núcleo para ser creados (no
necesitan de llamadas al sistema) luego son más rápidos de crear y manejar.
g. Como contrapartida, en los hilos creados por usuarios, si un hilo realiza una
llamada al sistema y éste ha ser bloqueado, el sistema (que no conoce el
concepto de hilo) bloqueará a todo el proceso pesado, lo cual hace que varios
hilos sean bloqueados innecesariamente. Esto no ocurriría en el caso de que
los hilos fueran programados por el S.O.
h. Si los hilos son implementados por el Sistema, éstos podrán disponer de un
“beneficio” en el sentido de que cada hilo perteneciente a un proceso multihilo
tendrá “derecho” a CPU de la misma forma que cualquier proceso pesado que
se esté ejecutando en el sistema. En este mismo sentido, si los programa un
5/7
usuario, el sistema ve el proceso multihilo como un único proceso y asignará
tiempo de CPU a dicho proceso como si fuera un proceso más y no como un
proceso compuesto por varios hilos (varios procesos ligeros).
a) ¿En qué consiste el efecto convoy? Nombra una política de planificación en
la que no pueda darse este efecto.
Supóngase un proceso limitado por CPU y muchos procesos limitados por E/S.
Supóngase que el limitado por CPU puede obtener y retener la CPU. Durante este
tiempo, todos los demás terminarán sus operaciones de E/S y se moverán a la cola de
preparados, esperando CPU. Mientras esperan, los dispositivos de E/S están
inactivos. Con el tiempo, el proceso limitado por CPU terminará su ráfaga de CPU y se
mueve hacia un dispositivo de E/S. Todos los procesos limitados por E/S, que tienen
ráfagas breves se ejecutan rápidamente y se mueven de regreso a las colas de E/S.
En este punto, la CPU se encuentra inactiva. El proceso limitado por CPU volverá
entonces de regreso a la cola de preparados y se le asignará el procesador.
Nuevamente, todos los procesos de E/S acaban esperando hasta que salga. Se
produce un efecto convoy al esperar todos los demás procesos a que el proceso
grande suelte la CPU. Este efecto da por resultado una menos utilización de la CPU y
de los dispositivos de la que sería posible si se permitiera que los procesos más cortos
obtuvieran primero la CPU.
Si el planificador utiliza una política del tipo SJF no se produciría el efecto convoy.
b) Suponiendo que la gestión de la cola de procesos bloqueados asociados a
un semáforo se gestiona mediante una política del tipo LIFO, ¿qué
consecuencias podría tener?
Puede producirse la siguiente situación: Supóngase que hay una serie de procesos
esperando por el semáforo. Como la cola se gestiona con una política del tipo LIFO,
los primeros procesos que entraron en la cola serán los últimos en salir. Si a
continuación entran muchos procesos y salen otros tantos antes de que los primeros
en entrar salgan, se puede producir el efecto de inanición de estos primeros procesos
que estaban esperando, y que no son “liberados” de la cola.

6/7
a) SJF

tiempo 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
CPU P4 P3 P2 P3 P4 P1 P2 P4 P1 P2 P1
P4 P4 P2 P1
E/S
P3 P2 P1

Tiempos de Retorno Tiempos de Espera


P1 39 9+(22-17)+(32-29) = 17
P2 32 3+(16-11)+(28-24) = 12
P3 8 1
P4 22 (20-19) = 1
Tiempos Medios 25,25 7,75

b) RR, q=3

tiempo 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
CPU P1 P2 P3 P4 P1 P2 P3 P1 P1 P4 P2 P1 P2 P1 P4 P1 P2 P1 P2
P3 P2 P4
E/S P4 P1 P2
P1

Cuando termina un proceso una operación de E/S al mismo tiempo que a otro proceso se le cumple su cuanto y a este último aún que faltan ciclos de disfrute de la
CPU, se ha optado por incluir en primer lugar en la cola de preparados al proceso que termina la operación de E/S. En caso de que varios terminen
simultáneamente sus operaciones de E/S se ha cogido al de menor Pi.
CPU ociosa

Tiempos de Retorno Tiempos de Espera


P1 39 (9-3)+(14-12)+(23-19)+(32-30)+(38-35) = 17
P2 40 3+(12-6)+(20-17)+(26-23)+(35-31)+(39-38) = 20
P3 14 6+(13-12) = 7
P4 32 8+(19-16) = 11
Tiempos Medios 31,25 13,75

7/7
Universidad de Las Palmas de Gran Canaria
Escuela Universitaria de Informática Calificación

Sistemas Operativos 1
Examen Convocatoria Ordinaria , 11 de Julio de 2005 2
a
1 PARTE 3

Nombre Titulación

Dispone de 1:30 horas para realizar el examen

1 (3,5 puntos) Test. En cada uno de los siguientes apartados, señale cuál opción es correcta. En caso de que existan varias
opciones ciertas, se considerará como correcta la más completa o precisa. Las preguntas no contestadas no puntúan; las contestadas
erróneamente penalizan un tercio de su valor. Señale sus respuestas rodeando con un círculo la opción correcta. Si se equivoca, tache la
respuesta incorrecta y rodee la opción que considere correcta. Escriba con tinta. Las preguntas respondidas con lápiz o con varios círculos
no tachados se considerarán no contestadas.
1. Un sistema de interrupciones
a) exige utilizar un vector de interrupciones
b) evita la espera activa por dispositivos
c) protege la memoria donde reside el sistema operativo
d) todas las anteriores son ciertas
2. ¿Cuál de estas técnicas NO tiene como fin solapar la ejecución de instrucciones en CPU con la ejecución de operaciones de
entrada/salida?
a) acceso directo a memoria (DMA)
b) modo dual de operación
c) procesamiento fuera de línea ( off-line)
d) spooling
3. Un sistema operativo distribuido
a) permite gestionar recursos dispersos por medio de una máquina central que controle al resto
b) sólo tiene sentido si el sistema consta de máquinas heterogéneas
c) permite la ejecución de un servicio en una máquina diferente a aquélla donde fue solicitado
d) todas las anteriores son ciertas
4. Sobre planificación de procesos:
a) todos los métodos basados en prioridades tienen riesgo de inanición
b) los métodos multicolas están concebidos para planificar sistemas multiprocesadores
c) el algoritmo FCFS perjudica a los procesos intensivos en CPU
d) los enunciados a, b y c son todos falsos
5. La afirmación de que un sistema operativo es un programa dirigido por eventos implica que
a) responde a interrupciones
b) atiende eventos generados por los periféricos
c) atiende eventos generados por los programas
d) son ciertas todas las anteriores
6. ¿Cuál de estas instrucciones no ha de ser privilegiada?
a) desactivar las interrupciones
b) cambiar de modo usuario a supervisor
c) leer el temporizador
d) solicitar una operación de disco
7. Una llamada al sistema...
a) es atendida por el núcleo, aunque el usuario puede instalar sus propios servicios
b) es un punto de entrada para un servicio del sistema
c) se ejecuta en modo no privilegiado
d) Todas las anteriores son ciertas
8. En el núcleo del sistema operativo reside la implementación de
a) el modo dual de operación
b) las instrucciones privilegiadas
c) los servicios del sistema
d) todas son ciertas

1/4
9. Cuando un proceso intenta acceder a una dirección de memoria fuera de su espacio, se genera
a) una interrupción
b) una excepción
c) un aborto (abort) del proceso
d) la suspensión del proceso
10. Si en un sistema se soporta concurrencia entonces hay
a) multiprogramación
b) paralelismo
c) procesamiento distribuido
d) procesamiento en tiempo real
11. Multiprogramación implica:
a) Tiempo compartido
b) Procesamiento en lote
c) Interactividad
d) Todas las anteriores son falsas
12. Un recurso del sistema operativo es
a) hardware a disposición de los usuarios
b) software a disposición de los usuarios
c) hardware o software a disposición de los usuarios
d) datos que los usuarios pueden utilizar
13. ¿Cuál de estas combinaciones no se puede dar?
a) concurrencia sin tiempo compartido
b) tiempo compartido sin concurrencia
c) tiempo compartido sin paralelismo
d) paralelismo sin tiempo compartido
14. Para resolver el problema de la exclusión mutua, puede emplearse una variable global turno con el identificador del proceso que
tiene derecho a entrar en la sección crítica. Cada vez que un proceso sale de su S.C., cambia el valor de turno al identificador de otro
proceso. Esta solución:
a) es correcta
b) no cumple la propiedad de exclusión mutua
c) no cumple la propiedad de progreso
d) no cumple la propiedad de independencia de la arquitectura
15. El bloque de control de proceso...
a) realiza los cambios de contexto de un proceso
b) almacena los registros del proceso
c) controla el tiempo que un proceso está bloqueado o bien en ejecución
d) todas las anteriores son ciertas
16. El llamado efecto convoy...
a) consiste en una cola de procesos interactivos que compiten con un proceso intensivo en entrada/salida.
b) ocasiona el solape continuado de actividades de E/S con actividades de CPU.
c) puede corregirse por completo con técnicas expulsivas (preemptive).
d) es un problema específico de los métodos multicolas sin realimentación.
17. Un semáforo tiene actualmente el valor 2. Si se ejecuta una operación wait o P sobre él, ¿qué sucederá?
a) El proceso que ejecuta la operación se bloquea hasta que otro ejecute una operación signal o V.
b) Tras hacer la operación, el proceso continuará adelante sin bloquearse.
c) El proceso continuará adelante sin bloquearse, y si previamente existían procesos bloqueados a causa del semáforo, se desbloqueará uno de
ellos.
d) Un semáforo jamás podrá tener el valor 2, si su valor inicial era 0 (cero) y se ha operado correctamente con él.
18. El problema de la sección crítica aparece porque
a) existen sistemas de memoria compartida aparte de los de paso de mensajes
b) la espera activa es insuficiente para resolver la exclusión mutua de procesos concurrentes
c) la ejecución de porciones de código del sistema operativo accediendo a tablas protegidas ha de efectuarse en exclusión mutua
d) varios procesos concurrentes pueden acceder a un mismo conjunto de datos
19. En un sistema multihilo
a) un proceso pesado puede tener varios hilos con distintos espacios de memoria
b) un proceso pesado tiene uno o más hilos con distintos conjuntos de registros
c) por lo general, el tiempo de cambio de contexto es mayor entre hilos que entre procesos pesados
d) dos hilos de un mismo usuario comparten el mismo espacio de memoria
20. Para evitar el acaparamiento de CPU por parte de un único proceso, es condición necesaria que el método de planificación sea
a) basado en prioridades más envejecimiento
b) multicola
c) multicola con realimentación
d) expulsivo (preemptive)
2 (3 puntos) En un sistema informático con un sistema operativo multiproceso se van a lanzar tres procesos,
cuya ejecución si no existieran otros procesos sería la representada en la siguiente figura:
18ms E/S 4ms

12s E/S 4ms

4ms E/S 9ms

Se supone despreciable el tiempo de conmutación de tarea. El tiempo necesario para realizar la operación de
entrada y salida es de 4ms y para simplificar sólo se hace sobre un único dispositivo. En la siguiente tabla se indica
el instante de llegada de cada proceso y el tiempo de CPU requerido.

Proceso Tiempo de llegada Tiempo de ejecución


P0 0 22
P1 8 16
P2 17 13

Obtener el diagrama de Gantt, el tiempo medio de retorno y el tiempo medio de espera al aplicar las siguientes
políticas de planificación:
a) Round-Robin con valor de cuanto de 10ms (1p)
b) Apropiación de prioridades variables basado en un algoritmo que aumenta en una unidad la prioridad de los
procesos que esperan por el recurso por cada unidad de tiempo transcurrida. A mayor valor de prioridad,
mayor prioridad. Cada vez que un proceso ingresa en la cola de espera se le asigna una prioridad inicial de 3,
5 y 6 para los procesos P0, P1 y P2 respectivamente. (1.5p)

3 (4 puntos) Justificar brevemente, y únicamente en el espacio que aparece, cada una de las siguientes
cuestiones:
a) Para que el S.O. funcione correctamente hay que impedir que distintos programas de usuario
puedan realizar libremente ciertas operaciones. ¿Cuál es la problemática a la que se hace referencia?
¿Qué solución proponen los sistemas operativos actuales? ¿en qué se basan? (0.8p)

b) ¿En qué consisten los microkernels? ¿Por qué aparecen? Indicar ventajas y desventajas de su
utilización. (0.8p)
c) ¿Para qué se utilizan las interrupciones? ¿Qué elementos se necesitan para que funcionen? En un
sistema basado en interrupciones, ¿de qué forma puede saberse qué recurso realiza una
interrupción? (0.8p)

d) Para lograr la ejecución concurrente de procesos, es necesario que el sistema operativo sea capaz de
desalojar un proceso de la CPU y asignársela a otro. ¿Cómo se denomina esta operación? ¿De qué
elementos dispone el sistema operativo para realizarlo? Indique para estos elementos sus
componentes y cómo se realiza dicha operación atendiendo a ellos. (0.8p)

e) La planificación de procesos en el sistema operativo actúa en distintos niveles de detalle. ¿A qué


niveles nos referimos? Indicar para cada nivel qué tipo de planificador se requiere y poner un
ejemplo. (0.8p)
Universidad de Las Palmas de Gran Canaria Calificación
Escuela Universitaria de Informática 1

2
Sistemas Operativos
Convocatoria Extraordinaria, 12 de diciembre de 2005 3

Nombre Titulación
SOLUCIONES
Dispone de 3 horas para realizar el examen

1 (2,5 puntos) Ciertos sistemas de archivos trabajan con un modelo de «una sola
escritura». Cuando el archivo se crea, se almacena su contenido en disco normalmente. Si el
usuario modifica el archivo, se mantiene intacta la versión antigua del archivo original. El
contenido del archivo modificado se guarda en otro lugar del disco. De esta forma, el
sistema operativo mantiene el histórico de todas las versiones que existieron sobre el
archivo. El usuario puede acceder a las versiones antiguas a través de nombres de archivo
especiales (ej. miArchivo.txt#1, miArchivo.txt#2, etc.).
a) ¿Qué política de asignación de espacio encaja mejor con esta clase de sistemas?
b) ¿Qué ventajas ofrece este sistema? ¿Qué inconvenientes le ves?
En el sistema aquí descrito, una vez que se crea una versión de un fichero, esta
permanece inalterada en el disco. Por tanto, los bloques de datos que se reservan una
vez nunca más se liberan. La política más simple para gestionar el almacenamiento
consiste en ir reservando bloques de forma secuencial. Si N es el primer bloque libre y
se solicitan K bloques, concedemos los bloques del N al N+K-1. El primer bloque libre
pasa a ser N+K. Esta política de asignación de espacio es contigua. No hay que
mantener listas de bloques libres ni ocupados, ya que al no liberarse nunca los
bloques solicitados, los bloques libres siempre forman un grupo compacto.
Las otras políticas de asignación que se han explicado en la asignatura, como la
enlazada y la indexada, son inútiles aquí, dado que no se produce ninguna
fragmentación en el espacio libre ni en el espacio ocupado por los ficheros.

Las ventajas e inconvenientes de este tipo de sistemas son múltiples.


Entre las ventajas, podemos destacar la posibilidad que tiene el usuario de recuperar
cualquier versión antigua de sus archivos sin tener que preocuparse de hacer copias
de seguridad manuales. Se facilita también el trabajo en equipo, porque si varios
usuarios trabajan simultáneamente con un archivo, los cambios de cada uno se
pueden guardar en distintas versiones, para luego combinarlos en una nueva versión
(manualmente o con ayuda de algún software).
Un claro inconveniente de este sistema es que la demanda de almacenamiento es
mucho mayor que en un sistema convencional, aunque podría atenuarse guardando
sólo los cambios efectuados en cada versión, no el contenido completo del archivo.
Otro inconveniente es que este sistema se adapta mal a aquellos archivos que
cambian con asiduidad, como los ficheros de registro (logs). Otro problema es que, si
no se puede eliminar la información, pueden quedar datos confidenciales que no
interesa conservar en el disco.

1/5
2 (2,5 puntos) Diseñe una solución al primer problema de los lectores y escritores
(prioridad para los lectores), utilizando MONITORES y añadiendo el requisito de que no
puede haber más de 20 lectores simultáneos.

Una posible solución, con sintaxis estilo C++/Java:

monitor lectores_escritores
{
int cuentalect = 0;
boolean bloqueo_escritores = false;
condition escr, lect;
const int MAX_LECTORES = 20;

procedure entry solicito_escritura( )


{
if ( ( (cuentalect > 0) || bloqueo_escritores ) {
escr.wait();
}
bloqueo_escritores = true;
}

procedure entry finalizo_escritura()


{
bloqueo_escritores = false;
if ( cuentalect == 0 ) {
escr.signal();
}
}

procedure entry solicito_lectura()


{
cuentalect++;
if ( cuentalect == MAX_LECTORES ) {
lect.Wait();
}
if ( cuentalect == 1 ) {
bloqueo_escritores = true;
}
}

procedure entry finalizo_lectura()


{
cuentalect--;
if ( cuentalect >= MAX_LECTORES ) {
lect.Signal();
}
elseif ( cuentalect == 0 ) {
bloqueo_escritores = false;
escr.Signal();
}
}
}

2/5
Nombre

3 (2,5 puntos) Tenemos un sistema de gestión de memoria paginada, con dos niveles de
tablas de páginas. Cada entrada en una tabla de páginas (primaria o secundaria) ocupa
exactamente cuatro bytes. El tamaño de página es de 4 kilobytes. Cada dirección de memoria
tiene 32 bits, que se organizan de la siguiente manera:

1er nivel 2º nivel desplazamiento


paginación paginación
10 bits 10 bits 12 bits

a) ¿Cuántas páginas puede llegar a tener en total un proceso?


220 = 1.048.576 (cualquiera de estas respuestas es válida)
b) ¿Cuántas entradas puede llegar a tener la tabla de páginas primaria de un proceso?
¿Qué tamaño en bytes puede ocupar como máximo dicha tabla?
Entradas en la tabla: 210 = 1.024 (cualquiera de las respuestas es válida)
Tamaño en bytes de la tabla: 1024 × 4 = 4.096 bytes
c) ¿Cuántas entradas puede llegar a tener una tabla de páginas secundaria? ¿Qué tamaño
en bytes puede ocupar como máximo dicha tabla?
Entradas de la tabla: 210 = 1.024
Tamaño en bytes de la tabla: 1024 × 4 = 4.096 bytes
d) Un programa que ocupe 100 megabytes, ¿cuánto espacio consumirá en tablas de
páginas?
100 megabytes = 100 × 220 bytes = (100 × 220) ÷ 212 páginas = 100 × 28 =
25.600 páginas.
El programa tiene 25.600 páginas.
En tablas secundarias consumirá 25.600 × 4 = 102.400 bytes.
Como cada tabla secundaria puede tener hasta 1.024 entradas, hacen falta:
25.600 ÷ 1.024 = 25 tablas secundarias.
Esto significa que la tabla primaria debe tener 25 entradas, ocupando por tanto
25 × 4 = 100 bytes.
Así que en total el programa consumirá en tablas 102.400 + 100 = 102.500 bytes.
4 (2,5 puntos) En un sistema de un solo procesador se hallan tres procesos, P1, P2 y P3,
que van a ejecutar estas instrucciones:

Process P1 Process P2 Process P3


begin begin begin
<código_A> <código_A> <código_A>
wait(X) wait(Y) wait(X)
<código_X> <código_Y> <código_X>
signal(X) signal(Y) signal(X)
<código_B> <código_B> <código_B>
end; end; end;

Los semáforos X e Y están inicializados a 1. El código_A necesita 2 ms de tiempo para


ejecutarse, el código_B 4 ms, el código_X 6 ms y el código_Y 6 ms. El tiempo de las
operaciones wait y signal se considera despreciable.
La política de planificación de procesos es un método de prioridades expropiativo. El plan de
ejecución de los procesos es:
Proceso Tiempo de llegada Prioridad
P1 0 ms Baja
P2 4 ms Mediana
P3 8 ms Alta

Se pide:
a) Realizar el diagrama de Gantt de la ejecución de estos procesos, marcando en cada
instante de tiempo qué parte de código se está ejecutando del proceso
correspondiente (P1_A si es la sección etiquetada como código_A del proceso P1,
P1_X si es la sección etiquetada como código_X del proceso P1, …).

b) Calcular el tiempo de espera medio y el tiempo de retorno medio.

La respuesta está en la siguiente página.

4/5
a)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
P1 A A X X X X X X B B B B
P2 A A Y Y Y Y Y Y B B B B
P3 A A X X X X X X B B B B

Obsérvese que el proceso P2, en la práctica, ha gozado de más prioridad que P3. Esto se debe a que P3, en el instante 11, quedó en espera por
un recurso retenido por P1 (el semáforo X). A su vez, P1 no podía avanzar, porque P2 tenía más prioridad. El resultado ha sido que P2 ha
impedido indirectamente que P3 progrese. Este fenómeno se conoce como inversión de prioridades. Los sistemas operativos modernos aplican
técnicas para impedir que se produzca la inversión de prioridades. En nuestro caso, se podría haber elevado artificialmente la prioridad de P1,
para que se adelantara a P2 y no se bloqueara injustamente a P3.

b)

Tiempos de Retorno Tiempos de Espera


P1 36-0 = 36 (18-4)+(32-22) = 24
P2 18-4 = 14 10-8 = 2
P3 32 – 8 = 24 0 **(ver nota)
Tiempos Medios 24,67 8,67
** No se ha contabilizado como tiempo de espera la espera realizada por el proceso cuando queda bloqueado al intentar entrar en la sección
crítica y queda retenido en la operación wait(X), es decir, se ha asumido que dicho proceso pasa a un estado bloqueado y que el tiempo de
espera se mide tendiendo en cuenta la suma de los tiempos que un proceso permanece en la cola de preparados hasta que se le va asignando la
CPU.

5/5
Universidad de Las Palmas de Gran Canaria Calificación
1
Escuela Universitaria de Informática 2
Facultad de Informática 3
4
Sistemas Operativos
Convocatoria de Junio, 26 de Junio de 2003
SOLUCIONES

Nombre Titulación

1 ( 3,5 puntos) Responda, justificando sus respuestas, a las siguientes cuestiones:

a) ¿Cuál es el propósito de las llamadas al sistema y cómo se relacionan éstas con el


S.O. y con el concepto de modo dual de operación?
Las llamadas al sistema son la interfaz del S.O. para los programas en ejecución, es
decir, son los mecanismos que utilizan los programas en ejecución para solicitar
servicios al núcleo del sistema operativo de tal forma que cuando un proceso realiza
una llamada al sistema, el S.O. recupera el control y se conmuta de modo no
privilegiado a modo privilegiado.

b) ¿En los primeros computadores cada byte de datos de lectura o escritura era
directamente manejado por la CPU, ¿Qué implicaciones tiene esta organización con
respecto a la multiprogramación?
Cuando las operaciones de E/S son manejadas directamente por la CPU, es decir, no
se dispone ni de interrupciones ni de DMA, se requiere la intervención activa del
procesador para transferir los datos entre la memoria y el módulo de E/S. Esto es
especialmente grave en dispositivos de E/S rápidos donde se podría transmitir
información a velocidades cercanas a las de la memoria, lo que en definitiva implica
que el procesador no dispondría de mucho tiempo para la ejecución de procesos en
medio de las operaciones de E/S de un proceso. En cambio, cuando disponemos de
DMA, el procesador sólo se ve involucrado al principio y al final de la transferencia,
estando desocupado en el transcurso de la operación de E/S y pudiendo aprovechar
ese tiempo para ejecutar otro proceso (multiprogramación).

c) ¿Debe ser un sistema operativo multiprogramado de tiempo compartido? ¿ Y


viceversa?
Cuando hablamos de un sistema multiprogramado nos referimos a un sistema que
permite la ejecución concurrente de varios procesos, es decir, observaríamos como se
entrelaza la ejecución de varios procesos. Cuando hablamos de un sistema de tiempo
compartido hablamos también de un sistema multiprogramado en el que a cada
proceso se le asigna un intervalo de tiempo de ejecución. Podríamos perfectamente
pensar en un sistema multiprogramado en el que la asignación de la CPU a los
procesos no se realice en base a un intervalo de tiempo, por ejemplo, un sistema
multiprogramado con una política de planificación de CPU FIFO (cuando un proceso
espera por algún evento, se conmuta a otro proceso). Queda por tanto claro y
justificado que la respuesta a la primera pregunta es NO y a la segunda SI.
d) ¿Puede producirse una cambio de contexto en un sistema con un planificador
basado en el algoritmo “primero el trabajo más corto” además de cuando se
bloquea o se termina el proceso?
Si nos referimos a la versión no expulsiva (SJF) la respuesta es NO ya que una vez
que el planificador toma la decisión de quién entra en base a la duración de la ráfaga
de CPU y dado que se trata de una política no expulsiva, ese proceso sólo
abandonará la CPU cuando se bloque por algún motivo (por ejemplo cuando realiza
una operación de E/S) o cuando termine su ejecución. En cambio, en la versión
expulsiva (SRTF) existe otra situación que provoca un cambio de contexto: la llegada
de un proceso con una duración de ráfaga de CPU inferior a la del proceso que
actualmente tiene asignada la CPU.

e) ¿Qué algoritmo de planificación será más conveniente para optimizar el


rendimiento de la CPU en un sistema que sólo tiene procesos en los cuales no hay
E/S?
Si se trata de procesos en los que no hay E/S, el objetivo de optimizar el rendimiento
de CPU debe basarse en elegir un algoritmo de planificación simple de forma que se
“pierda” el menor tiempo posible en trabajo no productivo, entendiéndose como tal
todo el tiempo invertido por el propio sistema operativo en la toma de decisión del
proceso a ocupar la CPU, manejo de las estructuras necesarias para implementar la
política de planificación, tiempo invertido en cambios de contexto, etc.... En este
sentido la política de planificación FIFO es una candidata ideal.

f) Suponga que se encuentra definiendo la estrategia a seguir en su S.O. en relación al


problema del interbloqueo, ¿Cuáles serían a grandes rasgos las opciones a
considerar?
A la hora de plantearnos el problema del interbloqueo podemos optar por diferentes
estrategias:
1.- Garantizar que en el sistema nunca ocurran interbloqueos empleando para ello
algún algoritmo de prevención (evitando que ocurra alguna de las cuatro
condiciones necesarias) o de evitación (por ej. el algoritmo del banquero).
2.- Permitir la aparición de interbloqueos y recuperarse cuando ocurran
(necesitaremos algún algoritmo de detección y recuperación).
3.- No tratar el problema (si se producen interbloqueos, el usuario tendrá que
intervenir).

g) ¿Cuáles son las ventajas fundamentales que aportan los hilos frente a los procesos?
La ventaja principal es poder dotar de concurrencia interna a una aplicación, con un
coste reducido. Varios hilos dentro de un proceso pesado comparten el mismo espacio
de memoria (código y datos), así como los recursos que la aplicación tenga asignados.
Por tanto, la comunicación entre hilos es más sencilla y además al ser entidades que
consumen menos recursos que los procesos el cambio de contexto entre hilos es
menos costoso.
Nombre

2 (2,5 puntos) Suponiendo que estamos trabajando con el Nachos, desarrolle una
implementación de las variables de tipo condición, utilizando semáforos, según el estilo de
Mesa.

Para cada variable de tipo condición se deberá utilizar:


Semaforo: Sbloqueo;
// Semáforo para implementar el funcionamiento de “wait”, “signal” y “broadcast”
// Su valor inicial es 0

Entero: contador;
// Para almacenar el número de hilos bloqueados por haber realizado una operación
de “wait” y esperan a que se realice una operación “signal”.
// Su valor inicial es 0

Además todas las variables de tipo condición definidas en un mismo monitor deberán
hacer uso de un semáforo común, que llamaremos “cerrojo”, para garantizar la
exclusión mutua. Asumimos que todo hilo que realice una operación de “wait”, “signal”
o “broadcast” previamente tiene el control de este semáforo.

Operación “wait”:
Sumar 1 a contador;
V(cerrojo):
P(Sbloqueo);
P(cerrojo);

Operación “sígnal”:
“Si” contador > 0 “Entonces”
V(Sbloqueo);
Restar 1 a contador;
“Fin si”

Operación “broadcast”:
“Mientras” contador > 0 “hacer”
V(Sbloqueo);
Restar 1 a contador;
“Fin mientras”
3 (2,5 puntos) Suponga un sistema paginado de memoria virtual en el que una dirección
posee la siguiente estructura: 22 bits para especificar número de página y 10 bits para
desplazamiento de la página. Explique de forma algorítmica el proceso de traducción de
una dirección virtual. En su descripción deberá contemplar el uso de:
o Recursos hardware. Deberá especificar en qué punto se utilizan y para qué.
o Estructuras de datos (tablas y registros). Deberá explicar sus estructuras internas,
así como para qué se utilizan y en qué punto de su descripción.
o Políticas empleadas en caso de ser necesarias su utilización. Deberá especificar
cuándo se utilizan y con que finalidad.

Recursos hardware (ver estructura interna en la bibliografía):


Registros asociativos (TLBs) para la traducción rápida de direcciones.
Registro base de la tabla de páginas
Registro de longitud de la tabla de páginas

Recursos Software (ver estructura interna en la bibliografía):


Tabla de páginas (una por programa en ejecución)
Tabla de marcos de páginas del Sistema Operativo.

Políticas:
Política de reemplazo de páginas, que decide que página sustituir cuando un
programa referencia a una página y ésta no se encuentra en memoria y además no
existen marcos disponibles.

El proceso de traducción se realiza paralelamente vía hardware (mediante TLBs) y vía


software (mediante tablas). Si el proceso hardware falla (debido a que la página
referenciada no está representada en estos registros asociativos), entonces los pasos
que se describen a continuación se ejecutan en su totalidad:

1.- Obtener la dirección base de la tabla de páginas utilizando el registro base de


la tabla de página.
2.- Comprobar que el campo página de la dirección es válido, si no es así,
entonces error por dirección inválida y se interrumpe el proceso de traducción.
3.- Entrar en la entrada correspondiente en la tabla de páginas (usando el campo
página de la dirección virtual) y comprobar si se trata de una página válida o no.
4.- Si es una página inválida, entonces:
4.1.- Si el programa tiene consumido su número máximo de páginas en
memoria, entonces invocar a la política de reemplazo.
4.2.- Cargar la página en memoria, actualizando la tabla de páginas del
programa y la tabla de marcos de página del sistema operativo.

5.- La dirección final será la suma de la dirección base del marco de página que
contiene a dicha página y el contenido del campo desplazamiento de la dirección
virtual.
Nombre

4 ( 1,5 puntos) Suponga un sistema de archivos que utiliza una política de asignación en
disco indexada a un solo nivel, teniendo la tabla de índices 25 entradas y cada una de ellas
de 4 bytes. Suponga que el tamaño en bytes de un bloque de sistema de ficheros es
DBLOQ. Especifique los pasos e ejecutar y cálculos a realizar para atender a la siguiente
petición de acceso a un registro de fichero de usuario:
Readat( fd, Nreg, buff)
Siendo:
- fd un descriptor de fichero válido que previamente se ha obtenido mediante la
función “open”.
- Nreg el número de registro a acceder, se trata por tanto de un acceso directo a
fichero.
- Buff dirección de memoria dónde depositar el contenido del registro a leer.
LREG es el tamaño de los registros del fichero, cumpliéndose que todos tienen el mismo
tamaño y LREG puede ser menor o igual que DBLOQ.

1.- El descriptor de archivo (fd) es empleado cómo índice en la tabla de archivos


abiertos donde se almacena toda la información de la entrada de directorio asociada al
archivo (información que es copiada en dicha tabla en la operación de apertura del
fichero). En dicha entrada tendremos información relacionada con cuestiones de
seguridad (permisos), fechas de acceso y modificaciones y entre otros datos, la
referencia al bloque índice de dicho fichero. Leemos dicho bloque índice y lo
almacenamos en memoria (INDICE).

2.- Obtenemos la posición del primer byte del registro lógico Nreg con respecto al
origen del fichero:
P = Nreg*LREG

3.- Obtenemos el bloque relativo que contiene al primer byte del registro lógico Nreg:
Br = Parte entera (P/DBLOQ)

4.- Obtenemos la posición del primer byte (Desplazamiento) del registro lógico Nreg en
el bloque Br:
D = Resto (P/DBLOQ)

5.- Obtenemos el número de bloque de sistema de archivo del bloque Br a partir del
bloque índice donde se encuentra Nreg:
Bloque1 = INDICE[Br]

6.- En el caso de que el registro Nreg se encuentre en dos bloques, es decir, si


DBLOQ no es un múltiplo exacto de LREG (dado que el enunciado indica que
LREG<=DBLOQ, como mucho se necesitará leer dos bloques), será necesario
acceder al siguiente bloque:
Bloque2 = INDICE[Br+1]

7.- La información leída de disco del registro Nreg se guarda en memoria en buff.
Calificación
Universidad de Las Palmas de Gran Canaria 1
2
Escuela Universitaria de Informática
3
Facultad de Informática 4
5
Sistemas Operativos 6
7
Convocatoria de diciembre, 1 de diciembre de 2003
8
9
10
11

Nombre Titulación

Dispone de tres horas para realizar el examen.

1 (0,33 puntos) Indica dos objetivos fundamentales de un sistema operativo.

2 (0,33 puntos) ¿Cuál es el propósito de las llamadas al sistema y cómo se relacionan


estas con el SO y con el concepto de modo dual de operación?

3 (0,33 puntos) El intérprete de órdenes es un programa que siempre forma parte del
núcleo del sistema operativo y sirve de interfaz a los programas de usuarios para que estos
puedan realizar llamadas al sistema, ¿Estas de acuerdo con la afirmación anterior? Justifica
tu respuesta.

4 (0,5 puntos) Suponga que desarrollamos el sistema operativo “SOPA” empleando


para ello el lenguaje ensamblador, Qué ventajas o desventajas ofrece dicha elección frente a
desarrollarlo empleando un lenguaje de alto nivel como C/C++?

5 (0,5 puntos) Compare los métodos de asignación contigua, enlazada o indexada desde
el punto de vista de la confiabilidad.

6 (1,5 puntos) Establece las relaciones correspondientes entre los dos grupos de
conceptos que se muestran a continuación y justifícalas:

Semáforo Política de reemplazo de página: LRU


Cerrojo Memoria Virtual
Round-Robin Memoria Paginada
Bit de modificación Signal(x): Operación sin ningún efecto
Anomalia de Belady Planificación Expropiativa
Bit de validez Tiempo compartido
SJF expulsivo Algoritmo del banquero
Monitor Intérprete de órdenes
Variables Condición Exclusión mutua por definición
7 (1,25 puntos) Describa las acciones que el sistema operativo realiza cuando ocurre un
fallo de página en un sistema de memoria virtual paginada.

8 (1,25 puntos) Suponga la siguiente solución al problema de la sección crítica:

loop
Sección No Crítica
llave:=true;
loop
swap(cerradura,llave)
cxit when llave=false
cnd loop
Sección Crítica
cerradura:=false;
end loop;

Suponiendo que cerradura esta inicializado a “false”, ¿se trata de una solución
satisfactoria?. Razone la respuesta.

9 (2 puntos) Consideremos un sistema compuesto por tres procesos fumadores y un


proceso agente. Cada fumador continuamente hace un cigarro y se lo fuma, pero para
poder fumarse un cigarro se necesitan tres ingredientes: papel, tabaco y cerillas. Uno de los
fumadores tiene papel, el otro tabaco y el otro cerillas. El agente tiene una cantidad infinita
de los tres ingredientes. El agente pone dos de los ingredientes en la mesa. El fumador que
tiene el ingrediente que falta puede hacer un cigarro y fumárselo, indicando al agente
cuando termine que se lo ha fumado. El agente entonces pone otros dos ingredientes y el
ciclo se repite. Se pide construir un programa que sincronice convenientemente al agente y
los fumadores.

10 (1 puntos) Indique los cambios fundamentales que ha realizado en el nachos para


hacerlo multiprogramado.

CONTINUA EN LA PÁGINA SIGUIENTE


Nombre

11 (1 puntos) Suponga el siguiente código en el fichero “threadtest.cc” de Nachos:

#include<…>

Lock cerrojo(“cerrojo”);
Semaphore sem(“sem”,0);
void Hilo1(int which)
{
cerrojo.Acquire();
for(int i=1; i<=3; i++)
{
printf(“Hilo1: Iteración %d”,i);
currentThread->Yield();
}
printf(“Hilo1 terminando….”);
cerrojo.Release();
}

void Hilo2(int which)


{
for(int i=1; i<=3; i++)
{
printf(“Hilo2: Iteración %d”,i);
currentThread->Yield();
}
sem.V();
printf(“Hilo2 terminando….”);
}

void ThreadTest()
{
Thread *t1=new Thread(“Hilo1”);
Thread *t2=new Thread(“Hilo2”);
t1->Fork(Hilo1,1);
t2->Fork(Hilo2,2);
cerrojo.Acquire();
sem.P();
printf(“Hilo principal terminado…..”);
cerrojo.Release();
}
Calificación
1
Universidad de Las Palmas de Gran Canaria 2
Escuela Universitaria de Informática 3
Facultad de Informática 4
5
Sistemas Operativos
Examen parcial, 11 de mayo de 2002
SOLUCIONES

1 (2’5 puntos) Responda con brevedad y precisión a las siguientes preguntas:


• ¿Qué ventajas tiene poder declarar hilos dentro de un proceso pesado?
Ø La ventaja principal es poder dotar de concurrencia interna a una aplicación,
con un coste reducido. Varios hilos dentro de un proceso pesado comparten el
mismo espacio de memoria (código y datos), así como los recursos que la
aplicación tenga asignados. Si nuestro sistema operativo no nos diera la
posibilidad de declarar hilos en un proceso, las actividades concurrentes de
una aplicación tendrían que definirse mediante procesos pesados, que no
comparten memoria ni recursos, y por tanto se consumirían más recursos.
• El intérprete de órdenes (command interpreter) puede ser una aplicación
independiente (ej. UNIX), o puede estar implementado dentro del núcleo del
sistema operativo (ej. CP/M). ¿Qué ventajas o inconvenientes observa usted en
cada alternativa?
Ø Ventajas del intérprete en el núcleo: Dado que es una aplicación de uso muy
frecuente, si se tiene el código en el núcleo, la ejecución de las aplicaciones
puede ser más rápida (no hay que cargarla del disco).
Ø Inconvenientes del intérprete en el núcleo: El núcleo crece de tamaño.
Cuando no se está utilizando el intérprete de órdenes, se está ocupando
memoria con código que no se emplea. El sistema es menos flexible, ya que si
quisiéramos cambiar la versión del intérprete de órdenes, tendríamos que
reinstalar el núcleo del s.o.
• ¿Por qué es necesario establecer dos modos de ejecución (modo supervisor y
modo usuario)?
Ø Principalmente, porque en un sistema operativo multiprogramado o
multiusuario existen restricciones de acceso a los recursos: protección de
zonas de memoria, restricción del uso de archivos y dispositivos de E/S, etc.
En segundo lugar, y muy relacionado con lo anterior, para poder preservar la
integridad del sistema operativo, que no debe ser dañado por el uso indebido
de los programas de usuario.
• ¿Qué diferencia hay entre las llamadas al sistema y los programas del sistema?
Ø Las llamadas al sistema son los mecanismos que utilizan las aplicaciones para
solicitar servicios al núcleo del sistema operativo, mientras que los programas
del sistema son aplicaciones independientes que se distribuyen junto al
sistema operativo y que resuelven necesidades básicas de operación o
administración (ej. editores, compiladores, intérpretes de órdenes, etc.) Las
llamadas al sistema son la interfaz del s.o. para las aplicaciones, mientras que
los programas del sistema son la interfaz del s.o. para los usuarios.
• Si un sistema no es multiusuario, ¿tampoco es multitarea?
Ø No necesariamente. Un sistema puede ser multitarea sin ser multiusuario.
Aunque sólo exista un usuario en el sistema, éste puede encontrar útil lanzar
varias aplicaciones concurrentes, como puede suceder en un entorno de
ventanas.

2 (1’25 puntos) Se propone una nueva política de planificación de procesos, que


consiste en ceder siempre la CPU al proceso que menos memoria necesita.
a) ¿Esta política ofrece algún beneficio?
Ø Se está dando preferencia a los programas de pequeño tamaño, con lo cual se
estimula a los programadores a que escriban aplicaciones lo más pequeñas
que puedan (lo cual es deseable).
Ø (ampliación) Si esta idea se extendiera al Planificador de Largo Plazo,
estaríamos hablando de mantener en la cola de preparados a los procesos con
menos demanda de memoria: en ese caso, la política tendría el efecto
beneficioso de mantener en ejecución la mayor cantidad de procesos posible.
b) ¿Y algún efecto negativo?
Ø El efecto negativo más inmediato es el perjuicio causado a los procesos que
demanden más memoria para su ejecución, con el riesgo de inanición. Otro
efecto negativo es que la política no tiene en cuenta características importantes
de los procesos, como la duración de sus ráfagas de CPU, sus requisitos de
interactividad, etc., que sabemos que influyen mucho en el rendimiento de la
planificación de procesos. Un proceso de pequeño tamaño no implica un
proceso de menos duración. Por tanto, el rendimiento de esta política sería
imprevisible y, desde luego, alejado del óptimo.
c) ¿Es implementable?
Ø Por supuesto que sí, ya que se pueden conocer por anticipado las necesidades
de memoria de un programa (código y datos), o al menos una estimación fiable.

3 (2’5 puntos) Tenemos un sistema concurrente con una capacidad de memoria de N


bytes. Cada proceso del sistema, para poder ejecutarse, debe reservar previamente un
número de bytes. Si no hay cantidad suficiente de memoria, debe quedarse bloqueado
hasta que otros procesos vayan liberando memoria suficiente. La ejecución del proceso
debe estar regulada mediante un monitor, como se muestra a continuación:

monitor.reserva (nbytes);
… se ejecuta el proceso …
monitor.devuelve (nbytes);

Implemente las operaciones de este monitor. Para escribir su solución, puede usar un
monitor clásico o bien cerrojos y variables condición.
Nombre

Con un monitor (lenguaje estilo Ada):


Monitor ReservaMemoria is
begin

procedure entry reserva (nbytes: natural) is


begin
while espacio_libre < nbytes loop
HayEspacio.Wait;
HayEspacio.Signal;
end loop;
espacio_libre := espacio_libre - nbytes;
end reserva;

procedure entry devuelve (nbytes: natural) is


begin
espacio_libre := espacio_libre + nbytes;
HayEspacio.Signal;
end devuelve;

HayEspacio: condition;
N: constant natural := …;
espacio_libre: natural range 0..N := N;

end ReservaMemoria;

NOTA: El signal posterior al wait es imprescindible para despertar a todos los


procesos en espera cuando se devuelve memoria al sistema. P.ej. si hay dos procesos
en espera que necesitan 10 y 30 bytes, y un proceso que finaliza devuelve 50 bytes,
hay que desbloquear a los dos procesos. Considérese también el ejemplo en el que
estén esperando tres procesos que necesitan 60, 10 y 30 bytes; y que un proceso
devuelve 50 bytes. Si se desbloquea el proceso de 60, tiene que volver a bloquearse,
pero hay que darle una oportunidad a los procesos de 10 y de 30 bytes.
El signal de devuelve() se puede sustituir por un broadcast, en cuyo caso no hace falta
hacer el signal posterior al wait del método reserva().
Con cerrojos y variables condición (estilo Nachos, escrito en C++):

const int N = …;

class ReservaMemoria
{
private:
int espacio_libre;
Lock cerrojo;
Condition HayEspacio;

public:

ReservaMemoria ()
: HayEspacio(cerrojo)
{ espacio_libre = N; }

void reserva (int nbytes)


{
cerrojo.Acquire();
while ( espacio_libre < nbytes )
{
HayEspacio.Wait();
HayEspacio.Signal();
}
espacio_libre -= nbytes;
cerrojo.Release();
}

void devuelve (int nbytes)


{
cerrojo.Acquire();
espacio_libre += nbytes;
HayEspacio.Signal();
cerrojo.Release();
}
};

NOTA: la misma que para la solución de Ada.

4 (1’25 puntos) Dada la siguiente carga de trabajo, obtener el diagrama de Gantt, el


tiempo medio de retorno y el tiempo medio de espera al aplicar las siguientes políticas
de planificación:
- Primero el más corto (SJF) con expropiación.
- Round-Robin con cuanto de 3 u.t.

Proceso Tiempo de llegada Duración


P0 0 9
P1 2 5
P2 3 2
P3 5 4
Nombre

Primero el más corto (SJF) con expropiación: admite dos posibilidades

Solución A
P0 P0 P1 P2 P2 P3 P3 P3 P3 P1 P1 P1 P1 P0 P0 P0 P0 P0 P0 P0

Proceso Tiempo de retorno Tiempo de espera


P0 20 11
P1 11 6
P2 2 0
P3 4 0
Media 9,25 4,25

Solución B
P0 P0 P1 P2 P2 P1 P1 P1 P1 P3 P3 P3 P3 P0 P0 P0 P0 P0 P0 P0

Proceso Tiempo de retorno Tiempo de espera


P0 20 11
P1 7 2
P2 2 0
P3 8 4
Media 9,25 4,25

Round-Robin (Q = 3 u.t.): admite dos posibilidades

Solución A:
P0 P0 P0 P1 P1 P1 P2 P2 P0 P0 P0 P3 P3 P3 P1 P1 P0 P0 P0 P3

Proceso Tiempo de retorno Tiempo de espera


P0 19 10
P1 14 9
P2 5 3
P3 15 11
Media 13,2 8,2
Solución B:
P0 P0 P0 P1 P1 P1 P0 P0 P0 P2 P2 P3 P3 P3 P1 P1 P0 P0 P0 P3

Proceso Tiempo de retorno Tiempo de espera


P0 19 10
P1 14 9
P2 8 6
P3 15 11
Media 14 9

5 (2’5 puntos) A continuación se muestra la implementación de los semáforos en


Nachos:

void Semaphore::P()
{
IntStatus oldLevel = interrupt->SetLevel(IntOff);
while (value == 0) {
queue->Append((void *)currentThread);
currentThread->Sleep();
}
value--;
(void) interrupt->SetLevel(oldLevel);
}

void Semaphore::V()
{
Thread *thread;
IntStatus oldLevel = interrupt->SetLevel(IntOff);
thread = (Thread *)queue->Remove();
if (thread != NULL)
scheduler->ReadyToRun(thread);
value++;
(void) interrupt->SetLevel(oldLevel);
}

a) ¿Qué significa el ReadyToRun() de la operación V()?


Ø Sirve para reincorporar en la cola de preparados a un hilo que estaba
bloqueado (apuntado por la variable thread).
b) ¿Qué tipo de cola es el atributo queue? ¿FIFO? ¿LIFO? ¿con prioridad?
Ø Se está usando como una cola FIFO.
c) ¿La implementación de los semáforos en Nachos utiliza espera activa?
Ø No. Cuando un hilo que hace una P() descubre que el semáforo vale cero, se
bloquea con Sleep() y no reevalúa el semáforo hasta que alguien le despierta.
Por tanto, mientras está bloqueado está fuera de la cola de preparados.
d) ¿Por qué hace falta un while en la implementación de la operación P()? ¿No
puede sustituirse por un if?
Nombre

Ø El while es necesario, porque cuando el hilo que hizo la P() se recupera del
Sleep(), ingresa en la cola de preparados por el final. Delante de él, en la cola
de preparados, puede haber otros procesos que van a hacer operaciones P()
sobre el mismo semáforo, con lo cual, cuando le llegue el turno de CPU al
proceso despertado, puede ocurrir que el semáforo vuelva a estar a cero. Por
eso tiene que volver a evaluar el valor del semáforo y bloquearse si de nuevo lo
encuentra a cero.
Ø Para sustituir el while por un if, habría que hacer modificaciones en los
algoritmos aquí expuestos.
Calificación
1
Universidad de Las Palmas de Gran Canaria
2
Escuela Universitaria de Informática 3
4
Sistemas Operativos 5
6
Convocatoria de junio, año 2002
21 de junio de 2002
SOLUCIONES
Nombre Titulación

IMPORTANTE: Las seis preguntas suman 12 puntos. Usted deberá descartar al menos
UNA de las preguntas 3, 4, 5 y 6. Es decir, usted puede optar por contestar estos grupos de
preguntas: 12345, 12346, 12356, 12456. No se admitirá ninguna otra combinación.
Dispone de tres horas y media para completar el examen.

1 (2 puntos) Describa mediante un esquema todos los estados por los que atraviesa un
hilo en Nachos y las transiciones entre ellos, indicando cuál es el tipo de evento que
produce cada transición.

Diagrama de estados

hilo = new Thread(“mihilo”)

hilo->Fork(funcion, param)
scheduler->Run(hilo)
JUST_CREATED

READY RUNNING

currentThread->Yield( )
scheduler->ReadyToRun(hilo) currentThread ->Sleep( )

BLOCKED

delete threadToBeDestroyed

“hilo finalizado”

1. El primer estado por el que pasa un hilo es el de “recién creado”


(JUST_CREATED):
hilo = new Thread(“mihilo”);
En este punto, al hilo aún no se le ha creado una pila ni se sabe el código que
va a ejecutar.

2. En el momento en que se realiza la operación:


hilo->Fork(funcion, param)
El hilo pasa a la cola de preparados (estado “READY”), pendiente únicamente
de que se le asigne la CPU para su ejecución (ya se le ha creado la pila y se ha
indicado el código que ejecutará - funcion).

3. El hilo creado (en adelante “mihilo”) pasará a estado “RUNNING”, es decir, “en
ejecución” cuando el planificador le ceda la CPU:
scheduler->Run(hilo)
situación que puede venir provocada bien porque otro hilo ceda
voluntariamente la CPU (recuerden que la política de planificación de hilos del Nachos
es no expulsiva) o bien porque otro hilo en ejecución termine o quede bloqueado a la
espera de algún evento, situaciones ambas en las que el planificador toma el siguiente
de la cola de preparados. En ambos casos “mihilo” debe ser evidentemente el primero
de la cola de preparados.

4. Estando en ejecución (RUNNING), un hilo puede pasar a diferentes estados:

• “READY”: un hilo estando en ejecución pasará a la cola de preparados


si voluntariamente cede la CPU (currentThread->Yield) y siempre que
existan otros hilos en la cola de preparados, ya que de lo contrario
permanecerá en el mismo estado, es decir, en ejecución.
• “BLOCKED”: se pasará a estado “bloqueado” cuando se invoca:
currentThread->Sleep()
Esto se puede deber a dos razones: la primera es que el hilo necesite
esperar a que ocurra algún evento o condición (por ejemplo, pasará a este
estado un hilo que ejecute una operación wait sobre una variable condición). La
segunda situación por la que un hilo pasa a estado bloqueado se debe a la
forma en que un hilo finaliza. En Nachos, la terminación de un hilo provoca que
este pase a estado bloqueado, de forma que sea el siguiente hilo que entre en
ejecución el encargado de liberar la memoria del hilo finalizado (una variable
global, threadToBeDestroyed, apunta al hilo finalizado).

5. Por último señalar que para pasar del estado “bloqueado” al estado
“preparado” se debe producir el evento o condición de desbloqueo (para el
caso comentado en el que el hilo quedó bloqueado al realizar una operación
wait sobre una variable condición, el desbloqueo y consecuentemente el paso
a estado preparado se producirá cuando otro hilo ejecute una operación signal
o broadcast sobre dicha variable condición)
Nombre

2 (2 puntos) Implemente las operaciones de un semáforo general utilizando un monitor.

type Semaforo (Valor_Inicial) = monitor


var
bloqueado: condition;
s: entero;

procedure entry P()


begin
while s=0 then bloqueado.Wait;
s:=s-1;
end;

procedure entry V()


begin
s:=s+1;
bloqueado.Signal;
end;

begin
s := Valor_Inicial;
end;

end.

3 (2 puntos) La tabla inferior muestra una carga de procesos. Represente con un


diagrama de Gantt la planificación de estos procesos y obtenga los tiempos de retorno y de
espera al aplicar las siguientes políticas:
- Primero el más corto con expropiación
- Round-Robin con cuanto de 2 u.t.

TL: tiempo de llegada Proceso TL D


D: duración P0 0 4
P1 1 1
P2 1 2
P3 2 2
Primero el más corto (SJF) con expropiación

P0 P1 P2 P2 P3 P3 P0 P0 P0

Proceso Tiempo de espera Tiempo de retorno


P0 5 9
P1 0 1
P2 1 3
P3 2 4
Media 2 4,25

Round-Robin (Q = 2 u.t.): admite dos posibilidades (en realidad cuatro, puesto


que al llegar P1 y P2 en el mismo instante, es posible colocar primero en la cola
cualquiera de los dos)

Solución A:
P0 P0 P1 P2 P2 P3 P3 P0 P0

Proceso Tiempo de espera Tiempo de retorno


P0 5 9
P1 1 2
P2 2 4
P3 3 5
Media 2,75 5

Solución B:
P0 P0 P1 P2 P2 P0 P0 P3 P3

Proceso Tiempo de espera Tiempo de retorno


P0 3 7
P1 1 2
P2 2 4
P3 5 7
Media 2,75 5
Nombre

4 (2 puntos) Considere un sistema de gestión de memoria paginada de un solo nivel, sin


memoria virtual. Especifique de forma algorítmica los pasos que se deben ejecutar en la
traducción de una dirección lógica a una dirección física. En su especificación deberá
explicar el uso de los distintos recursos físicos y lógicos requeridos.
El formato de la dirección contiene dos campos: página (PAG) y desplazamiento
en la página (DES). Al no disponer de memoria virtual se asume que todo el
espacio direccionable está en memoria.
1. Traducción mediante el hardware especial de traducción (TLB): si la página está
representada en dicha tabla, entonces se obtiene la dirección sumando la dirección
base del marco de página que la contiene con el desplazamiento.

2. Traducción mediante la tabla de páginas.


2.1. Obtener el comienzo de la tabla de páginas (registro origen de la tabla de páginas)
2.2. Verificar que se trata de una página válida. Esto se comprueba comparando PAG
con el número de entradas de la tabla, si PAG lo supera entonces error por dirección
inválida.
2.3. Acceder a la entrada PAG de la tabla de páginas y obtener la dirección base del
marco de página que la contiene. El resultado de la traducción será la suma de esta
dirección base con el campo DES.

5 (2 puntos) Se tiene un sistema con 5 procesos, P0 a P4, y 3 tipos de recursos A, B, y C.


El tipo de recurso A tiene 10 ejemplares, B tiene 6 ejemplares y C tiene 2 ejemplares.
Suponga que en el instante T0 el sistema se encuentra en el siguiente estado:

Asignados Solicitudes
A B C A B C
P0 0 0 1 0 0 0
P1 2 0 0 2 2 0
P2 3 3 0 0 0 0
P3 2 1 1 1 0 0
P4 0 2 0 0 2 0

¿El sistema se encuentra en interbloqueo? Justifique la respuesta.


El sistema no está en interbloqueo
El sistema no está en un estado de interbloqueo. Para demostrarlo aplicamos el
algoritmo de detección visto en clase y vemos que podemos encontrar una secuencia
ordenada de procesos <p0,p2,p3,p4,p1> en la que lo que pide cada proceso puede ser
satisfecho por lo disponible más lo asignado a los procesos que están antes que él en
la secuencia.
6 (2 puntos) Un sistema de archivos utiliza una política de asignación de espacio
indexada. En este sistema, los bloques de datos de un archivo, ¿se pueden ubicar de forma
contigua? ¿Es necesario que los bloques estén ubicados de forma contigua? ¿Da igual que lo
estén? Justifique con mucha claridad su respuesta.
¿Cambiaría en algo su contestación si la asignación de espacio fuera enlazada?
La asignación indexada permite que los bloques de datos de un archivo se encuentren
dispersos por el disco, pero evidentemente no obliga a ello. Así que los bloques de un
archivo indexado pueden estar contiguos.
Sin embargo, no es indiferente el que los bloques estén contiguos. Los accesos
secuenciales al archivo serán más eficientes en ese caso, porque el desplazamiento
de los cabezales del disco será menor, comparado con el recorrido que tendría que
hacer el cabezal si los bloques estuvieran desperdigados por la superficie del disco. La
contigüidad ocasiona un menor tiempo de acceso. En el mejor caso, todos los bloques
del archivo estarían en un mismo cilindro y la cabeza lectora no tendría que hacer
ningún movimiento para leer el archivo completo.
Si la asignación de espacio fuera enlazada, la respuesta sería similar. Incluso tendría
más impacto en el rendimiento el hecho de que los bloques estén contiguos, ya que en
la asignación enlazada cualquier acceso al archivo, ya sea secuencial o ya sea directo,
exige recorrer los enlaces de los bloques. Si los bloques están contiguos, el cabezal
del disco hará un recorrido más pequeño.
Calificación
1
Universidad de Las Palmas de Gran Canaria
2
Facultad de Informática 3
4
Sistemas Operativos 5
6
Convocatoria de junio, 26 de junio de 2002
SOLUCIONES
Nombre Titulación

IMPORTANTE: Las seis preguntas suman 12 puntos. Usted deberá descartar al menos
UNA de las preguntas 3, 4, 5 y 6. Es decir, usted puede optar por contestar estos grupos de
preguntas: 12345, 12346, 12356, 12456. No se admitirá ninguna otra combinación.
Dispone de tres horas y media para completar el examen.

1 (2 puntos) - Responda, justificando sus respuestas, a las siguientes cuestiones sobre


Nachos:
A. La ejecución de la función Yield(), ¿provoca siempre el cambio de estado del
hilo que la invoca?
No. Sólo provoca un cambio de estado (de RUN a READY) si la cola de hilos en
estado READY no está vacía.
B. ¿Cómo está estructurado internamente un fichero que contiene un programa de
usuario ejecutable de Nachos?
Contiene tres partes. Primero un bloque cabecera que describe como están
estructuradas las dos bloques que le siguen que son: bloque de código y bloque de
datos con valores iniciales. El bloque cabecera dice que tamaño y dónde empieza en
el archivo cada uno de estos bloques.
C. ¿Por qué debemos utilizar un compilador cruzado para compilar un programa de
usuario de Nachos y un compilador normal (no cruzado) para compilar los
distintos módulos de núcleo?
Debido a que los módulos del núcleo se ejecutan en el sistema nativo de la máquina
(sistema Linux, por tanto requieren un compilador “normal”) y los programas de
usuario se ejecutan en una máquina basada en un microprocesador MIPS (que se
simula, por tanto se requiere un compilador “cruzado”).

2 (2 puntos) Diseñe una solución al primer problema de los lectores y escritores


(prioridad para los lectores), con el requisito añadido de que no puede haber más de N
lectores simultáneos. Como herramienta de sincronización, utilice monitores.
La solución consistirá en el algoritmo que ha de ejecutar un proceso lector, y el que ha de
ejecutar un proceso escritor. El código puede estar escrito en cualquier especificación
algorítmica.
type Lectores_Escritores = monitor
var
Lect, Esc: condition;
nlec: entero;
escribiendo: booleana;

procedure entry Empezar_Lectura()


begin
nlec:=nlec+1;
while escribiendo or nlec>N do
Lect.Wait;
end;

procedure entry Terminar_Lectura()


begin
nlec:=nlec-1;
if nlec>=N then
Lect.Signal
else if nlec=0 then
Esc.Signal;
end if;
end;

procedure entry Empezar_Escritura()


begin
while escribiendo or nlec>0 do
Esc.Wait;
Escribiendo:=verdadero;
end;

procedure entry Terminar_Escritura()


begin
escribiendo:=falso;
if nlec>0 then
Lect.Broadcast;
else
Esc.Signal;
end if;
end;

begin
nlec:=0;
escribiendo:=falso;
end;

end.

3 (2 puntos) Responda con brevedad a las siguientes cuestiones.


A. ¿Qué significa que una política de planificación de CPU sea expulsiva?
Nombre

Ø Que el planificador puede desalojar al proceso que está en CPU. Por ejemplo,
para implementar tiempo compartido y tiempo real, es necesaria una
planificación expulsiva.

B. ¿Con qué finalidad se emplea la técnica de envejecimiento en la planificación del


uso del procesador?
Ø Para evitar el riesgo de inanición existente cuando se lleva a cabo una
planificación por prioridades.

C. Un sistema de memoria virtual ha de escoger a una página víctima. Existen tres


páginas candidatas, que sólo se diferencian en el estado del proceso que las posee:
hay una página cuyo proceso está en estado de ejecución; otra cuyo proceso está en
estado de bloqueo; y el proceso de la tercera página está en estado de preparado.
¿Qué página sería más recomendable escoger como víctima?
Ø Es conocido que la política óptima consiste en escoger como víctima aquella
página que más tiempo tarde en usarse. De las tres candidatas, la página que
más probablemente tarde en accederse es la del proceso que está en estado
de bloqueo. Las otras dos páginas pertenecen a procesos que muy
probablemente hagan accesos a memoria en un futuro inmediato, mientras que
el proceso bloqueado no hará ningún acceso en tanto persista su situación de
bloqueo. Así que esa es la mejor apuesta.

4 (2 puntos) Considere un sistema de archivos en un disco en el que el tamaño de


bloque de sistema de archivos es 512 bytes. Suponga que toda la información de control de
cada archivo ya se encuentra en memoria principal. Para las estrategias de asignación de
espacio de disco contigua e indexada, especifique los pasos y cálculos a realizar para
transformar una dirección de dato de archivo, expresada en forma de desplazamiento desde
el comienzo del archivo y longitud del dato, a bloque de sistema de archivos.
Sea:
P la posición del primer byte del dato a acceder del fichero con respecto al origen de
éste.
L la longitud del dato
Entonces:
1. Obtenemos el bloque relativo que contiene al primer byte del dato:
B0 = Parte entera(P/512)
2. Obtenemos la posición del primer byte del dato en el bloque B0:
D0 = Resto(P/512)
3. Obtenemos el bloque relativo que contiene el último byte del dato a acceder.
B1 = Parte entera((P+D-1)/512)
4. Obtenemos la posición de este último byte en el bloque B1
D1 = Resto((P+D-1)/512)
5. Obtenemos el número de bloque de sistema de archivo de los bloques B0 y B1:
- Para la política contigua DB0 = B0 y DB1 = B1
- Para la política indexada DB0 = INDICES[B0] y DB1 = INDICES[B1]. Siendo
INDICE el bloque de índices del archivo.
5 (2 puntos) Considere un sistema de memoria segmentada, sin memoria virtual.
Especifique de forma algorítmica los pasos que se deben ejecutar en la traducción de una
dirección lógica a dirección física. En su especificación deberá contemplar el uso de los
distintos recursos físicos y lógicos requeridos.

El formato de la dirección contiene dos campos: segmento (SEG) y desplazamiento


en el segmento (DES). Al no disponer de memoria virtual se asume que todo el
espacio direccionable está en memoria.
1. Traducción mediante el hardware especial de traducción (que consiste en una serie
de registros que representan a un subconjunto de segmentos del espacio
direccionable del programa): si el segmento está representado en dicho subconjunto,
entonces se obtiene la dirección sumando la dirección base de la zona de memoria
que contiene el segmento con el desplazamiento.
2.1. Obtener el comienzo de la tabla de segmentos (registro origen de la tabla de
segmentos)
2.2. Verificar que se trata de un segmento válido. Esto se comprueba mediante dos
verificaciones. Primero, comparando SEG con el número de entradas de la tabla, si
SEG lo supera entonces error por dirección inválida (número de segmento inválido).
Segundo que el campo de desplazamiento no supera el tamaño del segmento, si es
así entonces error por dirección inválida (desplazamiento en el segmento inválido).
2.3. Acceder a la entrada SEG de la tabla de segmentos y obtener la dirección base
del área de memoria que lo contiene. El resultado de la traducción será la suma de
esta dirección base con el campo DES.

6 (2 puntos) Suponga un sistema con 5 procesos, P0 a P4, y 3 tipos de recursos A, B, y


C. El tipo de recurso A tiene 2 ejemplares, B tiene 10 ejemplares y C tiene 6 ejemplares. En
cierto instante, el sistema se encuentra en el siguiente estado:
Asignados Solicitudes
A B C A B C
P0 1 0 0 0 0 0
P1 0 2 0 0 2 2
P2 0 3 3 0 0 0
P3 1 2 1 0 1 0
P4 0 0 2 0 0 2

¿Hay interbloqueo en el sistema? Justifique su respuesta.


El sistema no está en un estado de interbloqueo. Para demostrarlo aplicamos el
algoritmo de detección visto en clase y vemos que podemos encontrar una secuencia
ordenada de procesos <p0,p2,p4,p1,p3> en la que lo que pide cada proceso puede ser
satisfecho por lo disponible más lo asignado a los procesos que están antes que él en
la secuencia.
Calificación
1
2
Universidad de Las Palmas de Gran Canaria 3
Escuela Universitaria de Informática 4
5
6
Sistemas Operativos
Convocatoria de septiembre, año 2002
9 de septiembre de 2002

Nombre Titulación

Dispone de tres horas para completar el examen.

1 (1,5 ptos) Considere la siguiente carga de procesos:


Proceso Tiempo de Duración de ciclo de
llegada procesador
A 0 3
B 1 5
C 3 2
D 9 5
E 12 5

Para las siguientes políticas: a)Round-Robin con cuanto igual a 4 y b)primero el más corto
expulsivo. Obtenga el diagrama de Gantt y el tiempo de espera medio por cada política.

ROUND ROBIN (Q=4)


T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12 T13 T14 T15 T16 T17 T18 T19
A A A B B B B C C B D D D D E E E E D E

Tiempos de espera:
A 0
B 4
C 4
D 5
E 3

PRIMERO EL MAS CORTO EXPULSIVO


T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12 T13 T14 T15 T16 T17 T18 T19
A A A C C B B B B B D D D D D E E E E E
Tiempos de espera:
A 0
B 4
C 0
D 1
E 3

2 (1,75 ptos) Tenemos un sistema de gestión de memoria paginada de dos niveles que
utiliza una TLB. Se tienen los siguientes tiempos medios:
• Tiempo de acceso a la TLB: 4 nseg. (1 nseg = 10-9 seg.)
• Tiempo medio de acceso a memoria principal: 33 nseg.
Suponiendo que la TLB tiene una tasa del 98% de aciertos, ¿cuánto es el tiempo medio de
acceso a memoria?

tiempo medio de acceso = Tacierto*Pacierto + Tfallo*Pfallo


Tacierto = tiempo de acceso si hay acierto en TLB = 4 + 33 = 37 nseg.
Pacierto = probabilidad de acierto en TLB = 98%
Tfallo = tiempo de acceso si falla la TLB = 4 + 33 + 33 +33= 103 nseg.
Pfallo = probabilidad de fallo en TLB = 2%
El tiempo medio, por tanto, es: 0,98 * 37 + 0,02 *103= 38,32 nseg.

3 (1,75 ptos) Suponga un sistema que emplea el algoritmo del banquero para evitar caer
en una situación de interbloqueo. En un instante dado y ante unas solicitudes de recursos,
el sistema lanza el algoritmo y detecta que si concede los recursos se encontraría en un
estado inseguro. Si, a pesar de esto, el sistema decide conceder los recursos solicitados,
¿puede afirmarse que el sistema se encuentra en interbloqueo?

No necesariamente. El conjunto de estados en los que podríamos afirmar que el sistema se


encuentra en una situación de interbloqueo constituyen un subconjunto de los estados
inseguros, es decir, un estado de interbloqueo es un estado inseguro pero no todos los
estados inseguros son estados de interbloqueo (ver figura).

Estados inseguros
Estados de
interbloqueo

Estados seguros
Nombre

4 (1,75 ptos) Responda con claridad y brevedad a las siguientes cuestiones:


a) ¿Qué ventaja aportan los manejadores de dispositivos de E/S en el diseño de un
sistema operativo?

Comodidad, pues liberan al usuario programador de tener que incluir en si código el


manejo de los dispositivos.
Seguridad, pues al formar parte del sistema operativo, es éste quién en última instancia
realiza las operaciones de entrada salida.

b) ¿Qué ventaja aportan los enlaces (links) en un sistema de archivos?

Flexibilidad en la organización lógica de los archivos, pues un mismo archivo puede ser
referenciado con pathname diferentes.

c) ¿En qué consiste el problema de las autoreferencias en los sistemas de archivos?

Un archivo posee referencias (pathnames distintos) que realmente ya no son válidas, éste
fenómeno sólo se da en los directorios con estructura de grafo general.

d) La mayoría de los sistemas actuales presentan dos modos de operación: modo


privilegiado y modo no privilegiado. ¿Por qué? ¿Cuándo y cómo se cambia de
modo?

Principalmente, porque en un sistema operativo multiprogramado o multiusuario


existen restricciones de acceso a los recursos: protección de zonas de memoria,
restricción del uso de archivos y dispositivos de E/S, etc. En segundo lugar, y muy
relacionado con lo anterior, para poder preservar la integridad del sistema operativo,
que no debe ser dañado por el uso indebido de los programas de usuario.
La CPU arranca en modo privilegiado. Cuando el SO cede el control al usuario,
conmuta previamente a modo no privilegiado. Sólo se vuelve a modo privilegiado
cuando el SO recupera el control, es decir, cuando ocurre una interrupción, una
llamada al sistema o una excepción.

5 (1,5 ptos) Dada esta cadena de referencias a memoria virtual:

8,1,3,1,4,5,2,3,4,5,1,2,3,6,1,8,4,1,3

Simule la gestión de estas referencias utilizando las siguientes políticas: a)LRU; b)segunda
oportunidad. Suponga que el sistema dispone de tres marcos físicos que inicialmente están
sin asignar.
8 1 3 1 4 5 2 3 4 5 1 2 3 6 1 8 4 1 3
LRU 8 8 8 8 3 1 4 5 2 3 4 5 1 2 3 6 1 8 4
1 1 3 1 4 5 2 3 4 5 1 2 3 6 1 8 4 1
3 1 4 5 2 3 4 5 1 2 3 6 1 8 4 1 3

81 81 81 81 41 41 41 31 31 31 11 11 11 61 61 61 41 41 41
2ª OP.

11 11 11 10 51 51 50 41 41 40 21 21 21 11 11 10 11 10
31 31 30 30 21 20 20 51 50 50 31 31 30 81 80 80 31

NOTAS segunda oportunidad:


• La flecha indica el apuntador al siguiente candidato a víctima.
• El número en subíndice es el bit de referencia de cada página.

6 (1,75 ptos) Construya una solución al segundo problema de los lectores y escritores
(prioridad para estos últimos), con el añadido de que se debe garantizar que nunca puede
haber más de 10 lectores trabajando simultáneamente. Para su implementación puede optar
por alguna de estas herramientas:
• semáforos
• monitores
• cerrojos y variables condición
Nombre

type Lectores_Escritores = monitor


var
Lect, Esc: condition;
nlec, nesc, nescbloq: entero;
escribiendo: booleana;

procedure entry Empezar_Lectura()


begin
nlec:=nlec+1;
while nesc>0 or nlec>10 do
Lect.Wait;
end;

procedure entry Terminar_Lectura()


begin
nlec:=nlec-1;
if nesc>0 and nlect=0 then
Esc.Signal;
else if nesc=0 then
Lect.Signal;
end if
end;

procedure entry Empezar_Escritura()


begin
nesc=nesc+1;
while escribiendo or nlec>0 do
nescbloq:=nescbloq+1;
Esc.Wait;
nescbloq:=nescbloq-1;
end while;
escribiendo:=verdadero;
end;

procedure entry Terminar_Escritura()


begin
nesc:=nesc-1;
if nescbloq>0 then
Esc.Signal;
else
escribiendo:=falso;
Lect.Broadcast;
end if;
end;

begin
nlec:=0;
nesc:=0;
nescbloq:=0;
escribiendo:=falso;
end;

end.
Calificación
1
2
Universidad de Las Palmas de Gran Canaria 3
Facultad de Informática 4
5
6
Sistemas Operativos
Convocatoria de septiembre, año 2002
9 de septiembre de 2002

Nombre Titulación

Dispone de tres horas para realizar el examen.

1 (1,5 ptos) Considere la siguiente carga de procesos:


Proceso Tiempo de Duración de ciclo de
llegada procesador
A 0 3
B 1 5
C 3 2
D 9 5
E 12 5

Para las siguientes políticas: a)Round-Robin con cuanto igual a 4 y b)primero el más corto
expulsivo. Obtenga el diagrama de Gantt y el tiempo de espera medio por cada política.

ROUND ROBIN (Q=4)


T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12 T13 T14 T15 T16 T17 T18 T19
A A A B B B B C C B D D D D E E E E D E

Tiempos de espera:
A 0
B 4
C 4
D 5
E 3

PRIMERO EL MAS CORTO EXPULSIVO


T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12 T13 T14 T15 T16 T17 T18 T19
A A A C C B B B B B D D D D D E E E E E
Tiempos de espera:
A 0
B 4
C 0
D 1
E 3

2 (1,5 ptos) ¿Qué diferencia una política de planificación de CPU expulsiva de otra no
expulsiva? Ponga algún ejemplo de cada caso. ¿Cree que es posible que exista un sistema de
tiempo compartido que emplea una política de planificación no expulsiva? Justifique su
respuesta.

En una política de planificación expulsiva el planificador puede desalojar al proceso que


está en CPU. Por ejemplo el algoritmo SJF expulsivo (SRTF). Esto no ocurre en el caso
de políticas de CPU no expulsivas como por ejemplo el algoritmo FCFS.
No, ya que si un proceso no puede ser desalojado de la CPU salvo por voluntad propia
es imposible pensar en un sistema de tiempo compartido, el cual se caracteriza por
tiempos de respuesta cortos.

3 (1,75 ptos) Construya una solución al problema de los filósofos que esté libre de
interbloqueos. Puede usar cualquier primitiva de sincronización de las estudiadas en la
asignatura.

Respuesta: puede encontrar una solución a este problema en el texto perteneciente a la


bibliografía básica de la asignatura “Sistemas Operativos” (Quinta Edición), pag. 185, de
los autores Silberschatz y Galvin.

4 (1,75 ptos) Suponga un sistema con memoria paginada, en el cual encontramos un


proceso con la siguiente cadena de referencias a páginas: 244, 1A1, 244, 363, 244, 268, 244,
1A1, 1A2, 363. Describa el estado de la memoria en cada momento, suponiendo que el
proceso dispone de 3 marcos de página que inicialmente están desocupados.

Óptima
Ref. 244 1A1 244 363 244 268 244 1A1 1A2 363
M0 244 244 244 244 244 244 244 244 244 244
M1 1A1 1A1 1A1 1A1 1A1 1A1 1A1 1A1 363
M2 363 363 268 268 268 1A2 1A2
Nombre

LRU
Ref. 244 1A1 244 363 244 268 244 1A1 1A2 363
M0 244 1A1 244 363 244 268 244 1A1 1A2 363
M1 244 1A1 244 363 244 268 244 1A1 1A2
M2 1A1 1A1 363 363 268 279 1A1

Segunda oportunidad
Ref. 244 1A1 244 363 244 268 244 1A1 1A2 363
M0 244 1A1 1A1 363 363 268 268 1A1 1A2 363
M1 244 244 1A1 1A1 244 244 268 244 1A2
M2 244 244 363 363 244 1A1 244

Nota: número de página en negrita significa bit de referencia a uno.

5 (1,5 ptos) Considere un sistema de gestión de memoria virtual mediante paginación


bajo demanda en el que se han medido estos tiempos:
• Tiempo medio de acceso a memoria principal: 50 nanosegundos.
• Tiempo medio de resolución de un fallo de página: 20 milisegundos.
• El resto de los tiempos se consideran despreciables
Calcule cuál es la máxima tasa de fallos de página aceptable si queremos mantener el
tiempo medio de acceso a memoria –contando con los fallos de página- por debajo de los
200 nanosegundos.

Sabemos que el tiempo medio de acceso viene dado por esta fórmula:
tiempo medio de acceso = Tconfallo*Pfallo + Tsinfallo*Psinfallo
Tconfallo = tiempo de acceso cuando hay un fallo = 20 mseg. + 50 nseg. == 20 miliseg.
Pfallo = probabilidad de fallo de página = incógnita
Tsinfallo = tiempo de acceso cuando no hay fallo = 50 nanoseg.
Psinfallo = probabilidad de no haber fallo de página = 1-Pfallo

Nos queda la inecuación


20miliseg * Pfallo + 50nanoseg * (1-Pfallo) < 200 nanoseg.

que, una vez resuelta, nos da:


Pfallo < 7,5 * 10-6
es decir, que la tasa de fallos de página tiene que ser inferior a siete fallos y medio por cada
millón de accesos a memoria.
6 (2 ptos) Responda con brevedad y claridad a las siguientes cuestiones:
a) Comente brevemente las ventajas y desventajas de la asignación contigua, enlazada
e indexada a la hora de asignar espacio a un fichero en disco.

Ventajas Desventajas
Asignación contigua • Permite manejar acceso • Encontrar espacio para la
tanto secuencial como creación de un fichero
directo • Fragmentación externa
• Todos los bloques se • Declaración por anticipado
destinan a almacenar datos del tamaño del archivo
(no se destina espacio al
almacenamiento de
punteros)
Asignación Enlazada • No se produce • Eficiente solo para
fragmentación externa archivos de acceso
• No es necesario declarar secuencial
por anticipado el tamaño • Espacio que ocupan los
del archivo punteros
• Confiabilidad: la perdida
de punteros puede
provocar la perdida de
grandes cantidades de
datos
Asignación Indexada • No se produce • Mayor perdida de espacio
fragmentación externa con respecto a la
• No es necesario declarar asignación enlazada
por anticipado el tamaño (bloque/s índices)
del archivo • Confiabilidad: La perdida
• Permite manejar acceso del bloque/s indice/s
tanto secuencial como puede provocar la pérdida
directo de todos los datos.

b) ¿Qué ventajas aporta la técnica de spooling?

hacer que dispositivos no compartidas parezcan dispositivos compartidos, el caso típico es


el recurso de impresión. Otra ventaja es que gracias a esta técnica se pudo implementar la
lista de tareas a ejecutar en el sistema, aspecto básico para poder soportar la
multiprogramación.

c) Demuestre que el método de la ordenación lineal de recursos es una solución válida


al problema del interbloqueo.

Puede encontrar una solución a este problema en el texto perteneciente a la bibliografía


básica de la asignatura “Sistemas Operativos” (Quinta Edición), pag. 216, de los autores
Silberschatz y Galvin.

S-ar putea să vă placă și