0Pricing
C Academy · Ders

Birden Çok İstemciyi İşleme

select ve poll

Birden Çok İstemciyi İşleme, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 4. 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.

Eşzamanlılık Sorunu

Basit bir sunucu aynı anda tek bir istemciyi ele alır. Bir istemci yavaşsa diğer herkes bekler. Birçok istemciye eşzamanlı olarak hizmet vermek için farklı bir modele ihtiyacınız vardır.

Eşzamanlılık Yaklaşımları

Yaygın üç strateji:

  • İstemci başına iş parçacığı/süreç: basittir ancak ölçek büyüdükçe ağırlaşır
  • select veya poll ile G/Ç çoklama: tek bir iş parçacığı birçok soketi izler
  • epoll/kqueue ile olay döngüleri: binlerce bağlantıya ölçeklenebilir

select Ne Yapar

select(), bir dosya tanımlayıcıları kümesini izler ve tek bir engelleyici çağrıda hangilerinin okuma, yazma için hazır olduğunu veya hangilerinde hata bulunduğunu bildirir. Böylece tek bir iş parçacığı birçok sokete hizmet verebilir.

fd_set Temelleri

select, fd_set bit maskesini kullanır. Bu maskeyi şu makrolarla yönetin: FD_ZERO, FD_SET, FD_CLR ve FD_ISSET.

#include <sys/select.h>

void setup_set(fd_set *set, int listen_fd) {
    FD_ZERO(set);          /* clear all */
    FD_SET(listen_fd, set); /* watch the listener */
}

select Çağrısı

select, en yüksek fd değerinin bir fazlasını gerektirir ve hazır tanımlayıcıları işaretlemek için kümeyi yerinde değiştirir. Yıkıcı olduğu için her çağrıdan önce kümeyi yeniden oluşturmanız gerekir.

#include <sys/select.h>
#include <stdio.h>

int wait_ready(int maxfd, fd_set *read_set) {
    int n = select(maxfd + 1, read_set, NULL, NULL, NULL);
    if (n < 0) perror("select");
    return n; /* number of ready fds */
}

select Sunucu Döngüsü

İzlenecek yol şöyledir: kümeyi yeniden oluşturun, select çağrısını yapın, ardından hazır olan her fd için, dinleyici ise yeni bir istemci kabul edin; istemci ise veri okuyun.

#include <sys/select.h>

void loop_skeleton(int listen_fd, fd_set *master, int maxfd) {
    fd_set work;
    for (;;) {
        work = *master;           /* copy, select destroys it */
        select(maxfd + 1, &work, NULL, NULL, NULL);
        for (int fd = 0; fd <= maxfd; fd++) {
            if (!FD_ISSET(fd, &work)) continue;
            /* fd == listen_fd -> accept; else -> recv */
        }
    }
}

İstemcileri İzleme

Yeni bir bağlantıyı kabul ettiğinizde fd değerini ana kümeye ekleyin ve maxfd değerini güncelleyin. Bir istemci bağlantıyı kestiğinde (recv 0 döndürdüğünde) close çağrısı yapın ve fd değerini FD_CLR ile kümeden çıkarın.

#include <sys/select.h>
#include <unistd.h>

void add_client(fd_set *master, int *maxfd, int conn) {
    FD_SET(conn, master);
    if (conn > *maxfd) *maxfd = conn;
}
void drop_client(fd_set *master, int conn) {
    close(conn);
    FD_CLR(conn, master);
}

select'in Sınırlamaları

select bazı dezavantajlara sahiptir:

  • FD_SETUP tanımlayıcıyla sınırlıdır (çoğunlukla 1024)
  • Her çağrıda tüm fd değerlerini O(n) karmaşıklığıyla tarar
  • Küme her yinelemede yeniden oluşturulur

Çok sayıda bağlantı için poll veya epoll daha iyi ölçeklenir.

poll Ne Sunar

poll(), sabit bir bit maskesi yerine struct pollfd dizisi alır; bu nedenle 1024 tanımlayıcı sınırı yoktur ve her çağrıda girdiyi bozmaz.

#include <poll.h>

void setup_poll(struct pollfd *pfd, int listen_fd) {
    pfd[0].fd = listen_fd;
    pfd[0].events = POLLIN; /* notify when readable */
}

poll Çağrısı

poll, en az bir fd hazır olana (veya zaman aşımı gerçekleşene) kadar engellenir, ardından hazır olan her girdide revents alanını ayarlar.

#include <poll.h>
#include <stdio.h>

int poll_ready(struct pollfd *pfds, int count) {
    int n = poll(pfds, count, -1); /* -1 = block forever */
    if (n < 0) perror("poll");
    return n;
}

Ölçeği Büyütme: epoll

Binlerce bağlantı için Linux'un epoll'ü (ve BSD'nin kqueue'su), select ve poll'un yaptığı tam taramadan kaçınarak olay başına O(1) maliyetle yalnızca hazır tanımlayıcıları döndürür.

Kısa Kontrol

Birden çok istemciyi ele alma hakkındaki anlayışınızı sınayın.

Özet

Tek bir iş parçacığıyla birçok istemciye hizmet vermeyi öğrendiniz.

  • select birçok fd değerini izler; bunları FD_ makrolarıyla yönetin
  • select yıkıcı olduğu için her döngüde kümeyi yeniden oluşturun
  • Kabul edilen istemcileri kümeye ekleyin; bağlantı kesildiğinde çıkarın
  • poll 1024 sınırını ortadan kaldırır; epoll binlerce bağlantıya ölçeklenir

Sıkça Sorulan Sorular

“Birden Çok İstemciyi İşleme” dersi ücretsiz mi?

Evet — “Birden Çok İstemciyi İşleme” 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.

“Birden Çok İstemciyi İşleme” dersinde ne öğreneceğim?

select ve poll 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 4. dersidir.

“Birden Çok İstemciyi İşleme” 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

  1. Soketlere Genel Bakış
  2. TCP Sunucusu
  3. TCP İstemcisi
  4. Birden Çok İstemciyi İşleme
← C Academy Sayfasına Dön