Búsqueda personalizada

viernes, 25 de enero de 2008

Como Compilar y ejecutar programas con PVM

Antes de compilar se tendrá que comprobar que la PVM esta activa de la siguiente forma:

$$>$pvm

Una vez activada la PVM utilizaremos el comando quit para salir de esta.

Seguidamente se creará un archivo llamado Makefile.aimk que esta en la carpeta Examples en Pvm, que tendrá la siguiente estructura:

DEBUG =

SDIR = ..

BDIR = $(HOME)/pvm3/bin

#BDIR = $(SDIR)/../bin

XDIR = $(BDIR)/$(PVM_ARCH)

CC = gcc

OPTIONS = -g

CFLAGS= $(OPTIONS) -I$(PVM_ROOT)/include $(ARCHCFLAGS)

LIBS = -lpvm3 $(ARCHLIB)

GLIBS = -lgpvm3

LFLAGS= $(LOPT) -L$(PVM_ROOT)/lib/$(PVM_ARCH)

default: nombre_programa -master nombre_programa-slave

nombre_programa-master : $(SDIR)/ejer5-master.c $(XDIR)newli $(CC) $(DEBUG) $(CFLAGS) -o $@ $(SDIR)/ejer5-master.c $\backslash $

$(LFLAGS) $(LIBS) -lm

cp $@ $(XDIR)

nombre_programa-slave : $(SDIR)/nombre_programa-slave.c $(XDIR)

$(CC) $(DEBUG) $(CFLAGS) -o $@ $(SDIR)/nombre_programa-slave.c $\backslash $

$(LFLAGS) $(LIBS) -lm

cp $@ $(XDIR)

$(XDIR):

- mkdir $(BDIR)

- mkdir $(XDIR)

clean:

rm -f *.o nombre_programa-master nombre_programa-slave $(XDIR)/nombre_programa-master $(XDIR)/ nombre_programa -slave

Para compilar los programas fuentes únicamente se tendrá que hacer:

$$>$ aimk

En el caso de que se quiera borrar los código objeto:

$$>$ aimk clean

Una vez que tenemos los programas ya compilados para ejecutarlos se realizará lo siguiente:

$$>$ programa-master Numero de procesos

Instalacion Pvm

Bueno continuando con el tema de Pvm vamos a ver la instalación correspondiente

Se Descargo el paquete(http://rpm.pbone.net/index.php3/stat/4/idpl/2396522/com/pvm-3.4.3-4.i386.rpm.html) en formato fuente y .rpm y se instalo en todas las maquinas usando el comando.


rpm -ivh pvm-3.4.3-4.i386.rpm


Con esto se instalo en nuestro sistema el programa PVM y el compilador aimk , el paso siguiente fue configurar las variables de entorno agregando esto al fichero ~/bashrc


export PVM_ROOT=/usr/share/pvm3
export PVM_ARCH=LINUX
export PATH=$PATH:$PVM_ROOT/lib:$HOME/pvm3/bin/$PVM_ARCH
export PVM_DPATH=$PVM_ROOT/lib/pvmd
export PVM_RSH=/usr/bin/ssh
export MANPATH=$MANPATH:$PVM_ROOT/man


Donde PVM_ROOT es el directorio donde se instalo el programa PVM_ARCH representa la arquitectura del sistema en el que se intalo la herramienta en nuestro caso contamos con 2 arquitecturas distintas LINUX para la maquina intel (x86)y LINUXSPARC para las station.


Tambien es necesario hacer notar que por defecto PVM trabajo con conexión mediante rsh lo que se cambio a SSH mediante la cariable PVM_RSH.


Existe otra manera de cambiar la ultima opcion que consiste en cambiar antes de compilar el pvm el archivo ../pvm3/conf/LINUXSPARC.def, el cual es para cuando se compila el programa (cuando no haya el sistema de paquetes rpm), si es ese el caso primero hay que configurar las variables de entorno para que se pueda compilar sin problemas


Luego el siguiente paso fue ejecutar pvm y configurar algunos aspectos extras, desde pvm.

pvm>add con este comando agregamos la lista de maquinas que correran pvm como lo muestra la siguiente imagen (conf muestra las maquinas agregadas)




Luego en las maquinas se procedio a configurar el compilador aimk modificando el fichero Makefile.aimk con los siguientes cambios:

# $Id: Makefile.aimk,v 1.16 1998/11/20 19:46:41 pvmsrc Exp $

#

# Makefile.aimk for PVM example programs.

#

...

#

SHELL = /bin/sh

# CAMBIO 1

#PVMDIR = ../..

# se sustituye por

PVMDIR = /usr/share/pvm3/

#CAMBIO 2

#SDIR = $(PVMDIR)/examples

#se sustituye por

SDIR = $(HOME)/pvm3/examples

# CAMBIO 3

#BDIR = $(PVMDIR)/bin

se sustituye por

BDIR = $(HOME)/pvm3/bin

XDIR = $(BDIR)/$(PVM_ARCH)

CFLOPTS = -g

CFLAGS = $(CFLOPTS) -I$(PVMDIR)/include $(ARCHCFLAGS)

##### Need to select some architecture-specific libraries to link tasks

# The default setup is for workstations

### Select PVMLIB depending on architecture.

# For MPPs (PGON and AIX4SP2/SP2MPI) select:

# PVMLIB = -lpvm3pe

# For Workstations and shared memory architectures select:

# PVMLIB = -lpvm3

PVMLIB = -lpvm3


A continuacion se compila un prograama para chequear el correcto funcionamiento de la herramienta, y esto se hace mediante un ejemplo clasico el HolaMundo que viene en los ejemplos de PVM, se compila con aimk mediante el siguiente comando:

$ aimk hello

Luego con el comando spawn dentro de pvm iniciamos el subprograma hello como se ve en la imagen y el llamado a otra maquina en este caso se ejecuto desde Rocco y llamo a Keyra





Como paso final se creo el archivo pvm.hosts el cual contiene los nombre o en su defecto las Ip de las maquinas que se desean agregar al iniciar el demonio pvmd, el cual se ejecuta al inicio con el comando add


$pvm>add pvm.hosts

viernes, 18 de enero de 2008

Funciones Pvm

a) Control de procesos

