jueves, 1 de diciembre de 2011

Problema

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.



Debemos calcular lo que ocupa la FAT o tamaño de enlace que es de 32 bits por el numero de entradas de la tabla, que es el tamaño de l disco dividido por el tamaño del Cluster que sería 20 GB/(16 x 512) = 20x217 entradas luego lo multiplicamos por 32 que es lo que ocupa la tabla lo que nos da un resultado de 20x219 bytes, se divide lo que ocupa la tabla entre el tamaño del agrupamiento, con lo que obtenemos el número de agrupamientos que ocupa la tabla 20x219 /(16x512) = 20x26 = 1280 y finalmente multiplicamos por 16 que es el número de sectores por agrupamiento

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


Código Corregido y aumentado

#include<stdio.h>
#include<stdlib.h>
#include<semaphore.h>
#include<pthread.h>
#include<unistd.h>
#include<stdbool.h>
#include<string.h>


#define MAX 10
#define FIN -1

int buffer[MAX];
sem_t huecos, elementos;

int generar_dato (void) { return random() %256;}

int numero_aleatorio(void) { return random() %100;}

void *productor (void *p) {
int pos_productor= 0;
int num, dato, n;
n= numero_aleatorio();
printf ("Productor con %d datos\n", n);

for(num= 0; num< n; num++) {
dato= generar_dato();
sem_wait(&huecos);
buffer[pos_productor]= dato;
pos_productor= (pos_productor+ 1) %MAX;
sem_post(&elementos);
}
sem_wait(&huecos);
buffer[pos_productor]= FIN;
sem_post(&elementos);
pthread_exit(NULL);
}

void *consumidor(void *p){
int pos_consumidor= 0, dato;
bool continuar= true;
while (continuar) {
sem_wait(&elementos);
dato= buffer[pos_consumidor];
sem_post(&huecos);
if (dato== FIN)
continuar= false;
else {
printf ("Numero aleatorio: %d\n", dato);
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;
}