epoll ve kqueue ile Eşzamansız IO
Linux'ta epoll, BSD veya macOS'ta kqueue ile çok sayıda bağlantıya ölçeklenin
epoll ve kqueue ile Eşzamansız IO, CoddyKit'te ücretsiz bir C++ Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C++ Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C++ Academy kursu toplamda 4 dersten oluşur.
Neden Eşzamansız G/Ç?
Her bağlantı için bir iş parçacığı kullanmak, binlerce veya milyonlarca istemciye ölçeklenmez. Eşzamansız G/Ç, bunlardan herhangi birinin okunabilir ya da yazılabilir duruma gelmesini bekleyerek tek bir iş parçacığının birçok soketi işlemesini sağlar.
Linux: epoll
Linux'un ölçeklenebilir olay API'sidir. Dosya tanımlayıcılarını bir epoll örneğine ekleyin ve bunlardan herhangi birindeki olayları bekleyin.
#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);Olayları Bekleme
epoll_wait, olaylar kullanılabilir olana kadar bloklanır ve ardından hazır tanımlayıcıları döndürür.
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);
}Kenar Tetiklemeli ve Seviye Tetiklemeli
İki kip vardır:
- Seviye tetiklemeli (varsayılan) — bir koşul sürdüğü müddetçe epoll bildirim göndermeye devam eder
- Kenar tetiklemeli (
EPOLLET) — yalnızca durum değiştiğinde bildirim gönderir; her seferinde soketi tamamen boşaltmanız gerekir
macOS ve BSD: kqueue
kqueue, epoll'un BSD'deki karşılığıdır ve macOS'ta da kullanılabilir. Kavramsal olarak benzerdir; API'si farklıdır.
#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, epoll/kqueue'nun hazır olma modelinden farklı olarak, tamamlanma tabanlı bir model kullanan G/Ç Tamamlanma Bağlantı Noktalarını (IOCP) kullanır; işlem tamamlandığında bildirim gönderilir.
Engellemesiz Soketler
Soketleri fcntl(fd, F_SETFL, O_NONBLOCK) ile engellemesiz olarak ayarlayın. Aksi hâlde okumalar ve yazmalar tüm olay döngüsünü engelleyebilir.
Olay Döngüsü Deseni
Sonsuza kadar çalışan bir döngü:
- Hazır olayları bekleyin
- Her olay için, engellenmesi gerekene kadar G/Ç işlemi yapın
- Yineleyin
Çok Sayıda İstemciyi İşleme
Tek bir epoll iş parçacığı, on binlerce eşzamanlı bağlantıyı işleyebilir; bu, C10K problemidir. Modern sistemler milyonlarca bağlantıya ulaşabilir.
Yaygın Hatalar
Şu noktalara dikkat edin:
- Engellemesiz kipi ayarlamayı unutmak
- Soketi boşaltmadan kenar tetiklemeli kip kullanmak
- Kapatılan FD'leri epoll kümesinden kaldırmamak
- Her bağlantı için arabellek sızıntıları
Üst Düzey Sarmalayıcılar
Bir epoll döngüsünü elle yazmak hataya açıktır. Üretim kodu için libuv, libevent veya Boost.Asio kullanın; bunlar platform farklılıklarını soyutlar ve test edilmiş G/Ç döngüleri sağlar.
Eşzamansız G/Ç ve İş Parçacıkları
Eşzamansız G/Ç daha iyi ölçeklenir ancak yazılması daha zordur. Birkaç bin bağlantıya sahip sunucular için bağlantı başına iş parçacığı modeli daha basittir. Beklediğiniz yüke göre seçim yapın.
Hızlı Kontrol
epoll'daki kenar tetiklemeli ve seviye tetiklemeli kipler arasındaki fark nedir?
Özet
Eşzamansız G/Ç, tek bir iş parçacığında birçok soketi işleyerek çok yüksek eşzamanlılığa ölçeklenir. Linux epoll, BSD/macOS kqueue, Windows ise IOCP kullanır. Soketleri engellemesiz olarak ayarlayın. Üretim için olay döngüsünü elle kodlamak yerine bir kitaplık (Asio, libuv, libevent) kullanın.
Sıkça Sorulan Sorular
“epoll ve kqueue ile Eşzamansız IO” dersi ücretsiz mi?
Evet — “epoll ve kqueue ile Eşzamansız IO” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C++ Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C++ Academy kursu toplamda 4 dersten oluşur.
“epoll ve kqueue ile Eşzamansız IO” dersinde ne öğreneceğim?
Linux'ta epoll, BSD veya macOS'ta kqueue ile çok sayıda bağlantıya ölçeklenin C++ Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C++ Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C++ Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“epoll ve kqueue ile Eşzamansız IO” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C++ Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C++ Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- C++'ta BSD Soket API'si
- TCP Yankı Sunucusu Oluşturma
- epoll ve kqueue ile Eşzamansız IO
- Modern Eşzamansız IO için Boost Asio Kullanımı