jueves, 1 de diciembre de 2011

Practica de 01-12-2011 números aleatorios

Elaborado por Raul Lopez  Bautista. 

55. 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ño del enlace (32 bits) por el número de entradas de la tabla que, a su vez, es el tamaño del disco dividido por el tamaño del agrupamiento y que en este problema son 20GB/(16 512bytes) = 20 217 entradas. Luego la tabla ocupa 20 219 32bits = 20 219 bytes.

Si se divide lo que ocupa la tabla por el tamaño del agrupamiento se obtiene el número de agrupamientos que ocupa la tabla: 20 219/(16 512) = 20

26 = 1280 agrupamientos, que multiplicado por 16, que es el número de sectores por agrupamiento, se obtiene el número total de sectores que es 20480.

56. 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ón fin de lista EOF. Es posible recuperar datos utilizando los enlaces partiendo desde esa posición EOF hacia atrás.
La reconstrucción de la lista de bloques será:

14 15 12 13 10 11 EOF

La información de esa lista de bloques será:

Sigan buscando yo no he sido EOF

PANTALLAS  DEL PROGRAMA





miércoles, 23 de noviembre de 2011

jerarquia de procesos con xload y kcalc

Elaborado por: Raul Lopez Bautista
practica 1 del tercer parsial de SO

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.





jueves, 13 de octubre de 2011

Diferencia entre FIFO y LIFO

FIFO
Primero en entrar, primero en salir, es un concepto utilizado en estructura de datos y teoría de colas. Guarda analogía con las personas que esperan en una cola y van siendo atendidas en el orden en que llegaron, es decir, que la primera persona que entra es la primera persona que sale.
La implementación puede efectuarse con ayuda de arrays o vectores, o bien mediante el uso de punteros y asignacion de memoria dinamica.
el sistema debe reservar el tamaño de memoria necesario para acoger todos los datos, sea cual sea el número de elementos usados.

LIFO
Ultimo en entrar primero en salir.

El término LIFO se utiliza en estructuras de datos y teoria de colas. Guarda analogía con una pila de platos, en la que los platos van poniéndose uno sobre el otro, y si se quiere sacar uno, se saca primero el último que se puso. LIFO es el algoritmo utilizado para implementar pilas.

Diferencia:
La diferencia es que en FIFO se manejan lo que son colas que tiene que ver con atender procesos pero la forma de atenderse es el primero en llegar es el primero en ser atendido  para salir y seguir con el siguiente   mientras que en LIFO se ocupan lo que son pila que de igual es atender procesos pero la diferencia que hay aquí es que el ultimo en entrar es el primero en ser atendido para salir.

martes, 4 de octubre de 2011

Semaforo

Este programa principal se guarda como filos.c

#include "rshmem.h"
#include <stdlib.h>
#define N 5
#define M 50

/* Declaracion de la funcion incrementa */

incrementa (int *mem, int k){
int i;
i=*mem;
TP ; TP ; TP TP ;
TP ; TP TP ; TP ;
TP TP ; TP ; TP
i=i+k;
TP ; TP ; TP TP ;
TP ; TP TP ; TP ;

TP TP ; TP ; TP

*mem=i;
}


/* Declaracion de la funcion filosofo: uso de semaforos */

void filosofo(FILE *pf, key_t *sclave, int *spalillo, int scomer, int i, int *comer, int *fin){
/* ABRIR SEMAFOROS */

/*Abrir semaforo de la izquierda del filosofo */

if (-1==(spalillo[i]=semOpen(sclave[i])))
fprintf(stderr,"no tengo el cualificador del semaforo palillo %d\n",i);

/*Abrir semaforo de la derecha del filosofo */

if (-1==(spalillo[(i+1)%N]=semOpen(sclave[(i+1)%N])))
fprintf(stderr,"no tengo el cualifacador semaforo palillo %d\n",(i+1)%N);

/*Abrir semaforo de la variable comer y variable fin:memoria compartida*/

if (-1==(scomer=semOpen(sclave[N])))
fprintf(stderr,"no tengo el cualifacador semaforo scomer\n");

/* COMER M VECES */

while(*comer<M){
semWait(spalillo[i]);
semWait(spalillo[(i+1)%N]);
semWait(scomer);

incrementa(comer,1);

(void) fprintf(pf,"[comer:%.4d] el filosofo %d ha comido\n", *comer, i);
fflush(pf); /* para sincronizar la escritura de datos en el fichero de saliadas */

semSignal(scomer);
semSignal(spalillo[(i+1)%N]);
semSignal(spalillo[i]);
}


/* CERRAR SEMAFOROS Y TERMINAR */

semClose(spalillo[i]);
semClose(spalillo[(i+1)%N]);
semClose(scomer);
(*fin)++;
exit(1);
}

