Pergunta

Qual é o melhor recurso de notificação de eventos de E/S do Windows?

Por melhor quero dizer algo que ...

  1. não tem limite no número de descritores de arquivo de entrada
  2. funciona em todos os descritores de arquivos (arquivos de disco, soquetes, ...)
  3. fornece vários modos de notificação (acionado por borda, acionado por limite)
Foi útil?

Solução

No Windows, as operações assíncronas são feitas por operação de arquivo, não por descritor.Existem várias maneiras de aguardar a conclusão assíncrona das operações de arquivo.

Por exemplo, se você quiser saber quando os dados estão disponíveis em um soquete de rede, emita uma solicitação de leitura assíncrona no soquete e, quando ela for concluída, os dados estarão disponíveis e serão recuperados.

No Win32, as operações assíncronas usam o OVERLAPPED estrutura para conter o estado sobre uma operação de IO pendente.

  1. Associe os arquivos a um Porta de conclusão IO e enviar solicitações de E/S assíncronas.Quando uma operação for concluída, ela colocará uma mensagem de conclusão na fila que seus threads de trabalho podem esperar e recuperar quando chegarem.Você também pode colocar mensagens definidas pelo usuário na fila.Não há limite para quantos arquivos ou mensagens na fila podem ser usados ​​com uma porta de conclusão
  2. Despache cada operação IO com um evento.O evento associado a uma operação será sinalizado (satisfará uma espera) quando for concluído.Usar WaitForMultipleObjects esperar por todos os eventos de uma vez.Isto tem a desvantagem de só poder esperar MAXIMUM_WAIT_OBJECTS objetos de uma só vez (64).Você também pode esperar por outros tipos de eventos ao mesmo tempo (encerramento de processo/thread, mutexes, eventos, semáforos)
  3. Use um Grupo de discussão.O pool de threads pode receber um número ilimitado de objetos e operações de arquivo para aguardar e executar um função definida pelo usuário após a conclusão de cada um.
  4. Usar ReadFileEx e WriteFileEx enfileirar Chamadas de procedimento assíncronas (APCs) para o thread de chamada e SleepEx (ou WaitFor{Single|Multiple}ObjectsEx) com Alertable TRUE para receber uma mensagem de notificação para cada operação quando ela for concluída.Este método é semelhante a uma porta de conclusão de E/S, mas funciona apenas para um thread.

O kernel do Windows NT não faz distinção entre soquete, arquivo de disco, canal, etc.operações de arquivo internamente:todas essas opções funcionarão com todos os tipos de arquivo.

Outras dicas

libuv

libuv oferece E/S eventos para Unix e Windows e tem suporte para soquete, arquivos e pipes.É a camada de plataforma do Node.js.

Mais detalhes estão em: http://nikhilm.github.io/uvbook/introduction.html

Ainda não existe, pelo que eu saiba.Um amigo e eu estamos trabalhando em uma implementação de código aberto do Windows epoll (link abaixo), mas estamos tendo problemas para descobrir como fazê-lo funcionar da mesma forma que a implementação do Linux.

Obstáculos atuais:

  • No Linux, os descritores de arquivo e os descritores de soquete são intercambiáveis, mas no Windows não.Ambos devem ser compatíveis com uma implementação epoll.
  • No Windows é bastante complicado obter eventos do kernel...é assim que o epoll funciona no Linux.Acreditamos que um programa que use nossa biblioteca epoll multiplataforma será executado visivelmente mais lento no Windows do que no Linux.

Tentarei voltar e atualizar este post à medida que avançamos no projeto.

http://sourceforge.net/projects/cpoll

A função select() é POSIX e pode ser usada em Windows, incluindo "winsock.h" ou "winsock2.h".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top