ในการเขียนระบบสคริปต์สำหรับงานวิศวกรรมซอฟต์แวร์และการดูแลรักษาระบบระดับสูง การจัดการการรอทรัพยากรอินเทอร์เน็ตเป็นหัวข้อที่สำคัญและมักสร้างความเข้าใจผิดให้กับผู้เริ่มต้น Shell Script เนื่องจากโดยธรรมชาติแล้ว สคริปต์แบบดั้งเดิมมีการทำงานตามลำดับอย่างเคร่งครัด เมื่อกระบวนการหนึ่งต้อง ‘รอ’ ข้อมูลจาก Socket หรือ I/O Stream มันจะเกิดภาวะ Blocking ซึ่งหมายถึงโปรแกรมทั้งหมดจะต้องหยุดชะงักจนกว่าข้อมูลนั้นจะมาถึง
ทำไมจึงจำเป็นต้องศึกษา Non-blocking และ Multiplexing
เมื่อเราต้องการให้ Bash script ทำหน้าที่เหมือน Server ที่สามารถเฝ้าดูสถานะของหลายๆ Connection พร้อมกัน โดยที่ไม่ปล่อยให้ Process ทั้งหมดติดอยู่ในโหมด Waiting บน Single Resource วิธีแก้ไขคือการเปลี่ยนจากการบล็อกไปสู่กลไก Asynchronous เรามีสองแนวคิดหลัก ๆ คือ Non-blocking I/O (NonBlocking) และ API อย่าง select()/poll() เพื่อควบคุมวิธีการนี้
1. แนวคิด Non-blocking I/O
- คำจำกัดความ: การตั้งค่า Socket ให้เป็น non-blocking หมายความว่า หากสคริปต์พยายามอ่านหรือเขียนข้อมูล แต่ไม่มีข้อมูลพร้อมใช้งานทันที ระบบปฏิบัติการจะไม่ทำให้ process หยุดนิ่ง แต่มันจะคืนค่า Error Code ทันที ทำให้โค้ดส่วนที่เรียกใช้ IO นั้นยังคงทำงานต่อไปได้
อย่างไรก็ตาม แม้ว่าจะหลีกเลี่ยงปัญหา Blocking ได้ด้วยวิธีนี้ ปัญหาใหม่ก็เกิดขึ้นตามมา นั่นคือ Developer จะต้องรับผิดชอบในการวนลูปตรวจสอบซ้ำ ๆ ว่าแต่ละ Stream มีอะไรเปลี่ยนแปลงหรือไม่ ซึ่งอาจนำไปสู่อัตราการบริโภค CPU ที่สูงเกินจำเป็นหากมีการ Polling บ่อยครั้งโดยไม่เกิดประโยชน์
2. กลไก Multiplexing ด้วย Select หรือ Poll
Multiplexing เป็นเทคนิคขั้นกว่าของการจัดการ Process Wait โดยมันไม่ได้ให้เราแค่บอกว่า