pvm_mytid():Esta función incorpora a la PVM al proceso que la invoca, propor

cionándole un número de tarea único en toda la máquina virtual,

denominado tid. Esta función debe ser la primera rutina que se in

voque antes de cualquier otra.

pvm_exit(): Comunica al demonio local que el proceso está abandonando la

PVM. Esta primitiva no elimina el proceso en sí, sino que éste

continúa pero como un proceso convencional de UNIX.

pvm_spawn():Inicializa un conjunto de tareas que se incorporarán a la PVM.

Para determinar en qué EP se van a crear estas nuevas tareas, la

heurística utilizada podría estar diseñada en función de las medi

das de carga de los EP de la PVM y de la capacidad de cómputo

de los mismos. La función devuelve el número de tareas creadas

en una o más máquinas de la configuración.

Si las tareas han sido inicializadas correctamente, como pará

metro de salida, devuelve un vector con los tids y en caso que

alguna tarea no haya podido ser inicializada, devuelve en su

correspondiente componente del vector, un código de error,

indicando el motivo por el que no ha podido iniciarse dicha

tarea.

pvm_kill(): Elimina de la PVM la tarea identificada por el parámetro tid.

b) Información de la máquina virtual

pvm_parent(): Devuelve el tid del proceso que creó la tarea que invoca a esta

función. Si existe algún error devuelve un error tipo

PvmNoParent.

pvm_pstat(): Devuelve el estado de una tarea PVM identificada por tid.

Devuelve PvmOk si la tarea está en ejecución, PvmNoTask si no

lo está, y PvmBadParam si el tid es incorrecto.

pvm_mstat(): Devuelve PvmOk si el EP está ejecutando tareas PVM,

PvmHostFail si no es posible acceder al EP, o PvmNoHost si ese

EP no está en la PVM. Esta función es útil en el diseño de

aplicaciones tolerantes a fallos. En todo momento se puede

interrogar por el estado de cualquiera de las máquinas

involucradas en la maquina virtual

pvm_config(): Devuelve información acerca de la PVM, incluyendo el número

de EPs, tipo de arquitecturas, etc.

pvm_tasks(): Devuelve información sobre las tareas en ejecución en la PVM.

c) Configuraciones dinámicas

pvm_addhost (), pvm_delhost () :Estas primitivas permiten añadir o eliminar

un EP de la configuración inicial de la PVM.

d) Primitivas de señalización

pvm_sendsig(): Envía la señal signum a otra tarea PVM identificada por un tid.

pvm_notify(): Provoca el envío de un mensaje a una serie de tareas

especificadas, al ocurrir un evento en la PVM. Los posibles

eventos que pueden ocurrir son: una tarea ha finalizado, una

máquina ha caído o ha sido eliminada, o si se ha añadido una

nueva máquina.

e) Primitivas de mensajes de error

pvm_error(): Imprime el estado de error de la última primitiva PVM.

pvm_serror(): Seleccionar esta rutina permite enviar mensajes de error de

forma automática, y de esta forma cualquier error que se

produzca, automáticamente notificará el mensaje de error

asociado.

f) Envío y recepción de mensajes

El envío de mensajes conlleva los pasos siguientes:

· Se debe inicializar un buffer de envío a través de una primitiva particular.

· Los datos que van a ser enviados deben ser empaquetados (primitivas de

empaquetado).

· El mensaje se envía a otro proceso (primitivas de emisión).

Un mensaje podrá ser recibido a través de una primitiva de recepción con o sin

bloqueo. Después se debe desempaquetar cada elemento del mensaje. En la PVM, sólo existe un buffer de envío y otro de recepción activos por cada proceso en un instante dado. El usuario es responsable de gestionar qué tipo de mensaje está activo en cada momento, pudiendo crear los que sean necesarios.

pvm_mkbuf(): Crea un buffer de envío vacío y especifica un código para

designarlo. Existen varias opciones para la codificación de

los datos en este mensaje, dependiendo del valor de la

constante encoding:

· PvmDataDefault. Codificación estándar XDR.

· PvmDataRaw. No realizar codificación.

· PvmDataInPlace. Los datos se quedan en el mismo EP.

