C++ Academy · Pelajaran

IO Tak Segerak dengan epoll dan kqueue

Kendalikan banyak sambungan dengan epoll di Linux serta kqueue di BSD atau macOS.

Pelajaran 3 daripada 414 langkah

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:

  1. Tunggu peristiwa yang bersedia
  2. Bagi setiap peristiwa, lakukan I/O sehingga operasi itu akan menyekat
  3. 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.

Percuma untuk bermula

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

  1. API Soket BSD dalam C++
  2. Membina Pelayan Gema TCP
  3. IO Tak Segerak dengan epoll dan kqueue
  4. Menggunakan Boost Asio untuk IO Tak Segerak Moden
← Kembali ke C++ Academy