Sistemas Operativos. Grado Ingeniería Informática. TGR

Anuncio
Sistemas Operativos. Grado Ingeniería Informática.
TGR-2.1 Procesos. Noviembre 2014
Problemas para hacer en clase
1. Dos procesos A y B tienen una ráfaga de CPU de 50 ms y un proceso C tiene cuatro
ráfagas de CPU de 10 ms. intercaladas con tres ráfagas de E/S a disco de 30 ms. Los
procesos tiene el mismo tiempo de llegada con el orden C, A, B. Complete el diagrama de
planificación y calcule el tiempo de retorno promedio y el porcentaje de utilización de la
CPU y del disco bajo las políticas de planificación de la CPU FIFO (FCFS), Round-Robin
(RR) con quantum 50 ms. y RR con quantum 10 ms. y SRTF (Shortest Remaining Time
First). Recordad SRTF es la versión apropiativa en tiempo de llegada del SJF (Shortest Job
First), i.e., si un proceso que llega a la cola de procesos listos en ejecución tiene un tiempo
esperado de ejecución menor que el proceso en ejecución, el proceso que llega toma la CPU.
FIFO
cpu C
dsk
A
C
2. Conteste brevemente
-¿Bajo que condiciones el algoritmo de planifiación de procesos FIFO (FCFS) resultaría en el
tiempo de respuesta promedio más pequeño?
-¿Bajo que condiciones la planificación Round Robin se comporta igual que FIFO?
-¿Bajo que condiciones la planficación de procesos Round Robin se comporta peor que FIFO (en
tiempo de respuesta promedio)?
-En la situación anterior, si se reduce el quantum, ¿ayudaría o perjudicaría las prestaciones del RR
con respecto a FIFO?
-Un proceso CPU-bound (limitado por CPU) es un proceso que usa mucha CPU en relación a su
uso de E/S. La definición de proceso E/S-bound (limitado por E/S) es análoga. ¿Es la siguiente
afirmación verdadera o falsa?: Para un proceso CPU-bound es razonable darle más prioridad en las
operaciones E/S que a un proceso E/S-bound.
3. Considere los estados de los procesos: en ejecución (running), preparado o listo (ready),
bloqueado (blocked, waiting), bloqueado suspendido (blocked swapped out), suspendido
listo, exit (terminado). Para las siguientes situaciones diga que transición se produce en el
diagrama de estados.
-Se produce un evento por el que espera un proceso en memoria: E/S completa, despierta en un
semáforo, etc.:
-Un proceso comunica con otro proceso y tiene que esperar por el mensaje del otro proceso:
-Mediante una llamada al sistema un proceso requiere un recurso (por ejemplo un fichero o una
sección de memoria compartida) que no puede ser satisfecho inmediatamente por el sistema
operativo:
-Un proceso aborta:
-Un proceso termina normalmente:
-Se produce el evento que un proceso bloqueado en memoria secundaria estaba esperando:
-El proceso en ejecución necesita más memoria y el sistema operativo decide mover un proceso
bloqueado a disco
-Normalmente el sistema operativo preferiría suspender (intercambiar) un proceso bloqueado que
suspender un proceso listo ya que ambos están en memoria pero el bloqueado no está listo para
ejecución. De alguna razón para una transición Listo → Suspendido listo
-Algunos textos de SO muestran la transición Bloqueado suspendido → bloqueado, mientras otros
la ignoran. ¿Por qué?
4. El programa a.out tiene que ejecutar b.out y c.out que están en el directorio actual y tienen
que dar un mensaje de haber finalizado ambas ejecuciones. ¿Es correcta esta
implementación? En caso contrario proponer una alternativa.
#include
#include
#include
#include
#include
#include
<unistd.h>
<sys/types.h>
<errno.h>
<stdio.h>
<sys/wait.h>
<stdlib.h>
/*
/*
/*
/*
/*
/*
Symbolic Constants */
Primitive System Data Types */
Errors */
Input/Output */
Wait for Process Termination */
General Utilities */
int main()
{
pid_t pid;
if ((pid=fork()) == -1)
perror("fallo en
exit(0);
}
if (pid==0){
execl("./b.out",
}
else
execl("./c.out",
{
fork");
"b.out", NULL);
"c.out", NULL);
printf("Finalizados b.out y c.out");
return 1;
}
5. a) ¿Cuántas líneas de salida genera este programa? b) ¿Cual es el orden posible de esas
lineas?
#include
#include
#include
#include
#include
#include
#include
<unistd.h>
/* Symbolic Constants */
<sys/types.h> /* Primitive System Data Types */
<errno.h>
/* Errors */
<stdio.h>
/* Input/Output */
<sys/wait.h>
/* Wait for Process Termination */
<stdlib.h>
/* General Utilities */
<string.h> /* String utilities*/
void unix_error(char *msg)
{
fprintf (stderr, "%s: %s\n", msg, strerror(errno));
exit(0);
}
pid_t Fork(void)
{
pid_t pid;
if ((pid = fork()) < 0)
unix_error("Fork error");
return pid;
}
int main()
{
int status;
pid_t pid;
printf("Hello\n");
pid = Fork();
printf("%d\n", !pid);
if (pid != 0) {
if (waitpid(-1, &status, 0) > 0) {
if (WIFEXITED(status) != 0)
printf("%d\n", WEXITSTATUS(status));
}
}
printf("Bye\n");
exit(2);
}
Sistemas Operativos. Grado Ingeniería Informática.
TGR-2.2 Procesos. Noviembre 2014
Soluciones problemas a resolver por los estudiantes.
1. Considerar los siguientes procesos con los tiempos de llegadas, prioridades y ráfagas de cpu.
Proceso
Ráfaga de CPU
Prioridad
Tiempo llegada
1
50 ms
4
0 ms
2
20 ms
1
20 ms
3
100 ms
3
40 ms
4
40 ms
2
60 ms.
Muestra como se planifican estos procesos con los algoritmos Shortest Remaing Time First (SRTF),
Prioridades no Apropiativo (un valor más pequeño en la tabla indica más prioridad) y Round Robin
con quantum de 30 ms. SRTF es una versión apropiativa de SJF (Shortest Job First) donde si un
proceso que llega a la cola de procesos listos para ejecución tiene un tiempo esperado de ejecución
menor que el proceso en ejecución, el proceso que llega toma la CPU. ¿Cuál es el tiempo de espera
promedio para los distintos algoritmos y esta carga de trabajo? Cada celda representa 10ms.
Shortest Remaning Time First
1 1 2 2 1 1 1 4
4
4
4
3
3
3
3
3
3
3
3
3
3
P1 comienza pero es apropiado al llegar P2 (a los 20 ms) porque P2 tiene una ráfaga de 20,
menor que los 30 ms que quedan a P1. P2 se ejecuta hasta completarse. A los 40 ms llega P3
pero tiene una ráfaga (40 ms) mayor que lo que queda a P1 por completar, de forma que P1
toma de nuevo la CPU, después P4 toma la CPU y completa y finalmente lo mismo con P3.
Tiempo medio de espera: (20 + 0 + 70 + 10)/4 = 25 ms.
Prioridades no apropiativas
1 1 1 1 1 2 2
4
4
4
4
3
3
3
3
3
3
3
3
3
3
P1 comienza porque es el único que está en la cola de proceso listos para ejecución, a los 20 ms
llega P2, que es el proceso de más prioridad, pero el algoritmo no es apropiativo con lo que no
puede tomar la CPU hasta que P1 se completa. Cuando acaba P2, en la cola están P4 y P3 y se
ejecuta primero P4 porque tiene más prioridad.
Tiempo medio de espera: (0 + 30 + 70 + 10)/4 = 27.5 ms.
Round Robin de quantum 30 ms.
1 1 1 2 2 1 1 3
3
3
4
4
4
3
3
3
4
3
3
3
3
P1 llega primero y consigue 30 ms de CPU. En ese momento P2 está en la lista de preparados
de forma que se apropia de la CPU y se ejecuta durante 20 ms y termina. Observe que P3
habrá llegado a la cola cuando P2 acaba pero se habrá puesto después de P1 por lo que P1
toma la CPU de nuevo y se completa su ejecución. En ese momento P4 habrá llegado a cola de
preparados pero se habrá puesto en esta cola después de P3, por lo que P3 toma la CPU y P3 y
P4 se alternan en CPU hasta que acaban.
Tiempo medio de espera: (20 + 10 + 70 + 70)/4 = 42.5 ms.
2. a) ¿Qué salida genera el proceso hijo? b) ¿Qué salida genera el proceso padre?
int main()
{
int x=1;
if (Fork()==0)
printf("printf1: x=%d\n", ++x);
printf("printf2: x=%d\n", --x);
}
El hijo ejecuta ambos printf:
printf1: x=2
printf2: x=1
El padre sólo el printf2:
printf2 x=0
3.¿Qué posibles salidas genera el siguiente programa?
int main()
{
if (Fork()==0) {
printf("a");
}
else {
printf("b");
waitpid(-1, NULL, 0);
}
printf("c");
exit(0);
}
El padre imprime b y luego c. El hijo imprime a y luego c (en el caso de que el fork no falle, si
el fork fallase sólo el padre puede imprimir bc). Pero no se puede suponer nada acerca de
como se entrelaza la ejecución del padre y el hijo, por lo que en principio todas estas salidas
son posibles: acbc, bacc, abcc.
Descargar