miércoles, 28 de diciembre de 2016

Diseño y Administracion de SO - UNED (Usando semáforos)

Después de darle toda la tarde al tema pienso que más o menos lo entiendo (al menos lo básico)  por lo que lo voy a intentar explicar.

Lo primero, necesitamos la librería  #include <sys/sem.h>

Y además tenemos que declarar una union tipo semun

...........................
union semun
{
    int              val;
    struct semid_ds *buf;
    unsigned short  *array;
    struct seminfo  *__buf;
};
............................
 struct sembuf oper;
 union semun arg;
.............................

Ahora lo primero es obtener la clave del semáforo (cada mecanismo IPC debe estar identificado con una clave)

...........................
clave = ftok("ruta",'letra');
...........................

una vez tenemos la clave creamos el array de semáforos y obtenemos su identificador

...........................
ID = semget(clave, 1, IPC_CREAT | 0600); //en este caso un array de 1 semáforo.
...........................

A continuación inicializamos el semáforo (verde)

...........................
arg.val = 1;
int control = semctl (ID, 0, SETVAL, arg);
...........................

Ahora ya podemos trabajar con el semáforo en nuestra sección critica.

...........................
//probar(P)
oper.sem_num = 0;
oper.sem_op = -1;
oper.sem_flg = 0;
semop (ID, &oper, 1);

//seccion critica

//incrementar(V)
oper.sem_num = 0;
oper.sem_op = 1;
oper.sem_flg = 0;
semop (ID, &oper, 1);

En las operaciones oper.xxx estamos preparando el struct sembuf para luego realizar la operación de forma atómica con semop().

Culex.


viernes, 16 de diciembre de 2016

PED - Diseño y Administracion de SO - UNED (Top)

Como no hay segunda convocatoria pienso que no hay ningún problema por publicar la PED.
Aún no está evaluada por lo que puede que no sea un buen ejemplo :-).

Tiene como nota un 10.

El Objetivo de esta práctica es programar un script en bash llamado mitop.sh que muestre información sobre los procesos de forma similar a la mostrada por comando top.


Obtención de datos iniciales 

Como paso inicial se lee el contenido del directorio /proc filtrando el resultado para obtener solo los PID de todos los procesos independientemente de su estado (R, S, D, Z, T).

listadoProcesos=$(ls -d  [0-9]*)

A continuación realizamos la primera medición de tiempo inicio=`date +%s%N` y obtenemos la suma de ticks de reloj planificados (modo usuario + modo núcleo) de  los todos los procesos existentes usando un bucle for y el archivo proc/PID/stat. Esta información junto con el PID se almacena en el archivo ‘tiempo1’ 

Es necesario usar una sentencia condicional  if [ -d "$i" ]  para descartar procesos que han finalizado y que por lo tanto no existen en /proc.
Realizamos la pausa de 1 segundo y realizamos la segunda medición de tiempo fin=`date +%s%N`.  Con estas dos medidas obtendremos el tiempo real de entre las dos iteraciones.

Finalmente, volvemos a obtener la suma de ticks de reloj planificados (modo usuario  + modo núcleo) de  los todos los procesos existentes (archivo ‘tiempo2’), calculamos la diferencia y la guardamos (archivo ‘tiempoTotal’), ordenamos el resultado y nos quedamos con los 10 procesos con mayor tiempo de CPU (archivo ‘tiemporTotalOrdenado’).

paste $HOME/tiempo1 $HOME/tiempo2 | awk '{print $1, ($4 - $2)}' >> $HOME/tiempoTotal
sort -k2 -nr $HOME/tiempoTotal | head -10 >> $HOME/tiempoTotalOrdenado

Detalle de la cabecera

La información a  mostrar en la cabecera la obtenemos de la variable ‘listadoProcesos’, del archivo /proc/meninfo, del archivo temporal ‘CPU_PID’ y del comando ‘free’

numeroProcesos=$(echo "$listadoProcesos"| wc -w)
memoriaTotal=$(awk '/MemTotal/ {print $2}' < /proc/meminfo)
memoriaLibre=$(awk '/MemFree/ {print $2}' < /proc/meminfo)
memoriaUsada=$(free | awk 'NR==2{print $3}')
usoCPU=`awk '{sum+=$2};END{print sum}' $HOME/CPU_PID`

Detalle por Proceso

