Practica 4 ASO, Fork o Threads ¿Que es mas eficiente?

Objetivo de Practica:

Vamos a empezar estudiar como el proceso es un parte fundamental para entender el funcionamiento del kernel. En este practica, vamos a compilar el kernel….

Otra conjunta de problemas que queremos ver tiene que ver con threads, como hemos visto en clase. Vamos a comprobar algunos problemas y ver como funcionan.

  1. Escribe un código para comparar el tiempo de ejecución para crear N procesos de fork y N threads. Plot su resultado como función de N.
  2. Comprobar como funciona el código de “mutexes” con threads. Intenta ejecutar este codigo sin los mutex locks. ¿Cuantos veces tiene un “race condition”. Puedes indicar como un % cuantos veces tienes un races?
  3. Compilar el kernel para que se puede compilar un kernel. Para ello tiene que instalar las utilidades de make y el libraría de “libncurses-dev”.

Parte 1

Cuando queremos aprovechar las ventajas de los nuevos procesadores de varios núcleos tenemos que recurrir a hacer fork’s del proceso o invocar threads

¿Cual es mejor?, usando el codigo  para los fork process y para los c threads (recordar añadir la opción -lpthread en gcc al compilar este ultimo)

aqui la tabla de tiempos en mi equipo

FORK FORK FORK Threads Threads Threads
real user sys real user sys
50 0.016 0.002 0.007 0.004 0.001 0.002
300 0.074 0.005 0.049 0.014 0.001 0.005
500 0.129 0.019 0.107 0.019 0.004 0.008
1000 0.238 0.023 0.226 0.037 0.000 0.017
5000 1.152 0.161 0.266 0.176 0.003 0.058
10000 2.306 0.255 2.685 0.354 0.018 0.114
30000 7.116 0.685 7.108 1.032 0.055 0.481
50000 11.665 1.048 11.665 1.764 0.114 0.693

y como interpretar datos de una tabla no es muy rapido ni intuitivo podemos crearemos unos gráficos con gnuplot, guardamos la tabla en un archivo de texto, (Fork and Threads Stats) abrimos el gnuplot y escribimos

set xlabel “Number of Process”

set ylabel “Seconds to Create”

plot “stats.txt” using 1:2 w lines title ‘Fork Real’,”stats.txt” using 1:3 w lines title “Fork User”,”stats.txt” using 1:4 w lines title ‘Fork Sys’,”stats.txt” using 1:5 w lines title ‘Threads Real’,”stats.txt” using 1:6 w lines title ‘Threads User’,”stats.txt” using 1:7 w lines title ‘Threads Sys’

y aparece en nuestra pantalla el siguiente gráfico

threads_vs_fork_total_times
threads_vs_fork_total_times

puede dar lugar a confusión así que lo sacaremos solo con el tiempo real

total_time_fork_vs_threads
total_time_fork_vs_threads

en definitiva si quieres ganar rendimiento el uso de los threads es mas adecuado.

Parte 2

Threads con Mutex
Threads con Mutex

Threads sin Mutex
Threads sin Mutex

Tras ejecutar los threads sin mutex varias veces el contador solo llega a valores entre 110-130 lo que significa que el 50-60% de los threads entran en “race condicion”

Parte 3

Documentación detallada para compilar el nucleo (Gentoo Handbook)

Numeros Aleatorios en ANSI C

necesitamos las librerias

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

/*
*getRandomInt — returns a random int value
*/
int getRandomInt()
{
int toret=0;

srand(time(NULL));//inicializamos la semilla aleatoria utilizando la hora del sistema

toret= (int) (random());
return toret;
}

Os recomiendo observar el valor de la variable RAND_MAX si queréis evitar que la secuencia sea poco aleatoria, evitar generar menos de 2/3 del valor de RAND_MAX

Librerias estaticas y Librerias dinamicas

Cunado estas compilando tus fuentes en Linux una de las opciones son el tipo de enlace que quieres realizar en tus librerías estático o dinámico ¿en que se diferencian?

  • Librerías estáticas (lib_nombrelibreria.a)

Una librería estática se “encastra” dentro de nuestro ejecutable lo que significa que podemos llevarlo a otro ordenador sin temer a que nos falten librerías.

pero si las librerías tienen un bug y aparece una versión que arregla ese fallo tienes que recompilar el código

son mas grandes al llevar las librerías encastradas

son mas rápidos en la ejecución porque las funciones están dentro del ejecutable no  tenemos que buscarlas

  • Librerías dinámicas (lib_nombre_libreria.so)

Una librería dinámica no se “encastra” dentro de nuestro ejecutable por lo que nuestro ejecutable sera mas pequeño pero

Si nos llevamos nuestro ejecutable a otra maquina las librerías tienes que ir con el

La ejecución es mas lenta a causa de tener que ir a buscar la librería fuera del ejecutable

Si existe un bug en la librería se actualiza y arreglado en todos los ejecutables que la usan , si es un cambio en una función (mas parámetros,cambio de comportamiento ..) tenemos que volver a compilar todo.

¿Como se compilan?

Estaticas

  1. Crear los ficheros objero (.o) a partir de nuestro codigo fuente (.c)

    gcc -c fuente.c -o fuente.o

  2. Crear las librerías (.a)

    ar -rv libnombre.a fuente1.o fuente2.o … fuenten.o

    librerias_estaticas
    librerias_estaticas

Dinámicas

  1. Crear los ficheros objeto

    gcc -c fuente.c -o fuente.o

  2. Crear las librerias dinamicas

    ld -o liblibreria.so objeto1.o objeto2.o … -shared

    librerias_dinamicas
    librerias_dinamicas

Listas simplemente enlazadas

