การแยกส่วนโมเดล

เมธอดที่ทําเครื่องหมายเป็น oneway จะไม่บล็อก สำหรับวิธีการที่ไม่ได้ทำเครื่องหมายเป็น oneway ซึ่งเป็นการบล็อกการเรียกเมธอดของไคลเอ็นต์จนกว่าเซิร์ฟเวอร์จะมี ดำเนินการเสร็จสมบูรณ์หรือเรียกว่า Callback แบบซิงโครนัส (ขึ้นอยู่กับว่ากรณีใดจะเกิดขึ้นก่อน) การใช้เมธอดเซิร์ฟเวอร์จะเรียกใช้ Callback แบบซิงโครนัสได้มากที่สุด 1 รายการ พิเศษ การโทรติดต่อกลับจะถูกทิ้งและบันทึกว่าเป็นข้อผิดพลาด หากเมธอดควรดำเนินการ แสดงผลค่าผ่าน Callback และไม่เรียกใช้ Callback ซึ่งได้รับการบันทึกเป็น และรายงานว่าเป็นข้อผิดพลาดในการรับส่งไปยังไคลเอ็นต์

ชุดข้อความในโหมดส่งผ่าน

ในโหมดส่งผ่าน การเรียกส่วนใหญ่จะเป็นแบบซิงโครนัส แต่เพื่อรักษา เป็นลักษณะการทำงานที่ตั้งใจไว้ซึ่งการเรียก oneway จะไม่บล็อกไคลเอ็นต์ ระบบจะสร้างชุดข้อความขึ้นสำหรับแต่ละกระบวนการ โปรดดูรายละเอียดที่ ภาพรวม HIDL

ชุดข้อความใน HAL ที่มีการเชื่อมโยง

เพื่อให้บริการการเรียก RPC ขาเข้า (รวมถึงการเรียกกลับแบบไม่พร้อมกันจาก HAL ไปยัง ผู้ใช้ระดับ HAL) และการแจ้งเตือนการเสียชีวิต โดย Threadpool จะเชื่อมโยงกับแต่ละกระบวนการ ที่ใช้ HIDL ในกรณีที่กระบวนการเดียวใช้อินเทอร์เฟซ HIDL หลายรายการ และ/หรือ ตัวแฮนเดิลการแจ้งเตือนการเสียชีวิตและ Threadpool จะแชร์ระหว่างตัวแฮนเดิลทั้งหมด วันและเวลา กระบวนการได้รับสาย Method ขาเข้าจากไคลเอ็นต์ กระบวนการจะเลือกเทรดฟรี จาก Threadpool และเรียกใช้การเรียกใช้เทรดนั้น หากไม่มีชุดข้อความฟรีคือ ก็จะบล็อกจนกว่าจะพร้อมใช้งาน

หากเซิร์ฟเวอร์มีชุดข้อความเดียว การเรียกไปยังเซิร์ฟเวอร์ก็จะเสร็จสมบูรณ์ ตามลำดับ เซิร์ฟเวอร์ที่มีชุดข้อความมากกว่า 1 ชุดอาจทำการเรียกได้สำเร็จไม่สำเร็จ แม้ว่าลูกค้าจะมีชุดข้อความเดียวก็ตาม แต่สำหรับออบเจ็กต์อินเทอร์เฟซหนึ่งๆ การโทร oneway รายการได้รับการรับประกันว่าจะมีการสั่งซื้อ (โปรดดู รูปแบบการแยกชุดข้อความเซิร์ฟเวอร์) สำหรับเซิร์ฟเวอร์แบบหลายเธรดที่ โฮสต์หลายอินเทอร์เฟซ oneway การเรียกไปยังอินเทอร์เฟซที่แตกต่างกัน อาจได้รับการประมวลผลพร้อมกัน หรือการเรียกที่บล็อกอื่นๆ

ระบบจะส่งการเรียกที่ฝังหลายรายการไปยังเทรด Hwbinder เดียวกัน ตัวอย่างเช่น หากกระบวนการ (A) ทำการเรียกแบบซิงโครนัสจากเธรด Hwbinder ไปยังกระบวนการ (B) จากนั้นประมวลผล (B) เรียกกลับเข้าสู่กระบวนการ (A) การโทร ดำเนินการกับเธรด Hwbinder ดั้งเดิมใน (A) ซึ่งถูกบล็อกในต้นฉบับ การโทร การเพิ่มประสิทธิภาพนี้ทำให้ จัดการการโทรที่ซ้อนกัน แต่ไม่รวมถึงกรณีที่การโทรผ่าน อีกลำดับในการเรียก IPC ตัวอย่างเช่น หากกระบวนการ (B) ได้ระบุ การเรียก binder/vndbinder ที่ถูกเรียกเข้าสู่กระบวนการ (C) แล้วเรียก (C) กลับเข้าไปใน (A) จะไม่แสดงในชุดข้อความเดิมใน (A)

