Multitarea – Condiciones de carrera



Las condiciones de carrera (Race Condition o Race Hazard en inglés) es un problema de diseño propio de los sistemas multitarea. Diferentes tareas o proceso compiten por determinados recursos compartidos y en ocasiones pueden provocar la caída del sistema o una mala experiencia de usuario.

Intentemos explicar las condiciones de carrera con una carrera de caballos.



Imaginemos que una carrera de caballos, todos los jinetes intentan cabalgar por el carril mas interno.

El carril más interno de la pista de carreras es un recurso compartido, puesto que puede ser ocupado por cualquiera de los jinetes en un momento dado.

Pero el uso de este carril, implica que al ser uno solo, los jinetes compitan por ocuparlo y esa competencia tiene que tener determinada sincronización.

Una vez ocupado este carril, puedes correr a toda velocidad si no tienes ningún caballo delante, o correr teniendo en cuenta la velocidad del o los caballos que tengas delante en el mismo carril.

Otro problema es que dos caballos no pueden ocupar el mismo carril a la vez en la misma posición porque se produciría una colisión que podría traer como consecuencia la caída de caballos y jinetes.

La única solución que tiene un jinete en una carrera de caballos para utilizar este carril es la sincronización:

  • Si está vacío, puedes ocuparlo a toda velocidad y correr mientras no tengas nadie delante
  • Si está ocupado, tienes que ir a una velocidad inferior a la de los caballos que tengas delante
  • Si vas a entrar o a salir del carril, tienes que cuidar que no haya colisión con otros caballos

Un problema similar ocurre con los ordenadores y teléfonos móviles. Imaginemos que el carril es un recurso compartido, por ejemplo el micrófono de un teléfono móvil. Los caballos son hilos de ejecución (threads). Como por lo general, el teléfono solo tiene un micrófono, un hilo de ejecución donde se ejecuta una llamada de voz no puede interferir con hilo que ejecuta una grabación de notas de voz.



Y lo mismo pasa con la pantalla. Un juego que presenta animaciones en pantalla, no puede interferir con el uso del visor de la cámara de fotos que utiliza también la pantalla.

Si no sincronizan y se respetan estas acciones, el usuario grabaría una conversación de voz que no sería transmitida al otro interlocutor a través de la red telefónica, o el juego continuaría enviando imágenes animadas a una pantalla por donde tenemos que mirar antes de hacer una foto.

Las condiciones de carrera en un sistema informático se producen siempre cuando varios procesos o tareas acceden a un recurso compartido (memoria, disco, dispositivo de entrada / salida) cambiando temporalmente su estado que es reportado a otro proceso como un error. Por ejemplo que se grabe una conversación de voz en vez de trasmitirse a la voz a otro usuario.

Otra condición de carrera se produce cuando un proceso descarga un archivo de música o vídeo desde Internet y otro proceso intenta reproducirlo al mismo tiempo. 



El proceso que reproduce tiene que tener dos facilidades implementadas:

  • Buffering (a almacenamiento temporal) de los datos que desea reproducir. El proceso de descarga transfiere bloques de datos a este buffer bloqueándolo durante un corto espacio de tiempo y luego liberándolo para que el proceso reproductor lo pueda leer
  • Mecanismo para sincronizar cuando el buffer tiene datos disponibles o cuando se han terminado los datos o simplemente cuando no se actualiza el buffer durante un período de tiempo demasiado grande

Si no hay buffering, el proceso que reproduce puede intentar leer un fichero que puede estar bloqueado por el proceso de descarga. Esto implicaría que nuestra aplicación tendría que esperar terminar la descarga antes de reproducir su contenido.

Si no hay sincronismo entre procesos, el que reproduce fallará porque el buffer podría estar en uso por el proceso de descarga.

Entorno de Desarrollo WASCE - Parte III


Añadiendo el servidor WASCE local

A continuación vamos a añadir a Eclipse nuestro servidor WASCE. Para ello nos aseguramos que estamos en la perspectiva Java EE, seleccionamos en el panel inferior “Servers” y luego “new server wizard…”.



En la pantalla siguiente, seleccionamos IBM y damos información sobre el servidor WASCE:


