ความแตกต่างระหว่าง Libev และ Libevent คืออะไร?


96

ทั้ง 2 libs ได้รับการออกแบบมาสำหรับการตั้งเวลา async i / o และทั้งสองใช้ epoll บน linux และ kqueue บน FreeBSD

ยกเว้นความแตกต่างเพียงผิวเผินฉันหมายถึงอะไรคือความแตกต่างที่แท้จริงระหว่างไลบรารีทั้งสองนี้? เกี่ยวกับสถาปัตยกรรมหรือปรัชญาการออกแบบ?



1
เสรีนิยมยังรองรับ IOCP สำหรับ windows (ผ่าน AFAIK แบบบัฟเฟอร์) ที่ Libev ไม่ทำ
rogerdpack

1
rogerdpack, libuv รองรับ IOCP github.com/joyent/libuv
Denis Denisov

คำตอบ:


223

สำหรับปรัชญาการออกแบบนั้น 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 ได้


Marc คุณเป็นคนเขียนเรื่อง Libeio ด้วยหรือไม่?
juanpavergara

น่าเศร้าที่มันถูกลบและแทนที่ด้วย libuv: github.com/joyent/libuv/issues/485และสิ่งนี้: groups.google.com/forum/#!topic/nodejs/UwHkaOksprw
Peter Teoh

1
ฉันได้เพิ่มความสวยงามให้กับ Libev ที่เรียกว่า Libevfibers มันเพิ่มระดับไฟเบอร์ที่ด้านบนของ Libev, libcoro และibeio ได้ที่นี่: github.com/Lupus/libevfibers
Lupus

1
libevเจ็บปวดบนแพลตฟอร์ม Windows MinGW คอมไพเลอร์ sigfault เปิดอยู่เสมอ++activecnt(ฟังก์ชันev_ref) และฉันไม่เข้าใจวิธีแก้ไขปัญหานี้ ปัญหาที่สองคือการใช้selectอินเทอร์เฟซซ็อกเก็ตเก่ากับการทำงานร่วมกันของซ็อกเก็ตเวอร์ชัน IOCP ที่ทันสมัยของเรา คุณช่วยปรับปรุงการสนับสนุน Widnows ได้ไหม
Vitold S.

3
ขออภัยที่ต้องพูด แต่ดูเหมือนจะมี "ปรัชญา" อีกประการหนึ่งที่อยู่เบื้องหลัง libev ซึ่งทำให้โครงการโอเพ่นซอร์สเสียหายไปหลายโครงการ ที่เห็นได้ชัดเช่นในlists.schmorp.de/pipermail/libev/2017q1/002710.htmlหรือlists.schmorp.de/pipermail/libev/2010q1/000912.html ผู้ใช้ที่มีศักยภาพควรพิจารณาด้วยเช่นกัน
dbrank0

13

ประโยชน์ที่ดีของlibeventสำหรับฉันเป็นตัวในการสนับสนุน OpenSSL อินเทอร์เฟซ Bufferevent ซึ่งเปิดตัวในเวอร์ชัน 2.0 ของเสรีนิยม API จัดการกับการเชื่อมต่อที่ปลอดภัยโดยแทบไม่ลำบากสำหรับนักพัฒนา อาจเป็นเพราะความรู้ของฉันล้าสมัยไปแล้ว แต่ดูเหมือนว่าlibevไม่สนับสนุนสิ่งนี้


3
ถูกต้อง: libev ไม่ทำ I / O ให้คุณดังนั้นจึงไม่ทำ TLS ให้คุณ (หรือในความเป็นจริง I / O ใด ๆ )
จำ Monica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.