pvm_initsend(): Limpia el buffer de envío y lo prepara para empaquetar

nuevos datos. Esta primitiva debe ejecutarse antes de

empaquetar los datos. Los valores de encoding son los

mismos que en la función anterior.

pvm_freebuf(): Elimina el buffer identificado por el parámetro bufid. Se

debe ejecutar esta primitiva siempre que se deje de utilizar

este buffer.

pvm_getsbuf(): Devuelve el número del buffer de envío activo en ese

momento.

pvm_getrbuf(): Devuelve el número del buffer de recepción activo.

pvm_setsbuf(): Selecciona el nuevo buffer de envío activo y devuelve el

identificador del anterior.

pvm_setrbuf(): Selecciona el nuevo buffer de recepción activo, retornando el

identificador del anterior. El empaquetado de los datos se

realiza con diferentes primitivas que empaquetan un

conjunto de elementos del mismo tipo en el buffer de envío

activo. Estas primitivas pueden ser llamadas múltiples veces

y en cualquier orden. De esta forma, un mensaje puede

contener varios vectores de datos de distintos tipos. No

existen restricciones relativas a cuan complejos pueden ser

estos mensajes. La única condición que existe es que se

deben desempaquetar en el mismo orden en que fueron em

paquetados. Se dispone de primitivas para empaquetar

bytes, enteros, reales, complejos, caracteres, etc.

El envío y recepción de datos se lleva a cabo con las siguientes primitivas.

pvm_send(): Esta primitiva etiqueta un mensaje con un valor entero,

msgtag, que indica un número de mensaje, y lo envía a una

tarea especificada por un tid.

pvm_mcast(): Etiqueta el mensaje con un identificador entero, msgtag, y lo

envía a las tareas especificadas por tids.

pvm_nrecv(): Recepción sin bloqueo. Si el mensaje solicitado no ha sido

recibido, esta primitiva devuelve un cero. Esta rutina puede

ser invocada repetidamente para solicitar el mensaje y

comprobar si ha llegado. Mientras el mensaje llega, se

puede seguir realizando otro trabajo entre dichas llamadas.

Si llega un mensaje con etiqueta específica desde una tarea

tid concreta, entonces se colocará el mensaje en el buffer

activo.

pvm_recv(): Primitiva de recepción con bloqueo. Espera hasta que un

mensaje con la etiqueta especificada y/o con tid

determinado haya llegado.

pvm_bufinfo(): Devuelve información acerca del mensaje con el

identificador especificado.

pvm_recvf(): Uso de definiciones propias de la primitiva de recepción de

mensajes.

g) Primitivas de grupos de procesos

Estas funciones permiten controlar un conjunto de procesos que por cuestiones del problema a resolver, interesa que estén agrupadas. Cuestiones como la sincronización de los procesos, se pueden realizar permitiendo que todos los procesos pertenezcan a un grupo. Dentro de un grupo, se pueden realizar diferentes funciones que aquí comentamos. Cualquier tarea PVM puede incorporarse o abandonar un grupo de procesos en cualquier momento sin tener que informar al resto de tareas del grupo.

pvm_joingroup (): Permite que una tarea se incorpore al grupo. Crea un

grupo con el nombre especificado y asigna la tarea a ese

grupo. A cada tarea, al incorporarse a un grupo, se le

asigna un número, a través del cual se gestionan los

grupos.

pvm_lvgroup(): Una tarea abandona un grupo invocando a esta primitiva.

En caso de volver a incorporarse, el número asignado

será posiblemente distinto al que tenía anteriormente.

Los números se asignan dinámicamente.

pvm_gettid(): Devuelve el tid del proceso que está en un grupo con un

número determinado.

pvm_getinst(): Devuelve el número que tiene una tarea dentro de un grupo.

pvm_gsize(): Devuelve el número de miembros que existen en un grupo.

pvm_barrier(): Cuando se invoca a esta función, el proceso se bloquea en

espera de que todas las tareas implicada ejecuten esta

función.

pvm_cast(): Etiqueta un mensaje con un identificador entero, y envía el

mensaje a todas las tareas de un grupo determinado. Si una

tarea se incorpora a un grupo durante la llegada de este

tipo de mensajes, podría no recibirlo.

Pvm Informacion General

La herramienta Pvm, es un conjunto de librerias necesarias para trabajar con el concepto de clusters y crear una maquina paralela virtual. Para que Pvm funcione necesariamente tiene que estar funcionando la red de computadores, permitiendo la conexión de los mismos y el inicio de sesiones en hosts remotos.

La maquina paralela virtual es una maquina que no existe, pero un API apropiado nos permite programar como si existiese. El modelo abstracto que nos permite usar el API de la Pvm consiste en una maquina multiprocesador completamente escalable (es decir, que podemos aumentar y disminuir el numero de procesadores en caliente, esto en cualquier momento). Para ello, nos va a ocultar la red que estemos empleando para conectar nuestras maquinas, asi como las maquinas de la red y sus caracteristicas especificas.

Demonio Pvm