Luego seleccionamos el directorio donde hemos instalado el servidor WASCE en Ubuntu:


La próxima pantalla nos permite introducir el usuario y contraseña de administrador si hemos cambiado los valores por defecto de la instalación:

  • Administrator id: system
  • Administrator password: manager



En la próxima pantalla damos “Finish” y ya tenemos el servidor WASCE configurado dentro de nuestro Eclipse. Como el WASCE arranca de manera automática como un servicio, nos aparecerá arrancado (started) dentro del IDE:


Si seleccionamos con el botón derecho el servidor y luego “Luego WASCE Console” tendríamos dentro de Eclipse la consola de administración. Personalmente, prefiero utilizar la consola desde Firefox, donde hay más espacio y se ve mucho mejor.


Desde este menú contextual se puede detener, reiniciar o arrancar el servidor en caso de problemas.








Entorno de Desarrollo WASCE - Parte II


Instalación en Eclipse del adaptador para WASCE

Entramos en la siguiente página Web de IBM:

Tenemos varias formas para actualizar el adaptador de WASCE:

  • Directamente por http desde un sitio en Internet
  • Descargando el software a un repositorio local
  • Descargando directamente el software para actualizar dentro de eclipse la carpeta “features” y la carpeta “plugins”

Yo voy a elegir la opción más rápida que es la tercera.

En la página, buscamos el enlace  “ WASCE 3.0 WTP Server Adapter deployable zip package here”  y descargamos su contenido.

Nos aseguramos que Eclipse no se esté ejecutando. Abrimos el archivo zip con el Archive Manager de Ubuntu y hacemos las siguientes operaciones:

  • Añadimos el contenido de la carpeta “features” a la carpeta de Eclipse “features” (en mi caso está en /home/jmaw/eclipse/features)
  • Añadimos el contenido de la carpeta “plugins” a la carpeta de Eclipse “plugins” (en mi caso está en /home/jmaw/eclipse/plugins)


Una vez concluidas, ejecutamos Eclipse desde el lanzador de Unity.

Verificamos la instalación

En el menú “Help” seleccionamos “About Eclipse” donde veremos lo siguiente:


El icono destacado en rojo indica que se ha instalado software de IBM en Eclipse.

Si presionamos el botón “Installation Details” tendríamos más información indicando que hemos instalado el adaptador:


Entorno de Desarrollo WASCE - Parte I


Una vez instalado el servidor de aplicaciones, tenemos que configurar un entorno de desarrollo para poder crear y desplegar aplicaciones en él.

Instalación de Eclipse

Como IDE (Integrated Development Environment) vamos a utilizar Eclipse en su última versión. Nos vamos a la página de descargas de Eclipse en:

  
Seleccionamos Linux como sistema operativo, la versión de 32 bits (en mi caso porque tengo un Ubuntu de 32 bits) y el Eclipse IDE for Java EE Developers.




La instalación de Eclipse es bastante simple. Solo tenemos que descargar el software, descomprimirlo en una carpeta y ya está listo para trabajar.



Para ahorrarnos los temas de permisos, vamos a crear la carpeta de Eclipse en la ruta de nuestro perfil (en mi caso en /home/jmaw).

Así que arrastramos la carpeta eclipse del archivo tar.gz a la carpeta Home de nuestro perfil.

Una vez creada la carpeta eclipse, entramos y ejecutamos a Eclipse Juno. Aceptamos el workspace que nos pondrá por defecto (en mi caso es /home/jmaw/workspace)


Usando gedit, creamos en la carpeta eclipse un archivo denominado eclipse.desktop con el siguiente contenido:

[Desktop Entry]
Version=1.0
Name=Eclipse
GenericName=Eclipse
X-GNOME-FullName=JEE Development IDE
Comment=JEE Development IDE
Type=Application
Categories=Application;Java;IDE;Programming
Exec=/home/jmaw/eclipse/eclipse
TryExec=/home/jmaw/eclipse/eclipse
Terminal=false
StartupNotify=true
Icon=/home/jmaw/eclipse/icon.xpm

