ทั้ง 2 libs ได้รับการออกแบบมาสำหรับการตั้งเวลา async i / o และทั้งสองใช้ epoll บน linux และ kqueue บน FreeBSD
ยกเว้นความแตกต่างเพียงผิวเผินฉันหมายถึงอะไรคือความแตกต่างที่แท้จริงระหว่างไลบรารีทั้งสองนี้? เกี่ยวกับสถาปัตยกรรมหรือปรัชญาการออกแบบ?
ทั้ง 2 libs ได้รับการออกแบบมาสำหรับการตั้งเวลา async i / o และทั้งสองใช้ epoll บน linux และ kqueue บน FreeBSD
ยกเว้นความแตกต่างเพียงผิวเผินฉันหมายถึงอะไรคือความแตกต่างที่แท้จริงระหว่างไลบรารีทั้งสองนี้? เกี่ยวกับสถาปัตยกรรมหรือปรัชญาการออกแบบ?
คำตอบ:
สำหรับปรัชญาการออกแบบนั้น Libev ถูกสร้างขึ้นเพื่อปรับปรุงการตัดสินใจทางสถาปัตยกรรมบางอย่างในแบบเสรีนิยมเช่นการใช้ตัวแปรทั่วโลกทำให้ยากที่จะใช้ตัวเลือกเสรีอย่างปลอดภัยในสภาพแวดล้อมแบบมัลติเธรดโครงสร้างผู้เฝ้าดูมีขนาดใหญ่เนื่องจากรวม I / O เวลาและสัญญาณ ตัวจัดการในตัวเดียวส่วนประกอบพิเศษเช่นเซิร์ฟเวอร์ http และ dns ได้รับผลกระทบจากคุณภาพการใช้งานที่ไม่ดีและปัญหาด้านความปลอดภัยที่เป็นผลลัพธ์และตัวจับเวลาไม่แน่นอนและไม่สามารถรับมือกับการข้ามเวลาได้ดี
Libev พยายามปรับปรุงสิ่งเหล่านี้โดยไม่ใช้ตัวแปรส่วนกลาง แต่ใช้บริบทการวนซ้ำสำหรับฟังก์ชันทั้งหมดโดยใช้ผู้เฝ้าดูขนาดเล็กสำหรับแต่ละประเภทเหตุการณ์ (ผู้เฝ้าดู I / O ใช้ 56 ไบต์บน x86_64 เทียบกับ 136 สำหรับตัวเลือกอิสระ) ทำให้สามารถเพิ่มได้ ประเภทเหตุการณ์เช่นตัวจับเวลาตามเวลาวอลล์คล็อกเทียบกับโมโนโทนิคการขัดจังหวะระหว่างเธรดเตรียมและตรวจสอบผู้เฝ้าดูเพื่อฝังลูปเหตุการณ์อื่นหรือที่จะฝังและอื่น ๆ
ปัญหาองค์ประกอบพิเศษได้รับการ "แก้ไข" โดยการไม่มีเลยดังนั้น Libev จึงมีขนาดเล็กและมีประสิทธิภาพ แต่คุณต้องมองหาไลบรารี http ที่อื่นด้วยเพราะ libev ไม่มีเลย (ตัวอย่างเช่นมี ไลบรารีที่เกี่ยวข้องกันมากเรียกว่า Libeio ที่ทำ I / O แบบอะซิงโครนัสซึ่งสามารถใช้งานได้อย่างอิสระหรือใช้ร่วมกับ Libev เพื่อให้คุณสามารถผสมและจับคู่ได้)
ดังนั้นในระยะสั้น Libev จึงพยายามทำสิ่งเดียวเท่านั้น (ไลบรารีเหตุการณ์ POSIX) และนี่เป็นวิธีที่มีประสิทธิภาพที่สุดเท่าที่จะเป็นไปได้ Libevent พยายามให้โซลูชันเต็มรูปแบบแก่คุณ (เหตุการณ์ lib ไลบรารี I / O ที่ไม่ปิดกั้นเซิร์ฟเวอร์ http ไคลเอ็นต์ DNS)
หรือสั้นกว่านั้น Libev พยายามที่จะปฏิบัติตามปรัชญาของกล่องเครื่องมือ UNIX ในการทำสิ่งเดียวให้ดีที่สุดเท่าที่จะทำได้
โปรดทราบว่านี่คือปรัชญาการออกแบบซึ่งฉันสามารถระบุได้ด้วยผู้มีอำนาจเพราะฉันออกแบบ Libev ไม่ว่าจะบรรลุเป้าหมายการออกแบบเหล่านี้จริงหรือว่าปรัชญาตั้งอยู่บนหลักการที่ดีขึ้นอยู่กับคุณที่จะตัดสิน
อัปเดต 2017:
ฉันถูกถามหลายครั้งว่าฉันอ้างถึงความไม่แน่นอนของตัวจับเวลาแบบใดและทำไม Libev จึงไม่รองรับ IOCP บน windows
สำหรับตัวจับเวลาผู้ปลดปล่อยจะกำหนดเวลาตัวจับเวลาที่สัมพันธ์กับเวลาพื้นฐานที่ไม่รู้จักซึ่งอยู่ในอนาคตโดยที่คุณไม่รู้ตัว Libev สามารถบอกคุณได้ล่วงหน้าว่าจะใช้เวลาพื้นฐานใดในการกำหนดเวลาตัวจับเวลาซึ่งทำให้โปรแกรมต่างๆใช้ทั้งแนวทางการปลดปล่อยและวิธีการปลดปล่อย นอกจากนี้บางครั้งผู้ปลดปล่อยจะหมดเวลาก่อนกำหนดขึ้นอยู่กับแบ็กเอนด์ ก่อนหน้านี้เป็นปัญหาเกี่ยวกับ API ปัญหาหลังแก้ไขได้ (และอาจได้รับการแก้ไขตั้งแต่นั้น - ฉันไม่ได้ตรวจสอบ)
สำหรับการรองรับ IOCP - ฉันไม่คิดว่ามันจะทำได้เพราะ IOCP นั้นมีประสิทธิภาพไม่เพียงพอ ประการหนึ่งพวกเขาต้องการซ็อกเก็ตประเภทพิเศษซึ่งจะ จำกัด ชุดของแฮนเดิลที่อนุญาตบน windows ให้มากยิ่งขึ้น (ตัวอย่างเช่น sopckets ที่ perl ใช้เป็นประเภท "ผิด" สำหรับ IOCP) นอกจากนี้ IOCP ไม่รองรับเหตุการณ์ความพร้อมของ I / O เลยพวกเขาสามารถทำ I / O จริงได้เท่านั้น มีวิธีแก้ปัญหาสำหรับแฮนเดิลบางประเภทเช่นการอ่านดัมมี่ 0 ไบต์ แต่อีกครั้งสิ่งนี้จะ จำกัด ประเภทแฮนเดิลที่คุณสามารถใช้บน windows ได้มากขึ้นและยิ่งไปกว่านั้นจะต้องอาศัยพฤติกรรมที่ไม่มีเอกสารซึ่งผู้ให้บริการซ็อกเก็ตบางรายไม่ได้แชร์ .
สำหรับความรู้ของฉันไม่มีไลบรารีเหตุการณ์อื่นที่รองรับ IOCP บน windows เช่นกัน สิ่งที่เสรีนิยมทำคือนอกเหนือจากไลบรารีเหตุการณ์แล้วยังช่วยให้คุณสามารถจัดคิวการอ่าน / เขียนการดำเนินการซึ่งสามารถทำได้ผ่าน IOCP เนื่องจาก Libev ไม่ได้ทำ I / O ให้คุณจึงไม่มีวิธีใดที่จะใช้ IOCP ในตัวเองได้
นี่เป็นเพราะการออกแบบ - Libev พยายามที่จะมีขนาดเล็กและเหมือน POSIX และ windows ก็ไม่มีวิธีที่มีประสิทธิภาพในการรับเหตุการณ์ I / O สไตล์ POSIX หาก IOCP มีความสำคัญคุณอาจต้องใช้เองหรือใช้เฟรมเวิร์กอื่น ๆ อีกมากมายที่ทำ I / O ให้คุณจึงสามารถใช้ IOCP ได้
libev
เจ็บปวดบนแพลตฟอร์ม Windows MinGW คอมไพเลอร์ sigfault เปิดอยู่เสมอ++activecnt
(ฟังก์ชันev_ref
) และฉันไม่เข้าใจวิธีแก้ไขปัญหานี้ ปัญหาที่สองคือการใช้select
อินเทอร์เฟซซ็อกเก็ตเก่ากับการทำงานร่วมกันของซ็อกเก็ตเวอร์ชัน IOCP ที่ทันสมัยของเรา คุณช่วยปรับปรุงการสนับสนุน Widnows ได้ไหม
ประโยชน์ที่ดีของlibeventสำหรับฉันเป็นตัวในการสนับสนุน OpenSSL อินเทอร์เฟซ Bufferevent ซึ่งเปิดตัวในเวอร์ชัน 2.0 ของเสรีนิยม API จัดการกับการเชื่อมต่อที่ปลอดภัยโดยแทบไม่ลำบากสำหรับนักพัฒนา อาจเป็นเพราะความรู้ของฉันล้าสมัยไปแล้ว แต่ดูเหมือนว่าlibevไม่สนับสนุนสิ่งนี้