La arquitectura de la pvm se compone de dos partes. La primera parte es el demonio, llamado Pvmd. El demonio ha de estar funcionando y configurado en todas las maquinas que vayan a compartir sus recursos computacionales con la maquina paralela virtual. A diferencia de otros demonios y programas del sistema, el demonio de Pvm puede ser instalado por el usuario en su directorio particular (de hecho, la instalacion por defecto es asi). Esto nos va a permitir hacer supercomputacion como usuarios, sin tener que discutir con el administrador de la red que programas vamos a poder ejecutar. Una vez que un usuario instalo en un directorio Pvm todo los usuarios pueden hacer uso de esa instalacion con el requisito de que el directorio donde esté instalada Pvm sea de lectura al usuario que quiera hacer uso de ella.

El demonio Pvmd es el responsable de la maquina virtual de por sí, es decir, de que se ejecuten nuestros programas para Pvm y de gerenciar los mecanismos de comunicación entre máquinas, la conversión automatica de datos y de ocultar la red al programador. Por ello, una vez que Pvm esté en marcha, el paralelismo es independiente de la arquitectura de la maquina, y solo depende de la arquitectura ed la maquina virtual creada por Pvm. Esto nos va a evitar el problema que teniamos con los Sockets, ya que teniamos que hacer una rutina de codificacion y otra de decodificacion, al menos, por cada arquitectura distinta del sistema.

Cada usuario, arrancará el demonio como si de un programa normal se tratase, para ejecutar el codigo de Pvm. Este programa se queda residente, realizando las funciones anteriores.

Biblioteca de desarrollo

La segunda parte es la biblioteca de desarrollo. Contiene las rutinas para operar con los procesos, transmitir mensajes entre procesadores y alterar las propiedades de la maquina virtual. Toda aplicación se ha de enlazar a la biblioteca para poderse ejecutar después. Tendremos tres ficheros de bibliotecas, la libpvm3.a (biblioteca basica en C), la libgpvm3.a (biblioteca de tratamiento de grupos) y la libfpvm3.a (biblioteca para fortran)

Tareas

Un programa para Pvm va a ser un conjunto de tareas que cooperan entre si. Las tareas se van a intercambiar información empleando paso de mensajes. Pvm, de forma transparente al programador, nos va a ocultar las transformaciones de tipos asociadas al paso de mensajes entre maquinas heterogeneas. Toda tarea de Pvm puede incluir o eliminar maquinas, arrancar o parar otras tareas, mandar datos a otras tareas o sincronizarse con ellas.

TIDs

Cada tarea en Pvm tiene un número que lo identifica inequívocamente, denominado TID (Task Identification Number). Es el numero al que se mandan los mensajes habitualmente. Sin embargo, no es el unico metodo de referenciar una tarea en Pvm. Muchas aplicaciones paralelas necesitan hacer el mismo conjunto de acciones sobre un conjunto de tareas. Por ello, Pvm incluye una abstracción nueva, el grupo

Grupos

Un grupo es un conjunto de tareas a las que nos podemos referir con el mismo codigo, el identificador de grupo. Para que una tarea entre o salga de un grupo, basta con avisar de la salida o entrada al grupo. Esto nos va a dotar de un mecanismo muy comodo y potente para realizar programas empleando modelos SIMD (Single Instruction, Multiple Data), en el que vamos a dividir nuestros datos en muchos datos pequeños que sean faciles de tratar, y después vamos a codificar la operación simple y replicarla tantas veces como datos unitarios tengamos de vivir el problema. Para trabajar con grupos, ademas de enlazar la biblioteca de Pvm (libpvm3.a) tenemos que enlazar tambien la de grupos (libgpvm3.a)

Funcionamiento

Habitualmente para arrancar un programa para Pvm, se lanzará manualmente desde un ordenador contenido en el conjunto de maquinas una tarea madre. La tarea se lanzará con el comando spawn desde un monitor de la maquina virtual, que a su vez se activará con el comando pvm. Esta tarea se encargará de iniciar todas las demás tareas, bien desde su funcion main (que va a ser la primera en ejecutarse), bien desde alguna subrutina invocada por ella. Para lanzar nuevas tareas se emplea la funcion pvm‗spawn, que devolverá un código de error, asociado a si pudo o no crearla, y el TID de la nueva tarea.

Clases de Arquitectura

Para evitar el problema de andar realizando transformaciones continuas de datos, Pvm define clases de arquitectura. Si es la misma, no necesita convertir datos, con lo que se tiene un gran incremento en el rendimiento. En caso que sean distintas las clases de arquitectura se emplea el protocolo XDR para codificar el mensaje.

Las clases de arquitectura están mapeadas en números de codificacion de datos, que son los que realmente se transmiten y, por lo tanto, los que realmente determinan la necesidad de la conversión

Paso de Mensajes

El modelo de paso de mensajes es transparente a la arquitectura para el programador, por la comprobación de las clases de arquitectura y la posterior codificación con XDR de no coincidir las arquitecturas. Los mensajes son etiquetados al ser enviados con un número entero definido por el usuario, y pueden ser seleccionados por el receptor tanto por dirección de origen como por el valor de la etiqueta.