Escribir un programa en C que define una estructura de una listas enlazada single.
Este lista enlazada debe contener un campo entero, denominada “pid”,
y también un campo de tipo array estatica denominada mem[], representando algo no especificada.
A continuación, escribe funciones que van a realizarlas siguientes operaciones fundamentales con este estructura:

  • crear un elemento que inicializa cada uno de los campos
  • insertar un nuevo elemento al principio (a la cabecera) de la lista
  • insertar un nuevo elemento al final (a la cola) de la lista
  • un iterador que es capaz de imprimir cada uno de los campos de cada elemento y también imprime cada uno de los elementos del array estática, mem[], correspondiente.
  • Eliminar un elemento de la lista a través del valor del pid

No es la solución mas elegante pero mi C se estaba oxidando demasiado

entrega_1_ASO

Punteros en C

Un puntero es una variable que apunta a una direccion de memoria

se declara así:

tipo_dato *nombrevariable

int *pid

Para obtener la dirección de memoria donde se encuentra una variable se utiliza el operador &

int unavariable;

int *punteroaint;

unavariable=1;

punteroaint=&unavariable;

printf(“La dirección de unavariables es %p\n”&unavariable);

printf(“El contenido de unavariable es %c\n”,*punteroaint);

¿Queda claro? siempre puedes dejar tus dudas en los comentarios

Como listar un directorio en PHP

<?php

//abrimos el directorio

$descriptor= opendir("./");

//recorremos el listado de ficheros del directorio

while ($lectura=readdir($descriptor))

{

//Empezamos a escribimos el enlace intercalado con el HTML

?>

<a href="<?php print $lectura; ?>"><?php print $lectura; ?></a><br>

<?php

}//Fin del bucle while

//cerramos el directorio

closedir($descriptor);

?>

Que buena gente los chicos de Sun y netBeans

Por fin me han llegado a casa el cd con el NetBeans y demas javerias.

Lo interesante es que se lo han traido desde Praga con un cuño de Prioritaire.

Estos chicos de Sun estan que lo regalan todo, haber cuando me regalan un Sun Ray Station de esas bonitos para darle paseo al paquito :-).

Por lo que he visto trae el netBeans la JDK y la JDK para dispositivos moviles

Cobol No esta muerto como dicen algunos

Leyendo mi listita de blogs de siempre y haciendo un comentario por algun que otro sitio me entero de que:

Que sepas que sorprendentemente el lenguaje más solicitado por los contratadores en IT es…. Cobol!

Ni corto ni perezoso me dirijo a infojobs para mirar cuanto tiene eso de verdad, Seleccione Madrid por las posiblilidades que pudiera tener al ser una provincia que mueve pasta y por tanto existe bastante curro de programación.

y taXan Cobol esta entre los lenguajes de programacion mas solicitados.

A mi siempre me han contado que cobol habia quedado relegado a un segundo puesto y solo era usado por bancos a causa de lo laborioso que podria ser repicar millones de billones de polimuchillones de lineas de codigo.

O muchos bancos hay en España o he estado engañado bastantes años

Cosas que siempre quise saber de Java y nunca me habia preguntado

En java si pasas una matriz a un metodo que la recibe de la forma A[][] ¿Como sabes la dimensión?

A[].length –>numero de columnas

A[x].length –> numero de filas donde x0

Los incrementadores ++

b++ –>primero hace las cosas y al final incrementa

++b –>incrementa y luego asigna

D[b++]=98

esto realizaria lo siguiente en caso de que b fuera=3

D[3]=98;b++

D[++b]=98

esto realizaria lo siguiente en caso de que b fuera=3

b++;D[4]=98

Pensando en ocultar las cosas

Hace tiempo que se me ocurrio una idea para que nadie pueda leer un fichero que tengas

en un cd o diskkete, supongamos que un archivo es como un libro, imaginate que lo desacemos y le sacamos el numero a cada

pagina, ¿Seria dificil montarlo?, creo que si pero con el tiempo lo conseguirias, ¿Y si te damos los parrafos solo?, aqui ya

seria practicamente imposible, ¿y si te doy las palabras? ¿mas dificil no? ¿y si te doy las letras? imposible practicamente.

Me pregunto si se podria hacer asi que se me a ocurrido lo siguiente:

-Abrimos un fichero

-guardamos su contenido en una array de caracteres

-Obtenemos el valor mas cercano a una matriz cuadrada

ejemplo 4*4

el fichero 1-1-1-1-2-2-2-2-3-3-3-3-4-4-4-4

nos quedaria la siguiente matriz:

1-1-1-1

2-2-2-2

3-3-3-3

4-4-4-4

-Establecemos una contraseña AB

Donde A B C referencia a opciones

A transpuesta de la matriz

B Cambiar columnas pares por impares

-Despues de aplicar la opcion A la matriz quedaria:

1-2-3-4

1-2-3-4

1-2-3-4

1-2-3-4

-Despues de aplicar B quedaria:

4-1-2-3

4-1-2-3

4-1-2-3

4-1-2-3

Pasamos la matriz a un array y nos quedaria:

4-1-2-3-4-1-2-3-4-1-2-3-4-1-2-3

Si lo comparamos con el original

1-1-1-1-2-2-2-2-3-3-3-3-4-4-4-4

4-1-2-3-4-1-2-3-4-1-2-3-4-1-2-3

podriamos realizar de forma continua para las distintas profundidades de la matriz asi si se acaba la longitud de la contraseña podemos volver a cogerla desde el principio o para mas salvaje podiamos aplicar el primer metodo de desordenación al resto de la contraseña si fuera mas larga

En fin dejo la idea para quien la quiera tomar.