กลับไปหน้าบทความ

อ่าน 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
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Epoll&oldid=1334343475 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ 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...