โมเดลการแยกชุดข้อความเซิร์ฟเวอร์

การใช้อินเทอร์เฟซ HIDL ของเซิร์ฟเวอร์แบบสด ยกเว้นโหมดส่งผ่าน ในกระบวนการที่ต่างจากไคลเอ็นต์ และต้องการชุดข้อความอย่างน้อย 1 รายการ ที่เรียกเข้ามา เทรดเหล่านี้คือ Threadpool ของเซิร์ฟเวอร์ เซิร์ฟเวอร์สามารถ จํานวนชุดข้อความที่ต้องการให้แสดงในกลุ่มชุดข้อความและใช้ ขนาด Threadpool เท่ากับ 1 สำหรับการเรียงลำดับการเรียกทั้งหมดในอินเทอร์เฟซ หากเซิร์ฟเวอร์ มีชุดข้อความใน Threadpool มากกว่า 1 รายการ จึงรับเข้าได้พร้อมกัน บนอินเทอร์เฟซใดๆ (ใน C++ หมายความว่าข้อมูลที่แชร์จะต้อง ล็อกอย่างระมัดระวัง)

การโทรทางเดียวเข้าสู่อินเทอร์เฟซเดียวกันจะเป็นแบบต่อเนื่อง หากเว็บเทรดหลายรายการ ไคลเอ็นต์โทรหา method1 และ method2 ในอินเทอร์เฟซ IFoo และ method3 ในอินเทอร์เฟซ IBar method1 และ method2 จะเป็นแบบต่อเนื่องเสมอ แต่ method3 สามารถเรียกใช้ควบคู่ไปกับ method1 และ method2

เทรดของไคลเอ็นต์เดี่ยวของการเรียกใช้อาจทําให้เกิดการดำเนินการพร้อมกันบน เซิร์ฟเวอร์ที่มีชุดข้อความหลายรายการ ซึ่งแบ่งเป็น 2 แบบ ดังนี้

  • ไม่ต้องบล็อกการโทร oneway สาย หากการโทร oneway คือ แล้วจะมีการเรียกรายการที่ไม่ใช่ oneway เซิร์ฟเวอร์จะสามารถเรียกใช้ได้ การโทร oneway และการโทรที่ไม่ใช่ oneway พร้อมกัน
  • เมธอดของเซิร์ฟเวอร์ที่ส่งข้อมูลกลับพร้อม Callback แบบซิงโครนัสสามารถเลิกบล็อกได้ ไคลเอ็นต์ทันทีที่การเรียกกลับจากเซิร์ฟเวอร์

สำหรับวิธีที่สอง โค้ดในฟังก์ชันของเซิร์ฟเวอร์ที่จะทำงานหลัง จะมีการเรียกใช้ Callback พร้อมกัน โดยที่เซิร์ฟเวอร์จะจัดการ จากลูกค้า ซึ่งรวมถึงโค้ดในฟังก์ชันของเซิร์ฟเวอร์และโค้ด ตัวทำลายที่เรียกใช้ตรงส่วนปลายของฟังก์ชัน ถ้าเซิร์ฟเวอร์มี เทรด 1 รายการใน Threadpool เกิดปัญหาการเกิดขึ้นพร้อมกันแม้ว่าจะมีการโทรเข้ามา จากเธรดของลูกค้าเพียงชุดเดียวได้ (หากมี HAL ใดๆ ที่แสดงโดยกระบวนการ เทรดหลายรายการ HAL ทั้งหมดมีชุดข้อความหลายรายการเนื่องจาก Threadpool ที่ใช้ร่วมกันต่อกระบวนการ)

ทันทีที่เซิร์ฟเวอร์เรียก Callback ที่ระบุ การรับส่งข้อมูลจะสามารถเรียก ใช้งาน Callback บนไคลเอ็นต์และเลิกบล็อกไคลเอ็นต์ ลูกค้าดำเนินการต่อ ควบคู่ไปกับการดำเนินการใดๆ ก็ตามที่การติดตั้งใช้งานเซิร์ฟเวอร์ทำหลังเรียกฟังก์ชัน Callback (ซึ่งอาจรวมถึงการเรียกใช้ตัวทำลาย) โค้ดในฟังก์ชันของเซิร์ฟเวอร์ หลังจากที่ Callback ไม่บล็อกไคลเอ็นต์แล้ว (ตราบใดที่เซิร์ฟเวอร์ Threadpool มีเทรดเพียงพอที่จะจัดการสายเรียกเข้า) แต่อาจจะมีการดำเนินการ พร้อมกันกับการเรียกในอนาคตจากไคลเอ็นต์ (เว้นแต่ว่า Threadpool ของเซิร์ฟเวอร์มี ชุดข้อความเดียว)

