it-swarm-pt.tech

Qual é o melhor equivalente de epoll / kqueue / select no Windows?

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

Pelo 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 (borda acionada, limite acionado)
35
blackwing

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

Por exemplo, se você deseja 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 concluída, os dados estavam disponíveis e foram recuperados.

No Win32, as operações assíncronas usam a estrutura OVERLAPPED para conter o estado sobre uma excelente IO).

  1. Associe os arquivos a um IO Completion Port e despache async IO solicitações. Quando uma operação for concluída, ela colocará uma mensagem de conclusão na fila em que o seu operador (s) ) pode 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 (satisfazer uma espera) quando for concluído. Use WaitForMultipleObjects para aguarde todos os eventos de uma só vez. Isso tem a desvantagem de poder esperar apenas objetos MAXIMUM_WAIT_OBJECTS de uma só vez (64) .Você também pode esperar outros tipos de eventos ao mesmo tempo (término do processo/encadeamento) , mutexes, eventos, semáforos)
  3. Use um pool de threads . O conjunto de encadeamentos pode levar 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. Use ReadFileEx e WriteFileEx para 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 IO, mas funciona apenas para um encadeamento.

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

40
Chris Smith

libuv

libuv oferece E/S registrada para Unix e Windows e possui suporte para soquete, arquivos e tubulações. É a camada da plataforma do Node.js.

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

4
schlamar

Ainda não existe, até onde eu saiba. Eu e um amigo estamos trabalhando em uma implementação de epoll do Windows de código aberto (link abaixo), mas estamos enfrentando problemas para descobrir como fazê-lo agir da mesma maneira que a implementação do Linux.

Obstáculos atuais:

  • No Linux, os descritores de arquivo e de soquete são intercambiáveis, mas no Windows eles não são. Ambos devem ser compatíveis com uma implementação de epoll.
  • No Windows, é bastante complicado obter eventos do kernel ... que é como o epoll funciona no Linux. Estamos supondo que um programa usando nossa biblioteca de epolls de plataforma cruzada seja notavelmente mais lento no Windows que no Linux.

Tentarei voltar e atualizar esta postagem à medida que progredimos no projeto.

http://sourceforge.net/projects/cpoll

1
Heron

a função select () é POSIX e utilizável em janelas, incluindo "winsock.h" ou "winsock2.h".

0
Nouil