Wednesday, November 2, 2011

Second Practical Presentation

Practica nachos2
View more presentations from Richi Garza

La idea era subir un video... pero despues de una pelea con un programa decidi tomar capturas de pantalla.

Bueno el siguiente codigo es el mismo de la presentacion. Es una pequeña implementacion de manejo de memoria en C.

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

#define NSIZE   (5*(1<<20))
#define SLEEPT  10

long  gx[NSIZE];

int
main (int argc, char *argv[])
{
  char  c[NSIZE];
  int  *px = malloc (NSIZE*sizeof(int));

  for (int i=0; i<NSIZE; i++) {
    gx[i] = (long)i;
    px[i] = i;
    c[i]  = 'c';
  }
  printf ("address of gx[0] = %012p\n", &gx[0]);
  printf ("address of px[0] = %012p\n", &px[0]);
  printf ("address of  c[0] = %012p\n", &c[0]);

  printf ("memory map file: /proc/%d/maps\n", getpid());
  printf ("sleeping %d...", SLEEPT);
  fflush (NULL);
  sleep (SLEEPT);

  free (px);

  printf ("\ndone\n");
  exit (EXIT_SUCCESS);


Esta es la captura de pantalla al momento de ejecutar el codigo.


/proc es un directorio extraño. Realmente no existe, sin embargo puedes explorarlo. Sus archivos de tamaño 0 no son ni binarios ni textos, sin embargo puedes examinarlos y desplegar su contenido. Este directorio especial contiene todos los detalles de tu sistema Linux, incluyendo el kernel, procesos y parámetros de configuración. Estudiando el directorio /proc, puedes aprender como los comandos de Linux trabajan e incluso es posible realizar tareas administrativas. 


El directorio /proc está organizado en directorios virtuales y subdirectorios, que agrupan archivos de tópicos similares. Trabajando como root el comando ls /proc te despliega algo como lo siguiente.



Como en la imagen anterior  hacemos   cat /proc/id/maps  le ponemos que lo imprima en un .dat y agregue solo una parte del archivo ya que era muy grande y este puede cambiar de tamaño en cualquier momento.



La direccion de la memoria esta expresada en numeros hexadecimales. Acordadamente el tamaño de una pagina es de 4KB y es expresado en 100016 o 0x1000


p en r-xp significa que es una region privada.



00d54000-00d56000 rw-p 00000000 00:00 0 
00d88000-00ea1000 r-xp 00000000 08:06 1834279    /usr/lib/libX11.so.6.3.0
00ea1000-00ea2000 r--p 00118000 08:06 1834279    /usr/lib/libX11.so.6.3.0
00ea2000-00ea4000 rw-p 00119000 08:06 1834279    /usr/lib/libX11.so.6.3.0
00ea4000-00ea5000 rw-p 00000000 00:00 0 
00eab000-00eb1000 r-xp 00000000 08:06 1835288    /usr/lib/libxcb-render.so.0.0.0
00eb1000-00eb2000 r--p 00005000 08:06 1835288    /usr/lib/libxcb-render.so.0.0.0
00eb2000-00eb3000 rw-p 00006000 08:06 1835288    /usr/lib/libxcb-render.so.0.0.0
00ec3000-00ede000 r-xp 00000000 08:06 1050850    /lib/ld-2.11.1.so
00ede000-00edf000 r--p 0001a000 08:06 1050850    /lib/ld-2.11.1.so
00edf000-00ee0000 rw-p 0001b000 08:06 1050850    /lib/ld-2.11.1.so
00ef1000-00ef9000 rwxp 00000000 00:00 0 
00f11000-00f19000 rwxp 00000000 00:00 0 
00f2f000-00f30000 r-xp 00000000 00:00 0          [vdso]
00f33000-00f3b000 rwxp 00000000 00:00 0 
00f6c000-00f70000 r-xp 00000000 08:06 1046643    /lib/tls/i686/cmov/libnss_dns-2.11.1.so
00f70000-00f71000 r--p 00004000 08:06 1046643    /lib/tls/i686/cmov/libnss_dns-2.11.1.so
00f71000-00f72000 rw-p 00005000 08:06 1046643    /lib/tls/i686/cmov/libnss_dns-2.11.1.so
00fb1000-00fd5000 r-xp 00000000 08:06 1046628    /lib/tls/i686/cmov/libm-2.11.1.so
00fd5000-00fd6000 r--p 00023000 08:06 1046628    /lib/tls/i686/cmov/libm-2.11.1.so
00fd6000-00fd7000 rw-p 00024000 08:06 1046628    /lib/tls/i686/cmov/libm-2.11.1.so
00fd7000-013a4000 r-xp 00000000 08:06 1833560    /usr/lib/libgtk-x11-2.0.so.0.2000.1
013a4000-013a8000 r--p 003cd000 08:06 1833560    /usr/lib/libgtk-x11-2.0.so.0.2000.1
013a8000-013aa000 rw-p 003d1000 08:06 1833560    /usr/lib/libgtk-x11-2.0.so.0.2000.1
013aa000-013ac000 rw-p 00000000 00:00 0 
08048000-0908e000 r-xp 00000000 08:06 1831708    /usr/lib/opera/opera
0908e000-0909d000 rw-p 01045000 08:06 1831708    /usr/lib/opera/opera
0909d000-090a3000 rw-p 00000000 00:00 0 
09f6d000-0d5c5000 rw-p 00000000 00:00 0          [heap]
b7576000-b7578000 rw-p 00000000 00:00 0 
b75b2000-b75f1000 r--p 00000000 08:06 1839402    /usr/lib/locale/en_US.utf8/LC_CTYPE
b75f1000-b75f2000 r--p 00000000 08:06 1839407    /usr/lib/locale/en_US.utf8/LC_NUMERIC
b75f2000-b7710000 r--p 00000000 08:06 1839401    /usr/lib/locale/en_US.utf8/LC_COLLATE
b7710000-b7716000 rw-p 00000000 00:00 0 
b7716000-b7717000 r--p 00000000 08:06 1844068    /usr/lib/locale/en_US.utf8/LC_TIME
b7717000-b7718000 r--p 00000000 08:06 1844069    /usr/lib/locale/en_US.utf8/LC_MONETARY
b7718000-b7719000 r--p 00000000 08:06 1844070    /usr/lib/locale/en_US.utf8/LC_MESSAGES/SYS_LC_MESSAGES
b7719000-b771a000 r--p 00000000 08:06 1839655    /usr/lib/locale/en_US.utf8/LC_PAPER
b771a000-b771b000 r--p 00000000 08:06 1839289    /usr/lib/locale/en_US.utf8/LC_NAME
b771b000-b771c000 r--p 00000000 08:06 1844071    /usr/lib/locale/en_US.utf8/LC_ADDRESS
b771c000-b771d000 r--p 00000000 08:06 1844072    /usr/lib/locale/en_US.utf8/LC_TELEPHONE
b771d000-b771e000 r--p 00000000 08:06 1839651    /usr/lib/locale/en_US.utf8/LC_MEASUREMENT
b771e000-b7725000 r--s 00000000 08:06 1832651    /usr/lib/gconv/gconv-modules.cache
b7725000-b7726000 r--p 00000000 08:06 1844073    /usr/lib/locale/en_US.utf8/LC_IDENTIFICATION
b7726000-b7728000 rw-p 00000000 00:00 0 
bff74000-bffa7000 rw-p 00000000 00:00 0          [stack]
El mapeo no identifica la memoria como "text" o "data" pero para eso podemos utilizar Size map como en la siguiente foto.
El comando cat /proc/meminfo puede traer a la pantalla algo como lo siguiente
MemTotal:        2999120 kB
MemFree:         1330344 kB
Buffers:          766668 kB
Cached:           421904 kB
SwapCached:            0 kB
Active:           511076 kB
Inactive:        1058524 kB
Muestra mas info... solo lo corte para no hacer spam

Filesystem

Para la parte correspondiente a "filesystem" utilizamos una herramienta llamada pyinotify, la cual permite monitorear los eventos en el sistema, esta herramienta es muy parecida a inotify utilizada por el kernel de Linux, en sí su principal función es darse cuenta cuando alguna carpeta o archivo han sido modificados y enviar un mensaje al sistema de que ha sucedido algún cambio.

Lo que hicimos nosotros fue ver de que manera funcionaba la herramienta y posteriormente hacer unas pruebas para saber que tan factible era utilizar algo similar en nuestro proyecto. Cabe hacer mención que no solo existe la herramienta en python si no que tambien la podemos encontrar en varios lenguajes de programación.

A continuación se encuentran un par de videos que hicimos de las pruebas de funcionamiento de pyinotify, En el primero se muestra como sucede el monitoreo de un archivo en el se muestra algunos cambios como lo son la creación del archivo, después cuando se escribe en el mismo y por ultimo cuando eliminamos el archivo.

video

En el segundo video se muestra el monitoreo sobre una carpeta y aquí podemos ver que el programa nos dice cuando se crea un archivo o una carpeta y cuando se eliminan los mismos.

video

Esta es la entrada correspondiente a la segunda presentación practica del proyecto.


Tuesday, September 13, 2011

First practical presentation

This entry is for presenting the code implemented in nachOS as part of the first assignment.
The pictures above show some results obtained when running the implemented code which is also described in it's more important parts.

Sunday, September 11, 2011

First Theoretical Presentation

This entry is for the first theoretical presentation.
The content of the entry is an explication to solve the problem unbounded-buffer, and a the unity test for the implement of lock using semaphore, for the project we are working with nachOS 3.4 and C++.


The next code is an example of how to solve the problem unbounded buffer using three locks, one lock for producers, the second lock for consumers and the last one for protecting the access to products.