Destaco en azul mi nombre de usuario que debería cambiarse por el usuario de cada cuál.

Guardamos el archivo y luego lo arrastramos al lanzador de Unity. Ya tenemos un enlace para ejecutar Eclipse directamente.

   
Actualizar Eclipse

Lo primero que haremos será actualizar Eclipse con los últimos cambios, desde sus repositorios originales.

Para ello ejecutamos un “Check for Updates” desde el menú “Help”.



Este proceso demorará unos minutos. Podemos esperar a que termine o ejecutarlo como tarea de fondo (background). Con esto garantizamos que el entorno esté lo más posible libre de fallos.

Integrando Ubuntu en el dominio de Windows – Compartiendo archivos


En artículos anteriores, hemos visto como integrar nuestro Ubuntu 12.04 “Precise Pangolin” en el dominio de Windows de Directorio Activo. Primero configuramos un Proxy para salir a Internet y acceder a recursos compartidos en el dominio. Luego vimos como añadir una impresora de red de Hewlett Packard.

Ahora vamos a ver como es posible compartir nuestros archivos con el resto de los ordenadores del dominio.

Samba

Samba es una implementación libre del protocolo de archivos compartidos de  Windows (antiguamente llamado SMB, renombrado recientemente a CIFS) para sistemas de tipo UNIX.

De esta forma, es posible que ordenadores con Linux, Mac OSX o UNIX en general se vean como servidores o actúen como clientes en redes de Windows.

Samba también permite validar usuarios haciendo de Controlador Principal de Dominio (PD o Primary Domain Controller), como miembro de dominio e incluso como un dominio de Directorio Activo para redes basadas en Windows; aparte de ser capaz de servir colas de impresión, directorios compartidos y autentificar con su propio archivo de usuarios.

Entre los sistemas tipo Unix en los que se puede ejecutar Samba, están las distribuciones GNU/Linux, Solaris y las diferentes variantes BSD Unix entre las que podemos encontrar el Mac OS X Server de Apple.

El nombre viene de insertar dos vocales al protocolo estándar que Microsoft usa para sus redes, el SMB o Server Message Block.

Samba es una implementación de una docena de servicios y una docena de protocolos, entre los que se encuentran:

  • NetBIOS sobre TCP/IP (NetBT)
  • SMB (también conocido como CIFS)
  • DCE/RPC o más concretamente MSRPC
  • El servidor WINS también conocido como el servidor de nombres NetBIOS(NBNS)
  • La suite de protocolos del dominio NT, con su Logon de entrada a dominio
  • La base de datos del gestor de cuentas seguras (SAM)
  • El servicio Local Security Authority (LSA) o autoridad de seguridad local
  • El servicio de impresoras de NT
  • El Logon de entrada de Directorio Activo, que incluye una versión modificada de Kerberos y una versión modificada de LDAP.

Samba configura directorios Unix y GNU/Linux (incluyendo sus subdirectorios) como recursos para compartir a través de la red.

Para los usuarios de Windows, estos recursos aparecen como carpetas normales de red.

Los usuarios de GNU/Linux pueden montar en sus sistemas de archivos estas unidades de red como si fueran dispositivos locales, o utilizar la orden smbclient para conectarse a ellas muy al estilo del cliente de la línea de órdenes ftp.

Cada directorio puede tener diferentes permisos de acceso sobrepuestos a las protecciones del sistema de archivos que se esté usando en GNU/Linux.

Por ejemplo, las carpetas home pueden tener permisos de lectura y escritura para cada usuario, permitiendo que cada uno acceda a sus propios archivos; sin embargo, deberemos cambiar los permisos de los archivos localmente para dejar al resto ver nuestros archivos, ya que con dar permisos de escritura en el recurso no será suficiente.

Instalación y configuración

Abrimos un terminal y tecleamos:

sudo apt-get install samba samba-client smbfs smbclient

Una vez termina la instalación, vamos al archivo de configuración para añadir nuestro nombre de dominio.

sudo nano /etc/samba/smb.conf

A continuación buscamos el parámetro workgroup:

#======= Global Settings =========
[global]
## Browsing/Identification ###
# Change this to the workgroup/NT-domain 
#   name your Samba server will part of
   workgroup = enterprise10.com

