Anket ve Seçme arasındaki farklar nelerdir?


Yanıtlar:


90

Ben düşünüyorum bu senin soruya cevap verir:

Richard Stevens'dan (rstevens@noao.edu):

Temel fark, select () 'nin fd_set öğesinin bir bit maskesi olması ve dolayısıyla sabit bir boyutu olmasıdır. Çekirdek derlendiğinde çekirdeğin bu boyutu sınırlamaması mümkün olabilir, bu da uygulamanın FD_SETSIZE değerini istediği şekilde tanımlamasına izin verir (sistem başlığındaki yorumların bugün ima ettiği gibi), ancak daha fazla çalışma gerektirir. 4.4BSD'nin çekirdeği ve Solaris kitaplığı işlevi bu sınıra sahiptir. Ancak BSD / OS 2.1'in bu sınırdan kaçınmak için kodlandığını görüyorum, bu yüzden yapılabilir, sadece küçük bir programlama meselesi. :-) Birisi bu konuda bir Solaris hata raporu sunmalı ve düzeltilip düzeltilmediğine bakmalıdır.

Ancak poll () ile kullanıcı bir dizi pollfd yapısı tahsis etmeli ve bu dizideki giriş sayısını geçmelidir, bu nedenle temel bir sınır yoktur. Casper'ın belirttiği gibi, seçilenden daha az sistemde anket () vardır, bu nedenle ikincisi daha taşınabilirdir. Ayrıca, özgün uygulamalar (SVR3) ile tanımlayıcıyı çekirdeğe, politd yapısındaki bir girişi yok saymasını söyleyecek şekilde ayarlayamazsınız, bu da diziden girdileri kaldırmayı zorlaştırır; SVR4 bunun üstesinden gelir. Şahsen ben her zaman select () ve nadiren poll () kullanıyorum, çünkü kodumu BSD ortamlarına da taşıyorum. Birisi bu ortamlar için select () işlevini kullanan bir poll () uygulaması yazabilir, ancak daha önce hiç görmedim. Hem select () hem de poll (), POSIX 1003.1g tarafından standartlaştırılmıştır.

Ekim 2017 Güncellemesi:

Yukarıda belirtilen e-posta en azından 2001 kadar eskidir; poll()BSD dahil - komutu artık (2017) tüm modern işletim sistemleri arasında desteklenmemektedir. Aslında, bazı insanlar select() bunun reddedilmesi gerektiğine inanıyor . Görüşler bir yana, taşınabilirlik sorunları poll()artık modern sistemler için bir endişe değil. Ayrıca, epoll()o zamandan beri geliştirilmiştir ( man sayfasını okuyabilirsiniz ) ve popülerlik artmaya devam ediyor.

Modern gelişim için muhtemelen kullanmak istemezsiniz select(), ancak bununla ilgili yanlış bir şey yoktur. poll()ve daha modern bir evrimdir epoll(), select()buradaki sınırlamalardan muzdarip olmadan aynı özellikleri (ve daha fazlasını) sağlar .


15
Stevens cevabı ne zaman yazıldı? BSD'de bulunmayan anket () ile ilgili yorum hala geçerli mi? MacOS X'in (kısmen BSD'ye dayanan) anketi () vardır ve POSIX standardı (POSIX 2008) gerektirir.
Jonathan Leffler

12
Rich Stevens Eylül 1999'da vefat etti, bu yüzden cevap bundan daha eski olmalı. Ocak 1996'da piyasaya sürülen BSD / OS 2.1'de yeni bir değişiklik gördüğünden söz ediyor, bu yüzden muhtemelen o zamanlar.
alanc

2
İnanmıyorum. Yanıt 5 yıl önce gönderildi, ben onun üzerine tökezledi, tarayıcıda açık bırakın. Ertesi gün, yazar cevabı düzenler ve geliştirir. SO bana AJAX / websocket kullanarak sayfada güncelleme ile bildirir. bu yüzden SO harika
Steven Lu

9
@StevenLu Evet, ancak maalesef AJAX / websocket'in kullanılıp kullanılmadığına dair hiçbir kelime selectveya poll:(
Christopher Schultz

> Birisi bu ortamlar için select () kullanan bir anket () uygulaması yazabilir, ancak daha önce hiç görmedim. Java öyle ;-)
Sergey Mashkov

