Apa tujuan dari argumen pertama untuk memilih panggilan sistem?

25

Dari man select

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

nfds adalah deskriptor file bernomor tertinggi dalam salah satu dari tiga set, ditambah 1.

Apa tujuan dari nfds, ketika kita sudah memiliki readfds, writefdsdan exceptfds, dari mana file deskriptor dapat ditentukan?

phhehehe
sumber
Saya akan bertanya pada SO, tapi lebih terpusat di sini, dan panggilan C API dianggap sesuai topik .
phunehehe

Jawaban:

25

Dalam "Pemrograman Tingkat Lanjut di Lingkungan UNIX" , W. Richard Stevens mengatakan ini adalah pengoptimalan kinerja:

Dengan menentukan deskriptor tertinggi yang kami minati, kernel dapat menghindari melalui ratusan bit yang tidak digunakan dalam tiga set deskriptor, mencari bit yang dihidupkan.

(Edisi 1, halaman 399)

Jika Anda melakukan segala jenis pemrograman sistem UNIX, buku APUE sangat dianjurkan.


MEMPERBARUI

An fd_setbiasanya dapat melacak hingga 1024 deskriptor file.

Cara paling efisien untuk melacak yang fdsditetapkan 0dan yang ditetapkan 1akan berupa bitset, sehingga masing fd_set- masing terdiri dari 1024 bit.

Pada sistem 32-bit, int panjang (atau "kata") adalah 32 bit, sehingga artinya masing fd_set- masing adalah
1024/32 = 32 kata.

Jika itu nfdsadalah sesuatu yang kecil, seperti 8 atau 16, yang akan ada di banyak aplikasi, hanya perlu melihat ke dalam kata 1, yang jelas harus lebih cepat daripada melihat ke dalam semua 32.

(Lihat FD_SETSIZEdan __NFDBITSdari /usr/include/sys/select.huntuk nilai pada platform Anda.)


PEMBARUAN 2

Mengapa fungsi tanda tangan tidak

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

Dugaan saya adalah karena kode mencoba menyimpan semua argumen dalam register , sehingga CPU dapat bekerja lebih cepat, dan jika harus melacak 2 variabel tambahan, CPU mungkin tidak memiliki cukup register.

Jadi dengan kata lain, selectmengekspos detail implementasi sehingga bisa lebih cepat.

Mikel
sumber
2
Itu, atau yang lebih baru The Linux Programming Interface
chris
APUE juga diperbarui baru-baru ini. Edisi kedua: amazon.com/gp/aw/d.html/ref=aw_d_detail?pd=1&a=0201433079
Mikel
@ Chris Saya akan memeriksa antarmuka pemrograman Linux. Terima kasih.
Mikel
Terima kasih atas informasinya, saya akan memeriksa buku-buku ketika saya mengambil waktu.
phunehehe
APUE 2nd Ed: 27 Juni 2005 (mencakup linux-2.4.22) TLPI: Oktober 2010 (mencakup linux-2.6.35)
chris
6

Saya tidak tahu pasti, karena saya bukan salah satu desainer pilih (), tapi saya akan mengatakan itu adalah optimasi kinerja. Fungsi panggilan tahu berapa banyak deskriptor file yang dimasukkan ke dalam read, write, dan kecuali FD, jadi mengapa kernel harus mencari tahu lagi?

Ingatlah bahwa pada awal 80-an, ketika select () diperkenalkan, mereka tidak memiliki multi-gigaghertz, multi-prosesor untuk bekerja dengannya. VAX 25 MHz cukup cepat. Plus, Anda ingin pilih () bekerja cepat jika bisa: jika beberapa I / O sedang menunggu proses, mengapa membuat proses menunggu?

Bruce Ediger
sumber
Untuk argumen Anda, saya akan mengatakan kita perlu nreadfds, nwritefdsdan nexceptfdsbukan hanya satu nfds.
phunehehe
Mungkin itu supaya nfdsbisa masuk register untuk akses yang lebih cepat. Jika harus melacak tiga angka, bersama dengan semua argumen lainnya, mungkin CPU tidak akan memiliki cukup register. Tentu saja, kernel bisa dibuat sendiri nfdsberdasarkan pada 3 variabel hipotetis Anda. Jadi tebakan saya adalah mengekspos detail implementasi untuk mendapatkan efisiensi.
Mikel
@Mikel, phunehehe: nfdsArgumen terpisah akan membawa sedikit keuntungan. Sebagian besar waktu, proses telah membuka sangat sedikit proses relatif terhadap FD_SETSIZE. Kasus khas mungkin memiliki (4,4,2) dari 1024; melakukan pemeriksaan kernel (4,4,4) adalah kemenangan besar (1024,1024,1024), tetapi mengoptimalkan ke (4,4,2) akan sia-sia.
Gilles 'SO- stop being evil'
@Gilles: gain akan menjadi API yang lebih bersih. (Seperti itu, baik programmer harus melakukan pekerjaan ekstra untuk menghitung nfds, atau menjadi malas dan menelepon select(FD_SETSIZE, ...), yang akan lebih lambat.)
Mikel
OTOH, melacak hanya satu variabel maks bisa lebih mudah bagi programmer juga.
Mikel