Esta parte es la más complicada ya que tenemos que realizar algunos cálculos para obtener los %CPU y %MEM. El resto de información mostrada se obtiene de nuevo del archivo proc/PID/stat (PR,VIRT, S, COMMAND, MEM por PID) y con el comando ‘ps’ (USER, TIME).

Se han utilizado una serie de bucles while cuya condición de salida es la finalización de las líneas de un archivo temporal que se le pasa como parámetro de entrada. Estos bucles generan, mediante la llamada a una función, mediante la lectura de proc/PID/stat o del comando ‘ps’ un archivo temporal de salida con la información requerida. 

Esta es la estructura genérica del bucle usado.

while read linea
do
read VARIABLE <<< $(echo -e "$linea"| awk '{print $COLUMNA;}')
//operaciones de lectura o calculos
printf "%s\t%s\n" $VARIABLE $VARIABLE CALCULADA >> $HOME/archivo salida
done < $HOME/archivo entrada;


A continuación explico en detalle el procedimiento seguido para obtener %CPU y %MEM.

%CPU, Porcentaje de uso del procesador en el intervalo de tiempo elegido.

Para realizar este cálculo, necesitamos saber cuál es el tiempo durante el cual cada proceso ha estado planificado en la CPU (utime+stime) durante el intervalo de tiempo elegido ‘tiempoTotal’. Esta información ya la tenemos ‘tiempoTotalOrdenado’ pero en ticks de reloj por lo que es necesario convertirla en milisegundos. 

Para poder realizar esta conversión lo primero que necesitamos saber cuánto equivale un tick de reloj en milisegundos. Esta información la hemos calculado previamente durante la preparación del entorno de ejecución y la tenemos  en la variable ‘miliSgPorTick’. Con estos dos datos, usando la función ‘ticksToMs’ convertimos los ticks de reloj a milisegundos para cada proceso. 

ticksToMs()
{
  let timeMs=($2*$miliSgPorTick)
  printf "%s\t %d\n" $1 $timeMs
}


Una vez que tenemos el tiempo de planificación de cada proceso en milisegundos, usamos otra función ‘CPUporPID’ para calcular el %CPU para cada proceso durante el intervalo de tiempo elegido

CPUporPID()
{
  porcentaje=$(echo "scale=4; $2/$tiempoTotal" | bc)  
  porcentajeT=$(echo "scale=4; $porcentaje*100" | bc) 
  porcentajeFormateado=`awk 'BEGIN{printf "%.4f", "'"$porcentajeT"'"}'`
  printf "%s\t%.4s\n" $1 $porcentajeFormateado
}

%MEM, Porcentaje de uso del procesador en el intervalo de tiempo elegido.

Para realizar este cálculo simplemente tenemos que sabe el tamaño en Kb de cada página de memoria, el número de páginas asignadas a cada proceso y el tamaño total de memoria principal. El tamaño de una página en Kb,  la hemos calculado previamente durante la preparación del entorno de ejecución y la tenemos  en la variable ‘pageSizeKB, el número de páginas en memoria asignadas al proceso ‘rss’ y el tamaño de la memoria también, en el archivo temporal ‘PVSCM_PID’ y la variable ‘memoriaTotal’ respectivamente. Ya solo nos queda llamar a la función MEMporPID pasando como parámetro el número de páginas para calcular el %MEM.

MEMporPID()
{
  porcentajeM1=$(echo "scale=4; $2*$pageSizeKB" | bc)  
  porcentajeM2=$(echo "scale=4; $porcentajeM1/$memoriaTotal" | bc)
  porcentajeMT=$(echo "scale=4; $porcentajeM2*100" | bc) 
  porcentajeMFormateado=`awk 'BEGIN{printf "%.4f", "'"$porcentajeMT"'"}'`
  printf "%s\t%.4s\n" $1 $porcentajeMFormateado
}

Como último paso en la sección DETALLE PROCESO  generamos un único archivo con todos los datos necesarios usando el comando paste.  El nombre de este archivo es ‘outputPID’.

Impresión de datos por pantalla

Se imprimen por pantalla los datos obtenidos usando los comandos echo y printf. El comando printf se ha elegido para el área de detalle del proceso ya que permite un mayor control del formato. Para la lectura del archivo ‘outputPID’ volvemos a usar un bucle while.





Y finalmente aquí está el código.

Culex.

jueves, 15 de diciembre de 2016

