Pertanyaan Apa yang terbaik dari epoll / kqueue / select equvalient pada Windows?


Apa fasilitas pemberitahuan acara I / O Windows terbaik?

Yang terbaik saya maksud adalah sesuatu yang ...

  1. tidak memiliki batasan jumlah deskriptor file input
  2. berfungsi pada semua deskriptor file (file disk, soket, ...)
  3. menyediakan berbagai mode notifikasi (edge ​​triggered, limit triggered)

32
2017-09-15 21:20


asal


Jawaban:


Di Windows, operasi async dilakukan oleh operasi file, bukan oleh deskriptor. Ada beberapa cara untuk menunggu operasi file untuk menyelesaikan secara asynchronous.

Misalnya, jika Anda ingin mengetahui kapan data tersedia di soket jaringan, berikan permintaan baca async pada soket dan ketika selesai, data tersedia dan diambil.

Di Win32, operasi async menggunakan OVERLAPPED struktur berisi keadaan tentang operasi IO yang luar biasa.

  1. Kaitkan file dengan Port IO Completion dan mengirimkan permintaan IO async. Ketika suatu operasi selesai, itu akan menempatkan pesan selesai pada antrian yang pekerja Anda dapat menunggu dan mengambil ketika mereka tiba. Anda juga dapat memasukkan pesan yang ditentukan pengguna ke dalam antrian. Tidak ada batasan untuk berapa banyak file atau antrian pesan dapat digunakan dengan port selesai
  2. Kirim setiap operasi IO dengan suatu peristiwa. Peristiwa yang terkait dengan operasi akan menjadi sinyal (memuaskan menunggu) ketika selesai. Menggunakan WaitForMultipleObjects untuk menunggu semua kejadian sekaligus. Ini memiliki kerugian karena hanya mampu menunggu MAXIMUM_WAIT_OBJECTS objek sekaligus (64). Anda juga dapat menunggu jenis acara lain pada saat yang sama (proses / pemutusan thread, mutex, peristiwa, semaphores)
  3. Gunakan kolam ulir. Thread pool dapat mengambil objek dan operasi file dalam jumlah tak terbatas untuk menunggu dan mengeksekusi fungsi yang ditentukan pengguna setelah selesai masing-masing.
  4. Menggunakan ReadFileEx dan WriteFileEx mengantri Panggilan Prosedur Asynchronous (APC) ke utas panggilan dan SleepEx (atau WaitFor{Single|Multiple}ObjectsEx) dengan Alertable TRUE untuk menerima pesan pemberitahuan untuk setiap operasi ketika selesai. Metode ini mirip dengan port penyelesaian IO, tetapi hanya berfungsi untuk satu utas.

Kernel Windows NT tidak membedakan antara socket, file disk, pipa, dll. Operasi file secara internal: semua opsi ini akan bekerja dengan semua jenis file.


37
2017-09-15 22:23



libuv

libuv menawarkan I / O yang dipamerkan untuk Unix dan Windows dan memiliki dukungan untuk soket, file dan pipa. Ini adalah lapisan platform Node.js.

Detail lebih lanjut ada di: http://nikhilm.github.io/uvbook/introduction.html


3
2018-04-16 10:26



Belum ada satu pun, sejauh yang saya ketahui. Seorang teman dan saya sedang mengerjakan implementasi open source Windows open source (tautan di bawah) tetapi kami mengalami masalah dalam mencari tahu bagaimana membuatnya bertindak sama dengan implementasi Linux.

Hambatan saat ini:

  • Di Linux, deskriptor file dan deskriptor soket dapat dipertukarkan, tetapi pada Windows tidak. Keduanya harus kompatibel dengan implementasi epoll.
  • Di Windows itu cukup rumit untuk mendapatkan acara kernel ... yang bagaimana epoll bekerja di Linux. Kami menduga bahwa program yang menggunakan pustaka epoll lintas platform kami akan berjalan terasa lebih lambat di Windows daripada Linux.

Saya akan mencoba untuk kembali dan memperbarui posting ini karena kami membuat kemajuan dengan proyek tersebut.

http://sourceforge.net/projects/cpoll


0
2017-09-15 22:13



select () function is POSIX dan dapat digunakan pada windows termasuk "winsock.h" atau "winsock2.h".


0
2017-08-02 10:30