อ่าน 3 นาที
epoll
epollเป็นการเรียกใช้ระบบเคอร์เนล Linux สำหรับกลไกการแจ้งเตือนเหตุการณ์ I/O ที่ปรับขนาดได้ ซึ่งเปิดตัวครั้งแรกในเวอร์ชัน 2.5.45 ของเคอร์เนล Linuxในเดือนตุลาคม พ.ศ.
epoll
epollเป็นการเรียกใช้ระบบเคอร์เนล Linux สำหรับกลไกการแจ้งเตือนเหตุการณ์ I/O ที่ปรับขนาดได้ ซึ่งเปิดตัวครั้งแรกในเวอร์ชัน 2.5.45 ของเคอร์เนล Linuxในเดือนตุลาคม พ.ศ. 2545 [ 1 ] [ 2 ]หน้าที่ของมันคือการตรวจสอบตัวอธิบายไฟล์หลายตัวเพื่อดูว่าสามารถทำ I/O บนตัวอธิบายไฟล์ใด ๆ ได้หรือไม่ มีจุดประสงค์เพื่อแทนที่การเรียกใช้ระบบPOSIXและ แบบเก่า เพื่อให้ได้ประสิทธิภาพที่ดีขึ้นในแอปพลิเคชันที่ต้องการประสิทธิภาพสูงกว่า ซึ่งจำนวนตัวอธิบายไฟล์ ที่ตรวจสอบ มีจำนวนมาก (ต่างจากการเรียกใช้ระบบแบบเก่าซึ่งทำงานใน เวลา O ( n ) แต่การ เรียกใช้ระบบ นี้ทำงานใน เวลา O (1)) [ 3 ]select(2)poll(2)epoll
epollคล้ายกับของFreeBSDkqueueตรงที่ประกอบด้วยชุดฟังก์ชันพื้นที่ผู้ใช้ โดยแต่ละฟังก์ชันจะรับอาร์กิวเมนต์ ตัวอธิบายไฟล์ซึ่งแสดงถึงวัตถุเคอร์เนลที่กำหนดค่าได้ ซึ่งฟังก์ชันเหล่านี้จะทำงานร่วมกันepollใช้ โครงสร้างข้อมูล ต้นไม้แดง-ดำ (RB-tree) เพื่อติดตามตัวอธิบายไฟล์ทั้งหมดที่กำลังถูกตรวจสอบอยู่[ 4 ]
API
int epoll_create1 ( int flags );สร้างepollวัตถุและส่งคืนตัวระบุไฟล์flagsพารามิเตอร์อนุญาตให้แก้ไขพฤติกรรมของ epoll มีค่าที่ถูกต้องเพียงค่าเดียวEPOLL_CLOEXEC. epoll_create()เป็นรูปแบบเก่ากว่าของepoll_create1()และถูกยกเลิกการใช้งานในเคอร์เนล Linux เวอร์ชัน 2.6.27 และ glibc เวอร์ชัน 2.9 [ 5 ]
int epoll_ctl ( int epfd , int op , int fd , struct epoll_event * event );ควบคุม (กำหนดค่า) ว่าตัวระบุไฟล์ใดบ้างที่วัตถุนี้กำลังตรวจสอบ และสำหรับเหตุการณ์ใดบ้างopสามารถเป็น ADD, MODIFY หรือ DELETE ได้
int epoll_wait ( int epfd , struct epoll_event * events , int maxevents , int timeout );รอเหตุการณ์ใดๆ ที่ลงทะเบียนไว้กับepoll_ctlจนกว่าจะมีเหตุการณ์อย่างน้อยหนึ่งเหตุการณ์เกิดขึ้นหรือหมดเวลา ส่งคืนเหตุการณ์ที่เกิดขึ้นในeventsสูงสุดในmaxeventsครั้งเดียวmaxeventsคือจำนวนสูงสุดของepoll_eventตัวอธิบายไฟล์ / ที่จะตรวจสอบ[ 6 ] [ 7 ]ในกรณีส่วนใหญ่maxeventsจะถูกตั้งค่าเป็นค่าของขนาดของ*eventsอาร์กิวเมนต์ ( struct epoll_event* eventsอาร์เรย์)
โหมดการกระตุ้น
epollฟังก์ชัน นี้รองรับทั้ง โหมด การทำงานแบบขอบทริกเกอร์และแบบระดับทริกเกอร์ในโหมดขอบทริกเกอร์ การเรียกใช้ ฟังก์ชัน epoll_waitจะส่งคืนค่าก็ต่อเมื่อมีเหตุการณ์ใหม่ถูกเพิ่มเข้าไปในepollคิวของอ็อบเจ็กต์เท่านั้น ในขณะที่ในโหมดระดับทริกเกอร์ ฟังก์ชันepoll_waitจะส่งคืนค่าตราบใดที่เงื่อนไขยังคงเป็นจริง
ตัวอย่างเช่น หากไปป์ที่ลงทะเบียนไว้ได้epollรับข้อมูล การเรียกใช้จะepoll_waitส่งคืนค่า ซึ่งส่งสัญญาณว่ามีข้อมูลให้อ่าน สมมติว่าผู้อ่านใช้ข้อมูลจากบัฟเฟอร์เพียงบางส่วน ในโหมดทริกเกอร์ระดับ การเรียกใช้เพิ่มเติมepoll_waitจะส่งคืนค่าทันที ตราบใดที่บัฟเฟอร์ของไปป์ยังมีข้อมูลให้อ่าน อย่างไรก็ตาม ในโหมดทริกเกอร์ขอบepoll_waitจะส่งคืนค่าก็ต่อเมื่อมีการเขียนข้อมูลใหม่ลงในไปป์เท่านั้น[ 8 ]
แมลง
Bryan Cantrillชี้ให้เห็นว่าepollมีข้อผิดพลาดที่สามารถหลีกเลี่ยงได้ หากได้เรียนรู้จากรุ่นก่อนหน้า ได้แก่พอร์ต การเสร็จสิ้นอินพุต / เอาต์พุตพอร์ตเหตุการณ์ (Solaris) และkqueue [ 9 ]อย่างไรก็ตาม คำวิจารณ์ส่วนใหญ่ของเขาได้รับการแก้ไขโดยตัวเลือกต่างๆepollถูกเพิ่มในเวอร์ชัน 2.6.2 ของเคอร์เนล Linux หลัก ซึ่งเผยแพร่ในเดือนกุมภาพันธ์ 2004 ถูกเพิ่มในเวอร์ชัน 4.5 ซึ่งเผยแพร่ในเดือนมีนาคม 2016 [ 10 ]EPOLLONESHOTEPOLLEXCLUSIVEEPOLLONESHOTEPOLLEXCLUSIVE
ดูเพิ่มเติม
ลิงก์ภายนอก
- หน้าคู่มือการใช้งาน epoll
- แพทช์ epoll
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ epoll
epollเป็นการเรียกใช้ระบบเคอร์เนล Linux สำหรับกลไกการแจ้งเตือนเหตุการณ์ I/O ที่ปรับขนาดได้ ซึ่งเปิดตัวครั้งแรกในเวอร์ชัน 2.5.45 ของเคอร์เนล Linuxในเดือนตุลาคม พ.ศ.
API
สร้าง epoll วัตถุและส่งคืนตัวระบุไฟล์ flags พารามิเตอร์อนุญาตให้แก้ไขพฤติกรรมของ epoll มีค่าที่ถูกต้องเพียงค่าเดียว EPOLL_CLOEXEC . epoll_create() เป็นรูปแบบเก่ากว่าของ epoll_create1() และถูกยกเลิกการใช้งานในเคอร์เนล Linux เวอร์ชัน 2.6.27 และ glibc เวอร์ชัน 2.
โหมดการกระตุ้น
epoll ฟังก์ชัน นี้รองรับทั้ง โหมด การทำงานแบบขอบทริกเกอร์ และ แบบระดับทริกเกอร์ ในโหมดขอบทริกเกอร์ การเรียกใช้ ฟังก์ชัน epoll_wait จะส่งคืนค่าก็ต่อเมื่อมีเหตุการณ์ใหม่ถูกเพิ่มเข้าไปใน epoll คิวของอ็อบเจ็กต์เท่านั้น ในขณะที่ในโหมดระดับทริกเกอร์ ฟังก์ชัน...
แมลง
Bryan Cantrill ชี้ให้เห็นว่า epoll มีข้อผิดพลาดที่สามารถหลีกเลี่ยงได้ หากได้เรียนรู้จากรุ่นก่อนหน้า ได้แก่พอร์ต การเสร็จสิ้นอินพุต / เอาต์พุต พอร์ตเหตุการณ์ (Solaris) และ kqueue [ 9 ] อย่างไรก็ตาม คำวิจารณ์ส่วนใหญ่ของเขาได้รับการแก้ไขโดยตัวเลือกต่างๆ epoll...