IO Tak Segerak dengan epoll dan kqueue
Kendalikan banyak sambungan dengan epoll di Linux serta kqueue di BSD atau macOS.
IO Tak Segerak dengan epoll dan kqueue ialah pelajaran C++ Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran C++ Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.
Mengapa I/O Tak Segerak?
Satu jalur bagi setiap sambungan tidak dapat diskalakan kepada ribuan atau jutaan klien. I/O tak segerak membolehkan satu jalur mengendalikan banyak soket dengan menunggu mana-mana soket menjadi boleh dibaca atau boleh ditulis.
Linux: epoll
epoll ialah API peristiwa Linux yang boleh diskalakan. Tambahkan deskriptor fail kepada tika epoll, kemudian tunggu peristiwa pada mana-mana deskriptor tersebut.
#include <sys/epoll.h>
int epfd = epoll_create1(0);
epoll_event ev{};
ev.events = EPOLLIN;
ev.data.fd = sock;
epoll_ctl(epfd, EPOLL_CTL_ADD, sock, &ev);Menunggu Peristiwa
epoll_wait menyekat pelaksanaan sehingga peristiwa tersedia, kemudian mengembalikan deskriptor yang bersedia.
epoll_event events[64];
int n = epoll_wait(epfd, events, 64, -1);
for (int i = 0; i < n; ++i) {
int fd = events[i].data.fd;
handle_io(fd);
}Dicetuskan Tepi berbanding Dicetuskan Aras
Dua mod:
- Dicetuskan aras (lalai) — epoll terus melaporkan peristiwa selagi sesuatu keadaan dipenuhi
- Dicetuskan tepi (
EPOLLET) — hanya melaporkan perubahan keadaan; anda mesti mengosongkan soket sepenuhnya setiap kali
macOS dan BSD: kqueue
kqueue ialah padanan BSD untuk epoll dan turut tersedia pada macOS. Konsepnya serupa, tetapi API-nya berbeza.
#include <sys/event.h>
int kq = kqueue();
struct kevent ev;
EV_SET(&ev, sock, EVFILT_READ, EV_ADD, 0, 0, nullptr);
kevent(kq, &ev, 1, nullptr, 0, nullptr);Windows: IOCP
Windows menggunakan Port Penyelesaian I/O (IOCP) — model berasaskan penyelesaian, iaitu pemberitahuan diberikan apabila operasi selesai, dan bukannya model kesediaan seperti epoll/kqueue.
Soket Tanpa Sekatan
Tetapkan soket kepada mod tanpa sekatan dengan fcntl(fd, F_SETFL, O_NONBLOCK). Jika tidak, operasi membaca dan menulis boleh menyekat seluruh gelung peristiwa.
Corak Gelung Peristiwa
Gelung yang berjalan selama-lamanya:
- Tunggu peristiwa yang bersedia
- Bagi setiap peristiwa, lakukan I/O sehingga operasi itu akan menyekat
- Ulangi
Mengendalikan Banyak Klien
Satu jalur epoll boleh mengendalikan berpuluh-puluh ribu sambungan serentak — masalah C10K. Sistem moden boleh mengendalikan sehingga jutaan sambungan.
Perangkap Lazim
Berhati-hati terhadap:
- Terlupa menetapkan mod tanpa sekatan
- Mod dicetuskan tepi tanpa mengosongkan soket
- Tidak mengeluarkan FD yang telah ditutup daripada set epoll
- Kebocoran penimbal bagi setiap sambungan
Pembungkus Aras Lebih Tinggi
Menulis gelung epoll secara manual mudah menyebabkan ralat. Gunakan libuv, libevent atau Boost.Asio untuk kod pengeluaran — pustaka ini menyembunyikan perbezaan platform dan menyediakan gelung I/O yang telah diuji.
Tak Segerak berbanding Jalur
I/O tak segerak lebih mudah diskalakan tetapi lebih sukar ditulis. Untuk pelayan dengan beberapa ribu sambungan, model satu jalur bagi setiap sambungan lebih mudah. Pilih berdasarkan beban yang anda jangkakan.
Semakan Ringkas
Apakah perbezaan antara mod dicetuskan tepi dan dicetuskan aras dalam epoll?
Rumusan
I/O tak segerak boleh diskalakan kepada keserentakan yang sangat besar dengan mengendalikan banyak soket dalam satu jalur. Linux menggunakan epoll, BSD/macOS menggunakan kqueue dan Windows menggunakan IOCP. Tetapkan soket kepada mod tanpa sekatan. Untuk pengeluaran, gunakan pustaka seperti Asio, libuv atau libevent dan bukannya menulis gelung peristiwa secara manual.
Pelajari C++ dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Soalan Lazim
Adakah pelajaran “IO Tak Segerak dengan epoll dan kqueue” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran C++ Academy, termasuk “IO Tak Segerak dengan epoll dan kqueue”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “IO Tak Segerak dengan epoll dan kqueue”?
Kendalikan banyak sambungan dengan epoll di Linux serta kqueue di BSD atau macOS. Anda berlatih C++ Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan C++ Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran C++ Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.
Berapa lamakah pelajaran “IO Tak Segerak dengan epoll dan kqueue” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran C++ Academy ini?
Ya. Setiap pelajaran C++ Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- API Soket BSD dalam C++
- Membina Pelayan Gema TCP
- IO Tak Segerak dengan epoll dan kqueue
- Menggunakan Boost Asio untuk IO Tak Segerak Moden