int main(){

FILE *pf; /*puntero a fichero salidas */
key_t sclave[N+1]; /*array de claves para semaforos */
int scomer; /*semaforo para variable comer (s.c.) */
int spalillo[N]; /*un semaforo por palillo */
int *comer; /*variable de memoria compartida */
int *fin; /*variable de memoria compartida */
int i; /*contador */

/* Abrir fichero de salidas */

if((pf=fopen("fich", "w+"))==NULL){

fprintf(stderr,"error al abrir el fichero para salidas\n");
exit(-1);
}
/* SEMAFOROS PARA PALILLOS */

for(i=0; i<N; i++){

/*crear nombres claves palillos */

if((key_t)-1==(sclave[i]=ftok("filos",'s'+i))){
fprintf(stderr,"main: error crear clave palillo %d con ftok(%c)\n", i,'s'+i);
exit(1);
}

/*crear semaforos palillos */

if(-1==(spalillo[i]=semCreate(sclave[i],1))){
fprintf(stderr,"main: no pude crear semaforo palillo %d\n",i);
exit(1);
}
}

/* SEMAFORO PARA VARIABLE COMER */

if((key_t)-1==(sclave[N]=ftok("filos",'r'))){
fprintf(stderr,"main: error crear clave comer con ftok()\n");
exit(1);
}
if(-1==(scomer=semCreate(sclave[N],1))){

fprintf(stderr,"main: no pude crear semaforo para comer (s.c.)\n");
exit(1);
}

/* CREAR ZONA DE MEMORIA COMPARTIDA: VARIABLE COMER */

if(!crearMemoria())
fprintf(stderr,"error de crearMemoria()\n");

/*inicializar variable comer y variable fin */

comer = (int *) memoria;
*comer = 0;
fin = (int *) comer + sizeof(int);
*fin = 0;

/* PROCESO PADRE */

for(i=0; i<N; i++){
if(0==fork())/* PROCESOS HIJOS */
filosofo(pf, sclave, spalillo, scomer, i, comer, fin);
}

while(*fin<5); /*espera a que los filosofos coman M veces */

fprintf(pf,"no habia comido ningun filososo y ahora han comido %d", *comer);
fclose(pf);

/* TERMINA */

/* eliminar memoria de las variables compartidas */

if(!eliminarMemoria())
fprintf(stderr,"error de eliminarMemoria()\n");

/* cerrar semaforos */

semClose(scomer);
for(i=0; i<N; i++)
semClose(spalillo[i]);
exit(0);
} /*fin proceso padre, fin main */

El siguiente se guardara como  rshmem.h


#define RUTINAS_SHMEM

#include "rshmem.h"

/* Crea memoria compartida. 
* - el manejador de memoria es interno
* - manda mensajes de error por salida de error estándar. 
*/ 
int crearMemoria() { 
char *funcName = "crearMemoria";
if ((shmid=shmget(IPC_PRIVATE, SHM_SIZE, SHM_MODE))<0) { 
fprintf(stderr, "%s: error de shmget()\n", funcName);
} else if ((memoria=shmat(shmid, 0, 0)) == (void *) -1) {
fprintf(stderr, "%s: error de shmat()\n", funcName); 
} else {
return TRUE; 
}
return FALSE; 
}

/* Destruye la memoria compartida creada por crearMemoria() 
*/
int eliminarMemoria() { 
char *funcName = "eliminarMemoria"; 
if (shmctl(shmid, IPC_RMID, 0) < 0) { 
fprintf(stderr,"%s: error de shmctl()\n", funcName);
return FALSE ; 
} else
return TRUE ; 
}

/* Coloca una semilla en el temporizador del bucle de 
* tiempoPasa()
*/ 
void origenTiempo(){
srand((unsigned int) time(NULL)) ; 
}