El envío de mensajes no es bloqueante. Esto quiere decir que el que envía el mensaje no tiene que esperar a que el mensaje llegue, sino que solamente espera a que el mensaje sea puesto en la cola de mensajes. La cola de mensajes, además, asegura que los mensajes de una misma tarea llegarán en orden entre si. Esto no es trivial, ya que empleando UDP puede que enviemos dos mensajes y que lleguen fuera de orden (UDP es un protocolo no orientado a conexión). TCP, por ser un protocolo orientado a la conexión, realiza una reordenación de los mensajes antes de pasarlos a la capa superior, sin embargo, tiene el inconveniente que establecer las conexiones entre nodos empleando TCP supone, si tenemos n nodos, tendremos un mínimo de

($n)(n$-1) conexiones TCP activas. Provocando esto que hasta para números ridículos de $n$ nos quedamos sin puertos por éste planteamiento. Establecer conexiones TCP entre procesos en lugar de entre nodos es peor todavía, por las mismas razones que en el caso de los nodos.

La comunicación de las tareas con el daemon se hace empleando TCP. Esto se debe a que, al ser comunicaciones locales, la carga derivada de la apertura y cierre de un canal es muy pequeño. Además, no vamos a tener tantas conexiones como en el caso de la conexión entre daemons, ya que las tareas no se conectan entre sí ni con nada fuera del nodo, por lo que sólo hablan directamente con su daemon. Esto determina que serán n conexiones TCP, que sí es una cifra razonable.

La recepción de los mensajes podemos hacerla mediante primitivas bloqueantes, no bloqueantes o con un tiempo máximo de espera. La PVM nos dotará de primitivas para realizar los tres tipos de recepción. En principio nos serán más cómodas las bloqueantes, ya que nos darán un mecanismo de sincronización bastante cómodo. Las de tiempo máximo de espera nos serán útiles para trabajar con ellas como si fuesen bloqueantes, mas dando soporte al hecho de que puede que el que tiene que mandarnos el mensaje se haya colgado. Por último, la recepción de mensajes mediante primitivas no bloqueantes hace de la sincronización un dolor de cabeza. De cualquier forma, en los tres casos anteriormente citados la misma PVM se encargará de decirnos cuándo una tarea acabó. Para informarnos de lo que pasa, emplea un mecanismo de eventos asíncronos.

La PVM puede ser empleada de forma nativa como funciones en C y en C++, y como procedimientos en Fortran. Basta para ello con tomar las cabeceras necesarias (si trabajamos con C o C++); y, para los tres, enlazar con la biblioteca adecuada, que viene con la distribución estándar. En el caso de C es libpvm3.a y en el del Fortran libfpvm3.a.

Si deseamos trabajar en otros lenguajes puede ser un poco más complejo. Si el lenguaje permite incorporar funciones nativas en lenguaje C (como es el caso, por ejemplo, de Java) no hay ningún problema; ya que podemos invocar la función; bien directamente si el lenguaje lo permite, bien haciendo alguna pequeña rutina para adaptar el tipo de los datos, el formato de llamada a función o cualquiera de las restricciones que nos imponga el lenguaje que empleemos para invocar funciones en C.

Hemos de destacar que toda función en C pvm_alguna cosa tiene como equivalente en Fortran pvmfalgunacosa, y viceversa.

El programa PVM corresponde al interprete de comandos de nuestra máquina virtual. Algunos de los comandos más importantes son:

* add máquina: Incorpora la máquina indicada a la máquina paralela virtual.

* delete máquina: Elimina la máquina indicada del conjunto de máquinas

asociadas a la máquina paralela virtual. Como es lógico, no podremos

eliminar la máquina desde la que estamos ejecutando el interprete de

comandos.

* conf: Configuración actual de la máquina paralela virtual.

* ps: Listado de procesos de la máquina paralela virtual. ps -a lista todos los

procesos.

* halt: Apaga la máquina paralela virtual. Esto significa que mata todas las

tareas de la PVM, elimina el daemon de forma ordenada y sale del

programa pvm.

* help: Lista los comandos del programa.

* id: Imprime el TID de la consola.

* jobs: Genera un listado de los trabajos en ejecución.

* kill: Mata un proceso de la PVM.

* mstat: Muestra el estado de una máquina de las pertenecientes a la PVM.

* pstat: Muestra el estado de un proceso de los pertenecientes a la PVM.

* quit: Sale de la máquina paralela virtual sin apagarla.

* reset: Inicializa la máquina. Eso supone matar todos los procesos de la PVM

salvo los programas monitores en ejecuciónón, limpiar las colas de

mensajes y las tablas internas y pasar a modo de espera todos los

servidores.

* setenv: Lista todas las variables de entorno del sistema.

* sig señal tarea: Manda una señal a una tarea.

* spawn: Arranca una aplicación bajo PVM. Es un comando bastante

complejo cuyas opciones veremos en una sección aparte.

* trace: Actualiza o visualiza la máscara de eventos traceados.

* alias: Define un alias predefinido, es decir, un atajo para teclear un

comando.

* unalias: Elimina un alias predefinido.

* version: Imprime la versión usada de la PVM

miércoles, 16 de enero de 2008

Steve Jobs presento Mac book Air

Hoy (15 de enero 2008) luego de una gran espera se dio a conocer en la MacWorld Expo de San Francisco lo que Steve Jobs nos tenia preparado y no decepciono a los presentes.

