//Estudia el siguiente codigo y escribe la jerarquia de procesos resultante. Despues, compila y ejecuta el codigo para comprobarlo (deberas añadir llamadas al sistema getpid, getppid y wait para conseguirlo).
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#define L1 2
#define L2 3
int main(int argc, char *argv[]) {
int cont1, cont2;
pid_t pid;
for (cont2= 0; cont2< L2; cont2++) {
for (cont1= 0; cont1< L1; cont1++) {
pid= fork();
if (pid== 0)
break;
}
if (pid!= 0)
break;
}
printf ("Soy el proceso de PID %d y mi padre tiene %d de PID.\n",getpid(), getppid());
if (pid!= 0)
for (cont1= 0; cont1< L1; cont1++)
printf ("Fin del proceso de PID %d.\n", wait (NULL));
return 0;
}
jueves, 24 de noviembre de 2011
Pratica 1 (3ºer parcial)
Dibuja la jerarquía de procesos que resulta de la ejecución del siguiente código. Introduce las llamadas al sistema wait para que una vez generado el árbol de procesos los hijos sean esperados por sus respectivos padres. Ademas, haz que se informe de los tiempos de ejecución de las aplicaciones xload y kcalc que se generen así como del tiempo total de ejecución. Para calcular el tiempo transcurrido, puedes utilizar la función´ time() de la librería estándar time.h. La llamada time(NULL) devuelve los segundos transcurridos desde las 00:00:00 del 1/1/1970 hasta el instante de la llamada.
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char ∗argv[]) {
int i, j;
pid t pid, nuevo, nuevo1;
time t ini, fin;
for (i= 0; i< 2; i++){
pid= getpid();
for (j= 0; j< i+2; j++){
nuevo= fork();
if(nuevo== 0){
break;
nuevo1= fork();
if(nuevo1== 0)
execlp ("xload", "xload", NULL);
}
}
if (pid!= getpid())
execlp ("kcalc", "kcalc", NULL);
}
return 0;
}
sábado, 12 de noviembre de 2011
Concepto de Procesos
2.1 Concepto de Procesos | |
Todos los programas cuya ejecucion solicitan los usuarios, se ejecutan en forma de procesos, de ahi la importancia para le informatico de conocerlos en detalle. El proceso se puede definir como un programa de gestion por el sistema operativo. Durante su eleccion el proceso va modificando en ejecucion y, de una forma un poco mas precisa, como la unidad de procesamiento los registro del modelo de programacion de la computadora, de acuerdo a las intrusiones de maquina involucradas. El sistema operativo mantiene por cada proceso una serie de estructuras de informacion que permiten identificar las caracteristicas de este, asi como los recursos que tiene asignados. En esta ultima categoria entran los descriptores de los segmentos de memoria asignados, los descriptores de los archivos abiertos, los descriptores de los puertos de comunicaciones, etc. Una parte muy importante de esta informacion se encuentra normalmente como en el llamado bloque de control de procesos (BCP). El sistema operativo mantiene una tabla de procesos con todos los BCP de los procesos. Por razones de eficiencia, la tabla de procesos se construyen normalmente como una estructura estática, que tiene un determinado numero de BCP, todos ellos del mismo tamaño. La información que compone un proceso es la siguiente: r Contenido de los segmentos de memoria en los que residen el código y los datos del proceso. A esta información se le denomina imagen de memoria o core imagen. r Contenido de los registros del modelo de programación r Contenido del BCP. | |
2.2 Estado y Transiciones del Proceso | |
Como se indico anteriormente, el proceso es la unidad de procesamiento gestionada por el sistema operativo. Para poder realizar este cometido, el proceso tiene asociado una serie de elementos de información, que se resumen en la Figura 3.8, que se analizan seguidamente. Estos elementos se organizan en tres grupos: estado del procesador, imagen de memoria y tablas del sistema operativo. Estado del procesador El estado del procesador esta formado por el contenido de todos sus registros, que se enumeran seguidamente: · Registros generales. De existir registros específicos de coma flotante también se incluyen aquí. · Contador de programa. Información del proceso · Puntero de pila. · Registro o registros de estado. · Registros especiales. Como puede ser el RIED (registro identificador de espacio de direccionamiento). El estado del procesador de un proceso reside en los registros del procesador, cuando el proceso esta en ejecución, o en el bloque de control de proceso (BCP), cuando el proceso no esta en ejecución. Cuando el proceso esta ejecutando, el estado del procesador varia de acuerdo al flujo de instrucciones maquina ejecutado. En este caso, la copia del estado del procesador que reside en el BCP no esta actualizada. Téngase en cuenta que los registros de la maquina se utilizan para no tener que acceder a la información de memoria, dado que es mucho mas lenta. Por tanto, no tiene sentido plantear que, en cada modificación de un registro, se actualice su valor en el BCP, puesto que esta en memoria. Sin embargo, cuando se detiene la ejecución de un proceso, como consecuencia de la ejecución de una interrupción, es muy importante que el sistema operativo actualice la copia del estado del procesador en su BCP. En términos concretos, la rutina del sistema operativo que trata las Interrupciones lo primero que ha de hacer es salvar el estado del procesador en el BCP del proceso interrumpido. | |
2.4 Concurrencia y Secuenciabilidad | |
Los procesos son concurrentes si existen simultáneamente. Los procesos concurrentes pueden funcionar en forma totalmente independiente unos de otros, o pueden ser asíncronos, lo cual significa que en ocasiones requieren cierta sincronizan o cooperación. Cuando dos o mas procesos llegan al mismo tiempo a ejecutarse, se dice que se ha presentado una concurrencia de procesos. Es importante mencionar que para que dos o mas procesos sean concurrentes , es necesario que tengan alguna relación entre ellos como puede ser la cooperación para un determinado trabajo o el uso de información o recursos compartidos, por ejemplo: en un sistema de un procesador , la multipropiedad es una condición necesaria pero no suficiente para que exista concurrencia, ya que los procesos pueden ejecutarse de forma totalmente independiente. Por otro lado en un sistema de varios procesos se puede presentar la concurrencia siempre y cuando las actividades necesiten actuar entre si ya sea para utilizar información en común o para cualquier otra cosa. Existen tres formas modelos de computadora en los que se puede pueden ejecutar procesos concurrentes: Multiprogramacion con un único procesador. En este modelo todos los procesos concurrentes ejecutan sobre un único procesador. El sistema operativo se encarga de ir repartiendo el tiempo del procesador entre los distintos procesos, intercalando la ejecución de los mismos para dar así una apariencia de ejecución simultanea. Multiprocesador. Un Multiprocesador es una maquina formada por un conjunto de procesadores que comparten memoria principal. En este tipo de arquitecturas, los procesos concurrentes no solo pueden intercalar su ejecución sino también superponerla. En este caso si existe una verdadera ejecución simultanea de procesos, al coincidir las fases de procesamiento de distintos procesos. En un instante dado se pueden ejecutar de forma simultanea tantos procesos como procesadores haya. Multicomputadora. Una multicomputadora es una maquina de memoria distribuida, en contraposición con el Multiprocesador que es de memoria compartida. Esta formada por una serie de computadoras completas con su UCP, memoria principal y, en su caso, periferia. Cada uno de estos procesadores completo se denomina nodo. Los nodos se encuentran conectados y se comunican entre si a través de una red de interconexion, empleando el método de paso de mensajes. En este tipo de arquitecturas también es posible la ejecución simultanea de los procesos sobre los distintos procesadores. En general la concurrencia sera aparente siempre que el numero de procesos sea mayor que el de procesadores disponibles, es decir, cuando haya mas de un proceso por procesador. La concurrencia sera real cuando haya un proceso por procesador | |
2.4.3 Interbloqueo (DeadLock) | |
El estancamiento se puede definir formalmente como sigue: "Un conjunto de procesos se estancan si cada proceso del conjunto esta esperando un evento que solo otro proceso del conjunto puede provocar". Puesto que todos los procesos están en espera, ninguno de ellos podrá ocasionar nuca ninguno de los eventos que podrían desbloquear a algunos de los otros miembros del conjunto y todos los procesos seguirán esperando indefinidamente. Definición de Abrazo Mortal Un conjunto de procesos esta en un abrazo mortal cuando todos los procesos en ese conjunto están esperando un evento que solo puede ser causado por otro proceso en el conjunto. Los eventos a los cuales nos estamos refiriendo son concernientes con la asignación y liberación de recursos principalmente. Sin embargo, otro tipo de eventos pueden llevar a la existencia de abrazos mortales. Para ejemplificar un estado de abrazo mortal, considere un sistema con tres unidades de disco. Suponga que existen tres procesos, cada uno de ellos tiene asignada una de las unidades de disco. Si ahora cada proceso pide otra unidad de disco, los tres procesos se encuentran ahora en un estado de abrazo mortal. Cada uno esta esperando el evento "unidad de disco liberada", lo cual solo puede ser causada por alguno de los otros procesos en espera. Este ejemplo ilustra un abrazo mortal involucrando procesos compitiendo por el mismo tipo de recurso. Los abrazos mortales pueden también involucrar diferentes tipos de recursos. Por ejemplo, considere un sistema con una impresora y una unidad de disco. Suponga que el proceso A tiene asignada la unidad de disco y que el proceso B tiene asignada la impresora. Ahora, si A pide la impresora y B pide la unidad de disco, ocurre un abrazo mortal. Debe ser obvio que un abrazo mortal es una condición indeseable. En un abrazo mortal, los procesos nunca terminan de ejecutarse y los recursos del sistema esta amarrados, evitando que otros procesos puedan siquiera empezar.? Antes de discutir varios métodos para manejar el problema de los abrazos mortales, seria útil describir algunas de las propiedades que los caracterizan. Condiciones Necesarias Según Conforman (1971), existen cuatro condiciones que deben cumplirse para que haya estancamiento. Una situación de abrazo mortal puede surgir si y solo si las siguientes cuatro condiciones ocurren simultáneamente en un sistema: 1. Exclusión Mutua. Cada recurso se asigna por lo regular exactamente a un proceso o bien esta disponible. Al menos un recurso es mantenido en un modo no-compartible; esto es, solo un proceso a la vez puede usar el recurso. Si otro proceso solicita ese recurso, tiene que ser retardado hasta que el recurso haya sido liberado. 2. Retener y Esperar. Los procesos que regularmente contienen recursos otorgados antes pueden solicitar nuevos recursos. Debe existir un proceso que retenga al menos un recurso y este esperando para adquirir recursos adicionales que están siendo retenidos por otros procesos. 3. No existe el derecho de des-asignar (No preemtion). Los recursos previamente otorgados no pueden extraerse por la fuerza de un proceso. Deben ser liberados explicita mente por el proceso que los contiene. Los recursos no pueden ser des-asignadoss (preempted); esto es, un recurso solo puede ser liberado voluntariamente por el proceso que lo retiene,despuéss de que el proceso ha terminado su tarea. 4. Espera Circular. Debe haber una cadena de dos o mas procesos, cada uno d los cuales este esperando u recurso contenido en el siguiente miembro de la cadena. Debe existir un conjunto {p0, p1, ...,pn} de procesos en espera tal que p0 este esperando por un recurso que esta siendo retenido por p1, p1 esta esperando por un recurso que esta siendo retenido por p2, ..., pn-1 esta esperando por un recurso que esta siendo retenido por pn y pn esta esperando por un recurso que esta siendo retenido por p0. Enfatizamos que las cuatro condiciones deben de cumplirse para que pueda ocurrir un abrazo mortal. La condición de espera circular implica la condición de retener y esperar, de tal manera que las cuatro condiciones no son totalmente independientes. Sin embargo, puede ser útil el considerar cada condición por separado. Una forma de modelar estas condiciones es usando un grafo de recursos: los círculos representan procesos, los cuadrados recursos. Una arista desde un recurso a un proceso indica que el recurso ha sido asignado al proceso. Una arista desde un proceso a un recurso indica que el proceso ha solicitado el recurso, y esta bloqueado esperándolo. Entonces, si hacemos el grafo con todos lo procesos y todos los recursos del sistema y encontramos un ciclo, los procesos en el ciclo están bajo bloqueo mutuo. Métodos para manejar los abrazos mortales Principalmente, existen dos métodos para manejar el problema de los abrazos mortales. Podemos usar algún protocolo para asegurar que el sistema nunca entrara en un estado de abrazo mortal. Alternativamente, podemos permitir que el sistema entre en un estado de abrazo mortal y después recuperarnos. Como podremos ver posteriormente, el recuperarse de un abrazo mortal puede ser muy difícil y muy caro. Por ello, primeramente consideraremos los métodos para asegurar que no ocurran los abrazos mortales. Comúnmente, existen dos métodos: El de PREVENCION de abrazos mortales (Deadlock Prevention) y el de EVASION de abrazos mortales (Deadlock Avoidance). |
Suscribirse a:
Entradas (Atom)