/* Rutina que hace pasar un poco de tiempo con un bucle 
* sencillo
*/
void tiempoPasa() { 
unsigned int i; 
int a=3;

/* Los parametros "50" y "2" dependen mucho de la velocidad 
* de la computadora y de la configuracion del SO. Espero que 
* funcionen bien 
*/
for (i=rand()/50; i>0; i--)
a = a%3 + i; 
}

el siguiente se guarda como  rshmen.h




/*
* rshmem.h
* * Fichero de cabecera con definiciones y declaraciones para usar
* memoria compartida.
*/

#include <stdio.h>
#include <time.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define ARRAY_SIZE 4000
#define MALLOC_SIZE 10000
#define SHM_SIZE 10000
#define SHM_MODE (SHM_R | SHM_W) /* read/write */

#define TRUE 1
#define FALSE 0

#ifdef RUTINAS_SHMEM
static int shmid; /* handler de memoria compartida */
char *memoria; /* puntero a zona de memoria compartida */
#else
extern char *memoria;
#endif

/* Prototipos de funciones de memoria compartida */

void origenTiempo();
void tiempoPasa();
int crearMemoria() ;
int eliminarMemoria() ;
#define TP tiempoPasa();





jueves, 29 de septiembre de 2011

Practica 5

29 de Septiembre del 2011


#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define lectura 0
#define escritura 1


int aleatorio(void)
{
       int semilla = (int)time(NULL);
       srand(semilla);
}

int hijo(int tube1[2], int tube2[2]){
        int ret;
        int minumero;

        int numbytes;
        char buf[256]={};

        ret = fork();

               if (ret == 0){
                       /*Tratamiento del nieto*/
                       //minumero = aleatorio();
                       minumero= 32;

               sprintf(buf,"%d",minumero);

               if( write (tube1[escritura],buf, sizeof(buf)) == -1){
               perror("Fallo write nieto");
               exit(EXIT_FAILURE);
                       }

               numbytes = read(tube2[lectura],buf,sizeof(buf));

               if (numbytes == -1){
               perror("Fallo read nieto");
               exit(EXIT_FAILURE);
                       }

                       close(tube1[escritura]);
                       close(tube2[lectura]);

printf("Soy hijo1 con PID=%d, mi número aleatorio es %d y el del otro proceso es %s\n",getpid(),minumero,buf);


               }

               else if (ret > 0){
                       /*Tratamiento del padre*/

                       //minumero = aleatorio();
                       minumero=10;

                      
                       sprintf(buf,"%d",minumero);

                       if( write (tube2[escritura],buf, sizeof(buf)) == -1){
                               perror("Fallo write padre");
                               exit(EXIT_FAILURE);
                       }

                       numbytes = read(tube1[lectura],buf,sizeof(buf));

                       if (numbytes == -1){
                               perror("Fallo read padre");
                               exit(EXIT_FAILURE);
                       }




                       close(tube1[lectura]);
                       close(tube2[escritura]);

printf("Soy hijo2 con PID=%d, mi número aleatorio es %d y el del otro proceso es %s\n",getpid(),minumero,buf);
               }

               else if (ret == -1){
                       /*Error*/
                       perror("Fallo en el segundo fork");
                       exit(EXIT_FAILURE);                  
               }
}

int main (void){
        int ret;
        int ret2;
        int tube1[2];
        int tube2[2];
        int temp;
        int e;
        char buf[256]={};

        if (pipe(tube1) == -1){
               perror("Fallo pipe1");
               exit(EXIT_FAILURE);
        }

        if (pipe(tube2) == -1){
               perror("Fallo pipe2");
               exit(EXIT_FAILURE);
        }

        ret = fork();

        if (ret == 0){
               /*tratamiento del hijo*/
               hijo(tube1,tube2);

        }

        else if( ret > 0){
               /*tratamiento del abuelo*/


        }

        else if (ret == -1){
               /*error*/
               perror("Fallo en fork");
               exit(EXIT_FAILURE);
        }

        ret = wait (NULL);

        while (ret > 0){
               ret = wait(NULL);
        }

        if (ret == -1 && errno != ECHILD){
               perror("Fallo en wait");
               exit (EXIT_FAILURE);
        }

}



Resultado del programa:




Nombre del Alumno: Raul Lopez Bautista