problema 1 solución

Anuncio
Sistemas Operativos II
Solución problema 2
Febrero 2000
Apellidos:
Nombre:
PROBLEMA 1
DNI:
Número de matrícula:
SOLUCIÓN
Puntuación: 6 puntos (0.6 por apartado)
min.
tiempo estimado: 1h. 30
1) A la ejecución del siguiente segmento de código:
....
P0;
pid = fork();
if (pid != 0)
{
P2;
wait(estado);
P1;
}
else
{ P3;}
...
P0
P2
P3
P1
le corresponde el diagrama de precedencia que se muestra a su derecha. Este diagrama
representa el orden de ejecución de los procedimientos “Pi” a los que se hace referencia en el
código.
Dado el siguiente segmento de código:
....
SOLUCIÓN
P0;
if ( fork()!=0)
if (fork() != 0)
{ P4;
P0
wait(estado);
wait(estado);
if (fork() != 0)
{ wait(estado);
P1
P2
P4
if (fork() !=0)
{ P6; exit(0); }
else
{ P3; exit(0); }
P5
}
else
{ P5; exit(0); }
}
P6
P3
else
{ P2; exit(0); }
else
{ P1; exit(0); }
...
SE PIDE: dibujar el diagrama de precedencia que permita observar el orden de
ejecución de los procedimientos “Pi” que aparecen en el segmento de código anterior.
Suponer que las llamadas al sistema no fallan.
Sistemas Operativos II
Solución problema 2
Febrero 2000
2) Escribir una de las posibles salidas que generaría por pantalla la ejecución del
siguiente programa. Suponer que las llamadas al sistema no fallan.
main()
{ int com1[2], com2[2];
char buffer, *argv[2];
pipe(com1);
pipe(com2);
if (fork() == 0)
{
if (fork() == 0)
{
close(com1[0]); close(com1[1]); close(com2[1]);
read(com2[0], &buffer, 1);
write(1, &buffer, 1);
}
else
{
close(com2[0]); close(com2[1]); close(com1[1]);
close(0); dup(com1[0]); close(com1[0]);
argv[0] = "prog1"; argv[1] = '\0';
execv("prog1", argv);
}
}
else
{
buffer = 'a'; write(com1[1], &buffer, 1);
buffer = 'b'; write(com2[1], &buffer, 1);
}
}
donde prog1 es un fichero ejecutable generado a partir del siguiente programa:
main()
{char buffer;
read(0, &buffer, 1);
write(1,&buffer, 1);
}
SOLUCIÓN: ba
Sistemas Operativos II
Solución problema 2
Apellidos:
Nombre:
Febrero 2000
DNI:
Número de matrícula:
3) Escribir la salida que generaría por pantalla la ejecución del siguiente programa:
#include<signal.h>
int pid;
void f1()
{
kill(pid, SIGUSR1);
}
void f2()
{
kill(getpid(), SIGUSR2);
}
main()
{ int com[2];
char buffer;
struct sigaction tratamiento;
pipe(com);
pid = fork();
if (pid == 0)
{
tratamiento.sa_handler = f2;
sigaction(SIGUSR1, &tratamiento, 0);
read(com[0], &buffer, 1);
write(1, &buffer, 1);
}
else
{
tratamiento.sa_handler = f1;
sigaction(SIGALRM, &tratamiento, 0);
alarm(5);
pause();
buffer = 'a';
write(com[1], &buffer, 1);
}
}
SOLUCIÓN: No se escribe nada
Sistemas Operativos II
Solución problema 2
Febrero 2000
4) Teniendo en cuenta que el fichero f1 contiene un programa ejecutable que escribe el
literal “Hola” por pantalla, que las llamadas al sistema no fallan y que la condición
del if se evalúa de izquierda a derecha, indicar la salida que generaría por pantalla la
ejecución del siguiente programa:
main()
{
int i;
char *argv[2];
argv[0] = "f1";
argv[1] = '\0';
for (i=0; i<3; i++)
{
if (execv("f1") == execv("f1"))
printf("H");
}
}
SOLUCIÓN: Hola
5) Teniendo en cuenta que las llamadas al sistema no fallan, indicar la salida que
generaría por pantalla la ejecución del siguiente programa:
main()
{ int estado, pid, i;
char buffer;
buffer = 'H';
for (i=0; i<2; i++)
{
pid = fork();
if (pid == waitpid(pid, &estado, 0))
{ write(1, &buffer, 1); }
}
}
SOLUCIÓN: HHH
6) El fichero Datos contiene las caracteres: abcdef. Teniendo en cuenta que las
llamadas al sistema no fallan, indicar una de las posibles salidas por pantalla que
generaría la ejecución del siguiente programa:
Sistemas Operativos II
Solución problema 2
Apellidos:
Nombre:
Febrero 2000
DNI:
Número de matrícula:
#include<fcntl.h>
main()
{ int df1, df2;
char *buffer;
df1 = open("Datos", O_RDONLY, 0700);
if (fork() == 0)
{
read(df1, &buffer, 3);
write(1, &buffer, 3);
df2 = open("Datos", O_RDONLY, 0777);
read(df2, &buffer, 3);
write(1, &buffer, 3);
}
else
{
read(df1, &buffer, 3);
write(1, &buffer, 3);
}
}
SOLUCIÓN: abcdefabc
7) Indicar dos razones por las cuales pueda fallar la llamada al sistema “wait” de
MINIX.
La llamada al sistema wait puede fallar porque el proceso que la ejecuta no tenga
ningún hijo o porque mientras el proceso está esperando por la muerte de un hijo le
llegue una señal que tenga asociado un tratamiento de función.
8) Indicar una razón por la cual el Gestor de Memoria de MINIX le solicite algún
trabajo al Gestor de Ficheros durante la ejecución de la llamada al sistema “execve”.
Una de las razones es para solicitarle al GF que obtenga la información del i-nodo
asociado al fichero que se pasa como primer parámetro de la llamada execve.
9) La llamada al sistema “pause” de MINIX siempre falla (devuelve –1) a no ser que el
proceso muera durante su ejecución. Explicar brevemente por qué.
Cuando un proceso de usuario ejecuta la llamada al sistema pause, este se queda
bloqueado hasta la recepción de una señal. Cuando el Gestor de memoria de
MINIX detecta que debe enviarle una señal al proceso bloqueado en la llamada
Sistemas Operativos II
Solución problema 2
Febrero 2000
pause, comprueba el tipo de tratamiento que tiene asociado. Si este es el
tratamiento por defecto, el Gestor de memoria mata al proceso. Si el tratamiento
asociado es una función, el Gestor de memoria comprueba si el proceso está
ejecutando una llamada (que es la situación), en cuyo caso le devuelve –1 al
proceso (la llamada falla).
10) Para cada una de las siguientes llamadas al sistema de MINIX indicar si durante su
ejecución se activa la tarea del sistema y en caso afirmativo indicar una razón por la
que se produzca esa situación:
 brk (direccion). Modifica el segmento de datos. La dirección del segmento de
datos se mantiene en la tabla de procesos del Gestor de Memoria y del núcleo
del S.O. Sí, se activa la tarea del sistema para que modifique la información en
la tabla de procesos del núcleo.
 setuid (nuevoUid). No se activa la tarea del sistema.
 write (df, &buffer, tamaño) (df está asociado a un fichero grabado en disco). Sí,
se activa la tarea del sistema para copiar la información de espacio de usuario
(de la variable buffer) a la cache de bloques del gestor de Ficheros.
 signal (numeroSeñal, función). No se activa la tarea del sistema.
Documentos relacionados
Descargar