En este parámetro añadimos el nombre de nuestro dominio de Directorio Activo. Guardamos el archivo de configuración y estamos listos para compartir carpetas.
Compartir carpetas con ordenadores Windows

Podemos crear y compartir una carpeta, pero mejor aún, vamos a compartir la carpeta Public en el home de nuestro usuario para poder intercambiar archivos con los ordenadores Windows.

Abrimos el explorador de archivos Nautilus y hacemos click derecho sobre la carpeta Public y seleccionamos Sharing Options:



En Sharing Options dejamos el nombre de la carpeta compartida como “Public”, añadimos una descripción que indica que la carpeta compartida está en un ordenador con Ubuntu y luego seleccionamos dos check boxes indicando:

  • Todos los usuarios pueden borrar o copiar archivos en esta carpeta compartida
  • Acceso de invitados para aquellos que no tengan una cuenta de usuario

Una vez introducida toda esta información, le damos al botón “Create Share”.



Creado el recurso compartido, nos va a preguntar previamente si añade los permisos de manera automática. A esto respondemos que sí.

Una vez compartida esta carpeta, tecleamos en el terminal el comando ifconfig para averiguar cuál es nuestra dirección IP.

ifconfig

El resultado del comando será algo como:

eth0      Link encap:Ethernet  HWaddr 08:00:27:b7:c3:3f 
          inet addr:172.26.20.13  Bcast:172.26.20.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:feb7:c33f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:85958 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6386 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:15126691 (15.1 MB)  TX bytes:1120151 (1.1 MB)

En azul tenemos nuestra dirección IP. Con esta dirección, nos vamos a cualquier ordenador Windows en el dominio, abrimos un explorador e intentamos acceder a la carpeta Public:




Como podemos ver en el explorador de Windows, aparecen los recursos compartidos de Ubuntu: la impresora de red y la carpeta pública.

Solo nos queda probar Samba, copiando archivos en Public y viendo en Ubuntu si realmente aparecen estos archivos.


Integrando Ubuntu en nuestro dominio de Windows – Impresoras de red


Una de las ventajas de estar en un dominio de Windows de Directorio Activo, es el acceso a recursos compartidos como las impresoras de red.

Una vez conectado nuestro ordenador Ubuntu Linux con el Microsoft Proxy Server, podemos fácilmente añadir una impresora de red que esté compartida en el dominio.

Vamos a System Settings y a  Printing para configurar una nueva impresora. Presionamos el botón “Add”.



Seleccionamos “Network Printer” y luego “Find Network Printer”. En el diálogo que tenemos a la derecha, introducimos la dirección IP de la impresora de red y damos “Find”.



Una vez encontrada la impresora nos aparecerá una pantalla como esta:



Esperamos unos segundos en esta pantalla mientras Ubuntu se comunica con la impresora y determina automáticamente la conexión adecuada:



Continuamos a la próxima pantalla, donde primero Ubuntu buscará los drivers de impresión:



Una vez encontrados los drivers de la impresora, nos pedirá si queremos añadir alguna descripción para nuestro Linux y terminamos con “Apply” para aceptar los cambios.

Por último, Ubuntu nos pide si queremos imprimir una página de pruebas para asegurarnos de que podemos usar la impresora de red sin problemas.



Por último aceptamos con “OK” el diálogo final para guardar la configuración de la impresora en el sistema.






Integrando Ubuntu en nuestro dominio Windows – Proxy NTLM


Introducción



En muchas empresas las granjas de servidores y los ordenadores de trabajo que utilizan Microsoft Windows están organizados dentro de lo que se conoce como dominios.

Estos dominios no son más que un conjunto de ordenadores conectados en una red que confían a uno de los equipos de dicha red la administración de los usuarios y los privilegios que cada uno de los usuarios tiene en dicha red.

Este equipo, al que se le denomina controlador de dominio, tiene un conjunto de roles o responsabilidades. Uno de ellos es la autenticación de los usuarios.

La autenticación es el proceso de garantizar o denegar a un usuario el acceso a recursos compartidos o a otra máquina de la red, normalmente a través del uso de una contraseña.

