Está en la página 1de 6

1 2 3 4 5 6 7 8 Nota total

GEI Ingeniería Informática-UAB 2 de noviembre de 2022

Sistemas Operativos 1er Control


Apellidos:
Nombre: DNI/NIU:
1. [2 puntos]. PREGUNTA PRÁCTICAS. Escribir un programa en pseudocódigo C en
el que un proceso padre crea 2 procesos hijos que se ejecutan de forma concurrente entre
sí y espera a la finalización de la ejecución de los hijos.
El primer proceso hijo ha de enviar el valor 1 al segundo proceso hijo mediante un pipe.
Se requiere programar la solución con las llamadas a sistema de creación de procesos, y
de pipes de Linux.
Solució 1:
int i, p, pfd[2], val=1;

//crear pipe de comunicacio fills->pare


pipe(pfd);

//crear 2 fills de forma concurrent


for(i=0;i<2;i++){
p=fork();
if(p==0){
if(i==0){
//primer fill, escriu al pipe
close(pfd[0]);
//escriure valor a fill-2 via pipe
write(pfd[1], &val, sizeof(val));
exit(0);
}if(i==1){
//segon fill, llegeix del pipe
close(pfd[1]);
//llegir el valor de fill-1 del pipe
read(pfd[0],&val, sizeof(val));
exit(0);
}
}
}
//proces pare espera pels fills
close(pfd[0]);
close(pfd[1]);

for(i=0; i<2; i++){


wait(NULL);
}

1
Solució 2:
int i, p, pfd[2], val=1;

//crear pipe de comunicacio fills->pare


pipe(pfd);

//crear 2 fills de forma concurrent


p=fork();
if(p==0){
//primer fill, escriu al pipe
close(pfd[0]);
//escriure valor a fill-2 via pipe
write(pfd[1], &val, sizeof(val));
exit(0);
}
if(p>0){
p=fork();
if(p==0){
//segon fill, llegeix del pipe
close(pfd[1]);
//llegir el valor de fill-1 del pipe
read(pfd[0],&val, sizeof(val));
exit(0);
}
}

if(p>0){
//proces pare espera pels fills
close(pfd[0]);
close(pfd[1]);

for(i=0; i<2; i++){


wait(NULL);
}
}

2
2. [2 puntos] ¿Qué semáforos y valores de inicio se necesitan para diseñar un esquema
de procesos productor y consumidor con semáforos en un vector de N elementos?
Escribir el pseudocódigo de la función: int sumar_elementos(), que devuelve la suma de
los valores de las posiciones del vector que no están vacías. Esta función no debe
ejecutarse cuando el vector está vacío y se deben usar semáforos para gestionar esta
situación y para acceder al vector. Se puede suponer un caso simple como:

0 1 2 3
out=0 in=4 N=9

Semáforo Descripción Valor


Inicial
mutex regular acceso a sección crítica 1

hay_elementos sincronizar la lectura de buffer vacío 0

hay_espacios sincronizar la escritura en buffer lleno N

int vector[10], in, out, s;


semaforo hay_elementos, hay_espacios, mutex;
main(){
in=4;
out=0;
sem_init(hay_elementos, 4);
sem_init(hay_espacios, 6);
sem_init(mutex, 1);

s=sumar_elementos(out, in-1);
}

int sumar_elementos(int primero, int ultimo){


int m, suma=0;
wait(hay_elementos); // hay_elementos se bloquea cuando
wait(mutex); // vector se queda sin elementos

for(m=primero;m++;m<=ultimo)
suma=suma+vector[m];

signal(mutex);
signal(hay_elementos);
return(suma);
}

3
3. [1 punto] A partir del diagrama de tiempos de ejecución de los procesos A, B y C
indicar los estados de los procesos A, B y C cuando A aparece en tiempo 0, B en tiempo
1 y C en tiempo 5
A CPU CPU E/S CPU CPU
B CPU CPU CPU E/S CPU
C CPU E/S CPU
0 1 2 3 4 5 6 7 8 9 10
Estados de los procesos:
A EXE EXE BLQ LLEST LLEST LLEST EXE EXE
B LLEST LLEST EXE EXE EXE BLQ LLEST LLEST LLEST EXE
C LLEST EXE BLQ LLEST EXE
1 2 3 4 5 6 7 8 9 10

Teoría: cada pregunta vale un punto


4. Citar tres funciones básicas del núcleo del Sistema Operativo.

El núcleo es la parte del sistema operativo que interacciona directamente con el


hardware de la máquina. Las funciones del núcleo se centran en la gestión de recursos,
como es el procesador, tratamiento de interrupciones y las funciones básicas de
manipulación de memoria.
Los servicios se suelen agrupar según su funcionalidad en varios componentes, como
los siguientes:

- Gestor de procesos. Encargado de la creación, planificación y destrucción de procesos.


- Gestor de memoria. Componente encargado de saber qué partes de la memoria están
libres y cuáles ocupadas, así como de la asignación y liberación de memoria según la
necesiten los procesos.
- Gestor de la E/S. Se ocupa de facilitar el manejo de los dispositivos periféricos.
- Gestor de ficheros y directorios. Se encarga del manejo de ficheros y directorios, y de
la administración del almacenamiento secundario.
- Gestor de comunicación y sincronización entre procesos. Ofrecer mecanismos para
que los procesos puedan comunicarse y sincronizarse.
- Gestor de seguridad frente a ataques del exterior y protección interna. Este
componente debe encargarse de realizar la identificación de los usuarios, de definir lo
que pueden hacer cada uno de ellos con los recursos del sistema y de controlar el acceso
a estos recursos.
5. ¿Se puede considerar a un contenedor como un tipo de máquina virtual? ¿Por
qué?
No. Las máquinas virtuales necesitan de un hipervisor ( de tipo I que trabaja
directamente sobre el hardware, o de tipo II que trabaja sobre el sistema operativo que
trabaja como anfitrión), y sobre este; se ejecuta la MV con su propio sistema operativo
(huesped).
El contenedor se construye directamente sobre el sistema operativo del host, crea una
imagen que contiene la aplicación junto con sus dependencias, ficheros, librerías, etc
todo menos el núcleo del sistema operativo. Se ejecuta de forma independiente de forma
y aislada, y sólo hay un sistema operativo para todos los contenedores; el del host.

4
6. En un cambio de contexto entre dos procesos, ¿Qué elementos del Sistema
Operativo intervienen y qué operaciones básicas realizan?

El cambio de contexto consiste en pasar de ejecutar un proceso A a ejecutar otro


proceso B seleccionado por el planificador. El cambio de contexto exige dos cambios
de modo. El primer cambio de modo viene producido por una interrupción, pasándose
a ejecutar el sistema operativo. Este cambio de modo exige almacenar el estado del
procesador, es decir, los contenidos de los registros del procesador, puesto que el
sistema operativo los va a utilizar, modificando su contenido.

El segundo cambio de modo lo realiza el sistema operativo al activar el proceso B. El


cambio de modo implica restaurar los registros del procesador con los valores
almacenados anteriormente en el BCP del proceso B. El módulo del sistema operativo
que pone a ejecutar un proceso se denomina activador o dispatcher. La activación de
un proceso consiste en copiar en los registros del procesador el estado del procesador,
que está almacenado en su BCP. De esta forma, el proceso continuará su ejecución en
las mismas condiciones en las que fue parado.El activador termina con una instrucción
de retorno de interrupción (p. ej.: RETI).

7. ¿Qué es una sección crítica?. Describir un ejemplo de sección crítica y una


solución que el S.O. proporcione para solucionar el problema.

En programación concurrente se denomina sección crítica al fragmento de código de un


programa que accede a un recurso compartido que no debe ser accedido en cada instante
por más de un flujo de ejecución (proceso o thread). Debe cumplirse exclusión mutua,
progreso y no darse inanición. Una sección crítica es un segmento de código susceptible
de contener una condición de carrera.

Un ejemplo en el que dos threads ejecutan un código tan sencillo como a++; sobre una
variable compartida a. Dado que la ejecución de dicho código requiere las tres
instrucciones de máquina (load, inc y store), dependiendo del orden relativo de
ejecución de los threads el resultado será correcto o erróneo. Solamente se obtiene el
valor correcto cuando cada thread ejecuta las tres instrucciones de máquina sin
entremezclarse con las del otro, es decir, de forma atómica.

Una solución puede proporcionarla el uso de semáforos.

init (s, 0)
int a; /* compartida */
<<Entrada a sección crítica>> wait (s)
a++;
<<Salida de sección crítica>> signal (s)

5
8. ¿Una interrupción hardware es una llamada al sistema? Explicar la respuesta.

No. Las interrupciones hardware (externas) informan a la CPU, de que un dispositivo de


E/S quiere trabajar con ella. Si las interrupciones son vectoradas, el chip de
interrupciones pasa el vector y la CPU ejecuta la RTI.
Para las llamadas al sistema suele existir una única interrupción de tipo software de
solicitud de servicio, esto significa que todos los servicios empiezan ejecutando el
mismo código. Se dice que hay una única puerta de entrada para los servicios. En
procesadores Intel x86, Linux utiliza el vector de interrupción 0x80 como ventana de
servicios, mientras que Windows utiliza el 0x2E. Estas instrucciones de TRAP suponen
un cambio de modo de ejecución a Kernel con acceso a la pila y recursos en modo
privilegiado.

También podría gustarte