229

select()Çağrı daha sonra üç Yazmakta, okuma için izlemek istiyorum prizler ve dosya tanımlayıcıları işaretine bit maskesi ve hataları ve aslında olanlar aktivite çeşit vardı işletim sistemi işaretleri oluşturmak vardır; poll()tanımlayıcı kimliklerinin bir listesini oluşturursanız ve işletim sistemi bunların her birini gerçekleşen olay türüyle işaretler .

select()Yöntem oldukça aksak ve verimsizdir.

  1. Genellikle bir işlem için binden fazla potansiyel dosya tanımlayıcısı vardır. Uzun süren bir işlemde yalnızca birkaç tanımlayıcı açıksa, ancak bunlardan en az birine yüksek bir sayı atanmışsa, o zaman geçirilen bitmaskın select()en yüksek tanımlayıcıyı alacak kadar büyük olması gerekir - bu yüzden yüzlerce bit aralığı işletim sisteminin select()yalnızca çağrılanmadıklarını keşfetmek için her çağrıda döngü oluşturması gerektiğini unutmayın.

  2. bir Zamanlar select() geri döndüğünde, arayan olayların ne olduğunu belirlemek için her üç bit maskenin üzerinde döngü yapmalıdır. Pek çok tipik uygulamada, herhangi bir anda yalnızca bir veya iki dosya tanımlayıcısı yeni trafik alacaktır, ancak hangi tanımlayıcıların bu olduğunu öğrenmek için üç bitmaskinin de sonuna kadar okunması gerekir.

  3. İşletim sistemi, bit maskeleri yeniden yazarak etkinlik hakkında sizi bilgilendirdiğinden, bunlar harap olur ve artık dinlemek istediğiniz dosya tanımlayıcıları listesiyle işaretlenmez. Hafızada tuttuğunuz başka bir listeden tüm bitmask'i yeniden oluşturmanız veya her bir bitmaskinin kopyasını ve memcpy()her select()çağrıdan sonra harap bitma maskelerinin üstünde veri bloğunu tutmanız gerekir .

Aynı poll()yaklaşım daha iyi çalışır çünkü aynı veri yapısını tekrar kullanmaya devam edebilirsiniz.

Aslında, poll() modern Linux çekirdeğinde başka bir mekanizmaya ilham verdi: epoll()bu da bugünün sunucuları genellikle aynı anda on binlerce bağlantıyı işlemek istediği için ölçeklenebilirlikte başka bir sıçramaya izin verme mekanizması üzerinde daha da gelişiyor. Bu çabaya iyi bir giriş:

http://scotdoyle.com/python-epoll-howto.html

Bu bağlantının yararlarını gösteren bazı güzel grafikler olsa da epoll()(select() bu noktaya kadar bu verimsiz ve eski moda olarak kabul edildiğini ).

http://lse.sourceforge.net/epoll/index.html


Güncelleme: İşte cevabı farklılıklar hakkında daha fazla ayrıntı veren başka bir Stack Overflow sorusu:

Twisted'da seçme / anket uyarıları ve epoll reaktörleri


1
Python'da epoll kullanma örneğine bağlantı için +1 - orada bazı ilginç örnekler var gibi görünüyor ve bunları denemek zorundayım ...
Allen George

Cevabı açıklamak için +1; -1 epoll bahsettiği için ama kqueue değil
İyi Kişi

Bu cevap epoll her zaman tercih edilir gibi ses çıkarıyor
user3467349

0

İkisi de yavaş ve çoğunlukla aynı , Ama boyut olarak farklı ve bir tür özellik!

Bir yineleyici yazdığınızda, selecther seferinde seti kopyalamanız gerekir ! Iken pollgüzel kod olması için bu tür bir sorunu düzeltti. Başka bir fark, pollvarsayılan olarak 1024'ten fazla dosya tanımlayıcısını (FD) işleyebilmesidir. pollbu tür bir işi yürütmek için birçok değişkene sahip olmak yerine programı daha okunabilir hale getirmek için farklı olayları işleyebilir. Operasyon pollve selectdoğrusal ve çünkü bir sürü çek sahip yavaştır.

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.