Curso2014/2015
1 PRCTICA
1 Objetivos
Se pretende que el estudiante conozca los mecanismos que proporciona el sistema operativo Unix
para el desarrollo de aplicaciones multiproceso, principalmente respecto a la creacin y terminacin
de procesos, y a su intercomunicacin. Tambin se estudiar el manejo de descriptores de E/S.
2 Desarrollo
La prctica est estructurada en cuatro etapas para facilitar su desarrollo (si bien la ltima de ellas es
opcional). Al finalizar cada etapa, el estudiante deber entregar a travs del EVA los resultados
parciales alcanzados. El formato de cada entrega y las fechas correspondientes se especificarn en su
momento en el entregador correspondiente. Esta prctica tiene una duracin total de 6 semanas.
La fecha tope para la entrega de los resultados finales de esta prctica ser el viernes de la semana 7
del primer bimestre a las 12:00 horas. La entrega se realizar mediante la subida al EVA de un nico
fichero zip que contenga el cdigo fuente desarrollado por el estudiante y otros ficheros que se
explican ms adelante. El fichero subido deber ajustarse a las especificaciones indicadas en el
entregador correspondiente. De no respetar dichas especificaciones, el profesor podr considerar no
vlida la entrega.
Esta prctica se realizar en grupos de 3 estudiantes como mximo, teniendo libertad los estudiantes
para elegir la configuracin de estos grupos. Todas las prcticas entregadas sern analizadas para
detectar posibles casos de plagio. En caso de que se compruebe que existe algn caso de plagio,
todos los estudiantes pertenecientes a los grupos implicados tendrn 0 puntos como calificacin final
de esta prctica (es decir, que no podr presentarse a la prueba de evaluacin de esta prctica) y el
hecho ser puesto en conocimiento de la autoridad competente para que tome las acciones
pertinentes.
3 Criterios de evaluacin
Esta prctica tiene un peso total de 10 puntos sobre la calificacin del primer bimestre repartidos de
la siguiente forma:
1. Informe de la prctica que incluye el cdigo de la aplicacin (4 puntos).
2. Evaluacin individual de los resultados de aprendizaje asociados a la prctica (6 puntos).
3. Hasta 2 puntos extra por la realizacin de las partes opcionales (1 punto por opcin).
4 Enunciado
Se va a desarrollar una aplicacin multiproceso que podr atender peticiones concurrentes a travs
del protocolo HTTP, que ser desarrollada en C sobre el sistema operativo FreeBSD. A este tipo de
aplicaciones se las denomina servidores web. Para realizar esta prctica, se le proporcionan los
siguientes recursos (disponibles a travs del EVA): un mdulo de funciones para procesar el
Prctica3pgina1
ArquitecturayComputacinParalela
Curso2014/2015
protocolo HTTP y realizar las comunicaciones de red (ver apartado 4.1.5), un mdulo que servir
para procesar las opciones de ejecucin del programa y establecer los parmetros de configuracin
del servidor, y un fichero Makefile para facilitar la compilacin y el enlazado de la aplicacin, que
ser adaptado por el estudiante.
La prctica se dividir en dos partes:
Una parte obligatoria para todos los estudiantes que abarca las funcionalidades bsicas del
servidor web (ver apartado 4.2).
Una parte opcional que representa algunas mejoras sobre la parte obligatoria, a elegir dentro
de un catlogo propuesto en esta prctica (ver apartado 4.3).
Prctica3pgina2
ArquitecturayComputacinParalela
Curso2014/2015
Si el proceso maestro detecta que hay menos de Pinact_min procesos trabajadores inactivos,
entonces crear procesos trabajadores adicionales hasta llegar a tener Pinact_min procesos
trabajadores inactivos o se alcance el lmite de Pmax procesos trabajadores.
Para finalizar la ejecucin del servidor web, el proceso maestro dar la orden a todos los
procesos trabajadores para que, cuando terminen de atender la peticin en curso, finalicen su
ejecucin.
Prctica3pgina3
ArquitecturayComputacinParalela
Curso2014/2015
Nota: La gestin de procesos que se pide en esta prctica est basada en la que utilizan servidores
web reales como Apache.
Para finalizar de forma ordenada, el proceso maestro debe gestionar la captura de las seales
SIGTERM y SIGINT, de forma que, cuando reciba cualquiera de ellas, d orden a todos los
procesos trabajadores para que terminen su ejecucin al finalizar el procesamiento de la
peticin en curso, cerrando adecuadamente las comunicaciones con los clientes.
Un proceso trabajador que crea un proceso hijo para ejecutar un CGI (Common Gateway
Interface) ha de pasar al CGI informacin sobre la invocacin y recibir de ste su resultado,
tal como se explica en el apartado 4.1.4. En este caso, se propone utilizar tuberas y duplicar
sobre ellas los descriptores STDIN_FILENO (entrada estndar) y STDOUT_FILENO (salida
estndar) del proceso CGI, adems de definir las variables de entorno necesarias.
Puerto TCP de escucha (opcin p[ort]). El servidor aceptar las peticiones de conexin
de los clientes en el puerto TCP indicado. Este parmetro es obligatorio
Directorio base (opcin b[ase]) a partir del cual se ubican los recursos que gestiona el
servidor. Por ejemplo, ~/paginas. El servidor deber comprobar que el camino indicado
existe y es un directorio. Si no es as, el servidor deber mostrar, por su salida de error
estndar, un mensaje indicndolo, y terminar su ejecucin.
Prctica3pgina4
ArquitecturayComputacinParalela
Curso2014/2015
Ayuda (opcin h[elp]). Muestra una ayuda acerca del uso del programa, describiendo
brevemente las opciones disponibles, y ejemplos de uso.
Los parmetros del servidor web se especificarn como argumentos de la lnea de mandatos. No se
admite que los valores estn incrustados en el cdigo ni que sean constantes de compilacin. Para
facilitar el desarrollo del servidor web, se proporciona un mdulo (ficheros param.c y param.h) para
la gestin de los parmetros bsicos de configuracin del servidor, disponible en el EVA.
El servidor web ha de recoger la salida estndar del programa CGI y enviarla tal cual al
cliente.
la funcin gethostname(3).
GATEWAY_INTERFACE:
SERVER_PROTOCOL
SERVER_PORT:
su valor es el nmero del puerto TCP en el que escucha el servidor web (en el
que acepta conexiones).
REQUEST_METHOD:
contiene todo lo que va detrs del primer carcter ? del URL, si es que hay
algo (campo argumentos de la estructura de peticin). En caso contrario, esta variable de
entorno no debe estar definida.
REMOTE_ADDR:
ArquitecturayComputacinParalela
Curso2014/2015
CONTENT_TYPE:
asociado al puerto TCP que recibe como argumento. Se habilita un puerto TCP para recibir
peticiones de conexin provenientes de los procesos cliente.
http_leer_peticion: Lee una peticin realizada por un cliente. Dada una ConexionHTTP
usada para comunicarse con un cliente, lee tanto como pueda de la misma y, si tiene
suficientes datos, genera y devuelve (parmetro resultado pasado por referencia) una
referencia a una Peticion. Tiene dos modos de funcionamiento seleccionables mediante el
parmetro de tipo lgico bloqueante. En modo bloqueante, espera hasta recibir una peticin
completa. En modo no bloqueante, si no dispone de una peticin completa en ese momento,
retorna con la indicacin HTTP_SEGUIR_ESPERANDO. En principio, para esta prctica siempre
se usar el modo bloqueante, salvo que se aborden ciertas mejoras del apartado 4.3.
Prctica3pgina6
ArquitecturayComputacinParalela
Curso2014/2015
descriptor de un fichero (o tubera) abierto para lectura, enva al cliente todo lo que lea a
travs de dicho descriptor. El parmetro es_fichero se usa para indicar si el descriptor est
asociado a un fichero o no. Al enviar la respuesta de un CGI, este parmetro deber ser 0 (ya
que el descriptor usado ser una tubera y no un fichero).
cdigo de error y un mensaje explicativo (descritos en el Apndice B), enva una respuesta de
error al cliente.
http_enviar_html: Enva datos HTML. Dada una ConexionHTTP y una cadena de texto
HTML, la enva al cliente a travs de dicha conexin. Se puede utilizar para implementar la
mejora 4.3.4.
La estructura de datos Peticion usada en las funciones anteriores contiene la siguiente informacin:
Otros campos que se utilizarn para proporcionrselos al CGI en caso de haberse solicitado
un recurso de este tipo (campos argumentos, content_type, cuerpo y long_cuerpo).
Otros campos de uso interno por parte del mdulo de comunicaciones (http).
servidor web
Recoger y procesar los parmetros de invocacin del programa servidor web, descritos en el
apartado 4.1.3.
Responder adecuadamente a las peticiones de documentos estticos que realicen los clientes.
trabajadores,
apartado
4.1.4
4.3.
4.3 Mejoras
En este apartado se proponen una serie de mejoras que se pueden hacer sobre las funciones bsicas
del servidor web. Se valorar positivamente la implementacin de las mejoras. Se recomienda que el
Prctica3pgina7
ArquitecturayComputacinParalela
Curso2014/2015
Prctica3pgina8
ArquitecturayComputacinParalela
Curso2014/2015
Es conveniente no elegir un puerto que ya est usando otro programa, por ello se aconseja usar nmeros mayores de
50.000
Prctica3pgina9
ArquitecturayComputacinParalela
Curso2014/2015
Ilustracin1.Recursoindex.htmldeldirectorio/usr/share/doc/ntp
Prctica3pgina10
ArquitecturayComputacinParalela
Curso2014/2015
Ilustracin2.Recursoindex.htmlalmostrarlaspginasdeprueba
Por si est interesado, puede encontrar el cdigo fuente de los programas CGI de ejemplo en el EVA
(en el fichero fuentes-cgi.tgz).
Tenga en cuenta que si est usando un navegador que tenga configurado un servidor Proxy, deber
deshabilitarlo para conectarse a su servidor web.
Todo ello suponiendo que la direccin IP de la mquina en la que est ejecutando su servidor web es
192.168.203.131, y que existe el fichero basica.htm en el directorio ~/bimestre1/paginas.
El documento Ejemplo.pdf, que puede encontrar en el EVA, describe paso a paso cmo se ha
construido el cdigo de este programa.
Prctica3pgina11
ArquitecturayComputacinParalela
Curso2014/2015
Es otra posibilidad ms para realizar pruebas con el servidor web de esta prctica, ya que permite
descargar recursos individuales, mientras que un navegador intentar descargar tambin posibles
referencias dentro del documento HTML, como imgenes, etc. Adems, proporciona alguna
informacin un poco ms detallada sobre el resultado de la operacin.
Para ejecutar wget basta con invocarlo (desde una sesin en la mquina FreeBSD) mediante un
mandato similar al siguiente:
wget O fichero_destino http://localhost:PUERTO/recurso
awk
'{
"http://localhost:PUERTO/"
$0
}'
>
Prctica3pgina12
ArquitecturayComputacinParalela
Curso2014/2015
Que existan diversos ficheros en el directorio de las pginas que luego va a usar en las
pruebas y que tengan los permisos esperados en cada caso.
Prctica3pgina13
ArquitecturayComputacinParalela
Curso2014/2015
asegurarse de que sabe manejar adecuadamente la API de comunicaciones HTTP con los clientes.
Evidentemente, este servidor no ser capaz de atender ms que una conexin en cada momento.
Adems, debe realizar el procesamiento completo de los parmetros de configuracin del servidor, e
incluir la gestin de las seales SIGTERM y SIGINT para poder terminar ordenadamente la ejecucin
del servidor web.
A continuacin se muestra un seudocdigo orientativo para la resolucin de esta fase:
Procesar los parmetros de configuracin
Establecer las rutinas de tratamiento de las seales
Crear gestorHTTP ( in puerto ) -> GestorHTTP
Repetir
Esperar conexin de cliente ( in gestorHTTP, out cliente )
Leer peticin ( in cliente, out peticin )
Procesar documento esttico ( in cliente, in peticin )
Destruir peticin ( in peticin )
Cerrar conexin ( in cliente )
Hasta final de programa
Destruir gestorHTTP ( in GestorHTTP )
El seudocdigo anterior cierra la conexin con el cliente tras servir una sola peticin. Esto no es muy
eficiente, ya que obliga a abrir una conexin nueva por cada recurso que haya que descargar, y
muchos documentos pueden desencadenar la solicitud de decenas o incluso cientos de recursos
adicionales. No obstante, ser suficiente para esta primera fase puesto que, al tratarse por el momento
de un servidor monoproceso, es incapaz de manejar varias conexiones en paralelo. Hay que tener en
cuenta que algunos agentes de usuario abren varias conexiones simultneas para descargar en
paralelo los recursos de un solo documento. Si el servidor slo es capaz de manejar una conexin en
cada momento y no la cierra despus de atender una nica peticin, esos agentes de usuario no seran
capaces de descargar completamente los documentos. En el momento en el que se pase al servidor
multiproceso, se modificar el seudocdigo anterior para procesar ms de una peticin en cada
conexin.
Obsrvese que, por simplicidad, ni en el seudocdigo propuesto para esta fase ni en los de las dems
fases se explicita en profundidad el tratamiento de los diversos errores y situaciones excepcionales
que pueden producirse durante la ejecucin del programa. No obstante, en su programa, el estudiante
debe detectar y tratar adecuadamente todos esos errores y situaciones excepcionales.
En este seudocdigo, el proceso permanece en un bucle hasta final de programa. Ese final de
programa se producir cuando el proceso reciba la seal SIGTERM o la seal SIGINT. El manejador
asociado a estas seales deber modificar la variable de control de dicho bucle. Tenga en cuenta que,
si se recibe una seal mientras las funciones http_esperar_conexion() o http_leer_peticion()
estn bloqueadas a la espera de recibir una solicitud de conexin o de leer una peticin, estas
funciones retornarn inmediatamente con el cdigo HTTP_ESPERA_INTERRUMPIDA. Obviamente, en
este caso no habr cliente que atender ni peticin que procesar.
Prctica3pgina14
ArquitecturayComputacinParalela
Curso2014/2015
Para probar esta fase se recomienda que el estudiante pruebe a solicitar el recurso
directorio pginas.
basica.htm
del
Ilustracin3.Recursobasica.htmldelaspginasdeprueba
Prctica3pgina15
ArquitecturayComputacinParalela
Curso2014/2015
Para que las tuberas funcionen correctamente, tanto el proceso padre como el proceso hijo deben
cerrar los extremos de las tuberas que no usan para nada. Esto no ha sido incluido en el seudocdigo
anterior. Adems, una vez que las tuberas han cumplido su funcin, deben cerrarse todos sus
descriptores asociados, puesto que en caso contrario el servidor podra quedarse sin descriptores para
poder abrir nuevos ficheros o tuberas, con lo que no podra seguir atendiendo peticiones. Ser labor
del estudiante determinar en qu puntos de su programa hay que realizar estas operaciones.
Para probar esta fase se recomienda que el estudiante abra los recursos de tipo CGI accesibles a
partir del recurso CGIs.html del directorio de pginas proporcionado.
Ilustracin4.ResultadoobtenidotraspulsarelenlaceCGIbsicoenelrecursoCGIs.htm
Prctica3pgina16
ArquitecturayComputacinParalela
Curso2014/2015
Ilustracin5.ResultadoobtenidotraspulsarelenlaceCGIquemuestralasvariablesdeentornoenelrecursoCGIs.htm
Prctica3pgina17
ArquitecturayComputacinParalela
Curso2014/2015
El ajuste de los manejadores de las seales puede ser necesario porque el proceso trabajador heredar
los ajustes del maestro y stos podran no ser los adecuados para el trabajador. En concreto:
El trabajador no tiene que procesar SIGINT, ya que eso lo hace el maestro.
La respuesta a SIGTERM tambin es diferente, ya que el maestro tiene que pedir a todos los
trabajadores que terminen, mientras que el trabajador tiene que terminar su ejecucin tras
procesar la peticin actual (si la hubiere). Ahora bien, el manejador de la seal en s podra
ser el mismo si lo nico que hace es cambiar el valor de la variable de control del bucle
principal del proceso.
El procesamiento de SIGCHLD tambin es diferente, puesto que en el maestro hay que
marcar que el trabajador que ha terminado ya no existe, mientras que en el trabajador esta
seal slo se recibe cuando termina un proceso hijo que se ha creado para ejecutar un CGI.
Tngase en cuenta que, para indicar a un trabajador que debe finalizar su ejecucin, el proceso padre
le enva la seal SIGTERM. El trabajador, al recibirla, tomar nota de que debe terminar su ejecucin
cuando concluya el procesamiento de la peticin actual.
Adems, hay que determinar cmo se actualiza la tabla de trabajadores para reflejar la creacin y la
terminacin del proceso trabajador. El paso de NOUSADO a INACTIVO lo podra hacer el proceso
trabajador cuando comienza su ejecucin, pero eso puede generar condiciones de carrera con el
maestro. Por tanto, es conveniente que el maestro lo marque como INACTIVO justo antes de crearlo.
Prctica3pgina18
ArquitecturayComputacinParalela
Curso2014/2015
Si por alguna razn, la creacin del trabajador fallara, el maestro debera volver a marcarlo como
NOUSADO. El paso de INACTIVO a NOUSADO podra hacerlo el trabajador justo antes de terminar, o el
proceso padre cuando recibe la seal SIGCHLD que le indica que un hijo ha terminado. Se recomienda
que sea el maestro el que lo haga (as tambin se marcaran como no usadas las posiciones de los
trabajadores que mueran abruptamente por cualquier motivo).
El maestro necesita conocer el PID de los procesos trabajadores para poder mandarles la seal de
terminacin. Hay que tener en cuenta posibles condiciones de carrera si un trabajador termina
prematuramente (antes de que se haya anotado su PID). Si el maestro recibe la seal SIGCHLD de un
trabajador y trata de localizar la entrada correspondiente de la tabla de trabajadores para marcarla
como NOUSADO, podra no encontrarla (porque an no se haya anotado su PID). Por tanto, habr que
garantizar que esto no ocurre. Una posibilidad es evitar que se procese la seal SIGCHLD hasta que el
PID del nuevo trabajador haya sido anotado (usando sigprocmask(2)).
Se recomienda que los trabajadores ignoren la seal de terminacin de los procesos que ejecutan los
programas CGI, y que sincronicen con ellos directamente, antes de pasar a atender una nueva
peticin. De esta forma, pueden detectar fallos en la ejecucin de los CGI, para avisar al cliente en
esos casos.
Cuando el maestro se entera de que le ha llegado la seal SIGCHLD y pasa a ejecutar la rutina de
atencin correspondiente, puede ser que hayan terminado varios procesos hijos antes de que se
ejecute su rutina de atencin, por lo que deber sincronizar con todos los hijos que estn pendientes
de sincronizar, para evitar que se queden zombis, y para anotar correctamente su estado en la tabla.
Obsrvese que en esta fase ya no hay problemas con los agentes de usuario que abren mltiples
conexiones simultneas con el servidor, ya que el servidor es capaz de atender varias conexiones a la
vez, usando, para ello, varios trabajadores en paralelo. NOTA: si el nmero mximo de procesos
trabajadores es demasiado bajo (menos de 4), s podra haber problemas con esos agentes de usuario.
Por ejemplo, podra verse que, al abrir un documento web con muchas imgenes en un navegador
web, se cargan rpidamente algunas imgenes, mientras que otras tardan mucho ms en cargarse.
Prctica3pgina19
ArquitecturayComputacinParalela
Curso2014/2015
Prctica3pgina20
ArquitecturayComputacinParalela
Curso2014/2015
estudiante cuyo nmero de cdula es 12345678 en la materia cuyo cdigo es el 23) y finalmente
generar un documento con la informacin resultante en formato HTML, la cual se enviar como
respuesta al cliente. Este documento dinmico podra hacer referencia a otros recursos grficos, de
audio, etc., los cuales descargara el cliente en cuanto interpretara el documento HTML. Existen dos
mtodos alternativos de invocar a los programas CGI, llamados GET y POST.
Existen otras muchas tecnologas que permiten generar recursos dinmicos, como PHP, JSP, ASP,
.NET, JAVA, etc., que simplemente se mencionan a ttulo informativo, ya que no se van a tener en
cuenta en esta prctica.
Los recursos dinmicos son muy tiles en combinacin con los formularios. Un formulario es un
elemento que puede aparecer en un documento HTML y que describe diversos elementos de entrada
que el usuario puede completar, como cajas de texto, listas desplegables, botones de radio, etc. As
mismo, el formulario puede proporcionar algn elemento de accin (botn, imagen, etc.) que, al ser
pulsado por el usuario, hace que el navegador enve a un determinado URL del servidor los valores
introducidos o seleccionados en el formulario como argumentos de la peticin. Ese URL deber ser
un programa CGI, que recoger los argumentos enviados para procesarlos y generar un recurso como
respuesta al cliente.
El URL http://www.utpl.edu.ec/cgi/calificaciones?cedula=12345678&materia=23, usado
como ejemplo anteriormente, podra haberse generado cuando el usuario ha pulsado el botn de
enviar de un formulario que contena una caja de texto llamada cdula en la que haba introducido
la cadena 12345678 y una lista desplegable en la que haba seleccionado la materia Arquitectura y
Computacin Paralela, cuyo cdigo numrico resulta ser el 23.
Los clientes web envan sus peticiones y reciben sus respuestas por medio del protocolo HTTP, cuya
versin ms reciente, HTTP/1.1, se encuentra especificada en la RFC 2616. A grandes rasgos, un
cliente abre una conexin TCP con el servidor web y entonces entra en un bucle de envo de una
peticin (generalmente el mtodo GET) y recepcin de una respuesta. Este bucle se repite hasta que,
bien el cliente, o bien el servidor, deciden cerrar la conexin. Obsrvese que, a travs de una misma
conexin, el cliente no enva una nueva peticin hasta haber recibido la respuesta de la peticin en
curso. Obsrvese, tambin, que un agente de usuario, podra crear varios clientes para abrir varias
conexiones simultneas con el servidor con el fin de hacer varias peticiones en paralelo.
Prctica3pgina21
ArquitecturayComputacinParalela
Curso2014/2015
400 Bad Request. El servidor web no pudo entender la solicitud debido a errores de sintaxis
en la peticin.
Este error puede deberse a un error de ortografa o de sintaxis en el URL o que se trate de un
recurso que ya no existe en el servidor.
405 Method Not Allowed. El mtodo especificado en la solicitud no se permite para el recurso
solicitado. Este error ocurre por ejemplo cuando se hace una peticin POST y el servidor web
solamente permite peticiones GET para el tipo de archivo correspondiente al URL solicitado.
408 Request Timeout. El servidor recibi una solicitud de conexin de un cliente, pero ste no
Prctica3pgina22
ArquitecturayComputacinParalela
Curso2014/2015
El mdulo http que se proporciona, ya codificado, al estudiante para gestionar las comunicaciones
con los clientes tambin hace uso de otras llamadas al sistema como, por ejemplo, socket(2),
bind(2), listen(2), accept(2), recv(2), send(2), setsockopt(2), fcntl(2) y shutdown(2).
Prctica3pgina23