El protocolo básico de comunicación en el dominio es Directorio Activo (Active Directory).Este protocolo implementa un servicio de directorio en una red de ordenadores conectadas a un dominio de Windows, basándose en una serie de protocolos estándares tales como LDAP, Kerberos, DNS, DHCP, NTLM, etc.

Microsoft Proxy Server




Junto con el controlador de dominio, se utilizan otros servidores que realizan funciones específicas, como el Microsoft Proxy Server.

El Proxy Server actúa como un gateway o pasarela segura para conectar su red local LAN a Internet. Gateway se refiere un software u ordenador ejecutando software que permite la comunicación entre dos redes.

Usando un gateway Proxy Server, es posible que la red quede protegida contra intrusos. El Gateway actúa como una barrera que permite hacer peticiones a Internet y recibir información, pero no permitirá el acceso a la red de usuarios no autorizados.

El Proxy Server se apoya en NTLM (NT LAN Manager), una serie de protocolos de seguridad de Microsoft que permiten autenticación, integridad y confidencialidad a los usuarios conectados en el dominio.




Instalación del proxy Cntlm






Para conectarnos al Proxy Server de Windows, vamos a utilizar la aplicación cntlm.

Cntlm es un Proxy NTLM rápido y eficiente, con muy poco consumo de memoria y procesador, con el que vamos a conectarnos desde nuestro Ubuntu al servidor Proxy de nuestra red de Windows.

El paquete se encuentra en el repositorio Universe y este repositorio va instalado por defecto en cualquier instalación de Ubuntu junto con los repositorios Main, Restricted y Multiverse.

No obstante, si queremos verificar que tenemos el repositorio instalado, nos basta con abrir una terminal y ejecutar un comando cat para ver el contenido del archivo /etc/apt/sources.list:

sudo cat /etc/apt/sources.list


En este archivo deben aparecer unas líneas que indican que tenemos el repositorio Universe instalado:

deb http://es.archive.ubuntu.com/ubuntu/ precise universe
deb-src http://es.archive.ubuntu.com/ubuntu/ precise universe
deb http://es.archive.ubuntu.com/ubuntu/ precise-updates universe
deb-src http://es.archive.ubuntu.com/ubuntu/ precise-updates universe

Con esta información ya podemos instalar el Proxy cntlm:

sudo apt-get install cntlm

O simplemente desde Ubuntu Software Center. Buscar “cntlm” e instalarlo.

Una vez instalado, nos quedan dos pasos muy importantes:

  • Configurar cntlm para que acceda al servidor Proxy del dominio
  • Configurar el Linux para que todas las peticiones http, ftp, etc. salgan se redirijan a nuestro Proxy local

Configuración de cntlm

El archivo de configuración de cntlm se encuentra en /etc/cntlm.conf.

sudo gedit /etc/cntlm.conf

Su contenido de este archivo es el siguiente:

#
# Cntlm Authentication Proxy Configuration
#
# NOTE: all values are parsed literally, do NOT escape spaces,
# do not quote. Use 0600 perms if you use plaintext password.
#

Username   johnsmith
Domain     enterprise10.com
Password   jsmith67

# NOTE: Use plaintext password only at your own risk
# Use hashes instead. You can use a "cntlm -M" and "cntlm -H"
# command sequence to get the right config for your environment.
# See cntlm man page
# Example secure config shown below.
# PassLM          1AD35398BE6565DDB5C4EF70C0593492
# PassNT          77B9081511704EE852F94227CF48A793
### Only for user 'testuser', domain 'corp-uk'
# PassNTLMv2      D5826E9C665C37C80B53397D5C07BBCB

# Specify the netbios hostname cntlm will send to the parent
# proxies. Normally the value is auto-guessed.
#
# Workstation     netbios_hostname

# List of parent proxies to use. More proxies can be defined
# one per line in format <proxy_ip>:<proxy_port>
#
#Proxy            10.0.0.41:8080
Proxy       myproxy.enterprise10.com:9712

