Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Índice
■Concepto de proceso
■Información del proceso
■Estados del proceso
■Formación de un proceso
■Concepto de hilo de ejecución
■Procesos en Minix
■Procesos en Linux
■Procesos en Windows NT/2000
■Planificación de procesos e hilos
■Servicios POSIX para gestión de procesos e hilos
■¿Qué es un proceso?
◆ Instancia de un programa en ejecución, requiriendo para ello
unos recursos
Proceso
Programa Pila
Otros recursos:
-Ficheros abierto
-Dispositivos E/S, etc.
Recursos:
-Procesador
-Zonas de memoria Datos
-Ficheros PC
Código
-Dispositivos, etc.
Proceso E Proceso F
◆ Objetivo:
●Entretener al procesador cuando no hay ninguna otra tarea
■Entorno del proceso:
◆ Tabla NOMBRE-VALOR que se pasa al proceso en su creación
◆ Se incluye en la pila
◆ Se establece:
●Por defecto
●Mediante mandatos del shell (export)
●Mediante API del SO (putenv, getenv )
◆ Ejemplo de entorno de un proceso en Unix:
●$env
LOGNAME=castano
SHELL=/bin/bash
TERM=vt100
HOME=/users/icc/castano
PATH=/usr/local/bin:/bin:/usr/bin:/users/castano/bin
...
■Grupos de procesos:
◆ Los procesos forman grupos de procesos con alguna característica
común
●Conjunto de procesos creados por el mismo padre
●Conjunto de procesos creados a partir de un shell
●Conjunto de procesos dependientes de un terminal
Índice
■Concepto de proceso
“ ■ Información del proceso
■Estados del proceso
■Formación de un proceso
■Concepto de hilo de ejecución
■Procesos en Minix
■Procesos en Linux
■Procesos en Windows NT/2000
■Planificación de procesos e hilos
■Imagen de memoria:
◆ Contenido de los segmentos de memoria en los que reside el código
y los datos del proceso
Problema
Editor
Módulo Módulo
fuente A fuente B
Compilador
o
ensamblad
or
Montador
Objeto Bibliotecas
ejecutable del sistema
Cargad
or
Ejecutable
en
memori
a
S O
Imagen de memoria II
■Si un proceso genera una dirección que esta fuera del espacio de
direcciones el HW genera una interrupción HW interna
Tamaño
Dat
os Disco
Tabla de
Pila páginas
■Información de identificación:
◆ PID del proceso, PID del padre
◆ ID de usuario real (uid real)
◆ ID de grupo real (gid real)
◆ ID de usuario efectivo (uid efectivo)
◆ ID de grupo efectivo (gid efectivo)
◆ La que se comparte:
●El BCP es de acceso restringido al proceso que lo ocupa
●Ejemplo: Punteros de posición de ficheros abiertos por el proceso
■Tabla de páginas:
◆ Describe la imagen de memoria del proceso
◆ Tamaño variable
◆ El BCP contiene el puntero a la tabla de páginas
◆ La compartición de memoria requiere que sea externa al BCP
BCP 4
BCP 7 BCP 23
Tabla Tabla Tabla de
de de ficheros
ficheros ficheros
0 23 0 23 0 54
f 1 4563 fd 1 4563 fd 1 63
d 3
2 56 2 56 2 53
68
34 34 3 33
ID P
FF P ● El proceso con BCP7 es hijo del proceso con BCP4
1 0
24456
2 234
● Los procesos con BCP7 y BCP4
34512 5 comparten punteros a los mismos ficheros
● El proceso con BCP23 abre uno de los
Tabla de ficheros del sistema ficheros compartido por los procesos con
BCP7 y BCP4
S O
IDFF = Identificativo de fichero
PP = Posición puntero al II
fichero
S O
Tablas del SO II
■Tabla de procesos: Tabla con los BCP de los procesos del sistema
Proceso 7 BCP 1
Proceso 5 BCP 2
Proceso 3 BCP 3
Proceso 9 BCP 4
Tabla de procesos
S O
Usuarios y grupos reales y efectivos II
Índice
■Concepto de proceso
■Información del proceso
“ ■ Estados del proceso
■Formación de un proceso
■Concepto de hilo de ejecución
■Procesos en Minix
■Procesos en Linux
■Procesos en Windows NT/2000
■Planificación de procesos e hilos
Ejecución Exit
Exit
Ejecución
Memoria
Listo
Recuperado del disco
Fin E/S o llegada evento Bloqueado
Expulsado al disco
Expulsado al disco
Entra al
sistema
Zona de intercambio
Procesos por Listo y Fin E/S Bloqueado y
suspendido suspendido
lotes en
espera
■Servicios POSIX
Tema 2. Procesos e hilos para gestión de
procesos e hilos
S O II
II
Índice
■Concepto de proceso
■Información del proceso
■Estados del proceso
“ ■ Formación de un proceso
■Concepto de hilo de ejecución
■Procesos en Minix
■Procesos en Linux
■Procesos en Windows NT/2000
■Planificación de procesos e hilos
Mapa de
memoria Tabla de procesos
Objeto Ca rg a d or
Imagen BCP
ejecutable
del proceso
Biblioteca
sistema
Índice
■Concepto de proceso
■Información del proceso
■Estados del proceso
■Formación de un proceso
“ ■ Concepto de hilo de ejecución
■Procesos en Minix
■Procesos en Linux
■Procesos en Windows NT/2000
■Planificación de procesos e hilos
■Planteamiento:
◆ Varios procesos pueden cooperar para resolver una misma tarea del SO
‹ Ejecución concurrente entre procesos ‹ Comunicación
entre procesos, por ejemplo, a través de memoria.
◆ Un programa podría incluir varias actividades concurrentes ‹
Ejecución concurrente dentro de un proceso.
■¿Qué es un hilo de ejecución?
◆ También llamado hebra, proceso ligero, flujo, subproceso o “thread”.
◆ Programa en ejecución que comparte la imagen de memoria y otros
recursos del proceso con otros hilos.
◆ Desde el punto de vista de programación: Función cuya ejecución
se puede lanzar en paralelo con otras.
◆ Un proceso puede contener uno o más hilos.
■¿Qué es un hilo de ejecución (cont.)?
Pila 1
Otros recursos:
Hilo 1 -Ficheros abierto
-Dispositivos E/S, etc.
Pila2
Proceso
Hilo 2
PC2
Datos
PC1
Código
Hilo 2
Otros datos
■Descriptor de un proceso y de un hilo:
◆ Todos los hilos de un proceso comparten el mismo entorno de
ejecución (variables globales, espacio de direcciones, ficheros abiertos,
etc.).
◆ Cada hilo tiene su propio juego de registros de CPU, pila,
variables locales, etc.
◆ No existe protección entre hilos: un error en un hilo puede estropear
la pila de otro.
◆ Para ordenar la forma en la que los hilos acceden a datos comunes
hay que emplear mecanismos de sincronización.
S O
Estados de un hilo y de un proceso II
II
Hilo
Paralelización usando hilos II
Procedimiento 1 Procedimiento 2
P Ejecución
Espera P F
Espera serie
en E/S
F
en E/S
Procedimiento 1
P F
Espera
en E/S
Ejecución
Procedimiento 2 Espera en E/S
P
paralela
F Procesamiento
S O
Servidor con múltiples hilos II
Hilo trabajador
Peticiones
■ Hilos trabajadores:
◆ Pueden crearse a medida que se necesitan y destruirse al finalizar
la tarea encomendada
◆ Pueden existir siempre y quedar libres al finalizar la tarea encomendada
●Más eficiente (evita el trabajo de crear y destruir hilos)
■ Ejemplo: Servidor secuencial de ficheros
MultiMS-
ProcDOS
e
sado
res
Múltiple
g
S O
U
n n Ej: Java
o p II
s r
o
U c
e
N s
o
I M
X ú Múltiples
l procesos
t Múltiples
i hilos/proceso
Téc
p
nica l Ej: Windows 2000,
mon e Solaris, OS/2
ohil s
o
h
i Técnica multihilo
l
o
s
/
p
r
o
c
e
s
o
Implementación de hilos II
■ Dos categorías:
◆ Hilos a nivel de usuario
◆ Hilos a nivel de núcleo
S O
Hilos a nivel de usuario II
P Proceso
Biblioteca de hilos
Modo usuario
Modo
supervisor
P
■ Ventajas frente a hilos a nivel de núcleo:
◆ No necesario acceder al núcleo para intercambio de hilos.
◆ Algoritmos de planificación ad-hoc para cada aplicación.
◆ Pueden ejecutarse en cualquier SO.
■ Ejemplo:
◆ Pthreads de POSIX.
S O
Hilos a nivel de núcleo II
P
■ Ventajas frente a hilos a nivel de usuario:
◆ El bloqueo de un hilo no supone (necesariamente) bloquear todo
el proceso.
◆ Planificación de múltiples hilos de un proceso en
múltiples procesadores.
◆ Las funciones del núcleo pueden ser multihilo.
■ Ejemplos:
◆ Linux, Windows 2000, OS/2.
S O
Aproximaciones combinadas II
■ Ejemplo: Solaris
◆ Creación, sincronización y planificación de hilos de una
aplicación en modo usuario.
◆ Planificación de múltiples hilos de un proceso en múltiples
procesadores.
◆ El bloqueo de un hilo no supone (necesariamente) bloquear
todo el proceso.
■ Ejemplo: Solaris (cont.)
P P
S O
Modelos multihilo II
II
■ Relación de:
HNU:HNN Descripción Ejemplos
◆ Muchos a uno.
M:1 Pthreads POSIX
◆ Uno a uno.
◆ Muchos a muchos.
M:N Solaris
Hilo a nivel de usuario (HNU)
Índice
■Concepto de proceso
■Información del proceso
■Estados del proceso
■Formación de un proceso
■Concepto de hilo de ejecución
“ ■ Procesos en Minix
✓ Estados de un proceso
✓ Implementación del descriptor de proceso
En ejecución
unready
pick_pro
c
sched
Bloqueado
Listo ready
e
n
L
i
n
u
x
✓ Estados de un proceso
✓ Implementación del descriptor de proceso
✓ Implementación de la tabla de procesos
✓ Implementación de la lista de procesos
preparados
■Bloqueo de un proceso:
◆ Espera a que ocurra un cierto evento
◆ Proceso bloqueado e interrumplible:
●Puede ser interrumpido por señales
●Puede desbloquearle:
Una interrupción HW
Liberación de un recurso por el que esperaba
Una señal
padre
p_pptr
p_osptr p_osptr
hijo más hijo más
joven hijo
p_ysptr viejo
p_ysptr
■ Señales del proceso:
struct mm_struct {
...
struc vm_area_struc *mmap;
t t
struc vm_area_struc *mmap_avl;
t t
struc vm_area_struc *mmap_cache
t t ;
struct fs_struct {
atomic_t count; /* Número de procesos que comparten esta estructura
*/ int umask; /* Máscara de creación de ficheros */
struct dentry * root; /* Directorio raíz del proceso
*/ struct dentry * pwd; /* Directorio de
trabajo */
};
struct files_struct {
tomic_t count; /* Num. procs que comparten estos ficheros abiertos
*/ fd_set * close_on_exec; /* Ficheros a cerrar ante una llamada exec */
fd_set * open_fds; /* Máscara bits de los descriptores de fichs usados
*/ struct file * fd_array[NR_OPEN_DEFAULT];
/* Tabla de ficheros abiertos por el proceso*/
};
■ Sistema de ficheros del proceso (cont.):
0 Tabla de inodos
1 Tabla de ficheros
2 del sistema
3
4
1 /etc/passwd
5
6 2 /usr/castano
Tabla de ficheros
del proceso
..
.
1 READ
..
.
1 WRITE
1 READ
..
.
..
.
Incluye el proceso en ejecución
■ Lista de procesos preparados:
◆ Lista circular doblemente enlazada que comienza y finaliza con el proceso
init_task (PID=0)
struct task_struct *next_run; /* Siguiente proceso de esta lista
*/ struct task_struct *prev_run; /* Anterior proceso de esta lista
*/
next_run
prev_run
■ Lista de procesos del sistema:
◆ Lista circular doblemente enlazada que comienza y finaliza con el proceso
init_task
struct task_struct *next_task; /* Siguiente proceso de esta lista
*/ struct task_struct *prev_task; /* Anterior proceso de esta lista
*/
next_task
prev_task
■ Tabla de procesos:
■ Operaciones habituales sobre (todos los procesos de) la lista de procesos del
sistema:
Índice
■Concepto de proceso
■Información del proceso
■Estados del proceso
■Formación de un proceso
■Concepto de hilo de ejecución
■Procesos en Minix
■Procesos en Linux
“ ■ Procesos en Windows NT/2000
✓ Objetos tipo proceso e hilo
✓ Estados de un hilo
✓ Implementación del procesos e hilos
Sistemas Operativos II (II-UJI) Procesos e hilos
70
S O
Procesos en Windows NT/2000 II
Tipo del
■
objeto
PROCESO
Identificativo de proceso
Objeto de acceso
del objeto
Atributos
Prioridad base
Afinidad del procesador
Tiempo de ejecución
Puertos de
comunicación Estado de
finalización etc.
Crear proceso
del objeto
Abrir proceso
Servicios
Tipo del
■
objeto
HILO
Identificativo de hilo
Contexto
Prioridad base
del objeto
Atributos
Prioridad dinámica
Afinidad del
procesador Tiempo de
ejecución Puerto de
terminación Estado de
finalización etc.
Crear
del objeto
hilo Abrir
Servicios
hilo
Pedir información del hilo
Añadir información del hilo
Finalizar hilo
Suspender/continuar hilo
Guardar/cargar contexto
etc.
■ Objeto tipo hilo (cont.):
Atributo Descripción
ID hilo Valor único que identifica al hilo
Contexto Valores de los registros y de otros datos que
definen su estado de ejecución
Prioridad dinámica Prioridad de ejecución en ese instante
Prioridad base Límite inferior de la prioridad dinámica
Afinidad del procesador Procesadores en los que se puede
ejecutar
Tiempo de ejecución Tiempo de ejecución transcurrido en modo usuario y
en modo supervisor
Puerto de terminación Canal de comunicación al que enviar un mensaje
cuando finaliza
Estado de finalización Motivo de la finalización del subproceso
■ Diagrama de transición entre estados (de un hilo):
Inicializado
Reinicializar
Finalizado Listo
Finalización
Bloqueado
Esperar evento
Ejecución
Alerta
A CPU
■ Algunos estados de un hilo:
◆ Alerta: Seleccionado como el siguiente hilo a ser
ejecutado en un procesador dado
Operación (planificación) previa a la invocación de un cambio
de contexto
◆ Bloqueado:Espera a que un objeto de sincronización pase a
una situación de marcado ("signaled") que indique la llegada
del evento de espera
■ Implementación de procesos e hilos en Windows NT/2000:
Objeto
de aceeso
Tabla de objetos
Subproceso x
Fichero y
. Sección z
.
.
ón en
Tema 2. Procesos e hilos Windo
ws
S O II NT/20
00
II
■Concepto de ■Procesos en
proceso Windows NT/2000
+ TAREAS FCFS
PROCESOS FCFS
PRIORIDAD SERVIDOR
PROCESOS
- USUARIO RR
rdy_head[TASK_Q]
TAREAS FCFS
+
rdy_head[SERVER_Q]
PROCESOS FCFS
PRIORIDAD SERVIDOR rdy_head[USER_Q]
PROCESOS RR
- USUARIO
■ Implementación del planificador (cont.):
PUBLIC pick_proc ()
{ register int q;/* Cola a usar: */
/* - Cola de tareas: TASK_Q */
/* - Cola de procesos servidor: SERVER_Q */
/* - Cola de procesos de usuario: USER_Q */
■ Políticas de planificación:
◆ FIFO (FCFS)
◆ Round Robin (RR)
◆ Otra
S O
El planificador de Linux II
void schedule(void)
{
int c;
struct task_struct * p, * prev, * next;
prev = current;
Deshabilitar interrupciones
cli();
/* move an exhausted RR process to be last */
if (!prev->counter && prev->policy == SCHED_RR) {
prev->counter = prev->priority;
move_last_runqueue(prev);
}
p = init_task.next_run;
sti();
Habilitar interrupciones
■ Función de planificación (cont.):
weight = p->counter;
if (weight) {
/* Give a slight advantage to the current process */
if (p == prev)
weight += 1;
}
return weight;
}
S O
El planificador de Windows NT/2000 II
■ Prioridad de un hilo:
◆ Dentro del rango 0..31
◆ Depende del tipo de trabajo que esté haciendo
◆ Una cola de hilos listos por cada posible nivel de prioridad
■ Tipos de prioridad:
◆ Prioridades en tiempo real
◆ Prioridades variables
■ Prioridades en tiempo real:
◆ Prioridades más altas (rango 31..16)
◆ Asignadas cuando el tiempo de respuesta del subproceso es crítico
(operaciones de comunicaciones, tareas de tiempo real, etc.)
◆ La prioridad del hilo no cambia nunca
◆ Política RR para los hilos de un nivel de prioridad dado
■ Prioridades variables:
◆ Prioridades más bajas (rango 15..0)
◆ Cola RR en cada nivel de prioridad
◆ Prioridad inicial del hilo:
●Prioridad del proceso + Prioridad base del hilo (-2..+2)
◆ La prioridad del hilo puede variar durante su vida
●No puede ser superior a 15
●No puede ser inferior a la prioridad inicial
●El núcleo baja la prioridad (dinámica) de un hilo cada vez que
finaliza su quantum de CPU asignado
●La prioridad (dinámica) de un hilo aumenta tras una operación de E/S
15
14
13
12
11
10
9
8
7
6 +2 mayor
+1 encima
5 normal
4 0 norm
3 al
2 -1 debajo
1 -2 normal
0
Prioridad Prioridad Prioridad
base del inicial del dinámica
proceso hilo del hilo
■ Algoritmo de planificación de hilos: NIVEL DE
PRIORIDAD
◆ Esquema expulsivo con prioridades 31
y colas multinivel realimentadas .
.
(selecciona el hilo con máxima . .
15
14
..
.
. .
. .
.
.
0
“ ■ Servicios POSIX
Tema 2. Procesos e hilos para gestión de procesos
e hilos
S O II
II
Índice
■Concepto de proceso
■Información del proceso
■Estados del proceso
■Formación de un proceso
■Concepto de hilo de ejecución
■Procesos en Minix
■Procesos en Linux
■Procesos en Windows NT/2000
■Planificación de procesos e hilos
■ Creación de atributos:
◆ Sintaxis:
int pthread_attr_init(pthread_attr_t *attr);
◆ Descripción:
●Inicia un objeto atributo de tipo pthread_attr_t con las
propiedades que tendrán los hilos que se creen
posteriormente
●Los atributos permiten especificar: tamaño de pila, prioridad,
política de planificación, etc.
●Existen diversas llamadas para modificar los atributos
■ Destrucción de atributos:
◆ Sintaxis:
int pthread_attr_destroy (pthread_attr_t *attr);
◆ Descripción:
●Destruye el objeto atributo de tipo pthread_attr_t pasado como
argumento a la misma
■ Establecimiento del estado de terminación:
◆ Sintaxis:
int pthread_attr_setdetachstate(pthread_attr_t *attr,
int detachstate);
◆ Descripción:
●Establece el estado de terminación de un hilo:
Si "detachstate" = PTHREAD_CREATE_DETACHED
El hilo se considerará como “independiente”
El hilo liberará sus recursos cuando finalice su ejecución
Si "detachstate" = PTHREAD_CREATE_JOINABLE
El hilo se considerará como “no independiente”
El hilo no liberará todos los recursos (descriptor y pila)
cuando finalice su ejecución, es necesario utilizar
pthread_join()
Habitualmente, valor por defecto
S O
Servicios POSIX sobre gestión de hilos II
■ Creación de hilos:
◆ Sintaxis:
int pthread_create (pthread_t *thread,
const pthread_attr_t *attr, void *(*func)(void *),
void *arg);
◆ Descripción:
●Crea un hilo con atributos attr que ejecuta func con argumentos arg
■ Finalización de hilos:
◆ Sintaxis:
int pthread_exit(void *value);
◆ Descripción:
●Finaliza la ejecución de un hilo, indicando su estado de terminación
■ Suspensión de hilos:
◆ Sintaxis:
int pthread_join(pthread_t thid, void **value);
◆ Descripción:
●Suspende la ejecución de un hilo hasta que termina el hilo
con identificador thid (no necesariamente un hilo hijo)
●Deja el estado de terminación del hilo en la posición apuntada por
value
●Sólo se puede solicitar este servicio sobre hilos no independientes
■ Identificación de hilos:
◆ Sintaxis:
pthread_t pthread_self(void);
◆ Descripción:
●Devuelve el identificador del hilo que ejecuta la llamada
■ Jerarquía de hilos:
Hilo principal (main)
Hilo 1
No
independiente
pthread_exit
pthread_join
pthread_exit
S O
Servicios POSIX para gestión de hilos II
■ Ejemplo 1:
#include <pthread.h>
#include <stdio.h>
void *hilo(void *cadena)
{
int i;
for (i=0; i<10; i++)
printf("Hilo (%d): %d %s \n",pthread_self(),i,(char *)cadena);
pthread_exit(0);
}
int main() A partir de aquí, el hilo principal, hilo1 e
{ hilo2 se ejecutan concurrentemente.
char *cadena1="Hola"; Cualquiera puede acabar 1°, 2°o último
char *cadena2="Adios";
pthread_t hilo1, hilo2;
pthread_create(&hilo1, NULL, hilo, (void *)cadena1);
pthread_create(&hilo2, NULL, hilo, (void *)cadena2);
exit(0);
}
■ Ejemplo 2:
#include <pthread.h>
¡Ojo a la exclución mutua!
#include <stdio.h>
int cont=0;
void *hilo(void *arg)
{ sleep(2);
cont=cont+1;
printf("Hilo (%d): cont=%d \n",pthread_self(),cont);
pthread_exit(0);
}
int main()
{ pthread_t hilo1, hilo2;
printf("Hilo principal (%d): cont=%d \n",pthread_self(),cont);
pthread_create(&hilo1, NULL, hilo, NULL);
pthread_create(&hilo2, NULL, hilo, NULL);
pthread_join(hilo1,NULL); /* Punto de sincronización con hilo1 */
/* Hilo2 sigue su marcha. Puede o no haber acabado*/
pthread_join(hilo2,NULL); /* Punto de sincronización con hilo2 */
printf("Hilo principal (%d): cont=%d
\n",pthread_self(),cont); exit(0);
}
S O
Servicios POSIX para gestión de procesos II
II
■ Ejemplo 2: Código pseudo-equivalente con gestión de procesos pesados:
#include <stdio.h>
int main() ¿Por qué?
{ int estado, cont=0;
printf("Padre (%d): cont=%d
\n",getpid(),cont); if (fork() != 0)
{
if (fork() != 0)
{ wait(&estado);
wait(&estado);
printf("Padre (%d): cont=%d \n",getpid(),cont);
} else { /* HIJO 2 */
cont=cont+1;
printf("Hijo 2 (%d): cont=%d \n",getpid(),cont);
}
} else { /* HIJO 1 */
cont=cont+1;
printf("Hijo 1 (%d): cont=%d \n",getpid(),cont);
}
exit(0);
}
S O
Servicios POSIX para gestión de hilos II
■ Ejemplo 3:
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
int x=0;
void *fhilo1(void *arg) void *fhilo2(void *arg)
{ int i, cont; { int i, cont;
for (i=0; i<3; i++) { for (i=0; i<3; i++)
{ cont=x+1; cont=x-1;
printf (“Suma 1\n”); printf (“Resta 1\n”);
sleep (random()%3); sleep (random()%3);
x=cont; x=cont;
} }
pthread_exit (NULL); pthread_exit (NULL);
} }
■ Ejemplo 3 (cont.):
main()
{ pthread_t hilo1, hilo2;
time_t t;
srandom (time(&t);
printf ("Valor inicial de x: %d \n",x);
pthread_create(&hilo1, NULL, fhilo1, NULL);
pthread_create(&hilo2, NULL, fhilo2, NULL);
pthread_join(hilo1,NULL);
pthread_join(hilo2,NULL);
printf ("Valor final de x: %d \n",x);
exit(0);
}
¿Funcionamiento correcto?
S O
Ejercicios II
■ Ejercicio 1:
Realizar un algoritmo o programa en el que, dado el número de identificación de
un proceso, se obtenga el número de hijos que tiene dicho proceso y sus
correspondientes números de identificación.
■ Ejercicio 1 (solución):
Solución I:
Proceso init Proceso 1 Proceso 2 Proceso 3 Proceso 4 Proceso 5 Proceso 6 Proceso 7 Proceso 8
... ... ... ... ... ... ... ... ...
Política planificación FIFO RR RR
Prioridad dinámica OTHER FIFO
FIFO OTHER RR 25 20 25 20 25
Prioridad estática 20 50 0
... 20 75 25 25 25 25 20 25
... ... ... ... ... ... ... ...
■ Ejercicio 5 (solución):
Solución:
El primero que se encuentre en la lista (ver ejemplo del ejercicio 5).
■ Ejercicio 8:
¿En qué variaría la política de planificación de procesos de linux si en
la función schedule se sustituye la línea
if (weight > c)
por lo siguiente:
?
if (weight >= c)
Solución:
En este caso, ante varios procesos con máxima prioridad se seleccionaría
el último de ellos que esté en la lista de procesos listos del sistema.
Consecuentemente, si estos procesos con la máxima prioridad tuviesen
asignada una política de planificación FIFO, dejaría que cumplirse
dicha política. Y lo mismo ocurriría con la política de planificación RR.
■ Ejercicio 9:
Explicar cómo se cumple la política FIFO en el planificador de procesos de
linux cuando varios procesos con este tipo de política tienen la máxima
prioridad.
■ Ejercicio 9 (solución):
Veámoslo con el siguiente ejemplo:
PROCESO P1 P2 P3 P4 P5 P6 P7 P8
Política FIFO RR FIFO Oth Oth FIFO RR FIFO
er er
Prior. Estática 50 40 50 80 60 30 25 50
Prior. 50 30 50 75 60 30 20 50
Dinámica
Weight 1050 1040 1050 75 60 1030 1025 1050
Tras el bucle while c=1050 y next apunta al proceso P1. Si no apareciesen más
procesos listos, cuando acabe la ejecución del proceso P1 el planificador
seleccionará al siguiente proceso de la lista más prioritario, esto es, P3, que
entró después de P1 en la lista. Si no hubiesen aparecido más procesos listos,
cuando P3 finalice el proceso más prioritario sería P8, que había entrado en la
lista tras P1 y P3. Resumiendo, los tres procesos FIFO con la prioridad máxima
se ejecutan en el orden en que entraron en la lista.
■ Ejercicio 10:
Explicar la validez del siguiente código:
#include <pthread.h>
#include <stdio.h>
#define MAX_THREADS 10
void *imprimir(int *n)
{ sleep (3);
printf("Hilo (%d): %d \n",pthread_self(),*n);
pthread_exit(0);
}
int main()
{ int num;
pthread_t hilo;
pthread_attr_t attr;
pthread_attr_init (&attr);
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
while (1) {
scanf (“%d”, &num);
pthread_create(&hilo, &attr, imprimir, &num);
exit(0);
}