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
, writefds
dan exceptfds
, dari mana file deskriptor dapat ditentukan?
system-calls
file-descriptors
phhehehe
sumber
sumber
Jawaban:
Dalam "Pemrograman Tingkat Lanjut di Lingkungan UNIX" , W. Richard Stevens mengatakan ini adalah pengoptimalan kinerja:
(Edisi 1, halaman 399)
Jika Anda melakukan segala jenis pemrograman sistem UNIX, buku APUE sangat dianjurkan.
MEMPERBARUI
An
fd_set
biasanya dapat melacak hingga 1024 deskriptor file.Cara paling efisien untuk melacak yang
fds
ditetapkan0
dan yang ditetapkan1
akan berupa bitset, sehingga masingfd_set
- masing terdiri dari 1024 bit.Pada sistem 32-bit, int panjang (atau "kata") adalah 32 bit, sehingga artinya masing
fd_set
- masing adalah1024/32 = 32 kata.
Jika itu
nfds
adalah 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_SETSIZE
dan__NFDBITS
dari/usr/include/sys/select.h
untuk nilai pada platform Anda.)PEMBARUAN 2
Mengapa fungsi tanda tangan tidak
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,
select
mengekspos detail implementasi sehingga bisa lebih cepat.sumber
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?
sumber
nreadfds
,nwritefds
dannexceptfds
bukan hanya satunfds
.nfds
bisa 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 sendirinfds
berdasarkan pada 3 variabel hipotetis Anda. Jadi tebakan saya adalah mengekspos detail implementasi untuk mendapatkan efisiensi.nfds
Argumen terpisah akan membawa sedikit keuntungan. Sebagian besar waktu, proses telah membuka sangat sedikit proses relatif terhadapFD_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.nfds
, atau menjadi malas dan meneleponselect(FD_SETSIZE, ...)
, yang akan lebih lambat.)