Diseño y Administracion de SO - UNED (Creando procesos)

Este año, entre otras cosas, toca darle duro al ‘Diseño y administración de SO’. Estamos usando UNIX o más bien GNG-Linux para poner en práctica toda la teoría que estamos viendo.

La asignatura me está resultando apasionante y el ED es buenísimo. El  caso es que el tema de procesos, hijos, señales y mecanismos IPC tiene su miga, por no decir algo más gordo.


Para intentar comprender bien el funcionamiento estoy haciendo algunas pruebas sencillas que quiero compartir y explicar por si son de utilidad a algún compañero.


Aquí también podéis ver el código --> código

El código va alternando la ejecución de dos procesos. Una parte del mismo solo la puede ejecutar el proceso hijo, pero la otra la pueden ejecutar hijo o padre de forma indistinta (depende de cómo son planificados por el SO).


En la parte que pueden ejecutar los dos procesos se observa que cuando lo ejecuta el hijo, se obtiene el PID correcto tanto del padre como del hijo. Por el contrario, cuando es el padre el que ejecuta esta parte del código el PID del hijo es incorrecto.



Esto es debido a que cuando la llamada al sistema fork() finaliza, el contexto de usuario del hijo es una copia idéntica al del padre y por tanto la lectura de la variable int padre es correcta. El padre por el contrario no puede acceder al contexto del hijo y por eso el PID del hijo es incorrecto. Muestra el valor de  int hijo=999. En lugar de hijo=getpid(). Recordar que la parte del if solo la ejecuta el hijo.

Culex.

viernes, 28 de octubre de 2016

La barra invertida (backslash) esa desconocida :)

Este año toca darle duro a UNIX, o más bien a su hermano GNU-Linux.



El caso es que estamos dándole duro a los script en bash y unos compañeros compartieron esto hablando del uso de la barra invertida..

No me he podido resistir :-)



Culex

lunes, 5 de septiembre de 2016

Kernel Linux 25 Años

Este mes el Kernel de Linux cumple 25 años, ¡Que pasada!..... me acuerdo hace un montón de años cuando un amigo me hablaba de linux y todas sus virtudes....   lo mismo que las peleas que te traías entre manos para instalar Debian y que el GUI funcionase..... 


y ahora, un par de click y toda la potencia de linux en tus manos.... 



Pues si creo que la gente que ha hecho todo esto posible se merece nuestras felicitaciones.... Good job!

Culex.

lunes, 22 de agosto de 2016

30000+

Pues eso +30000 visitas :)



Muchas gracias a todos.

miércoles, 17 de agosto de 2016

AI’s Language Problem

Adjunto un articulo que he encontrado sobre inteligencia artificial donde se plantea de forma bastante didáctica el problema que se enfrentan hoy en día los investigadores a la hora de intentar que los sistemas IA se comuniquen de forma inteligente con sus interlocutores humanos.

El articulo comienza explicando los avances actuales en tareas donde el dominio del problema es limitado, como por ejemplo los juegos de mesa.




Esto no implica que estos avances no sean impresionantes,  pero claro cuando abordas un dominio del problema  como es el lenguaje humano las técnicas existentes como por ejemplo, las redes neuronales artificiales y el deep learning,  no son suficientes. 

Hay una frase que me ha encantado.......

“Building systems that know what they know is a really hard problem” 

Y claro si un día un sistema es consciente de lo que sabe y de lo que no sabe, estaríamos hablando de que de algún modo es consciente de si mismo y de sus habilidades.... sobrecogedor ¿no?

Este es el enlace del articulo aquí :)

Culex.

martes, 9 de agosto de 2016

Sobreviviendo el primer dia en BASH

Jim Lehmer ha creado un breve libro 'Ten Steps to Linux Survival, Essentials for Navigating the Bash Jungle' editado por O'Reilly y GRATUITO para que cualquier principiante pueda hacer las tareas más sencillas de diagnóstico y recuperación de un sistema Linux en 10 pasos esenciales:

http://www.oreilly.com/programming/free/ten-steps-to-linux-survival.csp

Culex.

Inteligencia del enjambre (Inteligencia artificial)

Después de hablar con una amigo sobre los avances que esta realizando la robotica a nivel cooperativo me acorde de un vídeo que vi hace ya algún tiempo sobre la inteligencia del enjambre Awesome!

Parece facilito, pero reproducir cualquier tipo de actividad que implica reproducir los procesos cognitivos de los seres vivos es una pasada.


