Qué es un proceso?
Consiste
Espacio de direccionamiento
Código a ejecutar
Datos estáticos y dinámicos
Pila o stack
CPU: PC, SP y valores en registros de propósito general
Conjunto de recursos
Archivos, pipes, conecciones,etc
Concurrencia y paralelismo
Imaginar un servidor web que requiere manejar múltiples requerimientos concurrentemente
Mientras verifica la tarjeta de crédito de un cliente, podría recuperar de disco la información para otro cliente o realizar una búsqueda para otro
Imaginar un cliente web (web browser) que desee realizar múltiples requerimientos simultaneamente
Múltiples búsquedas, lectura de mails, chat, etc
Imaginar un programa paralelo ejecutándose en un multiprocesador, el cual no necesite concurrencia en términos de la multiplexación de una CPU
Ejemplo típico, multiplicación de matrices, dividir las matrices en un k regiones y calcular la multiplicación de las k regiones en k CPUs
Que se necesita?
En cada uno de ejemplos por separado
Todos los requerimientos quieren ejecutar el mismo código
Gran parte de los datos son los mismos (excepto caso paralelo)
Todos tienen los mismos privilegios
Todos usan los mismos recursos (archivos abiertos y conecciones)
Nos gustaría tener múltiples estados de ejecución
Cada estado de ejecución requiere
Estado en CPU
Pila de ejecución y su puntero SP
PC, indicando próxima instrucción a ejecutar
Conjunto de valores de registros de propósito general
Podemos hacer esto con procesos
Podríamos crear varios procesos con fork() y hacer que cada uno atienda un requerimiento?
Al crearse un proceso hijo
Desempeño
No tan bueno, porque SO ocupa tiempo y memoria para crear tabla de página y PCB de hijo
Sin embargo, SO no copia datos y código, sino que sólo hace que tablas de páginas de procesos apunten a lo mismo
COW (Copy On Write) : SO asigna memoria a proceso hijo cuando desea escribir.
Podemos hacerlo mejor
Idea
Separar concepto de proceso (espacio de direccionamiento, estado CPU, recursos)
Que es lo mínimo que necesitamos para identificar un estado de ejecución?
Estado de CPU. A esto se le llama hebra de control
Incluye estado PC,SP y valores registros generales
También se le llama proceso liviano
Hebras y procesos
Mayoría de SOs modernos (Mach, NT, Unix, Linux) soportan:
Proceso, el cual define espacio de direccionamiento y recursos como archivos abiertos, conecciones, etc
Hebra, define un flujo de ejecución secuencial dentro de un proceso
Una hebra vive dentro de un proceso
Múltiples hebras pueden vivir en un proceso
Compartir datos entre hebras es barato, comparten mismo espacio de direccionamiento
Crear hebras es rápido, manipulación del espacio de direccionamiento y estructura de datos de SO que conoce de hebras
Hebras pueden pasar a ser unidades planificables por SO
Procesos pasan a ser contenedores de hebras
Hebras en sistemas/lenguajes disponibles
Espacio direcc.
hebra
Una hebra/proceso
Muchos procesos
Muchas hebras/proceso
Muchos procesos
Una hebra/proceso
Un proceso
Muchas hebras/proceso
Un proceso
MS/DOS
Java
UNIX
antiguos
Mach, NT,
Linux, .
clave
Proceso ayer/hoy
(Gp:) código
(text segment)
(Gp:) Datos estáticos
(data segment)
(Gp:) heap
(mem dinámica)
(Gp:) stack
(mem dinámica)
(Gp:) SP
(Gp:) PC
0x00000000
0xFFFFFFFF
Espacio de
direccionamiento
código
(text segment)
Datos estáticos
(data segment)
heap
(mem dinámica)
Stack hebra 1
PC (H2)
SP (H2)
Stack hebra 2
Stack hebra 3
SP (H1)
SP (H3)
PC (H1)
PC (H3)
Proceso
Hebras
Separación Hebra/proceso
Multithreading (concurrencia) útil para:
Manejar eventos concurrentemente
Cuál es la ganada en una CPU?
Construir programas paralelos
Hebras se ejecutan en distintas CPUs
Mejorando estructura de programas
En lugar de crear múltiples procesos concurrentes crear múltiples hebras concurrentes
Más rápido / menos memoria / más fácil compartir
Quién crea/maneja hebras?
Opción 1: Hebras de Kernel (SO)
Llamadas a sistema permiten creación
Asignar stack de ejecución dentro del espacio de direccionamiento de un proceso
Crear e inicializar un TCB
SP, PC, registros
Planificación de hebras realizada por OS
Página siguiente |