Por onde devo começar com uma grande atribuição de programação simultânea? [fechadas]

8

Minha tarefa é implementar um sistema de semáforo distribuído (links para a descrição) e um aplicativo para ele. Usarei soquetes Java, e ele usará matrizes de marcas d'água e filas de prioridade (não sei onde) e, portanto, estou curioso sobre como lidar com esse projeto. Especificamente, eu gostaria de saber o que é um bom objetivo de primeira etapa ou um subsistema simples que eu possa implementar. No momento, eu simplesmente não sei onde focar minha atenção.

O aplicativo é um sistema de licença flutuante - como em um laboratório de informática com apenas uma cópia de um software (talvez um programa CAD), que permite que apenas um PC por vez use o software. Quando uma máquina está usando o software, o acesso ao software é bloqueado. Quando a máquina termina de usá-la, ela desiste e quem foi o primeiro a solicitar deve ser o próximo.

Aqui está o algoritmo de pseudo-código mencionado - http://i.imgur.com/q9kRm.png

Adel
fonte
1
Soa como um projeto divertido. Um bom "primeiro passo" seria fazer com que o aplicativo publicasse seu estado de execução na rede local. Segundo: outros aplicativos podem se recusar a executar enquanto o primeiro está sendo executado. Terceiro: os aplicativos podem entrar na fila e aguardar a sua vez. Por fim: informe os aplicativos sobre seu lugar na fila, talvez dê a eles a oportunidade de comprar um local melhor. ;-)
Sedate Alien

Respostas:

5

Considere começar com o subsistema "handshake" - aquele que permitirá que o aplicativo licenciado em execução em uma máquina específica registre uma sessão no servidor de licença e obtenha um token identificando-o exclusivamente para outras interações.

Eu acho que seria razoável para esse subsistema também incluir alguma "negociação" sobre outro protocolo de comunicação ("espera-se que os sinais de pulsação troquem a uma taxa entre 5 e 10 segundos" - coisas assim).

O próximo passo lógico provavelmente seria o estabelecimento de um tipo de módulo de "pulsação" - aquele que permitiria à máquina e ao servidor registrados ... ops, desculpe, você perguntou sobre o objetivo do primeiro passo que não se encaixa.

mosquito
fonte
8

Resposta genérica

O semáforo é uma técnica de alocação de recursos para gerenciar deadlocks e condições de corrida por meio de filas prioritárias. Colocando metaforicamente, você tem 3 bicicletas para alugar. Suponha que você o contrate por ordem de chegada. Portanto, se você contratou todas as suas 3 bicicletas e uma quarta pessoa solicita, ele deve esperar até que uma delas devolva a bicicleta. Há chances de você reservar a bicicleta para alguém, alguém pode cancelar uma bicicleta já reservada e assim por diante. Semelhante no caso de processos que desejam adquirir alguns recursos, semáforos são usados.

No caso de um semáforo distribuído, pode haver vários recursos que podem ser acessados ​​por vários processos. Suponha que um servidor hospede um aplicativo e possa hospedar várias instâncias dele e o usuário possa usá-lo se for gratuito. Seja o servidor S1, S2, .. Sn enquanto o aplicativo é A1, A2, ... An e os usuários sejam U1, U2, ... Un. Portanto, se o primeiro servidor pudesse hospedar três instâncias do aplicativo, seria indicado como S1A1, S1A2, S1A3. Também assuma as instâncias do aplicativo como slots ou caixas para facilitar o entendimento. Um slot é considerado vazio quando está livre e cheio quando está ocupado. Portanto, neste caso, o seguinte método é sugerido

  • Usuário solicita o aplicativo
  • A solicitação é passada para uma fila de prioridade.
  • A fila executa um processo contínuo em segundo plano para procurar slots livres e, quando um slot livre é encontrado, passa a solicitação ao aplicativo para iniciar o processamento
  • Quando um slot recebe a solicitação, eles se marcam como ocupados, iniciam o processamento e se libertam quando terminam o processamento.
  • Os slots periodicamente transmitem seu status para a fila para que a fila possa encaminhar as solicitações assim que um slot ficar livre

Recursos recomendados

  • Este modelo é baseado no intermediário de mensagens. A fila que processa a solicitação deve estar sempre disponível. Também pode haver um modelo sem corretor que pode ser implementado de uma maneira diferente
  • Programação de semáforo na Wikipedia
  • O Little Book on Semaphores é um excelente recurso disponível gratuitamente
  • O semáforo é baseado no modelo de memória compartilhada. O modelo do ator daria uma nova visão para resolver esse problema de uma maneira diferente

Resposta específica à pergunta no contexto

Observando o código, prefiro a versão clássica de um semáforo. O Java possui um pacote de semáforo incorporado para fazer isso e você pode facilmente construir nele.

Especificamente, eu gostaria de saber o que é um bom objetivo de primeira etapa ou um subsistema simples que eu possa implementar.

Supondo que apenas uma instância do aplicativo deva ser executada na LAN

  • Use o pacote sugerido acima
  • Crie o semáforo com um mecanismo de fila interno (semelhante a uma pilha) e implemente-o como um servidor
  • Quando um usuário inicia o aplicativo, ele procura o semáforo, diminui a contagem (nesse caso, apenas 0, pois apenas uma única instância deve ser permitida) e concede ao usuário o acesso ao aplicativo.
  • Quando um outro usuário inicia o aplicativo, ele procura o semáforo, já que é 0, coloca o usuário na fila e envia uma mensagem ao usuário de que o aplicativo está ocupado
  • Quando o primeiro usuário sai do aplicativo, o semáforo é incrementado, o recurso fica disponível, o usuário fica íntimo e agora pode iniciar o aplicativo.
  • O semáforo pode ser implementado como um servidor independente (possivelmente com uma interface da web simples) que pode ser acoplada ao aplicativo.

Vale a pena pensar nas seguintes advertências

  1. As filas podem ser totalmente liberadas ou a prioridade pode ser alterada
  2. O acoplamento ao aplicativo como servidor exige que exista apenas uma versão do servidor na LAN
  3. Prepare-se para falhas ou filas de mensagens autônomas (acesso de solicitação do usuário, mas não disponível quando o aplicativo é gratuito)

Eu provavelmente sugeriria o seguinte para uma melhor compreensão

  • Siga este link para entender melhor
  • Tente SCALA . Você pode usar todas as suas bibliotecas JAVA existentes e obter uma boa simultaneidade
  • Dê uma olhada no ZMQ . Essa pode ser a opção se você abstrair todo o processo em um aplicativo de mensagens separado que interaja com os recursos
  • Leia sobre o sistema de licenciamento do AutoCAD (eles implementam um modelo de licenciamento que corresponde a alguns de seus requisitos)

EDITAR Resposta completamente editada, pois a resposta original é baseada em uma perspectiva muito mais ampla

Ubermensch
fonte
Muito obrigado por esta resposta completa. Estou lendo os materiais que você forneceu. Principalmente, tudo o que sei é que o projeto implementa esse algoritmo na figura 9.3.
Adel
1
Resposta do @Adel atualizada para corresponder ao requisito. Links também alterados
Ubermensch 16/01