นอกจาก Callback แบบซิงโครนัสแล้ว oneway การโทรจาก ไคลเอ็นต์ที่มีชุดข้อความเดียวสามารถจัดการพร้อมกันได้โดยเซิร์ฟเวอร์ที่มี เทรดในเทรดของ Threadpool แต่เฉพาะเมื่อการเรียก oneway เหล่านั้น ดำเนินการบนอินเทอร์เฟซต่างๆ oneway สายโทรเข้า จะเป็นแบบอนุกรมเสมอ

หมายเหตุ: เราขอแนะนำให้เซิร์ฟเวอร์ดำเนินการต่อไปนี้ แสดงผลทันทีที่เรียกใช้ฟังก์ชัน Callback

ตัวอย่าง (ใน C++)

Return<void> someMethod(someMethod_cb _cb) {
    // Do some processing, then call callback with return data
    hidl_vec<uint32_t> vec = ...
    _cb(vec);
    // At this point, the client's callback is called,
    // and the client resumes execution.
    ...
    return Void(); // is basically a no-op
};

รูปแบบการแยกชุดข้อความย่อยในบทสนทนา

รูปแบบการแยกชุดข้อความในไคลเอ็นต์จะแตกต่างกันระหว่างการเรียกที่ไม่บล็อก (ฟังก์ชันที่มีเครื่องหมายคีย์เวิร์ด oneway) และการบล็อก การเรียก (ฟังก์ชันที่ไม่ได้ระบุคีย์เวิร์ด oneway ไว้)

บล็อกการโทร

สำหรับการบล็อกการเรียก ไคลเอ็นต์จะบล็อกจนกว่าจะมีการดำเนินการอย่างใดอย่างหนึ่งต่อไปนี้

  • เกิดข้อผิดพลาดในการนำส่ง ออบเจ็กต์ Return มีข้อผิดพลาด สถานะที่ดึงข้อมูลได้ด้วย Return::isOk()
  • การใช้งานเซิร์ฟเวอร์จะเรียก Callback (หากมี)
  • การใช้งานเซิร์ฟเวอร์จะแสดงค่า (หากไม่มีพารามิเตอร์ Callback)

ในกรณีที่สำเร็จ ฟังก์ชัน Callback ที่ไคลเอ็นต์ส่งเป็นอาร์กิวเมนต์คือ เรียกโดยเซิร์ฟเวอร์เสมอก่อนที่ฟังก์ชันจะแสดงผล การติดต่อกลับคือ ดำเนินการในเทรดเดียวกับที่มีการเรียกใช้ฟังก์ชัน ดังนั้นตัวติดตั้งใช้งาน ต้องระมัดระวังในการจับล็อกระหว่างการเรียกใช้ฟังก์ชัน (และหลีกเลี่ยง ทั้งหมดหากเป็นไปได้) ฟังก์ชันที่ไม่มีคำสั่ง generates หรือคีย์เวิร์ด oneway ยังคงบล็อกอยู่ ไคลเอ็นต์จะบล็อกจนกว่า เซิร์ฟเวอร์ส่งอ็อบเจ็กต์ Return<void> กลับมา

การโทรทางเดียว

เมื่อทำเครื่องหมายฟังก์ชันเป็น oneway ไคลเอ็นต์จะส่งกลับทันที และไม่รอให้เซิร์ฟเวอร์ดำเนินการเรียกฟังก์ชันได้สำเร็จ ที่ แพลตฟอร์ม (และแบบรวม) หมายความว่าการเรียกใช้ฟังก์ชันใช้เวลาครึ่งหนึ่ง เพราะกำลังเรียกใช้โค้ดครึ่งหนึ่ง แต่ขณะเขียนการใช้งานที่ มีความอ่อนไหวต่อประสิทธิภาพ และจะมีผลต่อกำหนดการบางอย่าง โดยทั่วไป การใช้การโทรทางเดียวจะทำให้ระบบยังกำหนดเวลาให้ผู้โทรอยู่ต่อไป ในขณะที่ การใช้การเรียกแบบซิงโครนัสปกติจะทำให้เครื่องจัดตารางเวลาโอนได้ทันที จากผู้โทรไปยังกระบวนการของผู้โทร วิธีนี้เป็นการเพิ่มประสิทธิภาพการทำงานใน Binder สำหรับบริการที่ต้องมีการดำเนินการเรียกใช้ทางเดียวในกระบวนการเป้าหมาย ลำดับความสำคัญสูง นโยบายการกำหนดเวลาของบริการรับข้อมูลอาจ มีการเปลี่ยนแปลง ใน C++ โดยใช้เมธอดของ libhidltransport setMinSchedulerPolicy พร้อมลำดับความสำคัญและนโยบายของเครื่องจัดตารางเวลา ที่กำหนดไว้ใน sched.h จะช่วยให้แน่ใจได้ว่าการเรียกใช้บริการทั้งหมดจะทำงานที่ อย่างน้อยที่สุดตามนโยบายการตั้งเวลา และลำดับความสำคัญ