Culex



Entendiendo el proceso de arranque (Understanding startup process)

Como decía en el post anterior lo bueno de meter la pata es que siempre puedes aprender algo nuevo para solucionar el problema.

Cuando me presentaron al BCD me quede con ganas de saber un poco mejor cómo funciona el proceso de arranque y después de documentarme un poco he juntado todo en el siguiente documento (está en ingles).

el 90% de la información la encontré en la siguiente url y está copiada prácticamente tal cual. Good job Daddy! whoever you are :-).


El aporte por mi parte ha venido por un mayor detalle en la explicación sobre el MBR(boot code & partition table) y un refuerzo de algunas partes con imágenes.

También encontré documentación interesante en las siguientes url's


Bueno sin enrollarme más adjunto el documento  enjoy!

Culex.

domingo, 31 de julio de 2016

Master Boot Record & Boot Configuration Data en Windows 7

En vista de la insistencia con la cual MS nos pedía actualizar a W10 y viendo que el dead-line se aproximaba tuve una de mis ideas geniales. Si ya sabes, una de esas con la que te cargas todo y después de un buen rato intentando solucionarlo aprendes un par de cosillas :-).

El caso es que no estaba muy convencido de migrar pero ya sabéis lo que dicen de la curiosidad y los gatos..... y pensé... hago una imagen de W7 actualizo a W10, hago una imagen de W10 para el futuro y recupero la imagen previa de W7... todo parecía fácil de realizar por lo que me pongo con la tarea.

Después de probar W10 un par de días y ver que todo funciona bien, ayer por la noche decidí volver a W7 y hay empezó la pequeña crisis..... después de recuperar la imagen de W7 upss! sorpresa no arranca el SO.




¡Que raro!, si esto lo he hecho decenas de veces..... pues ya ves, esta vez ha fallado y ha fallado porque a los SO de Microsoft (en concreto al bootmgr & bootloader) parece que nos les gusta mucho que los usuarios les degraden a una versión anterior .

The boot sector of the Windows partition was corrupted or overwritten somehow.

Una vez descartado un error en la imagen mis pasos se dirigieron a ver que pasaba con el MBR pues parecía que el gestor de arranque no localizaba la tabla de  particiones. 

Intente recuperar el MBR de varias formas pero el SO seguía sin arrancar por lo que tenía que haber algo más.

Y en efecto, algo más había de por  medio.  Hello    Boot Configuration Database.

Este archivo viene a ser lo que era boot.ini , es decir contiene información sobre las entradas presentes en el gestor inicio de windows (Windows Boot Manager).

Usando las opciones de recuperación desde la consola intente reparar el BCD pero al ejecutar el comando   bootrec /rebuildbcd   obtenía algo así.


cuando un resultado normal seria algo como esto.



Por lo que al final lo solucione a las bravas. Instale W7 desde cero para restaurar el archivo luego recupere la imagen y usando la opción de reparar equipo (F8) ajusto el BCD existente al nuevo de la imagen restaurada y voila!

Más tarde leyendo un poco más encontré la forma de solucionarlo sin tanto rollo. Básicamente necesitaba cambiar los atributos del archivo para poder editarlo.

attrib c:\boot\bcd -h -r- s 

Y

bootrec /rebuildBCD 


Finalmente, adjunto unos enlaces que me han parecido interesantes. En el ultimo es donde encontré la forma de solucionarlo :)


Culex.


jueves, 28 de julio de 2016

Libros técnicos MS

Desde  la siguiente url se pueden descargar libros técnicos sobre tecnologías y OS de Microsoft,

Si estas un poco aburrido este verano puede ser una opción para aprender alguna cosilla, además de practicar un poco el ingles :-)

Culex.


jueves, 7 de julio de 2016

Qué lenguaje programación prefieres

Me ha hecho mucha gracia....la metáfora.

¿Qué lenguaje de programación ganaría en una partida de poker?


Culex.

jueves, 23 de junio de 2016

Apuntes - Ingeniería Computadores III UNED

Adjunto mis apuntes por si son de utilidad a algún compañero :)

Y ahora de disfrutar del veranito mientras nos pensamos las asignaturas a cursar en Octubre


Culex.

miércoles, 22 de junio de 2016

EducaLAB: Conoce, conecta, crea, comparte, colabora...


