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
Índice
■ Procesos en Minix
✓ Estados de un proceso
✓ Implementación del descriptor de proceso
■ Procesos en Linux
✓ 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
■ Procesos en Windows NT/2000
✓ Objetos tipo proceso e hilo
✓ Estados de un hilo
✓ Implementación del procesos e hilos
Índice
■ Planificación de procesos e hilos
✓ Planificación en Minix
✓ Planificación en Linux
✓ Planificación en Windows NT/2000
Bibliografía
■ J. Carretero et al. Sistemas Operativos: Una Visión Aplicada. McGraw-
Hill. 2001. Capítulo 3
■ W. Stallings. Sistemas Operativos. Prenctice-Hall. 2001. Capítulos 3, 4,
9 y 10
■ A.S. Tanenbaum, A.S. Woodnull. Operating Systems. Design and
Implementation. Prentice-Hall International, 2a. edición. 1996.
■ H. Custer. Inside Windows NT. Microsoft Press. 1993.
Í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
Datos
-Zonas de memoria
-Ficheros PC
Código
-Dispositivos, etc.
■ Jerarquía de procesos:
◆ Algunos SO, como Unix, mantienen una estructura jerárquica entre
procesos
init
Shell Shell
Proceso init:
● PID = 1
Proceso A
Editor
● Ancestro de todos los procesos
Proceso E Proceso F
◆ Objetivo:
● Entretener al procesador cuando no hay ninguna otra tarea
■ 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
■ Servicios POSIX para gestió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
Registros
Mapa de memoria
especiales del Proceso A
Problema
Editor
Módulo Módulo
fuente A fuente B
Compilador o
ensamblador
Montador
Objeto Bibliotecas
ejecutable del sistema
Cargador
Ejecutable en
memoria
■ Si un proceso genera una dirección que esta fuera del espacio de direcciones
el HW genera una interrupción HW interna
Datos Tamaño
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
IDFF PP
1 24456 0 ● El proceso con BCP7 es hijo del proceso con BCP4
2 34512 2345
3 28 5566 ● Los procesos con BCP7 y BCP4 comparten
4 34512 10000
punteros a los mismos ficheros
● El proceso con BCP23 abre uno de los ficheros
Tabla de ficheros compartido por los procesos con BCP7 y BCP4
del sistema
IDFF = Identificativo de fichero
PP = Posición puntero al fichero
■ 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
■ Programas “SETUID”:
◆ Cuando un proceso ejecuta un programa “setuid” el núcleo asigna al EUID
del proceso el identificativo del propietario de dicho programa y al EGID del
proceso el identificativo del grupo del propietario de dicho programa
◆ Ejemplos de programas “setuid”: login, mount, passwd, mkdir, etc.
◆ Cambio del bit “setuid” para el usuario y del bit “setgid” para el grupo:
Í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
Ejecución Exit
Es
p er
U a
CP ev por
A U en E
CP
to /S
o
n
sió
p ul
Ex
■ Estados suspendidos:
Exit
Ejecución
Es
o pe
ad
n if
ic
o ra p
Memoria
Pla ido ev or
um en E
ns to /S
co
po
iem
T
Listo Fin E/S o llegada evento Bloqueado
Recuperado del disco
Expulsado al disco
Expulsado al disco
Entra al
sistema
intercambio
Zona de
Listo y Fin E/S Bloqueado y
Procesos por lotes suspendido suspendido
en espera
Í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
Mapa de
memoria Tabla de procesos
Objeto Ca rg a d o r
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
■ Servicios POSIX para gestió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.
Pila 1
Otros recursos:
Hilo 1 -Ficheros abierto
-Dispositivos E/S, etc.
Pila2
Proceso
Hilo 2
Datos
Código PC2
PC1
Otros datos
Hilo
Procedimiento 1 Procedimiento 2
Ejecución
P F P F
Espera Espera serie
en E/S en E/S
Procedimiento 1
P F
Espera
en E/S Ejecución
Procedimiento 2 paralela
P F Procesamiento
Espera
en E/S
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)
Algoritmo 1 Algoritmo 2
Mientras no haya que terminar { Mientras no haya que terminar {
Esperar a que llegue una petición Esperar trabajo
Esperar trabajador libre Comprobar que la petición es correcta
} Si (los datos no están en la caché) {
Enviar resultado Realizar operación de E/S
} bloqueante sobre disco
}
Enviar resultado
Avisar que está libre
}
● Mayor complejidad
● Buenas prestaciones
Multi
Proce
sado
res Múltiples procesos Múltiples procesos
Un hilo/proceso Múltiples hilos/proceso
Ej: Algunos UNIX Ej: Windows 2000, Solaris, OS/2
■ Dos categorías:
◆ Hilos a nivel de usuario
◆ Hilos a nivel de núcleo
P Proceso
Biblioteca de hilos
Modo usuario
Modo supervisor
■ Ejemplo:
◆ Pthreads de POSIX.
■ Ejemplos:
◆ Linux, Windows 2000, OS/2.
■ 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.
P P
■ 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)
● Cambio de contexto.
Í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_proc
sched
Listo Bloqueado
ready
■ Descriptor de un proceso:
Í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
✓ 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
● Puede desbloquearle:
Una interrupción HW
Liberación de un recurso por el que esperaba
■ Descriptor de un proceso:
◆ Estructura task_struct del fichero include/linux/sched.h
ptr padre
c
p_ p_p
tr ptr
pp
p_
p_pptr
p_osptr p_osptr
hijo más hijo más
joven hijo viejo
p_ysptr p_ysptr
struct mm_struct {
...
struct vm_area_struct *mmap;
struct vm_area_struct *mmap_avl;
struct vm_area_struct *mmap_cache;
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*/
};
0 ...
1 1 READ
... 1 /etc/passwd
2
3 1 WRITE
4 1 READ 2 /usr/castano
...
5
...
6
Tabla de ficheros Tabla de ficheros Tabla de inodos
del proceso del sistema
next_run
prev_run
next_task
prev_task
■ Tabla de procesos:
◆ Vector task del fichero kernel/sched.c
■ Operaciones habituales sobre (todos los procesos de) la lista de procesos del
sistema:
◆ Vector task del fichero kernel/sched.c
#define for_each_task(p) \
for (p = &init_task ; (p = p->next_task) != &init_task ; )
Í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
Tipo del
■ Objeto tipo proceso:
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
Abrir proceso
del objeto
Servicios
Tipo del
■ Objeto tipo hilo:
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 hilo
Abrir hilo
del objeto
Servicios
Inicializado
Reinicializar
Planificador
Finalización
Expulsar
Bloqueado
Esperar evento
lsar
Ejecución Expu Alerta
A CPU
Objeto
de aceeso
Tabla de objetos
Subproceso x
Fichero y
. Sección z
.
.
Í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 en Minix
☛ ■ Planificación de procesos e hilos ✓ Planificación en Linux
✓ Planificación en Windows NT/2000
+ TAREAS FCFS
PROCESOS FCFS
PRIORIDAD SERVIDOR
PROCESOS RR
- USUARIO
rdy_head[TASK_Q]
+ TAREAS FCFS
rdy_head[SERVER_Q]
PROCESOS FCFS
PRIORIDAD SERVIDOR rdy_head[USER_Q]
PROCESOS RR
- USUARIO
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
FIFO (SCHED_FIFO)
RR (SCHED_RR)
Otra (SCHED_OTHER)
■ Algoritmo de planificación:
◆ Algoritmo expulsivo con prioridades (selecciona el proceso con máxima
prioridad)
● El proceso finaliza
● El proceso finaliza
la máxima)
■ Función de planificación:
void schedule(void)
{
int c;
struct task_struct * p, * prev, * next;
p = init_task.next_run;
sti();
Habilitar interrupciones
weight = p->counter;
if (weight) {
/* Give a slight advantage to the current process */
if (p == prev)
weight += 1;
}
return weight;
}
■ 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 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)
■ Prioridades variables:
◆ Ejemplo de relación entre prioridades
15
14
13
12
11
10
9
8
7
6 +2 mayor
5 +1 encima normal
4 0 normal
3 -1 debajo normal
2 -2 menor
1
0
Prioridad Prioridad Prioridad
base del inicial del dinámica
proceso hilo del hilo
Prioridades en
y colas multinivel realimentadas
tiempo real
. .
.
(selecciona el hilo con máxima .
.
.
prioridad de todas las colas)
16
15
Prioridades
variables
14
.
. .
. .
.
.
.
.
0
Í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
Pthreads
int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_destroy (pthread_attr_t *attr);
int pthread_create (pthread_t *thread,
const pthread_attr_t *attr, void *(*func)(void *),
void *arg);
int pthread_exit(void *value);
int pthread_join(pthread_t thid, void **value);
pthread_t pthread_self(void);
int pthread_attr_setdetachstate(pthread_attr_t *attr,
int detachstate);
■ 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
♣ 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
■ 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
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
■ 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);
}
■ 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?
■ 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:
■ Ejercicio 1 (solución):
Solución II:
■ Ejercicio 2:
Desarrollar un algoritmo o un programa que genere una salida similar a la del
comando pstree en el sistema operativo Linux.
■ Ejercicio 3:
Desarrollar un algoritmo o un programa que calcule de la forma más
eficiente posible el número de procesos huérfanos que hay en un sistema
Linux en un instante dado.
■ Ejercicio 4:
Desarrollar un algoritmo o un programa en el que, dado el número de
identificación de un proceso Linux, se muestre el proceso hijo preparado
para ejecución (en estado listo) que lleva más tiempo ejecutándose, ya sea
en modo usuario o supervisor.
■ Ejercicio 5:
Supongamos que, en un instante dado, la lista de procesos preparados para
ejecución de un sistema operativo linux es la que aparece a continuación y
que el proceso en ejecución es el proceso 3. ¿Qué proceso pasaría a
ejecución si se invoca al planificador de linux? Justificar la respuesta.
r er ity
nte nt r rity
u it y u io
co rior co _pr prio
p rt rt_
Proceso init Proceso 1 Proceso 2 Proceso 3 Proceso 4 Proceso 5 Proceso 6 Proceso 7 Proceso 8
... ... ... ... ... ... ... ... ...
Política planificación FIFO OTHER RR FIFO RR RR OTHER FIFO
Prioridad dinámica 20 50 0 25 20 25 20 25
Prioridad estática 20 75 25 25 25 25 20 25
... ... ... ... ... ... ... ... ...
■ Ejercicio 5 (solución):
■ Ejercicio 6:
¿Qué proceso seleccionaría el planificador de linux en un instante dado en
el que hay dos procesos con la máxima prioridad y uno tiene asignada la
política FIFO y otro RR?
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:
■ 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 Other Other FIFO RR FIFO
Prior. Estática 50 40 50 80 60 30 25 50
Prior. Dinámica 50 30 50 75 60 30 20 50
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);
}