Level-triggered epoll
sangat mirip dengan poll
. Mengapa tidak poll
hanya pembungkus untuk epoll
sistem yang mendukung yang terakhir?
EDIT: Maksud saya, apakah ada hambatan teknis terhadap keputusan tersebut? Menerapkan poll
sebagai epoll
akan secara dramatis meningkatkan kinerja banyak aplikasi jaringan. Seharusnya ada beberapa masalah teknis yang saya gagal perhatikan.
poll
sebagai pembungkusepoll
akan menjadi sangat kompleks dan tidak efisien. Anda harus menyiapkan deskriptor epoll baru dan mengkonfigurasinya setiap kali atau Anda harus melakukan perbandingan yang menyakitkan dari polling saat ini dengan yang sudah dikaitkan dengan deskriptor epoll. Huek!Jawaban:
jajak pendapat jauh lebih sederhana untuk kasus-kasus mudah; mungkin sama efisiennya untuk sejumlah kecil deskriptor file. Penelepon tidak perlu khawatir tentang menjaga FD polling dan menambahkan / menghapus FD, mereka hanya dapat menambahkan semua yang mereka inginkan pada setiap panggilan untuk polling.
Perasaan saya adalah bahwa mereka gratis, meskipun polling BISA diterapkan sebagai pembungkus untuk epoll, mungkin seharusnya tidak.
epoll dapat (hampir) diimplementasikan sebagai pembungkus untuk polling, tetapi itu akan mengalahkan argumen efisiensinya.
sumber
Semantik
poll()
danepoll
berbeda. Jikapoll()
memberi tahu Anda bahwa deskriptor dapat dibaca, maka Anda melakukan beberapa pembacaan tetapi tidak membaca semua byte yang tersedia, dan kemudian meneruskan deskriptor itupoll()
lagi, itu akan segera bangun. AFAIK yang sama tidak benarepoll
.Perhatikan juga bahwa
epoll
deskriptor adalah sumber daya terbatas. Halaman manual berbicara tentangepoll_create()
kondisi kegagalan yang tidak terjadi pada AFAIKpoll()
.Meskipun saya tidak yakin dengan semua detail implementasi, dari sini kita dapat mengatakan bahwa tidak masuk akal untuk membuat
poll()
wrapperepoll
. Programmer harus menyadari poin-poin ini, dan kode yang ada ditulis dengan asumsipoll()
memungkinkan akan rusak.sumber
Oke, 7 tahun kemudian saya memiliki jawaban yang lebih meyakinkan berdasarkan artikel ini oleh Evan Klitzke.
Pertama, alasan saya mengajukan pertanyaan di tempat pertama adalah keunggulan kinerja yang sering disebutkan
epoll
dibandingkan denganpoll
/select
. Kata yangepoll
lebih asimtotis lebih efisien (O (1)) daripadapoll
(O ( N )).Apa yang tidak diketahui secara luas adalah bahwa hanya edge-triggered
epoll
yang benar-benar O (1), sementara level-trggeredepoll
memiliki asimptotik yang sama dengan O ( N ). Memang, rasa yang dipicu level harus memeriksa daftar fds yang ditonton setiap kali dipanggil untuk menemukan yang berpotensi memiliki lebih banyak data yang tertunda. Varietas yang dipicu edge dapat mengandalkan sinyal sebagai respons terhadap byte baru yang muncul dalam fd.Akan menarik untuk mencari tahu, bagaimana tepatnya sebuah thread yang dilanjutkan menemukan mana yang membangunkannya, tetapi tentu saja mungkin bahwa datum ini dilewati selama bangun yang dipicu oleh epoll.
Jelas,
poll
/select
tidak dapat menggunakan ujung-dipicuepoll
sebagai semantik yang berbeda. Seperti yang kita lihat, penerapan dengan level-triggeredepoll
tidak akan membawa manfaat kinerja asimptotik. Dan mungkin, juga berdampak negatif jika faktor konstan atau suku konstan tinggi (karena tampaknya didasarkan pada patokan kasar yang saya lakukan dan kutip dalam komentar lain).Untuk informasi lebih lanjut, silakan baca Pemblokiran I / O, Nonblocking I / O, Dan Epoll .
sumber