Leyendo cosillas en barrapunto me he encontrado con este post  y trasteando un poco más he encontrado unos cursos sobre Linux que puede resultar entretenidos para el verano.



No parecen super técnicos pero como toma de contacto pueden ser interesantes. 

Culex.

martes, 21 de junio de 2016

PED - Ingeniería Computadores III UNED

Adjunto PED de la asignatura Ingeniería de computadores III.

A modo de resumen decir que me ha parecido una de las asignaturas más sencillas de toda la carrera. Con leer el libro y hacer unos cuantos exámenes (eso si sabiendo el porqué se hace esto o lo otro) es fácil aprobar el examen. Por otro lado, el temario no me ha parecido muy interesante la verdad, esta bien conocer VHDL pero molaría estudiar procesadores reales (aunque sean antiguos) e intentar modelarlos.  En resumen me gusto bastante más ICI & ICII.

Bueno no me enrollo más, aquí está la PED

Culex.

domingo, 12 de junio de 2016

Notepad ++

Llevaba mucho tiempo usando este editor pero la verdad es que no le había sacado nunca demasiado jugo. 

Le usaba para escribir algo de código y anotaciones rápidas pero nada más. 

Y el caso es que hace unos días me he puesto a trastear y he encontrado unas cuantas opciones que molan bastante y ahora os voy a contar.

Pero bueno, lo primero es lo primero. Aquí está el site Notepad++ y algo de información NoteWiKi & Community.

Y ahora al turrón,

1.- Abrir varias vistas a la vez para poder comparar código o trabajar en paralelo en dos archivos. 

Hacemos click con el bóton derecho en la pestaña del documento abierto y seleccionamos clonar o abrir una nueva instancia a gusto del consumidor :) 





2.- Ver a pantalla completa, fold/unfold bloques de código o establecer una carpeta como espacio de trabajo también son bienvenidas.






3.- Tener un panel con los códigos ASCII nos puede venir bien en más de una ocasión. Menu edit y panel de caracteres.




4.- y sin olvidar funciones de manejo de manejo de texto.



Pero vamos que como siempre lo mejor es trastear un poco e ir probando los diferentes menus y configuraciones a nuestra disposición.

Y todo esto sin olvidarnos de los plugins que podemos usar.

Culex.

lunes, 25 de abril de 2016

Ingeniería inversa

Surfeando un poco por ahí me he encontrado este trabajo Reverse Engineering for Beginners.
Awesome!! + 900 paginas  o la versión lite con 150 :).



Como me gustaria llegar algún día llegar a conocer alguno de estos temas con la suficiente profundidad como para escribir algo parecido.

Culex.


domingo, 10 de abril de 2016

La transformación digital al mundo cognitivo. (Inteligencia artificial)

Tengo que reconocer que me todo lo que tenga que ver con la IA y la robotica me encanta. Por eso, cuando me entere de este evento en Google campus  no lo dude un segundo.

La gente que dio la conferencia trabaja para IBM y claro nos hablaron de su sistema cognitivo Watson y de todo lo que es capaz de hacer, vamos al mas puro estilo de VICKY en 'yo, robot'.



El caso es que publicidad a parte el evento fue muy interesante, por eso, os dejo aquí un par de presentaciones por si alguien las quiere echar un vistazo.

Culex.

Apuntes - Sistemas Bases de Datos UNED

Después de terminar la asignatura pienso que lo mas interesante ha sido la practica con Hadoop. Muchas veces he escuchado comentarios sobre el uso de tecnologías obsoletas en la universidad  y esta vez no creo que mucha piense que todo el ecosistema Hadoop es una tecnología obsoleta.
Un +1 por el ED de esta asignatura.

Y ahora al grano, como ya es habitual por estos lares aquí dejo mis apuntes por si algún compañero los quiere usar ;-)


Y la segunda parte

SBDII

Culex.

martes, 23 de febrero de 2016

Configurar VLAN en switch HP

Estoy en el curro pegándome con el tema este y he encontrado estos tres link que me han parecido bastante didácticos.

VLAN 1/3
VLAN 2/3
VLAN 3/3

Culex.

jueves, 14 de enero de 2016

La importancia de 'respetar' los protocolos de seguridad


No está de más,  recordar otra vez que el exceso de confianza nos puede llevar al desastre.

Adjunto un articulo que me ha parecido interesante.

IT Security and the Normalization of Deviance

Culex.