next up previous contents
Next: Bibliografía Up: Algoritmos de Relevancia de Previous: Skip Lists   Índice General

Modelo Cliente-Servidor

Hardware cliente-servidor

La arquitectura cliente-servidor permite al usuario en una máquina, llamada el cliente, requerir algún tipo de servicio de una máquina a la que está unido, llamado el servidor, mediante una red como una LAN (Red de Area Local) o una WAN (Red de Area Mundial). Estos servicios pueden ser peticiones de datos de una base de datos, de información contenida en archivos o los archivos en sí mismos, o peticiones de imprimir datos en una impresora asociada.


Aunque clientes y servidores suelen verse como máquinas separadas, pueden, de hecho, ser dos áreas separadas en la misma máquina. Por tanto, una única máquina Unix puede ser al mismo tiempo cliente y servidor. Además una máquina cliente unida a un servidor puede ser a su vez servidor de otro cliente y el servidor puede ser un cliente de otro servidor en la red. También es posible tener el cliente corriendo en un sistema operativo y el servidor en otro distinto.


Hay varios tipos comunes de máquinas clientes en entornos cliente-servidor. Uno de los clientes más populares es una computadora personal basada en Intel que ejecuta aplicaciones de DOS en un entorno Windows. Otra cliente popular es una terminal X; de hecho, el sistema X Windows es un modelo cliente-servidor clásico.


Hay también clientes Unix que ejecutan sistemas operativos como UnixWare. Un servidor que pide cosas a otro servidor es un cliente de la máquina a la que está pidiendo. Sin considerar el tipo de cliente que se esté usando en una red cliente-servidor, se realizando al menos una de las funciones básicas descritas aquí como funciones del cliente.


Los clientes en una red cliente-servidor son las máquinas o procesos que piden información, recursos y servicios a un servidor unido. Estas peticiones pueden ser cosas como proporcionar datos de una base de datos, aplicaciones, partes de archivos o archivos completos a la máquina cliente. Los datos, aplicaciones o archivos pueden residir en un servidor y ser simplemente accedidos por el cliente o pueden ser copiados o movidos físicamente a la máquina cliente.


Esta disposición permite a la máquina cliente ser relativamente pequeña. Para cada tipo de entorno de cliente, hay habitualmente software específico (y a veces hardware) en el cliente, con algún software y hardware análogo en el servidor. Los servidores pueden ser sistemas operativos diferentes como Windows NT, Windows 95, OS/2, Unix. Unix es popular porque, como sistema operativo de servidores, puede ser utilizado en muchos tipos de configuraciones sobre máquinas servidor, además de como servidores de archivos y servidores de impresión.


Los servidores en una red cliente-servidor son los procesos que proporcionan información, recursos y servicios a los clientes de la red. Cuando un cliente pide un recurso como, por ejemplo, un archivo, datos de una base de datos, acceso a aplicaciones remotas o impresión centralizada, el servidor proporciona estos recursos al cliente. Como se mencionó antes, los procesos del servidor pueden residir en una máquina que también actúa como cliente de otro servidor. Además de proporcionar este tipo de recursos, un servidor puede dar acceso a otras redes, actuando como un servidor de comunicaciones que conecta a otros servidores o $mainframes$ o minicomputadoras que actúan como $hosts$ de la red.


También puede permitir enviar faxes o correo electrónico desde un cliente en una red a un cliente en otra red. Puede actuar como servidor de seguridad, como servidor de gestión de la red, como servidor multimedia, como servidor de directorios o de acceso.


Los servidores que tienen sistemas operativos multitarea tienen la habilidad de ejecutar, aparentemente al mismo tiempo, numerosos programas sin obstaculizar la ejecución de cada Esto se conoce como multitareas preferentes, porque cada programa tiene garantizada la posibilidad de correr; esto es, cada programa no se ejecuta hasta que el sistema operativo lo aparta para permitir que otros programas corran. Otros sistemas operativos no soportan multitareas preferentes, sólo la llamada multitarea cooperativa, bajo la cual los programas corren hasta que ellos mismos permiten la ejecución de otro programa o no tienen otra cosa que hacer durante este periodo.


Es fácil apreciar los beneficios de tener capacidades multitareas preferentes. Además de reducir los tiempos muertos, la flexibilidad de no tener que cerrar las ventanas de aplicaciones antes de abrir y trabajar en otras es mucho más conveniente.


Algunos sistemas de multitareas preferentes realizan el procesamiento preferente mediante el monitoreo, tanto de los procesos que están en espera de ejecución como de los que se están ejecutando. Entonces, el sistema programa cada proceso para que tenga la misma oportunidad de acceso al microprocesador. El resultado es que las aplicaciones abiertas parecen correr al mismo tiempo. La capacidad de asignar tiempo a las aplicaciones que están en ejecución, nos permite mayor velocidad de procesamiento.