Se trata de la Macbook Air el portatil mas delgado del mundo con dimensiones desde 0.4 a 1.94 cms de ancho, pantalla de 13 pulgadas, camara incorporada iSight, teclado retroiluminado y trackpad.

Ademas tiene como caracteristicas de poseer 2 gb de memoria, procesadores Intel Core 2 duo de 1.6Ghz y 1.8Ghz especialmente hechos para las dimensiones del equipo y tambien conexion wireless 802.11n, que estaran a la venta en las proximas semanas (se puede reservar desde su pagina http://www.apple.com/macbookair/) y que tendra precios de 1799 y 3098 dolares.

Tambien se dio a conocer nuevas funcionalidades del Iphone a traves de una actualizacion y un sistema de arriendo de peliculas a traves del sistema iTunes en calidad HD y con el respaldo de las principales cinematograficas.

martes, 15 de enero de 2008

Mapa de Registros Maquina Sparc

Los procesadores SPARC realizan un “sistema de ventanas”. Cada ventana son 24 registros (a los cuales se le suman 8 más que son globales, o sea, accesibles por todas las ventanas; la suma de 32 registros es visible en todo momento) que pertenecen a un procedimiento o subprograma. A medida que se van creando nuevas ventanas los registros de salida de la ventana actual se solapan sobre los de entrada de la ventana siguiente. Los CPU registros locales y de salida de la ventana actual son diferentes a los registros locales y de salida de la ventana siguiente. Esta figura lo muestra esquemáticamente:

En la figura, CWP es el índice de la ventana actual. El comando SAVE y las TRAPS decrementan dicho índice, y RESTORE y RETT lo incrementan.

Para verificar si un número de ventana es válido se utiliza el registro WIN (Window

Invalid Mask) de 32 bits. Si el bit i-ésimo está en 1 indica que esa ventana inválida y si se intenta acceder esta, segenera un error (TRAP “window_overflow”).

El registro G0 está fijo por medio del hardware con el valor 0. En él, los almacenamientos no alteran su valor. Los registros G1 a G7 son globales y pueden contener variables enteras, apuntadores a tablas u otros datos importantes. Los registros de salida son de O0 a O7 y son usados por los procedimientos para pasar parámetros a los procedimientos que llaman. El primer parámetro va al registro O0, el siguiente al O1 y así sucesivamente. El registro O6 (AE) se utiliza como apuntados a la pila de memoria. La pila se usa para los parámetros que exceden los registros, espacio de asignación dinámica de la pila, ventanas apiladas en memoria, así como para salvar registros de punto flotante, apuntadores a buffers en donde los procedimientos llamados pueden enviar

estructuras y arreglos de datos, etc. La instrucción CALL (llamada) deposita la dirección de retorno en el registro O7. Los 8 registros para variables locales L0 a L7, se pueden usar en la forma que el programador o el compilador considere más conveniente. Las 8 variables de entrada I0 a I7 son los parámetros que son pasados al procedimiento actual por el que le llama: Los registros no utilizados pueden contener variables locales adicionales. I6 (FP) es el apuntador de marco que se usa para direccionar variables en el marco de pila. A diferencia de SP que solo puede cambiar mientras el procedimiento se ejecuta, FP apunta la misma palabra en memoria durante toda la ejecución del procedimiento, siendo más apropiado para la indexación que el SP. La dirección de retorno del procedimiento se encuentra contenida en el registro I7.

Por lo tanto y en general, existen 4 grupos de registros diferentes:

Registros Globales : G0-G1

Registros de Salida: O0-O7

Registros Locales: L0-L7

Registros de Entrada: I0-I7

Set de Intrucciones Maquina Sparc

Aqui va otra info sobre maquinas sparcs, lo hago por que por lo general cuesta encontrar informacion al respecto, espero que les sirva.

op1, op2 y op3 pueden ser un registro, dirección de memoria, desplazamiento

Instrucciones aritméticas

ADD[cc]: Suma op1 a op2 y almacena el resultado en op3.
ADDX[cc]: Suma op1 a op2 y el carry y almacena el resultado en op3.
SUB[cc]: Resta op2 a op1 y almacena el resultado en op3
SUBX[cc]: Resta op2 y el carry a op1 y almacena el resultado en op3

Instrucciones lógicas

AND[cc]: Realiza el "and" bit a bit entre op1 y op2 y almacena el resultado en op3.
OR[cc]: Realiza el "or" bit a bit entre op1 y op2 y almacena el resultado en op3.
XOR[cc]: Realiza el "xor" bit a bit entre op1 y op2 y almacena el resultado en op3.

Instrucciones de desplazamiento

SLL: Realiza un shift a la izquierda de los bits de op1, op2 lugares y almacena el
resultado en op3. Sólo considera los 5 bits más significativos de op2 para determinar el valor del contador. Rellena con ceros.
SRL: Realiza un shift a la derecha de los bits de op1, op2 lugares y almacena el
resultado en op3. Sólo considera los 5 bits más significativos de op2 para determinar el valor del contador. Rellena con ceros.
SRA: Realiza un shift a la derecha de los bits de op1, op2 lugares y almacena el
resultado en op3. Sólo considera los 5 bits menos significativos de op2 para determinar el valor del contador. Realiza expansión de signo, es decir, rellena con el bit más significativo de op1.

Instrucciones de memoria

LDSB: Carga en op2 el valor del byte almacenado en la dirección de memoria op1.
realiza expansión de signo.
LDSH: Carga en op2 el valor de la media palabra (2 bytes) almacenada a partir de
la dirección de memoria op1. Realiza expansión de signo.
LDUB: Carga en op2 el valor del byte almacenado en la dirección de memoria op1 .
no realiza expansión de signo. Rellena con ceros.

LDUH: Carga en op2 el valor de la media palabra (2 bytes) almacenada a partir de la dirección de memoria op1. No realiza expansión de signo. Rellena con
ceros.
LD: Carga en op2 el valor de la palabra (4 bytes) almacenada a partir de la
dirección de memoria op1.
STB: Guarda en el byte ubicado en la dirección de memoria op2 los 8 bits menos
significativos de op1.
STH: Guarda en la media palabra (2 bytes) ubicada a partir de la dirección de
memoria op2 los 16 bits menos significativos de op1.
ST: Guarda en la palabra (4 bytes) ubicada en la dirección de memoria op2 el
valor de op1.
SWAP: Intercambia los valores entre la palabra ( 4 bytes ) almacenada en la
dirección op1 en el registro op2 .
SETHI: Coloca en los 22 bits más significativos de op2 el valor op1.


Instrucciones de bifurcación incondicional

CALL: Coloca en el registro %15 el valor actual del PC (es decir de la instrucción
que contiene el CALL) y realiza un salto incondicional a la dirección
PC+4*desp30
JMPL: Coloca en el registro op2 el valor actual del PC (es decir de la instrucción
que contiene el JMPL) y realiza un salto incondicional a la dirección op1.
RETT: Es usada para retornar de un servicio a interrupción. Verifica que el retorno
sea válido y en caso de serlo transfiere el control a la dirección op1.


Instrucciones para manejo de ventanas

SAVE: Guarda la ventana del procedimiento llamador.
coloca en el registro op3 de la nueva ventana el valor op1 + op2 calculado
a partir de los valores de los registros de la ventana vieja.
RESTORE: Guarda la ventana del procedimiento llamador.
coloca en el registro op3 de la nueva ventana el valor op1 + op2
calculado a partir de los valores de los registros de la ventana vieja.






Instrucciones de bifurcación condicional

BA: Esta instrucción es en realidad un salto incondicional pero es equivalente en
formato a todas las demás que realizan saltos condicionales en el sentido de
realizar un salto a la dirección PC+4*op1 considerando el signo de op1.
BNE: En caso que la flag de Zero sea 0 realiza un salto a la dirección PC+4*op1
considerando el signo de op1.
BE: En caso que la flag de Zero sea 0 realiza un salto a la dirección PC+4*op1
considerando el signo de op1.
BG: Si la condición anterior se cumple entonces implica que en caso de haber sido
realizada una resta (una comparación) A-B de dos números A y B codificando
enteros en complemento a 2 entonces AB y AB entonces A > B y se
realiza un salto a la dirección PC+4*op1 considerando el signo de op1.
BLE: La condición es la negación del caso anterior ( ver BG) es decir que el salto
se realiza si A B considerando el signo.
BGE: La condición se cumple si N = V y por lo tanto es verdadera cuando A B
considerando el signo (ver BG) y en ese caso se realiza el salto.
BL: La condición es la negación del caso anterior (ver BGE)
se produce si A < B (ver BG) considerando el signo.
BGU: Si la condición anterior se cumple entonces implica que en caso de haber
sido realizada una resta (una comparación) C-D de dos números C y D
codificando enteros sin signo entonces C D y C D entonces C > D y se
realiza un salto a la dirección PC+4*op1 considerando el signo de op1.
BLEU: Es la negación de la condición anterior es decir que se realiza el salto si
C D (ver BGU) sin considerar el signo de C y D.
BCC: En caso que la flag de Carry sea 0 realiza un salto a la dirección PC+4*op1
considerando el signo de op1. Es equivalente a C D (ver BGU).
BCS: En caso que la flag de Carry sea 1 se realiza un salto a la dirección
PC+4*op1 considerando el signo de op1. Es equivalente a C < D (ver BGU).
BPOS: En caso que la flag Negative sea 0 realiza un salto a la dirección PC+4*op1
considerando el signo de op1.
BNEG: En caso que la flag Negative sea 1 realiza un salto a la dirección PC+4*op1
considerando el signo de op1.
BVC: En caso que la flag de Overflow sea 0 realiza un salto a la dirección
PC+4*op1 considerando el signo de op1.
BVS: En caso que la flag de Overflow sea 1 realiza un salto a la dirección
PC+4*op1 considerando el signo de op1.


Manejo especial del registro PSR(Program Satutus Register)

n Z v C
23 22 21 20

Los bits del 20 al 23 del PSR almacenan las banderas de la IU. Estos bits son
modificados por las instrucciones con cc (por ejemplo ANDcc) y por la instrucción WRPSR.

RDPSR: Copia el PSR a op1.
WRPSR: Coloca en PSR el valor op1 op2 1 2 Å .
RDWIM: Copia el WIM ( Window Invalid Mask ) a op1.
WRWIM: Coloca en WIM el valor op1 op2.
RDTBR: Copia el TBR ( Trap Base Register ) a op1.
WRTBR: Coloca en TBR el valor op1 op2.

sábado, 12 de enero de 2008

Configuracion Conexion SSH sin clave

Lo siguiente en configurar a la hora de trabajar fue lo de la conexion ssh en los equipos para que pudiera ingresar directamente sin clave.

1.- En la maquina que nos vamos a conectar creamos el fichero con la llave publica con cifrado rsa, esto con el comando

ssh-keygen –t rsa

Esto genera la carpeta ~/.ssh con los archivos

id_rsa id_rsa.pub known_hosts,

2.-Tomamos el archivo id_rsa.pub y lo sacamos desde la maquina que va a realizar la conexión, en este caso generamos la clave en la maquina llamada pc1 y sacamos el archivo desde la maquina llamada pc2, con el siguiente comando


scp pc1: ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys


con esto copia el archivo desde pc1 a pc2 y lo guarda en el archivo authorized_keys, luego modificamos el archivo de configuración en /etc/ssh/sshd_config y la linea AutorizedKeysFile .ssh/authorized_keys, luego guardamos y reiniciamos el demonio sshd mediante el siguiente comando:

service sshd restart

Repetimos esto en las maquinas correspondientes y en vez de poner authorized_keys, lo guardamos en un archivo temporal y ese archivo temporal lo concatenamos al archivo authorized_keys de cada maquina para que guarde cada configuración de las maquinas.

esto lo hacemos de este modo:
cat archivotemporal >> authorized_keys

de este modo queda configurado ssh para poder conectarse sin necesidad de ingresar nuevamente las claves

Otra forma más efectiva para hacer el intercambio de las claves es que se cree un archivo con todas las claves que se genera y este repartirlo en las maquinas correspondiente, esto lo hace mucho mas corto el proceso si se tiene mas de 2 maquinas (como me sucedio a mi).

Espero que les sirva

viernes, 11 de enero de 2008

Reprogramacion Nvram "The IDPROM contents are invalid"

Lo primero que tuve que hacer en mi curso de Arquitectura de computadores es tomar 4 Sparcstation 4 que no tenia nada, ni disco , ni ram, apenas 1 unidad externa de cd la cual tuve que repartir las tareas para mas adelante.

Bueno esta entrada es por que cuando ya los pude iniciar las Sparc y me dispuse a instalarle Aurora Linux para Sparc no podia, y era por los errores que me daba al inicio, y era por que la nvram (o bios en pc-ibm) esta corrupta, esto se da por el hecho que como antigua la maquina y no se prendio en tiempo la pila se agoto, por lo tanto por eso el estado de la nvram.

Buscando en google informacion encontre la informacion al respecto, habiendo 2 maneras de poder
reparar o mejor dicho reprogramar la nvram o Cambiar la nvram por una nueva, este es caso mas extremo ya que aparte de ingresar una nueva nvram (se tiene que desoldar la antigua y poner la nueva):

La formas de reprogramacion son:

1.- A través de la reprogramacion lenta bit por bit de la nvram, lo cual encontre tedioso y no muy incomprensible (aunque se bastante ingles hay cosas que no se da muy al entender en este metodo)
2.- Y el metodo que ocupe que en la guia que encontre esta descrito asi
"A Quick-and-Dirty Guide to Restoring the NVRAM of a sun4c/m/u machine", que seria como "Una Guia rápida y sucia de restorar la Nvram de una maquina dun4c/m/u" que a continuacion detallo en español para que la ejecute:

1.- Al iniciar la maquina presionamos Stop-A e ingresamos a la consola de la nvram (ok prompt), cuidado con esto por que estas trabajando a nivel de la nvram y cualquier configuracion erronea te matas

2.- Tecleamos en la consola lo siguiente:

ok? set-defaults

ok? setenv diag-switch? false

ok? 8 0 20 E3 E4 E5 H1H2H3 mkpl

(los numeros 8 0 20 E3 E4 E5 H1H2H3 es a gusto de consumidor digo yo por que con esa identificacion va a quedar la tarjeta de red, y aunque siempre tiene que empezar con 8 0 20 ya que son las asignadas a las sparcs)


3.- Al momento de ingresar la última línea, se presiona Control-D e inmediatamente Control-R.

4.- Reiniciamos y esta listo.


Con esto quedo configurada la Nvram y pude iniciar el proceso de instalacion de Sistema Operativo, como chiste quedo como anecdota que un amigo jugando con la configuracion puso que de entrada de dispositivo quedara el cdrom y no el teclado por lo tanto hasta alli llego esa sparc y lo otro que me preocupo era que la opcion mas compleja y que el profesor me daba era cortar la nvram por la mitad (me imagine esa escena y queda perplejo) y conectarle una nueva bateria, lo peor es que lo vi hacerlo al profesor y estabamos todos atonito por el metodo medio extremo del trabajo. Bueno espero cualquier comentario.

Dejo el link de la pagina en ingles de esto para mas detalles:

http://www.squirrel.com/sun-nvram-hostid.faq.html