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




miércoles, 23 de noviembre de 2011

Practica 1-3

Actividad 1

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.

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















jueves, 13 de octubre de 2011

Diferencia entre FIFO y LIFO


FIFO


El término FIFO es muy ocupado en estructuras de Programación ya que es la base para describir una Cola (Queue), con esta estructura permite hacer que en una colección de datos el primero en entrar será el primero en salir (First In Last Out), esto lo podemos ocupar ya sea con un vectro, matriz o apuntador.



LIFO


En este Sistema de Estructuras de Datos, se implementa una pila en la que conforme se van colocando elementos, el orden es ascendente y uno sobre otro, lo que nos obliga a sacar primero el último elemento para poder acceder a lo elementos de abajo. Por eso la definicion en ingles Last In First Out que significa último en entrar primero en salir.


LA DIFERENCIA


La diferencia recae en el el orden en que estas estructuras funcionan ya que una forma una cola la otra forma una fila, a que nos referimos con esto a que en FIFO la entrada del primer elemento será el primero en salir y en el LIFO el ultimo en entrar sera el primero en salir, en cuanto a procesos podemos utilizar esto metodos haciendo que el proceso iniciado en primer lugar sea el primero en terminar sin problemas y asi sucesivamente (FIFO) o de manera contraria que podamos iniciar el último proceso que se asigno, después el penúltimo y así hasta llegar a el primero que llego o solicitó el servicio.













martes, 4 de octubre de 2011

miércoles, 28 de septiembre de 2011

Posix


Posix (Portable Operating System Interface)


El termino fue sugerido por Richard Stallman en respuesta a la IEEE que buscaba un acrónimo fácil de recordar, la traducción mas acercada es Interfaz de Sistema Operativo Portable.

Estas POSIX son estandares de la IEEE para para formalizar interfaces en los sistemas operativos, surgió como una necesidad de estandarizar la API´s, esto quiere decir estandarizar programas que pudieran funcionar en diferentes Sistemas Operativos.

Las las Posix vienen acompañadas de pruebas llamadas PCTS, que significa Conjunto de conformación de pruebas Posix, estas pruebas se le aplica al software para poder considerarlo como parte de este conjunto de aplicaciones.

Ya que la IEEE aplicó un alto costo a la documentación de Posix surgió un nuevo estandar creado en base a la Single Unix Specification que es una alternativa al Posix.

Algunos de los sistemas que son totalmente compatibles con estandares Posix

  • A/UX
  • AIX
  • BSD/OS
  • DSPnano
  • HP-UX
  • INTEGRITY
  • IRIX
  • LynxOS
  • Mac OS X v10.5 en Procesadores Intel.
  • MINIX
  • MPE/iX
  • QNX (IEEE Std. 1003.13-2003 PSE52;
  • RTEMS (POSIX 1003.1-2003 Profile 52)
  • Solaris
  • Unison RTOS
  • UnixWare
  • velOSity
  • VxWorks (IEEE Std. 1003.13-2003 PSE52;

Algunos sistemas que son compatibles en su mayoría con estandares Posix

  • BeOS / Haiku
  • FreeBSD
  • GNU/Linux (la mayor parte de las distribuciones)
  • Contiki
  • NetBSD
  • Nucleus RTOS
  • OpenBSD
  • OpenSolaris
  • PikeOS
  • RTOS (para ciertos sistemas con particiones PSE51 y PSE52 opcionales)
  • RTEMS – Soporte API POSIX diseñado para IEEE Std. 1003.13-2003 PSE52
  • Sanos
  • SkyOS
  • Syllable
  • VSTa