jueves, 8 de diciembre de 2011

PrActicA SO

//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
#include
#include
#include
#include
<sys/types.h>
<sys/wait.h>
<unistd.h>
<stdio.h>
<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;
}
return 0;
}

jueves, 1 de diciembre de 2011

Practica 4

 

Disponemos de un disco duro de 20 GB de capacidad. Hay establecida sobre él, una única partición que contiene un sistema de ficheros del tipo FAT32 en el que cada agrupamiento (cluster) consta de 16 sectores de 512 bytes cada uno. ¿Cuántos sectores del disco se necesitarán para almacenar cada copia la FAT? Razona tu respuesta.

En primer lugar se calcula lo que ocupa la FAT, que es el tama˜no del enlace
(32 bits) por el n´umero de entradas de la tabla que, a su vez, es el tama˜no del
disco dividido por el tama˜no del agrupamiento y que en este problema son
20GB/(16 512bytes) = 20 217 entradas. Luego la tabla ocupa 20 217 32bits = 20 219 bytes.
Si se divide lo que ocupa la tabla por el tama˜no del agrupamiento se obtiene
el n´umero de agrupamientos que ocupa la tabla: 20 219/(16 512) = 20 26 = 1280 agrupamientos, que multiplicado por 16, que es el n´umero de
sectores por agrupamiento, se obtiene el n´umero total de sectores que es
20480.

 La policía ha arrestado al sospechoso de un delito. Al analizar el contenido de su ordenador piensan que pueden inculparle pues el contenido del mismo
es el siguiente:


Número  De bloque de datos
Contenido
10
He
11
Sido
12
Yo
13
No
14
Sigan
15
Buscando


Como experto informático, pides consultar el contenido de la FAT, que es el siguiente:



Número  de entrada en la FAT
Contenido
10
11
11
EOF
12
13
13
10
14
15
15
12


¿Apoyarías la opinión de la policía? Razona tu respuesta.

En un sistema de archivos FAT, los bloques se asignan como una lista enlazada
que finaliza con la posici´on fin de lista EOF. Es posible recuperar
datos utilizando los enlaces partiendo desde esa posici´on EOF hacia atr´as.
La reconstrucci´on de la lista de bloques ser´a:
14 15 12 13 10 11 EOF
La informaci´on de esa lista de bloques ser´a:
sigan buscando yo no he sido EOF


#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <pthread.h>
#include <unistd.h>
#include <stdbool.h>
#define MAX 10
#define FIN -1
int
sem t huecos, elementos;
int generar dato (void) { return random() %256;} int numero aleatorio(void) { return random() %100;}void productor (void p) {int
int
n= numero aleatorio();
printf ("Productor con %d datos\n", n);
for
sem wait (&huecos);
buffer[pos productor]= dato;
pos productor= (pos productor+ 1) %MAX;
sem post (&elementos);
}
buffer[pos productor]= FIN;
sem post (&elementos);
pthread exit (NULL);
}void consumidor(void p){int
bool
while
dato= buffer[pos consumidor];
sem post (&huecos);
if
continuar= false;
else
pos consumidor= (pos consumidor+1) %MAX;
}
}
pthread exit (NULL);
}int main (int argc, char argv[]) {pthread t hiloproductor, hiloconsumidor;
sem init (&elementos, 0, 0);
sem init (&huecos, 0, MAX);
pthread create (&hiloproductor, NULL, productor, NULL);
pthread create (&hiloconsumidor, NULL, consumidor, NULL);
pthread join (hiloproductor, NULL);
pthread join (hiloconsumidor, NULL);
sem destroy (&huecos);
sem destroy (&elementos);
return
}
0;
{ printf ("Numero aleatorio: %d\n", dato);
(dato== FIN)
(continuar) { sem wait (&elementos);
continuar= true;
pos consumidor= 0, dato;
sem wait (&huecos);
(num= 0; num< n; num++) { dato= generar dato();
num, dato, n;
pos productor= 0;
buffer[MAX];

jueves, 24 de noviembre de 2011

2da practica SO

//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;
}

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>
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.
 
Ejemplo de 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.
 
Ejemplo de un grafo de recursos.

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).