Procesos III
Procesos III
Procesos III
El proceso se define como un programa en ejecucin. De una forma un poco mas precisa, como la unidad de procesamiento gestionada por el SOp. El Sop. Mantiene por cada proceso una serie de estructuras de informacin que permiten identificar las caracterstica de ste, as como los recursos que tiene asignados. En esta ltima categora entran los descriptores de segmentos de memoria asignados, los descriptores de los archivos abiertos, los descriptores de los puertos de comunicaciones, etc.
Una parte muy importante de estas informaciones se encuentra en el llamado Bloque de Control del Proceso (BCP). El Sop mantiene una tabla de procesos con todos los BCP de los procesos.
Identificador pid Identificador uid Archivos abiertos Segmentos de memoria Temporizadores Seales Semforos Puertos
Contenido de los segmentos de memoria en los que residen el cdigo y los datos del proceso . A esta informacin se le denomina imagen de memoria o Core image. Contenido de los registros del modelo de programacin. Contenido del BCP.
La secuencia de creacin de procesos genera un rbol de procesos. Para referirse a las relaciones entre los procesos de la jerarqua se emplean los trminos de padre, hijo, hermano o abuelo. Cuando el proceso A solicita al SOp. que cree el proceso B, se dice que A es padre de B y que B es hijo de A. bajo esta ptica, la jerarqua de procesos puede considerarse como un rbol genealgico.
Vida de un Proceso
Proceso hijo Proceso padre Proceso hermano Proceso Abuelo Crea Ejecuta Muere o termina
Grupo de Procesos.- el conjunto de procesos creados a partir de un Shell puede formar un grupo de procesos. Tambin pueden formar un grupo los procesos dependientes de un terminal.
Batch o Background: No esta asociado a ningn terminal, Toma los datos de un archivo y los deja en otro. Interactivo: Esta asociado a un terminal. Coge informacin del usuario y da una contestacin.
El entorno del proceso consiste en un conjunto de variables que se le pasan al proceso en el momento de su creacin. El entorno esta formado por una tabla NOMBRE_VALOR que se incluye en la pila del Proceso. Se establece:
El NOMBRE especifica el nombre de la variable. Y el VALOR su valor. Por defecto. Mediante mandatos del shell ( export) Mediante API de SO (putenv, getenv)
Ejemplo: PATH=/usr/bin:/home/pepe/bin TERM=vt100 HOME=/home/pepe PWD=/home/pepe/libros/primero PATH.- indica la lista de directorios en los que el SOp busca los programas ejecutables, TERM.- el tipo de terminal, HOME.- el directorio inicial asociado al usuario y el PWD.- el directorio de trabajo actual.
Facilita la programacin, dividiendo los programas en procesos (modularidad). Permite prestar un buen servicio, atendiendo a varios usuarios de forma eficiente, interactiva y simultanea. Aprovecha los tiempos que los procesos pasan esperando a que se completen sus operaciones de E/S. Aumenta el uso de la CPU, al aprovechar los espacios de tiempo que los procesos estn bloqueados.
A mayor Grado de multiprogramacin se tiene mayores necesidades de memoria. En un sistema sin memoria virtual los procesos activos han de residir totalmente en memoria principal. El grado de multiprogramacin viene limitado por el tamao de los procesos y por la memoria disponible.
En los sistemas con memoria virtual es mas complejo, puesto que los procesos solo tienen en memoria principal su conjunto residente, lo que hace que quepan mas procesos. Sin embargo al aumentar el nmero de procesos disminuye el conjunto residente de cada uno. Xq al tomar un conjunto residente exige RAM para el almacenamiento del proceso proveniente de Disco (sobreescribiendo en los espacios de los demas conjuntos residentes de otros proceso) Cuando el conjunto residente de un proceso se hace menor de un determinado valor ya no representa adecuadamente al futuro conjunto de trabajo del proceso, lo que tiene como consecuencia que se produzcan muchos fallos de pagina. Cada fallo de pgina consume tiempo de procesador, por que el Sop ha de tratar el fallo, y tiempo de E/S, puesto que hay que hacer una migracin de paginas.
Cuando la memoria principal disponible es pequea, se llega a la situacin de hiperpaginacin (trashing), antes de alcanzar una cota alta de utilizacin del procesador. Para aumentar el rendimiento de un sistema que este en esta situacin es necesario aadir mas memoria principal. Cuando la memoria es grande se llega a saturar el procesador con menos procesos de los que caben en memoria. En este caso se puede aumentar el rendimiento del sistema manteniendo la memoria pero aumentando la potencia del procesador o aadiendo otro procesador.
El Proceso es la Unidad de procesamiento gestionada por el Sop. Para realizar este cometido el proceso tiene asociado una serie de elementos de informacin organizados en tres grupos:
Estado del procesador: contenido de los registros del
modelo de programacin. Imagen de memoria del proceso: contenido de los segmentos de memoria en los que reside el cdigo y los datos del proceso. Contenido del bloque de control del proceso BCP.
tambin se incluyen aqu. Contador de programas Puntero de pila Registros de estado Registros especiales. RIED (Reg. Identificador de Espacio de Direcciones)
Cuando un proceso esta ejecutndose su estado reside en los registros del computador. Cuando un proceso no ejecuta su estado reside en el BCP.
La imagen de memoria esta formada por los espacios de memoria que un proceso esta autorizado a utilizar. Principales caractersticas:
Si un proceso genera una direccin que esta fuera del
espacio de direcciones, el HW de proteccin deber detectarlo y levantar una excepcin (TRAP). La imagen de memoria dependiendo del computador puede esta referida a memoria virtual o fsica. Asignacin de Memoria contempla la modificacin de la imagen de memoria y la asignacin de marcos de memoria es de aplicacin en los sistemas con memoria virtual y se refiere a la modificacin del conjunto residente del proceso.
Los mecanismos de proteccin de memoria deben evitar que un programa en ejecucin direccione posiciones de memoria que no le hayan sido asignadas por el sistema operativo. Solucin en mquinas sin memoria virtual es incluir una pareja de registros valla
Memoria Principal
el proceso. Datos. Cada programa estructura sus datos de acuerdo a sus necesidades.
Datos con valor inicial Datos sin valor inicial Datos dinmicos
en memoria.
El modelo tradicional usado en UNIX contempla 3 segmentos: texto, pila y datos. Observe que el segmento de texto es de tamao fijo ( el programa habitualmente no se modifica) y que los segmentos de pila y de datos crecen en direcciones contrarias. Este modelo se adapta bien a los sistemas con memoria virtual, puesto que el espacio virtual reservado no existe, para que puedan crecer los segmentos de datos y pila. Solamente se crea, gastando recursos de disco y memoria, cuando se asigna.
Este modelo es mas avanzado que la anterior, al permitir que existan los segmentos que desee el proceso. El ejemplo presenta un caso de siete segmentos que podrn ser de texto, de pila o de datos. Es la solucin mas flexible y, por tanto, la utilizada en los Sop modernos como Win NT y las versiones actuales de UNIX
La preparacin del cdigo de un proceso, tambin llamado texto del proceso, sigue los siguientes pasos.
El SOp. Mantiene una serie de tablas que describen los procesos y a los recursos del sistema. La informacin asociada a cada proceso se encuentra parcialmente en el BCP y parcialmente fuera de l.
Cuando la informacin ha de ser compartida por varios procesos, no ha de residir en el BCP, que es de acceso restringido al proceso que lo ocupa. A lo sumo, el BCP contendr un apuntador que permita alcanzar esa informacin.
Consiste en completar todas las informaciones que lo constituyen, mas especifico, las operaciones que debe hacer el Sop son las siguientes: Asignar un espacio de memoria para albergar la imagen de memoria. Sera virtual y compuesto por varios segmentos. Seleccionar un BCP libre de la tabla de procesos. Rellenar el BCP con la informacin de identificacin del proceso, descripcin de la memoria asignada, con los valores iniciales de los registros indicados en el archivo objeto, etc. Cargar en el segmento de texto, el cdigo mas las rutinas del sistema y en el segmento de datos los datos iniciales contenidos en el archivo objeto. Crear en el segmento de pila, la pila inicial del proceso. Una vez completada toda la informacin del proceso, se puede marcar como listo para ejecutar, de forma que el planificador, cuando lo considere oportuno, lo seleccione para su ejecucin.
Ejecucin.- El proceso esta siendo ejecutado por el procesador, es decir, esta en fase de procesamiento y el estado del proceso reside en los registros del procesador. Bloqueado.- un proceso bloqueado esta esperando a que ocurra un evento y no puede seguir ejecutando hasta que suceda el evento es cuando el proceso solicita una operacin de E/S, hasta que no termina esta operacin el proceso queda bloqueado, en esta fase el estado del proceso reside en el BCP. Listo.- un proceso esta listo para ejecutar cuando puede entrar en fase de procesamiento. Dado que puede haber varios procesos en este estado, una de las tareas del sistema operativo ser seleccionar aquel que debe pasar a ejecucin y esto lo realiza el modulo Planificador del Sop. En esta fase el estado del proceso reside en el BCP.
proceso en ejecucin. Del estado de ejecucin se pasa al estado de bloqueado al solicitar una operacin de E/S. Tambin puede pasar del estado de ejecucin al estado de listo cuando el Sop decide que ese proceso lleva mucho tiempo en ejecucin. Del estado de bloqueado pasa al estado del listo cuando se produce el evento por el que estaba esperando el proceso (cuando se completa la operacin de E/S solicitada)
Los procesos entran en el sistema porque lo solicita un proceso de usuario o porque esta prevista su ejecucin Batch. Es frecuente tener una lista de procesos Batch en espera para ser ejecutados cuando se pueda. El sistema operativo ha de ir analizando dicha lista para lanzar la ejecucin de los procesos a medida que disponga de los recursos necesarios. Los procesos salen del sistema cuando mueren, es decir, al ejecutar el servicio correspondiente o al producir algn error irrecuperable. El SOp. Puede suspender algunos procesos, lo que implica retirar sus marcos de pginas, dejndolos en la zona de intercambio. El objetivo es dejar suficiente memoria a los procesos no suspendidos para que su conjunto residente tenga un tamao adecuado que evite la hiperpaginacin. Los procesos Batch que entran en el sistema lo hacen pasando al estado listo o al de listo suspendido.
Hilos a nivel de usuario Se usan aplicaciones o bibliotecas de hilos para manejarse (Creacin, destruccin, planificacin). El S.O. no conoce la existencia de los hilos (Unix) Existe un nico hilo por proceso Hay un paquete de hilos que corre en el espacio del usuario Hilos a nivel de Kernel El sistema operativo conoce la existencia de los hilos. El planificador no selecciona procesos para ser ejecutados sino hilos. El hilo seleccionado puede pertenecer al mismo proceso o a un proceso diferente
Web browser Un Hilo decodifica la pgina y la presenta en Pantalla. Un Hilo toma los datos de la pgina de Internet. Procesador de Texto. Un Hilo despliega en Pantalla la interfaz. Un Hilo toma los datos del Teclado. Un Hilo revisa la ortografa. Servidor Web Un Hilo acepta peticiones de los clientes. Para cada peticin recibida se crea un Hilo que la atiende. Usa muchos Hilos para atender en paralelo a muchos clientes.
Un proceso ligero o thread es un programa en ejecucin que comparte la imagen de memoria y otras informaciones con otros procesos ligeros Un proceso puede contener un solo flujo de ejecucin, como ocurre en los procesos clsicos, o mas de un flujo de ejecucin (procesos ligeros).
Un proceso ligero se define como una funcin cuya ejecucin se puede lanzar en paralelo con otras. El hilo de ejecucin primario, o de proceso ligero primario, corresponde a la funcin main
Cada proceso ligero tiene informaciones que le son propias y que no comparte con otros proceso ligeros, las informaciones propias se refieren fundamentalmente al contexto de ejecucin, pudindose destacar las siguientes:
Contador de programa Pila Registros Estado del proceso ligero (ejecutando, listo o bloqueado)
Todos los proceso ligeros de un mismo proceso comparten la informacin del mismo, es decir:
Espacio de memoria
Variables globales
Archivos abiertos Procesos hijos
Temporizadores
Seales y semforos Contabilidad
El estado del Proceso P es la combinacin de los estados de sus Hilos. Cuando cualquiera de los Hilos est en estado Ejecutando, el estado de P ser Ejecutando. Si ningn Hilo est en Ejecutando, y alguno est en Listo, el estado de P ser Listo. El estado de P es Bloqueado slo si todos sus Hilos estn en estado Bloqueado.
Cada proceso ligero de un proceso tiene su propio estado bloqueado, listo o en ejecucin. El estado del proceso ser la combinacin de los estados de sus procesos ligeros. Ej: si tiene un proceso ligero en ejecucin, el proceso esta en ejecucin.
Los procesos ligeros permiten ejecutar una aplicacin en paralelo. Un programa puede dividirse en procedimientos que se ejecutan de forma independiente, el mecanismo de los procesos ligeros permite lanzar simultneamente la ejecucin de todos ellos. De esta forma se consigue que el proceso avance mas rpidamente.
La base del paralelismo estriba en que, mientras un proceso ligero esta bloqueado, otro puede ejecutar.
Permite separacin de tareas. Cada tarea se puede encapsular en un proceso ligero independiente. Facilita la modularidad, al dividir trabajos complejos en tareas. Aumenta la velocidad de ejecucin de trabajo, puesto que aprovecha los tiempos de bloqueo de unos procesos ligeros para ejecutar otros. El paralelismo que permiten los procesos ligeros unido a que comparten memoria (utilizan variables globales que ven todos ellos) permite la programacin concurrente.
El objetivo es el reparto del tiempo de procesador entre los procesos que puede ejecutar. Planificador: selecciona el proceso en estado listo y pasa a estado de ejecucin. Activador: pone en ejecucin el proceso planificado.
A largo plazo: aade nuevos procesos al sistema de la lista de espera. En los que no importa cuando se ejecuten. A mediano plazo: trata la suspensin de procesos, decide que procesos pasan a suspendido y cuales dejan de estar suspendidos. A corto plazo: selecciona el proceso en estado de listo pasando a estado de ejecucion.
Reparto equitativo del procesador Eficiencia (optimizar el uso de procesador) Menor tiempo de repuesta en uso interactivo Menor tiempo de espera en lotes (batch) Mayor numero de trabajos por unidad de tiempo (batch) Cumplir los plazos de ejecucin de un sistema de tiempo real.
La colas de proceso se construyen con unas cabeceras y con unos punteros que estn incluidos en los BCP.
El programador encierra dentro del bloque TRY el fragmento de cdigo que quiere proteger de la generacin de excepciones. En el Bloque EXCEPT sita el manejador de excepciones. En caso de generarse una excepcin en el bloque TRY, el Sop transfiere el control al bloque EXCEPT que se encargara de manejar la correspondiente excepcin.
Se invoca el servicio FORK. El Sop trata este servicio realizando una clonacin del proceso que lo solicite. El proceso que solicita el servicio se convierte en el proceso padre del nuevo proceso, que es, a su vez, el proceso hijo. El prototipo de esta funcin es: pid_t fork()
La llamada fork() crea una copia (hijo) del proceso que la invoca El hijo hereda del padre:
El hijo no hereda:
Definida en:
#include <sys/types.h> pid_t fork(void);
Valores de retorno:
Al padre: el PID del hijo Al hijo: cero En caso de error: devuelve -1 y la variable errno
#include <sys/types.h> int main(void) { pid_t id; id = fork(); if (id == -1) { perror (Error en el fork); exit (1); } if (id == 0) { while (1) printf (Hola: soy el hijo\n); } else { while (1) printf (Hola: soy el padre\n); } } /* Fin de main */
01) (02) (03) 04) (05) (05) (06) (07) (08) (09) (10) (11) (12) 13) (14) (15) (16) (17) (18)
#include <unistd.h> #include <sys/types.h> #include <stdio.h> ( int main() { pid_t pid; int i; pid = fork(); if (pid == 0){ for (i = 0; i < 8; i++){ printf("-Hijo-\n"); } return(0); ( } for (i = 0; i < 8; i++){ printf("+Padre+\n"); } return(0); }
Las lineas nmero (01)-(03) contienen los includes de las libreras necesarias (E/S estndar, multitarea). El main (como siempre en GNU), devuelve un entero, que es normalmente cero si el programa llega al final sin errores o un cdigo de error si va algo mal; Luego definimos un tipo de dato para contener un pid (05) y un entero para usarlo como contador del bucle (06). Estos dos tipos, como se dijo antes, son idnticos, pero estn ah para mayor claridad. En la linea (07) llamamos a la funcin fork, la cual devolver cero al programa ejecutado en el proceso hijo y el pid del proceso hijo al padre; la comprobacin est en la linea (08). Ahora el cdigo de las lineas (09)-(13) se ejecutarn en el proceso hijo, mientras que el resto (14)-(16) las ejecutar el padre. Las dos partes simplemente escriben 8 veces en la salida estndar la palabra "-Hijo-" o "+Padre+", dependiendo en que proceso se ejecuta, y luego termina devolviendo 0. Esto es verdaderamente importante, ya que sin este ltimo "return" el proceso hijo, una vez que el bucle termine, seguir ejecutando el cdigo del padre
El proceso hijo tiene su propio identificador(PID). El proceso hijo tiene una nueva descripcin de la memoria. Aunque el hijo tenga los segmentos con el mismo contenido, no tienen por que estar en la misma zona de memoria. El tiempo de ejecucin del proceso hijo es igual a cero. Todas la alarmas pendientes se desactiva en el proceso hijo. El conjunto de seales pendientes se pone en cero. El valor que retorna el sistema operativo como resultado de fork() es distinto en el hijo que el padre (el hijo recibe un 0 y el padre el PID del hijo).
#include <sys/types.h> #include <stdio.h> #include <unistd.h> #include <sys/wait.h> int main(){ pid_t pid; pid = fork(); if(pid==-1) /* error del fork() */ printf(Error\n); else if(pid==0) printf("Soy el HIJO, Proceso %d; padre = %d \n", getpid(), getppid()); else printf("Soy el PADRE, Proceso %d\n", getpid()); }
// En cada ejecucin del bucle crea un proceso. El proceso padre obtiene el // identificador del hijo, que ser distinto de cero y saldr del bucle utilizando la sentencia break. El proceso hijo continuar la ejecucin, repitindose // este proceso hasta que se llegue al final del bucle
#include <sys/types.h> #include <stdio.h> #include <unistd.h> int main() { pid_t pid; int i; int n = 10; for (i = 0; i < n; i++){ pid = fork(); if (pid != 0) break; } printf("El padre del proceso %d es %d\n", getpid(), getppid()); }