Archive

Posts Tagged ‘io’

ว่าด้วยเรื่องของ Asynchronous I/O บน Unix และ Win32

Asynchronous I/O ที่ใช้กันส่วนใหญ่ในปัจจุบันจะมีอยู่สองแบบ คือ แบบเก่าที่เป็นแบบ Notify on Ready และแบบใหม่ที่เป็นแบบ Notify on Completion ซึ่งต่อไปนี้จะขอเรียกว่า NoR และ NoC

NoR นั้นได้ถูกคิดค้นขึ้นมาก่อน NoC สำหรับใช้บน Unix ในช่วงแรกๆ ส่วน NoC นั้นได้ถูกคิดค้นขึ้นมาสำหรับใช้กับ Windows NT ซึงถูกเรียกว่า Overlapped I/O (แต่ก็ยังคงรองรับ NoR)

NoR นั้นจะใช้การแจ้งเตือนเมื่อ I/O พร้อมที่จะทำงาน เช่น มีข้อมูลสำหรับอ่านแล้ว หรือมี Buffer ว่างสำหรับทำการเขียน ข้อดีคือ เขียนได้ง่ายกว่าแบบ NoC ส่วนข้อเสียคือ

  • จัดการกับ Error ที่เกิดขึ้นจากการเขียนได้ยากมาก เนื่องจากเราเขียนลง Buffer ของ Kernel ไม่ใช่การเขียนลง Device จริง
  • อ่านพร้อมกันมากกว่าหนึ่งเธรดลำบาก เนื่องจากต้องมีการ Synchronize เพื่อป้องกันไม่ให้เธรดอื่นเข้ามาอ่านในระหว่างที่อีกเธรดกำลังอ่านอยู่ ซึ่งก็ไม่ใช่วิธีที่ดีเพราะจะก่อให้เกิดการ Lock เกิดขึ้น

ส่วน NoC นั้นจะใช้การแจ้งเตือนเมื่อ I/O ทำงานเสร็จแล้ว เช่น เราสั่งอ่านข้อมูล เมื่อการอ่านเสร็จสิ้น ก็จะมีการแจ้งเตือนมาบอกว่าอ่านเสร็จแล้ว การเขียนก็เหมือนกัน เราสั่งเขียน เมื่อการเขียนเสร็จสิ้น ก็จะมีการแจ้งเตือนมาบอกว่าเขียนเสร็จแล้ว มีข้อดีคือ

  • ใช้ได้มากกว่าหนึ่งเธรด เนื่องจากมีการกำหนด Buffer ที่จะทำการอ่านหรือเขียนตอนสั่ง I/O พอ I/O ทำงานเสร็จสิ้น การแจ้งเตือนจะตกไปอยู่ที่เธรดไหนก็ได้ไม่จำเป็นต้องเป็นเธรดที่สั่ง I/O
  • จัดการกับ Error ที่เกิดขึ้นกับ Device ได้ง่าย เนื่องจากการแจ้งเตือนจะถูกส่งมาหลังจากทำงานเสร็จสิ้นหรือมี Error เกิดขึ้นเท่านั้น

ส่วนข้อเสียคือ

  • เขียนได้ยากกว่าแบบ NoR เนื่องจากต้องมีการจัดการกับ Buffer ที่ยังทำงานไม่เสร็จ
  • พอร์ต Code เก่าๆที่เขียนโดยใช้ NoR ได้ยาก เนื่องจากรูปแบบที่แตกต่างกัน

ใน Unix และ Unix-like ใหม่ๆนั้นส่วนใหญ่จะรองรับ NoC กันหมดแล้ว แต่บาง OS ก็ยังไม่สมบูรณ์ บวกกับแต่ละ OS มี API ที่แตกต่างกัน ทำให้หากต้องการเขียน Code ที่ใช้ NoC บนหลายๆ OS ที่เป็น Unix และ Unix-like นั้นจะยุ่งยากมาก เลยไม่ค่อยเป็นที่นิยม ทำให้ส่วนใหญ่ยังคงใช้แบบ NoR กันอยู่ ส่วนบน Windows NT นั้น I/O ทุกอย่างจะใช้ NoC ทั้งหมด แล้วค่อยทำแบบ Synchronous โดยขี่อยู่บน Asynchronous อีกทีหนึ่ง ซึ่งการรองรับ NoR บน Windows NT นั้นทำขึ้นมาเพียงเพื่อให้ API บางส่วนเกิดความเข้ากันได้กับฝั่ง Unix เท่านั้น