# List addresses you do not want to pass to parent proxies
# * and ? wildcards can be used
#
NoProxy           localhost, 127.0.0.*, 10.*, 192.168.*

# Specify the port cntlm will listen on
# You can bind cntlm to specific interface by specifying
# the appropriate IP address also in format <local_ip>:<local_port>
# Cntlm listens on 127.0.0.1:3128 by default
#
Listen            3128

# If you wish to use the SOCKS5 proxy feature as well, uncomment
# the following option. It can be used several times
# to have SOCKS5 on more than one port or on different network
# interfaces (specify explicit source address for that).
#
# WARNING: The service accepts all requests, unless you use
# SOCKS5User and make authentication mandatory. SOCKS5User
# can be used repeatedly for a whole bunch of individual accounts.
#
#SOCKS5Proxy      8010
#SOCKS5User dave:password

# Use -M first to detect the best NTLM settings for your proxy.
# Default is to use the only secure hash, NTLMv2, but it is not
# as available as the older stuff.
#
# This example is the most universal setup known to man, but it
# uses the weakest hash ever. I won't have it's usage on my
# conscience. :) Really, try -M first.
#
#Auth       LM
#Flags            0x06820000

# Enable to allow access from other computers
#
#Gateway    yes

# Useful in Gateway mode to allow/restrict certain IPs
# Specifiy individual IPs or subnets one rule per line.
#
#Allow            127.0.0.1
#Deny       0/0

# GFI WebMonitor-handling plugin parameters, disabled by default
#
#ISAScannerSize     1024
#ISAScannerAgent    Wget/
#ISAScannerAgent    APT-HTTP/
#ISAScannerAgent    Yum/

# Headers which should be replaced if present in the request
#
#Header           User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)

# Tunnels mapping local port to a machine behind the proxy.
# The format is <local_port>:<remote_host>:<remote_port>
#
#Tunnel           11443:remote.com:443
  

Los parámetros más importantes son:

Parámetro
Descripción
Username
Nombre de usuario en el dominio de Windows (Active Directory) con el que vamos a acceder al Microsoft Proxy Server. En este caso johnsmith
Domain
Dominio de Active Directory en el cuál validamos nuestro usuario. En este caso es enterprise10.com
Password
Contraseña de nuestro usuario de Active Directory. En este caso jsmith67. Si las políticas de Directorio Activo nos obligan a cambiar periódicamente la contraseña, tenemos que actualizarla en este parámetro también.No olvidemos que el cntlm intentará periódicamente conectarse al Microsoft Proxy Server con unas credenciales incorrectas que podrían bloquear nuestro usuario. 
Proxy
Nombre totalmente cualificado (FQDN) del Microsoft Proxy Server y de su puerto de acceso separados por dos puntos:
myproxy.enterprise10.com:9712
NoProxy
Rangos de direcciones para las que no necesitamos el uso del Proxy, usualmente:
localhost, 127.0.0.*, 10.*, 192.168.*
Listen
Puerto por donde nuestro Proxy local cntlm va a escuchar al resto de las aplicaciones en Linux cuando quieran acceder a Internet a través del Proxy Server del dominio. Por defecto es el puerto 3128


El cntlm se instala como un servicio, por lo que después de cambiar los parámetros en cntlm.conf, tenemos que reiniciarlo para que estos cambios tengan efecto:

sudo service cntlm restart

La salida deberá ser:

[sudo] password for jmaw:
Stopping CNTLM Authentication Proxy: cntlm.
Starting CNTLM Authentication Proxy: cntlm.


Configuración de Linux para usar cntlm

Para configurar en Linux el uso de cntlm, seleccionamos system settings:



Y en system settings seleccionamos Network. En Network seleccionamos primero el Proxy del sistema, luego que lo vamos a establecer de forma manual y seleccionamos a cntlm para cada uno de los protocolos con el puerto predeterminado 3128.




Una vez configurado el Proxy para todos los protocolos hacemos click en el botón “Apply system wide” y ya tenemos el Proxy cntlm listo.

La próxima prueba es abrir Firefox y hacer una búsqueda en Google para ver que efectivamente el acceso a Internet funciona.

Entradas más recientes Entradas antiguas Inicio