El concepto de que numerosos usuarios pudieran accesar aplicaciones o el potencial de procesamiento de una sola PC (computadora personal) era un mero sueño desde hace unos años. La capacidad para asignar tiempo del microprocesador a numerosas aplicaciones simultáneas se presentó como consecuencia de servir a numerosas personas al mismo tiempo, cada una ejecutando una o más aplicaciones.


Una particularidad de esta característica es que más de una persona puede trabajar en la misma versión de la misma aplicación de manera simultánea, desde las mismas terminales o desde terminales separadas. Esto no debe confundirse con numerosos usuarios que actualizan un archivo a un tiempo, particularidad que es potencialmente desconcertante y peligrosa a la vez que indeseable.

Programación Cliente-Servidor

Cuando un programa es leído del disco por el kernel y es cargado en memoria para ejecutarse, se convierte en un proceso. En un proceso no sólo hay una copia del programa, sino que además el kernel le añade información adicional para poder manejarlo.


Un proceso se compone de tres bloques fundamentales que se conocen como segmentos. Estos bloques son:

  1. El segmento de texto.
  2. El segmento de datos.
  3. El segmento de pila (stack).

Debido a que los procesos se pueden ejecutar en dos modos: usuario y kernel (o supervisor) el sistema maneja dos stacks por separado. El stack de usuario contiene los argumentos, variables locales y otros datos relativos a funciones que se ejecutan en modo usuario, y el stack del kernel contiene los stack frames de las funciones que se ejecutan en modo supervisor (estas funciones son las llamadas al sistema). UNIX es un sistema que permite multiproceso (ejecución de varios procesos simultáneamente). El scheduler o planificador es la parte del $kernel$ encargado de gestionar el CPU (unidad central de proceso) y determinar qué proceso pasa a ocupar tiempo de CPU en un determinado instante.


Un mismo programa puede estar siendo ejecutado en un instante determinado por varios procesos a la vez. Desde el punto de vista funcional, un proceso de UNIX es la entidad que se crea tras la llamada fork (esta función crea un proceso nuevo a partir del proceso actual). Todos los procesos, excepto el primero (proceso número 0), son creados mediante una llamada fork. El proceso que llama a $fork$ se conoce como proceso padre y el proceso creado es el proceso hijo. Todos los procesos tienen un único proceso padre, pero pueden tener varios procesos hijos. El $kernel$ identifica a cada proceso mendiante su pid (process identification), que es un número asociado a cada proceso y que no cambia durante el tiempo de vida de éste. La llamada a fork hace que el proceso actual se duplique. A la salida de $fork$, los dos procesos tienen una copia idéntica del contexto del nivel de usuario, excepto el valor de pid (identificador de proceso), que para el proceso padre toma el valor del pid del proceso hijo y para el proceso hijo toma el valor de 0.


La comunicación entre los procesos de UNIX se compone de tres mecanismos: los semáforos, que permiten sincronizar procesos, memoria compartida que permite que los procesos compartan su espacio de direcciones virtuales, y las colas de mensajes, que posibilitan el intercambio de datos con un formato determinado. El modelo cliente-servidor es el modelo éstandar de ejecución de aplicaciones en una red. Un servidor es un proceso que se está ejecutando en un nodo de la red y que gestiona el acceso a un determinado recurso. Un cliente es un proceso que se ejecuta en el mismo o diferente nodo y que realiza peticiones de servicio al servidor. Las peticiones están originadas por la necesidad de acceder al recurso que gestiona el servidor. El servidor está continuamente esperando peticiones de servicio. Cuando se produce una petición, el servidor despierta y atiende al cliente. Cuando el servicio concluye, el servidor vuelve al estado de espera.


Las acciones que debe llevar a vabo el programa servidor son las siguientes:

  1. Abrir el canal de comunicaciones e informar a la red tanto de la dirección a la que responderá como de su disposición para aceptar peticiones de servicio.
  2. Esperar a que un cliente le pida servicio en la dirección que él tiene declarada.
  3. Cuando recibe una petición de servicio, crea un proceso fork para que le de servicio al cliente.
  4. Se regresa al punto número 2 para esperar nuevas peticiones de servicio.
El programa cliente, por su parte, lleva a cabo las siguientes acciones:
  1. Abrir el canal de comunicaciones y conectarse a la dirección de red atendida por el servidor. Esta dirección de red debe ser conocida por el cliente y debe responder al esquema de generación de direcciones de la familia de sockets que se esté empleando.
  2. Enviar al servidor un mensaje de petición de servicio y esperar hasta recibir la respuesta.
  3. Cerrar el canal de comunicaciones y terminar la ejecución.

Generalmente se usa la familia de sockets AF_INET que se comunican mediante protocolos tales como TCP, y la semántica para la comunicación para el $socket$ es de tipo SOCK_STREAM que está orientado a conexión. Esto es lo que se conoce como circuito virtual.


next up previous contents
Next: Bibliografía Up: Algoritmos de Relevancia de Previous: Skip Lists   Índice General
Manuel Elizalde Vieyra 2001-10-27