PROCESOS
Un proceso es un programa en ejecución, que se ejecuta secuencialmente (no más de una
instrucción a la vez).
El proceso es una abstracción creada por el SO, que se compone de:
Identificación del proceso.
Identificación del proceso padre.
Información sobre el usuario y grupo.
Estado del procesador.
Información de control de proceso.
Información del planificador.
Segmentos de memoria asignados.
Recursos asignados
Dos niveles de procesos:
procesos pesados
procesos ligeros o hilos
PROCESO PESADO FORK()
Un proceso pesado contiene uno o varios hilos que comparten la misma memoria y recursos.
¿Quién implementa los hilos?
el sistema operativo
el programa de usuario
La llamada fork() crea una copia (hijo) del proceso que la invoca
El hijo hereda del padre:
Estado
Semáforos
Objetos de memoria
Política de planificación, etc.
El hijo no hereda:
El PID
Alarmas y temporizadores
Operaciones de E/S asíncronas
Problemas:
Copia de todos los recursos del proceso.
Coste de comunicaciones entre procesos
PROCESO LIGERO THREAD
Un hilo o proceso ligero es una unidad básica de ejecución, con su propio:
contador de programa
registros de CPU n pila (stack)
Los hilos dentro de una misma aplicación comparten:
código y datos
recursos del S.O. (ficheros, E/S, etc.)
Un thread es un flujo de control perteneciente a un proceso (a veces se habla de tareas con
threads)
Se les suele denominar también procesos ligeros, hebras, hilos, etc.
La sobrecarga debida a su creación y comunicación es menor que en los procesos pesados
Cada hilo pertenece a un proceso pesado
Todos los hilos comparten su espacio de direccionamiento
Cada hilo dispone de su propia política de planificación, pila y contador de programa
Soluciona:
Solo hay una copia de las variables compartidas.
Sin coste de comunicaciones entre procesos.
Beneficios:
Explotación del paralelismo
Explotación de concurrencia (I/O)
Estilo de programación
Inconvenientes:
Overhead por creación de threads
Sincronización: más bloqueos al haber más threads
Colisiones en el acceso a memoria
Más difícil la depuración: debuggers, trazadores, puntos de ruptura, repreducción de la
ejecución,
Uso de programación con threads:
Computación intensiva
Varios procesadores
Solapamiento computación y I/O
Aplicaciones servidor distribuidas
Operaciones con procesos ligeros
Creación y destrucción
Sincronización
Gestión de prioridades
Gestión de señales
Gestión de memoria
Se pueden utilizar todas las funciones incluidas en POSIX.1 y POSIX.1b
La interfaz de hilos POSIX es pthreads, aunque existen otras bibliotecas de hilos
Crear un nuevo hilo:
int pthread_create (pthread_t *thread,
pthread_attr_t *attr,
void *(*start)(void *),
void *arg);
En thread devuelve el identificador de hilo
attr es un puntero a los atributos de la tarea
El tercer argumento en un puntero a la función que ejecutará el hilo
arg es un puntero a los argumentos del hilo