Sistem çağrısını seçen ilk argümanın amacı nedir?


25

itibaren man select

int select(int nfds, fd_set *readfds, fd_set *writefds,
           fd_set *exceptfds, struct timeval *timeout);

nfds üç setten herhangi birinde en yüksek numaralı dosya tanıtıcısıdır, artı 1.

Amacı nedir nfds, biz zaten varken readfds, writefdsve exceptfds, hangi dosya tanımlayıcıları belirlenebilir?


SO hakkında sormak üzereydim, ama burada daha merkezileşmiş ve C API çağrıları konu olarak değerlendiriliyor .
phunehehe

Yanıtlar:


25

In "UNIX Çerçevesinde İleri Programlama" , W. Richard Stevens, bir performans optimizasyonu olduğunu söylüyor:

Çekirdek, ilgilendiğimiz en yüksek tanımlayıcıyı belirterek, üç tanımlayıcı kümesinde yüzlerce kullanılmamış bit kullanmaktan kaçınabilir, açık olanları arar.

(1. baskı, sayfa 399)

Herhangi bir UNIX sistemi programlaması yapıyorsanız, APUE kitabı önemle tavsiye edilir.


GÜNCELLEŞTİRME

Bir fd_setgenellikle 1024'e kadar dosya tanımlayıcıyı izleyebilir.

Hangi fdsayarlanmış 0ve ayarlanmış olan izlemenin en etkili yolu 1bir fd_setbit kümesidir , bu nedenle her biri 1024 bitten oluşur.

32 bit sistemde, uzun bir int (veya "word") 32 bittir, yani her fd_setbiri
1024/32 = 32 kelime anlamına gelir .

Eğer nfdsbir şey küçük, böyle birçok uygulamada olacağını 8 veya 16 gibi, sadece açıkça daha hızlı bütün 32'den içine bakarak daha olmalı 1 sözcüğü, içine bakmak için ihtiyacı var.

(Bkz FD_SETSIZEve __NFDBITSgelen /usr/include/sys/select.hsenin platformda değerler için.)


GÜNCELLEME 2

İşlev imzasının neden olmadığı

int select(fd_set *readfds, int nreadfds,
           fd_set *writefds, int nwritefds,
           fd_set *exceptfds, int nexceptfds,
           struct timeval *timeout);

Tahminime göre, kod kayıtlardaki tüm argümanları tutmaya çalıştığından , bu nedenle CPU kendi üzerinde daha hızlı çalışabilir ve eğer fazladan bir 2 değişken izlemek zorunda kalırsa, CPU yeterli kayıtlara sahip olmayabilir.

Başka bir deyişle, selectdaha hızlı olabilmesi için bir uygulama detayını ortaya koyuyor.


2
Bu, ya da daha yeni Linux Programlama Arabirimi
chris

APUE da yakın zamanda güncellendi. İkinci baskı: amazon.com/gp/aw/d.html/ref=aw_d_detail?pd=1&a=0201433079
Mikel

@chris Linux Programlama Arayüzünü kontrol edeceğim. Teşekkürler.
Mikel

Bilgi için teşekkürler, biraz zaman kaptığımda kitapları kontrol edeceğim.
phunehehe

APUE 2. Baskı: 27 Haziran 2005 (linux-2.4.22'yi kapsar) TLPI: Ekim 2010 (linux-2.6.35'i kapsar)
chris

6

Emin değilim, çünkü select () 'in tasarımcılarından biri değilim, ama bunun bir performans optimizasyonu olduğunu söyleyebilirim. Çağıran fonksiyon, okuma, yazma ve FD'ler haricinde kaç tane dosya tanımlayıcısı koyduğunu bilir, öyleyse çekirdek neden yeniden anlamalı?

80'lerin başında select () kullanıldığında, çoklu gigaghertz, birlikte çalışacak çoklu işlemcilere sahip olmadıklarını unutmayın. 25 MHz VAX oldukça hızlı bir şekilde doggone oldu. Artı, eğer yapabiliyorsa hızlı çalışmak için select () 'i istediniz: eğer bir G / Ç işlemi bekliyorsa, işlemi neden beklettiniz?


Senin argüman için ihtiyacımız olan söyleyebilirim nreadfds, nwritefdsve nexceptfdsbunun yerine sadece biri nfds.
phunehehe

Belki nfdsdaha hızlı erişim için bir sicile girebilir. Diğer tüm argümanlarla birlikte üç sayı izlemek zorunda olsaydı, belki de CPU yeterli kayıtlara sahip olmazdı. Elbette, çekirdek kendi nfdsvarsayımsal 3 değişkenlerinize dayanarak kendi yarattığınız şey olabilirdi . Yani benim tahminim verimlilik kazanmak için bir uygulama detayını açığa vuruyor.
Mikel

@Mikel, phunehehe: Ayrı nfdsargümanlar çok az kazanç getirir. Çoğu zaman, süreç göreceli olarak çok az işlem açtı FD_SETSIZE. Tipik bir vaka 1024 üzerinden (4,4,2) olabilir; çekirdek kontrolü (4,4,4) yapılması (1024,1024,1024) üzerinde büyük bir kazançtır, ancak (4,4,2) seviyesine kadar optimizasyon yapmak işe yaramaz olur.
Gilles 'SO- kötülük yapmayı bırak'

@Gilles: Kazanç daha temiz bir API olacaktır. (Olduğu gibi, ya programcı hesaplamak için fazladan bir iş yapmak zorundadır nfds, ya da tembel olmak ve select(FD_SETSIZE, ...)daha yavaş olurdu çağrı .)
Mikel

OTOH, sadece bir maksimum değişkeni izlemek, programcı için de kolay olabilir.
Mikel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.