IO Asinkron dengan epoll dan kqueue
Tangani banyak koneksi dengan epoll di Linux dan kqueue di BSD atau macOS
IO Asinkron dengan epoll dan kqueue adalah pelajaran C++ Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C++ Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C++ Academy mencakup 4 pelajaran total.
Mengapa I/O Asinkron?
Satu utas untuk setiap koneksi tidak dapat diskalakan hingga ribuan atau jutaan klien. I/O asinkron memungkinkan satu utas menangani banyak soket dengan menunggu salah satunya siap dibaca atau ditulis.
Linux: epoll
Linux memiliki API peristiwa yang dapat diskalakan. Tambahkan deskriptor berkas ke instans epoll, lalu tunggu peristiwa pada salah satu 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 memblokir sampai peristiwa tersedia, lalu mengembalikan deskriptor yang siap.
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);
}Dipicu Tepi vs Dipicu Tingkat
Dua mode:
- Dipicu tingkat (bawaan) — epoll terus melaporkan selama suatu kondisi terpenuhi
- Dipicu tepi (
EPOLLET) — hanya melaporkan saat terjadi perubahan keadaan; Anda harus mengosongkan soket sepenuhnya setiap kali
macOS dan BSD: kqueue
kqueue adalah padanan BSD untuk epoll dan juga tersedia di macOS. Secara konsep serupa, tetapi menggunakan API yang berbeda.
#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 I/O Completion Ports (IOCP) — model berbasis penyelesaian (memberi tahu saat selesai), bukan model kesiapan seperti epoll/kqueue.
Soket Tak Memblokir
Atur soket agar tidak memblokir dengan fcntl(fd, F_SETFL, O_NONBLOCK). Jika tidak, pembacaan dan penulisan dapat memblokir seluruh perulangan peristiwa.
Pola Perulangan Peristiwa
Perulangan yang berjalan selamanya:
- Tunggu peristiwa yang siap
- Untuk setiap peristiwa, lakukan I/O sampai operasi tersebut akan memblokir
- Ulangi
Menangani Banyak Klien
Satu utas epoll dapat menangani puluhan ribu koneksi serentak — masalah C10K. Sistem modern dapat menangani hingga jutaan koneksi.
Kesalahan Umum
Perhatikan hal-hal berikut:
- Lupa mengatur mode tak memblokir
- Menggunakan mode dipicu tepi tanpa mengosongkan soket
- Tidak menghapus FD yang tertutup dari kumpulan epoll
- Kebocoran buffer untuk setiap koneksi
Pembungkus Tingkat Lebih Tinggi
Menulis perulangan epoll secara manual rentan terhadap kesalahan. Gunakan libuv, libevent, atau Boost.Asio untuk kode produksi — pustaka tersebut menyembunyikan perbedaan platform dan menyediakan perulangan I/O yang telah diuji.
Asinkron vs Utas
I/O asinkron lebih mudah diskalakan, tetapi lebih sulit ditulis. Untuk server dengan koneksi hingga beberapa ribu, model satu utas per koneksi lebih sederhana. Pilih berdasarkan beban yang Anda perkirakan.
Pemeriksaan Singkat
Apa perbedaan antara mode dipicu tepi dan dipicu tingkat dalam epoll?
Ringkasan
I/O asinkron dapat diskalakan hingga konkurensi yang sangat besar dengan menangani banyak soket dalam satu utas. Linux menggunakan epoll, BSD/macOS menggunakan kqueue, dan Windows menggunakan IOCP. Atur soket agar tidak memblokir. Untuk produksi, gunakan pustaka (Asio, libuv, libevent), bukan menulis perulangan peristiwa secara manual.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “IO Asinkron dengan epoll dan kqueue” gratis?
Ya — teks lengkap “IO Asinkron dengan epoll dan kqueue” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C++ Academy, upgrade ke CoddyKit PRO. Kursus C++ Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “IO Asinkron dengan epoll dan kqueue”?
Tangani banyak koneksi dengan epoll di Linux dan kqueue di BSD atau macOS Kamu berlatih C++ Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C++ Academy?
Tidak diperlukan pengalaman sebelumnya. C++ Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “IO Asinkron dengan epoll dan kqueue” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C++ Academy ini?
Ya. Setiap pelajaran C++ Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- API Soket BSD dalam C++
- Membangun Server Echo TCP
- IO Asinkron dengan epoll dan kqueue
- Menggunakan Boost Asio untuk IO Asinkron Modern