¿Dónde debo comenzar en una gran tarea de programación concurrente? [cerrado]

8

Mi tarea es implementar un sistema de semáforo distribuido (enlaces a la descripción) y una aplicación para él. Usaré sockets Java, y usará matrices de marcas de agua y colas de prioridad (no estoy seguro de dónde), por lo que tengo curiosidad sobre cómo abordar este proyecto. Específicamente, me gustaría saber cuál es un buen objetivo de primer paso, o un subsistema simple que pueda implementar. Por el momento, no sé dónde enfocar mi atención.

La aplicación es un sistema de licencia flotante, como en un laboratorio de computación con solo una copia de un software (tal vez un programa CAD), que permite que solo una PC a la vez use el software. Cuando una máquina está utilizando el software, el acceso al software está bloqueado. Cuando esa máquina termina de usarla, se da por vencida y el que primero solicitó debe ser el siguiente.

Aquí está el algoritmo de pseudocódigo referenciado: http://i.imgur.com/q9kRm.png

Adel
fuente
1
Suena como un proyecto divertido. Un buen "primer paso" sería lograr que la aplicación publique su estado de ejecución en la red local. Segundo: otras aplicaciones pueden negarse a ejecutarse mientras se ejecuta la primera. En tercer lugar: las aplicaciones pueden unirse a una cola y esperar hasta que sea su turno. Finalmente: deje que las aplicaciones conozcan su lugar en la cola, quizás les dé la oportunidad de comprar un lugar mejor. ;-)
Sedate Alien

Respuestas:

5

Considere comenzar con el subsistema "apretón de manos", el que permitirá que la aplicación con licencia que se ejecuta en una máquina en particular registre una sesión en su servidor de licencias y obtenga un token que lo identifique de manera única para futuras interacciones.

Creo que sería razonable que este subsistema también incluyera alguna "negociación" sobre el protocolo de comunicación adicional ("se esperará que las señales de latido se intercambien a una velocidad entre 5 y 10 segundos", cosas así).

El siguiente paso lógico probablemente sería establecer un tipo de módulo "heartbeat", el que permitiría a la máquina y al servidor registrados ... ¡Uy, perdón por haber preguntado sobre el objetivo del primer paso que uno no encaja!

mosquito
fuente
8

Respuesta genérica

Semaphore es una técnica de asignación de recursos para gestionar puntos muertos y condiciones de carrera a través de colas de prioridad. Poniéndolo metafóricamente, tienes 3 bicicletas de alquiler. Suponga que lo contrata por orden de llegada. Entonces, si ha contratado todas sus 3 bicicletas y una cuarta persona lo solicita, debe esperar hasta que una de ellas haya traído la bicicleta. Hay posibilidades de que pueda reservar la bicicleta para alguien, alguien puede cancelar una bicicleta ya reservada y así sucesivamente. Similar en el caso de procesos que desean adquirir algunos recursos, se utilizan semáforos.

En el caso de un semáforo distribuido, podría haber múltiples recursos a los que podrían acceder múltiples procesos. Suponga que un servidor aloja una aplicación y puede alojar varias instancias de la misma y el usuario puede usar la aplicación si es gratuita. Deje que el servidor sea S1, S2, .. Sn mientras que la aplicación sea A1, A2, ... An y los usuarios sean U1, U2, ... Un. Entonces, si el primer servidor pudiera alojar tres instancias de la aplicación, entonces se denotaría como S1A1, S1A2, S1A3. Asuma también las instancias de la aplicación como ranuras o cuadros para una fácil comprensión. Una ranura se considera vacía cuando está libre y llena cuando está ocupada. Entonces, en este caso, se sugiere el siguiente método

  • El usuario solicita la aplicación
  • La solicitud se pasa a una cola prioritaria.
  • La cola ejecuta un proceso continuo en segundo plano para buscar espacios libres y una vez que se encuentra un espacio libre, pasa la solicitud a la aplicación para iniciar el procesamiento
  • Una vez que un espacio recibe la solicitud, se marcan como ocupados y comienzan a procesar y se liberan cuando terminan de procesar.
  • Las ranuras transmiten periódicamente su estado a la cola para que la cola pueda reenviar las solicitudes una vez que una ranura queda libre

Recursos recomendados

  • Este modelo se basa en el intercambio centralizado de mensajes. La cola que procesa la solicitud siempre debe estar disponible. También puede haber un modelo sin intermediario que podría implementarse de una manera diferente
  • Programación de semáforos en Wikipedia
  • El pequeño libro sobre semáforos es un excelente recurso disponible gratuitamente
  • Semaphore se basa en el modelo de memoria compartida. Actor Model daría una nueva visión para resolver este problema de una manera diferente

Respuesta específica a la pregunta en contexto.

Mirando el código, prefiero la versión clásica de un semáforo. Java tiene un paquete de semáforos incorporado para hacer esto y usted podría construirlo fácilmente.

Específicamente, me gustaría saber cuál es un buen objetivo de primer paso, o un subsistema simple que pueda implementar.

Suponiendo que solo una instancia de la aplicación se ejecute en la LAN

  • Use el paquete sugerido anteriormente
  • Cree el semáforo con un mecanismo de cola incorporado (similar a una pila) e impleméntelo como servidor
  • Cuando un usuario inicia la aplicación, busca el semáforo, disminuye el recuento (en este caso solo 0, ya que solo se permite una sola instancia) y le da acceso a la aplicación.
  • Cuando otro usuario inicia la aplicación, busca el semáforo, ya que es 0, coloca al usuario en la cola y le envía un mensaje de que la aplicación está ocupada.
  • Cuando el primer usuario sale de la aplicación, el semáforo se incrementa, el recurso se vuelve disponible, el usuario se intima y ahora puede iniciar la aplicación.
  • El semáforo se puede implementar como un servidor independiente (posiblemente con una interfaz web simple) que se puede combinar con la aplicación.

Vale la pena pensar en las siguientes advertencias

  1. Las colas se pueden vaciar por completo o se puede cambiar la prioridad
  2. Al acoplarlo con la aplicación como servidor, se requiere que solo haya una versión del servidor en la LAN
  3. Prepárese para bloqueos o colas de mensajes desatendidos (acceso de solicitud del usuario pero no disponible cuando la aplicación es gratuita)

Probablemente sugeriría lo siguiente para una mejor comprensión

  • Siga este enlace para comprender mejor
  • Prueba SCALA . Puede usar todas sus bibliotecas JAVA existentes y obtener una buena concurrencia
  • Echa un vistazo a ZMQ . Esta podría ser la opción si abstrae todo el proceso en una aplicación de mensajería separada que interactúa con los recursos
  • Lea sobre el sistema de licencias de AutoCAD (implementan un modelo de licencia que cumple con algunos de sus requisitos)

EDITAR Respuesta completamente editada ya que la respuesta original se basa en una perspectiva mucho más amplia

Ubermensch
fuente
Muchas gracias por esta respuesta completa. Estoy leyendo los materiales que me ha proporcionado. Principalmente, todo lo que sé es que el proyecto tiene el algoritmo implementado en la figura 9.3.
Adel
1
@Adel Answer actualizado para cumplir con el requisito. Los enlaces también cambiaron
Ubermensch