Mutex กับ Semaphore

การทำความเข้าใจความแตกต่างระหว่าง Mutex และ Semaphore มีความสำคัญอย่างยิ่งต่อการทำงานหลายงานพร้อมกันอย่างปลอดภัยและมีประสิทธิภาพในระบบฝังตัว

Mutex กับ Semaphore

Mutex และ Semaphores เป็นทรัพยากรของเคอร์เนลที่ให้บริการด้านการซิงโครไนซ์ (หรือที่เรียกว่ากลไกการซิงโครไนซ์) การซิงโครไนซ์มีความจำเป็นเมื่อมีหลายกระบวนการทำงานพร้อมกัน เพื่อหลีกเลี่ยงความขัดแย้งระหว่างกระบวนการที่ใช้ทรัพยากรร่วมกัน

มิวเท็กซ์

มิวเท็กซ์ (Mutex) แตกต่างจากเซมาฟอร์แบบไบนารี (Binary Semaphore) ซึ่งเป็นกลไกการล็อก มิวเท็กซ์ย่อมาจากMutual Exclusion Object (วัตถุการกีดกันร่วมกัน) โดยหลักแล้วมิวเท็กซ์ใช้เพื่อสร้างการกีดกันร่วมกันให้กับส่วนของโค้ดที่เฉพาะเจาะจง เพื่อให้กระบวนการสามารถทำงานกับส่วนของโค้ดนั้นได้ในเวลาที่กำหนดเท่านั้น  

  • มิวเท็กซ์ (Mutex) บังคับใช้การเป็นเจ้าของอย่างเข้มงวด มีเพียงเธรดที่ล็อกมิวเท็กซ์เท่านั้นที่สามารถปลดล็อกได้
  • โดยเฉพาะอย่างยิ่งใช้สำหรับล็อกทรัพยากรเพื่อให้แน่ใจว่ามีเพียงเธรดเดียวเท่านั้นที่สามารถเข้าถึงได้ในแต่ละครั้ง
  • เนื่องจากข้อจำกัดด้านความเป็นเจ้าของที่เข้มงวดนี้ มิวเท็กซ์จึงไม่เพียงแต่ใช้สำหรับการส่งสัญญาณระหว่างเธรดเท่านั้น แต่ยังใช้สำหรับการกีดกันซึ่งกันและกันเพื่อให้แน่ใจว่าทรัพยากรนั้นจะถูกเข้าถึงโดยเธรดเพียงเธรดเดียวในแต่ละครั้ง
  • Mutex ใช้กลไกการสืบทอดลำดับความสำคัญเพื่อหลีกเลี่ยงปัญหาการผกผันลำดับความสำคัญ

หมายเหตุ:กลไกการสืบทอดลำดับความสำคัญจะทำให้กระบวนการที่มีลำดับความสำคัญสูงกว่าอยู่ในสถานะถูกบล็อกเป็นเวลาน้อยที่สุดเท่าที่จะเป็นไปได้ อย่างไรก็ตาม วิธีนี้ไม่สามารถหลีกเลี่ยงปัญหาการกลับลำดับความสำคัญได้ แต่สามารถลดผลกระทบได้ในระดับหนึ่ง

การใช้ Mutex

ปัญหาผู้ผลิต-ผู้บริโภค: พิจารณาปัญหา  ผู้ผลิต-ผู้บริโภคมาตรฐาน สมมติว่าเรามีบัฟเฟอร์ขนาด 4096 ไบต์ เธรดผู้ผลิตจะรวบรวมข้อมูลและเขียนลงในบัฟเฟอร์ เธรดผู้บริโภคจะประมวลผลข้อมูลที่รวบรวมได้จากบัฟเฟอร์ เป้าหมายคือ เธรดทั้งสองไม่ควรทำงานพร้อมกัน

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

ข้อดีของ Mutex

  • ไม่เกิดสภาวะการแข่งขัน (race condition) เนื่องจากมีเพียงกระบวนการเดียวเท่านั้นที่อยู่ในส่วนวิกฤตในแต่ละครั้ง
  • ข้อมูลมีความสม่ำเสมอและช่วยรักษาความถูกต้องแม่นยำของข้อมูล
  • เป็นกลไกการล็อกแบบง่ายๆ ที่ล็อกเข้ากับส่วนที่สำคัญ และจะปลดล็อกเมื่อออกจากส่วนที่สำคัญนั้น

ข้อเสียของ Mutex

  • หากเธรดที่ถือมิวเท็กซ์ถูกขัดจังหวะหรือเข้าสู่โหมดพักการทำงานภายในส่วนวิกฤต เธรดอื่นๆ จะถูกบล็อก ซึ่งอาจนำไปสู่การผกผันลำดับความสำคัญหรือการอดอยาก
  • Mutexes เกี่ยวข้องกับการสลับบริบทและค่าใช้จ่ายเพิ่มเติมของเคอร์เนล ทำให้มันช้ากว่า spinlocks สำหรับส่วนวิกฤตที่สั้นมาก
  • การใช้งานที่ไม่ถูกต้อง (เช่น ลืมปลดล็อก) อาจทำให้เกิดภาวะล็อกตายได้

สัญญาณ

เซมาฟอร์คือตัวแปรจำนวนเต็มที่ไม่ติดลบซึ่งใช้ร่วมกันระหว่างเธรดต่างๆ เซมาฟอร์ทำงานโดยอาศัยกลไกการส่งสัญญาณ โดยเธรดหนึ่งสามารถรับสัญญาณจากเธรดอื่นได้

  • มันเป็นกลไกควบคุมที่ไม่เข้มงวดมากนัก เธรดใดก็ได้สามารถเรียกใช้signal()เมธอด `release()` หรือ `up()` ได้ และเธรดอื่นๆ ก็สามารถเรียกใช้เมธอด `wait()` หรือ `acquire()` หรือ `down()` ได้เช่นกัน
  • ในเซมาฟอร์นั้นไม่มีการกำหนดความเป็นเจ้าของอย่างเคร่งครัด หมายความว่าเธรดที่ส่งสัญญาณไม่จำเป็นต้องเป็นเธรดเดียวกับที่รอการตอบสนองเสมอไป

หมายเหตุ:เซมาฟอร์มักใช้สำหรับการประสานสัญญาณระหว่างเธรด เซมาฟอร์ใช้การดำเนินการพื้นฐานสองอย่างสำหรับการซิงโครไนซ์กระบวนการ ได้แก่ รอ (P) และส่งสัญญาณ (V)

การใช้สัญญาณไฟจราจร

ปัญหาผู้ผลิต-ผู้บริโภค: พิจารณาปัญหา  ผู้ผลิต-ผู้บริโภคมาตรฐาน สมมติว่าเรามีบัฟเฟอร์ขนาด 4096 ไบต์ เธรดผู้ผลิตจะรวบรวมข้อมูลและเขียนลงในบัฟเฟอร์ เธรดผู้บริโภคจะประมวลผลข้อมูลที่รวบรวมได้จากบัฟเฟอร์ เป้าหมายคือ เธรดทั้งสองไม่ควรทำงานพร้อมกัน

วิธีแก้ปัญหา:เซมาฟอร์เป็นมิวเท็กซ์ แบบทั่วไป แทนที่จะใช้บัฟเฟอร์เดียว เราสามารถแบ่งบัฟเฟอร์ขนาด 4 KB ออกเป็นบัฟเฟอร์ขนาด 1 KB สี่บัฟเฟอร์ (ทรัพยากรที่เหมือนกัน) เซมาฟอร์สามารถเชื่อมโยงกับบัฟเฟอร์ทั้งสี่นี้ได้ ผู้บริโภคและผู้ผลิตสามารถทำงานกับบัฟเฟอร์ที่แตกต่างกันได้ในเวลาเดียวกัน

ข้อดีของสัญญาณธง

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

ข้อเสียของสัญญาณธง

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

ความแตกต่างระหว่างมิวเท็กซ์และเซมาฟอร์

ความเข้าใจผิดเกี่ยวกับมิวเท็กซ์และเซมาฟอร์

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

  • มิวเท็กซ์ (Mutex) คือกลไกการล็อกที่ใช้ในการซิงโครไนซ์การเข้าถึงทรัพยากร
  • มีเพียงงานเดียวเท่านั้น (อาจเป็นเธรดหรือกระบวนการ ขึ้นอยู่กับการทำงานแบบนามธรรมของระบบปฏิบัติการ) ที่สามารถเข้าถึงมิวเท็กซ์ได้
  • หมายความว่ามีการผูกสิทธิ์ความเป็นเจ้าของกับมิวเท็กซ์ และมีเพียงเจ้าของเท่านั้นที่สามารถปลดล็อก (มิวเท็กซ์) ได้

ในขณะที่เซมาฟอร์เป็นกลไกการส่งสัญญาณที่ใช้ควบคุมการเข้าถึงทรัพยากรที่ใช้ร่วมกันในระบบปฏิบัติการ ตัวอย่างเช่น ลองนึกภาพว่าคุณกำลังดาวน์โหลดไฟล์ขนาดใหญ่ลงในคอมพิวเตอร์ของคุณ (งาน A) ในขณะเดียวกันก็พยายามพิมพ์เอกสาร (งาน B) เมื่อเริ่มงานพิมพ์ ระบบจะกระตุ้นเซมาฟอร์เพื่อตรวจสอบว่าการดาวน์โหลดเสร็จสมบูรณ์หรือไม่

  • หากการดาวน์โหลดยังไม่เสร็จสิ้น สัญญาณเซมาฟอร์จะป้องกันไม่ให้งานพิมพ์ดำเนินการต่อ ซึ่งเป็นการบอกว่า "รอจนกว่าการดาวน์โหลดจะเสร็จสิ้น"
  • เมื่อการดาวน์โหลดเสร็จสมบูรณ์ สัญญาณเซมาฟอร์จะส่งสัญญาณว่างาน B สามารถเริ่มพิมพ์ได้
  • วิธีนี้ช่วยให้มั่นใจได้ว่าทั้งสองงานจะไม่รบกวนซึ่งกันและกัน และช่วยจัดการทรัพยากรระบบได้อย่างมีประสิทธิภาพ ทำให้งานต่างๆ ดำเนินไปได้อย่างราบรื่นโดยไม่มีข้อขัดแย้ง
ผลิตภัณฑ์
September 11, 2026

Mutex กับ Semaphore

การทำความเข้าใจความแตกต่างระหว่าง Mutex และ Semaphore มีความสำคัญอย่างยิ่งต่อการทำงานหลายงานพร้อมกันอย่างปลอดภัยและมีประสิทธิภาพในระบบฝังตัว

นักเขียนบทความ
by 
นักเขียนบทความ
Mutex กับ Semaphore

Mutex กับ Semaphore

การทำความเข้าใจความแตกต่างระหว่าง Mutex และ Semaphore มีความสำคัญอย่างยิ่งต่อการทำงานหลายงานพร้อมกันอย่างปลอดภัยและมีประสิทธิภาพในระบบฝังตัว

Mutex และ Semaphores เป็นทรัพยากรของเคอร์เนลที่ให้บริการด้านการซิงโครไนซ์ (หรือที่เรียกว่ากลไกการซิงโครไนซ์) การซิงโครไนซ์มีความจำเป็นเมื่อมีหลายกระบวนการทำงานพร้อมกัน เพื่อหลีกเลี่ยงความขัดแย้งระหว่างกระบวนการที่ใช้ทรัพยากรร่วมกัน

มิวเท็กซ์

มิวเท็กซ์ (Mutex) แตกต่างจากเซมาฟอร์แบบไบนารี (Binary Semaphore) ซึ่งเป็นกลไกการล็อก มิวเท็กซ์ย่อมาจากMutual Exclusion Object (วัตถุการกีดกันร่วมกัน) โดยหลักแล้วมิวเท็กซ์ใช้เพื่อสร้างการกีดกันร่วมกันให้กับส่วนของโค้ดที่เฉพาะเจาะจง เพื่อให้กระบวนการสามารถทำงานกับส่วนของโค้ดนั้นได้ในเวลาที่กำหนดเท่านั้น  

  • มิวเท็กซ์ (Mutex) บังคับใช้การเป็นเจ้าของอย่างเข้มงวด มีเพียงเธรดที่ล็อกมิวเท็กซ์เท่านั้นที่สามารถปลดล็อกได้
  • โดยเฉพาะอย่างยิ่งใช้สำหรับล็อกทรัพยากรเพื่อให้แน่ใจว่ามีเพียงเธรดเดียวเท่านั้นที่สามารถเข้าถึงได้ในแต่ละครั้ง
  • เนื่องจากข้อจำกัดด้านความเป็นเจ้าของที่เข้มงวดนี้ มิวเท็กซ์จึงไม่เพียงแต่ใช้สำหรับการส่งสัญญาณระหว่างเธรดเท่านั้น แต่ยังใช้สำหรับการกีดกันซึ่งกันและกันเพื่อให้แน่ใจว่าทรัพยากรนั้นจะถูกเข้าถึงโดยเธรดเพียงเธรดเดียวในแต่ละครั้ง
  • Mutex ใช้กลไกการสืบทอดลำดับความสำคัญเพื่อหลีกเลี่ยงปัญหาการผกผันลำดับความสำคัญ

หมายเหตุ:กลไกการสืบทอดลำดับความสำคัญจะทำให้กระบวนการที่มีลำดับความสำคัญสูงกว่าอยู่ในสถานะถูกบล็อกเป็นเวลาน้อยที่สุดเท่าที่จะเป็นไปได้ อย่างไรก็ตาม วิธีนี้ไม่สามารถหลีกเลี่ยงปัญหาการกลับลำดับความสำคัญได้ แต่สามารถลดผลกระทบได้ในระดับหนึ่ง

การใช้ Mutex

ปัญหาผู้ผลิต-ผู้บริโภค: พิจารณาปัญหา  ผู้ผลิต-ผู้บริโภคมาตรฐาน สมมติว่าเรามีบัฟเฟอร์ขนาด 4096 ไบต์ เธรดผู้ผลิตจะรวบรวมข้อมูลและเขียนลงในบัฟเฟอร์ เธรดผู้บริโภคจะประมวลผลข้อมูลที่รวบรวมได้จากบัฟเฟอร์ เป้าหมายคือ เธรดทั้งสองไม่ควรทำงานพร้อมกัน

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

ข้อดีของ Mutex

  • ไม่เกิดสภาวะการแข่งขัน (race condition) เนื่องจากมีเพียงกระบวนการเดียวเท่านั้นที่อยู่ในส่วนวิกฤตในแต่ละครั้ง
  • ข้อมูลมีความสม่ำเสมอและช่วยรักษาความถูกต้องแม่นยำของข้อมูล
  • เป็นกลไกการล็อกแบบง่ายๆ ที่ล็อกเข้ากับส่วนที่สำคัญ และจะปลดล็อกเมื่อออกจากส่วนที่สำคัญนั้น

ข้อเสียของ Mutex

  • หากเธรดที่ถือมิวเท็กซ์ถูกขัดจังหวะหรือเข้าสู่โหมดพักการทำงานภายในส่วนวิกฤต เธรดอื่นๆ จะถูกบล็อก ซึ่งอาจนำไปสู่การผกผันลำดับความสำคัญหรือการอดอยาก
  • Mutexes เกี่ยวข้องกับการสลับบริบทและค่าใช้จ่ายเพิ่มเติมของเคอร์เนล ทำให้มันช้ากว่า spinlocks สำหรับส่วนวิกฤตที่สั้นมาก
  • การใช้งานที่ไม่ถูกต้อง (เช่น ลืมปลดล็อก) อาจทำให้เกิดภาวะล็อกตายได้

สัญญาณ

เซมาฟอร์คือตัวแปรจำนวนเต็มที่ไม่ติดลบซึ่งใช้ร่วมกันระหว่างเธรดต่างๆ เซมาฟอร์ทำงานโดยอาศัยกลไกการส่งสัญญาณ โดยเธรดหนึ่งสามารถรับสัญญาณจากเธรดอื่นได้

  • มันเป็นกลไกควบคุมที่ไม่เข้มงวดมากนัก เธรดใดก็ได้สามารถเรียกใช้signal()เมธอด `release()` หรือ `up()` ได้ และเธรดอื่นๆ ก็สามารถเรียกใช้เมธอด `wait()` หรือ `acquire()` หรือ `down()` ได้เช่นกัน
  • ในเซมาฟอร์นั้นไม่มีการกำหนดความเป็นเจ้าของอย่างเคร่งครัด หมายความว่าเธรดที่ส่งสัญญาณไม่จำเป็นต้องเป็นเธรดเดียวกับที่รอการตอบสนองเสมอไป

หมายเหตุ:เซมาฟอร์มักใช้สำหรับการประสานสัญญาณระหว่างเธรด เซมาฟอร์ใช้การดำเนินการพื้นฐานสองอย่างสำหรับการซิงโครไนซ์กระบวนการ ได้แก่ รอ (P) และส่งสัญญาณ (V)

การใช้สัญญาณไฟจราจร

ปัญหาผู้ผลิต-ผู้บริโภค: พิจารณาปัญหา  ผู้ผลิต-ผู้บริโภคมาตรฐาน สมมติว่าเรามีบัฟเฟอร์ขนาด 4096 ไบต์ เธรดผู้ผลิตจะรวบรวมข้อมูลและเขียนลงในบัฟเฟอร์ เธรดผู้บริโภคจะประมวลผลข้อมูลที่รวบรวมได้จากบัฟเฟอร์ เป้าหมายคือ เธรดทั้งสองไม่ควรทำงานพร้อมกัน

วิธีแก้ปัญหา:เซมาฟอร์เป็นมิวเท็กซ์ แบบทั่วไป แทนที่จะใช้บัฟเฟอร์เดียว เราสามารถแบ่งบัฟเฟอร์ขนาด 4 KB ออกเป็นบัฟเฟอร์ขนาด 1 KB สี่บัฟเฟอร์ (ทรัพยากรที่เหมือนกัน) เซมาฟอร์สามารถเชื่อมโยงกับบัฟเฟอร์ทั้งสี่นี้ได้ ผู้บริโภคและผู้ผลิตสามารถทำงานกับบัฟเฟอร์ที่แตกต่างกันได้ในเวลาเดียวกัน

ข้อดีของสัญญาณธง

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

ข้อเสียของสัญญาณธง

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

ความแตกต่างระหว่างมิวเท็กซ์และเซมาฟอร์

ความเข้าใจผิดเกี่ยวกับมิวเท็กซ์และเซมาฟอร์

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

  • มิวเท็กซ์ (Mutex) คือกลไกการล็อกที่ใช้ในการซิงโครไนซ์การเข้าถึงทรัพยากร
  • มีเพียงงานเดียวเท่านั้น (อาจเป็นเธรดหรือกระบวนการ ขึ้นอยู่กับการทำงานแบบนามธรรมของระบบปฏิบัติการ) ที่สามารถเข้าถึงมิวเท็กซ์ได้
  • หมายความว่ามีการผูกสิทธิ์ความเป็นเจ้าของกับมิวเท็กซ์ และมีเพียงเจ้าของเท่านั้นที่สามารถปลดล็อก (มิวเท็กซ์) ได้

ในขณะที่เซมาฟอร์เป็นกลไกการส่งสัญญาณที่ใช้ควบคุมการเข้าถึงทรัพยากรที่ใช้ร่วมกันในระบบปฏิบัติการ ตัวอย่างเช่น ลองนึกภาพว่าคุณกำลังดาวน์โหลดไฟล์ขนาดใหญ่ลงในคอมพิวเตอร์ของคุณ (งาน A) ในขณะเดียวกันก็พยายามพิมพ์เอกสาร (งาน B) เมื่อเริ่มงานพิมพ์ ระบบจะกระตุ้นเซมาฟอร์เพื่อตรวจสอบว่าการดาวน์โหลดเสร็จสมบูรณ์หรือไม่

  • หากการดาวน์โหลดยังไม่เสร็จสิ้น สัญญาณเซมาฟอร์จะป้องกันไม่ให้งานพิมพ์ดำเนินการต่อ ซึ่งเป็นการบอกว่า "รอจนกว่าการดาวน์โหลดจะเสร็จสิ้น"
  • เมื่อการดาวน์โหลดเสร็จสมบูรณ์ สัญญาณเซมาฟอร์จะส่งสัญญาณว่างาน B สามารถเริ่มพิมพ์ได้
  • วิธีนี้ช่วยให้มั่นใจได้ว่าทั้งสองงานจะไม่รบกวนซึ่งกันและกัน และช่วยจัดการทรัพยากรระบบได้อย่างมีประสิทธิภาพ ทำให้งานต่างๆ ดำเนินไปได้อย่างราบรื่นโดยไม่มีข้อขัดแย้ง

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

Mutex กับ Semaphore

Mutex กับ Semaphore

การทำความเข้าใจความแตกต่างระหว่าง Mutex และ Semaphore มีความสำคัญอย่างยิ่งต่อการทำงานหลายงานพร้อมกันอย่างปลอดภัยและมีประสิทธิภาพในระบบฝังตัว

Lorem ipsum dolor amet consectetur adipiscing elit tortor massa arcu non.

Mutex และ Semaphores เป็นทรัพยากรของเคอร์เนลที่ให้บริการด้านการซิงโครไนซ์ (หรือที่เรียกว่ากลไกการซิงโครไนซ์) การซิงโครไนซ์มีความจำเป็นเมื่อมีหลายกระบวนการทำงานพร้อมกัน เพื่อหลีกเลี่ยงความขัดแย้งระหว่างกระบวนการที่ใช้ทรัพยากรร่วมกัน

มิวเท็กซ์

มิวเท็กซ์ (Mutex) แตกต่างจากเซมาฟอร์แบบไบนารี (Binary Semaphore) ซึ่งเป็นกลไกการล็อก มิวเท็กซ์ย่อมาจากMutual Exclusion Object (วัตถุการกีดกันร่วมกัน) โดยหลักแล้วมิวเท็กซ์ใช้เพื่อสร้างการกีดกันร่วมกันให้กับส่วนของโค้ดที่เฉพาะเจาะจง เพื่อให้กระบวนการสามารถทำงานกับส่วนของโค้ดนั้นได้ในเวลาที่กำหนดเท่านั้น  

  • มิวเท็กซ์ (Mutex) บังคับใช้การเป็นเจ้าของอย่างเข้มงวด มีเพียงเธรดที่ล็อกมิวเท็กซ์เท่านั้นที่สามารถปลดล็อกได้
  • โดยเฉพาะอย่างยิ่งใช้สำหรับล็อกทรัพยากรเพื่อให้แน่ใจว่ามีเพียงเธรดเดียวเท่านั้นที่สามารถเข้าถึงได้ในแต่ละครั้ง
  • เนื่องจากข้อจำกัดด้านความเป็นเจ้าของที่เข้มงวดนี้ มิวเท็กซ์จึงไม่เพียงแต่ใช้สำหรับการส่งสัญญาณระหว่างเธรดเท่านั้น แต่ยังใช้สำหรับการกีดกันซึ่งกันและกันเพื่อให้แน่ใจว่าทรัพยากรนั้นจะถูกเข้าถึงโดยเธรดเพียงเธรดเดียวในแต่ละครั้ง
  • Mutex ใช้กลไกการสืบทอดลำดับความสำคัญเพื่อหลีกเลี่ยงปัญหาการผกผันลำดับความสำคัญ

หมายเหตุ:กลไกการสืบทอดลำดับความสำคัญจะทำให้กระบวนการที่มีลำดับความสำคัญสูงกว่าอยู่ในสถานะถูกบล็อกเป็นเวลาน้อยที่สุดเท่าที่จะเป็นไปได้ อย่างไรก็ตาม วิธีนี้ไม่สามารถหลีกเลี่ยงปัญหาการกลับลำดับความสำคัญได้ แต่สามารถลดผลกระทบได้ในระดับหนึ่ง

การใช้ Mutex

ปัญหาผู้ผลิต-ผู้บริโภค: พิจารณาปัญหา  ผู้ผลิต-ผู้บริโภคมาตรฐาน สมมติว่าเรามีบัฟเฟอร์ขนาด 4096 ไบต์ เธรดผู้ผลิตจะรวบรวมข้อมูลและเขียนลงในบัฟเฟอร์ เธรดผู้บริโภคจะประมวลผลข้อมูลที่รวบรวมได้จากบัฟเฟอร์ เป้าหมายคือ เธรดทั้งสองไม่ควรทำงานพร้อมกัน

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

ข้อดีของ Mutex

  • ไม่เกิดสภาวะการแข่งขัน (race condition) เนื่องจากมีเพียงกระบวนการเดียวเท่านั้นที่อยู่ในส่วนวิกฤตในแต่ละครั้ง
  • ข้อมูลมีความสม่ำเสมอและช่วยรักษาความถูกต้องแม่นยำของข้อมูล
  • เป็นกลไกการล็อกแบบง่ายๆ ที่ล็อกเข้ากับส่วนที่สำคัญ และจะปลดล็อกเมื่อออกจากส่วนที่สำคัญนั้น

ข้อเสียของ Mutex

  • หากเธรดที่ถือมิวเท็กซ์ถูกขัดจังหวะหรือเข้าสู่โหมดพักการทำงานภายในส่วนวิกฤต เธรดอื่นๆ จะถูกบล็อก ซึ่งอาจนำไปสู่การผกผันลำดับความสำคัญหรือการอดอยาก
  • Mutexes เกี่ยวข้องกับการสลับบริบทและค่าใช้จ่ายเพิ่มเติมของเคอร์เนล ทำให้มันช้ากว่า spinlocks สำหรับส่วนวิกฤตที่สั้นมาก
  • การใช้งานที่ไม่ถูกต้อง (เช่น ลืมปลดล็อก) อาจทำให้เกิดภาวะล็อกตายได้

สัญญาณ

เซมาฟอร์คือตัวแปรจำนวนเต็มที่ไม่ติดลบซึ่งใช้ร่วมกันระหว่างเธรดต่างๆ เซมาฟอร์ทำงานโดยอาศัยกลไกการส่งสัญญาณ โดยเธรดหนึ่งสามารถรับสัญญาณจากเธรดอื่นได้

  • มันเป็นกลไกควบคุมที่ไม่เข้มงวดมากนัก เธรดใดก็ได้สามารถเรียกใช้signal()เมธอด `release()` หรือ `up()` ได้ และเธรดอื่นๆ ก็สามารถเรียกใช้เมธอด `wait()` หรือ `acquire()` หรือ `down()` ได้เช่นกัน
  • ในเซมาฟอร์นั้นไม่มีการกำหนดความเป็นเจ้าของอย่างเคร่งครัด หมายความว่าเธรดที่ส่งสัญญาณไม่จำเป็นต้องเป็นเธรดเดียวกับที่รอการตอบสนองเสมอไป

หมายเหตุ:เซมาฟอร์มักใช้สำหรับการประสานสัญญาณระหว่างเธรด เซมาฟอร์ใช้การดำเนินการพื้นฐานสองอย่างสำหรับการซิงโครไนซ์กระบวนการ ได้แก่ รอ (P) และส่งสัญญาณ (V)

การใช้สัญญาณไฟจราจร

ปัญหาผู้ผลิต-ผู้บริโภค: พิจารณาปัญหา  ผู้ผลิต-ผู้บริโภคมาตรฐาน สมมติว่าเรามีบัฟเฟอร์ขนาด 4096 ไบต์ เธรดผู้ผลิตจะรวบรวมข้อมูลและเขียนลงในบัฟเฟอร์ เธรดผู้บริโภคจะประมวลผลข้อมูลที่รวบรวมได้จากบัฟเฟอร์ เป้าหมายคือ เธรดทั้งสองไม่ควรทำงานพร้อมกัน

วิธีแก้ปัญหา:เซมาฟอร์เป็นมิวเท็กซ์ แบบทั่วไป แทนที่จะใช้บัฟเฟอร์เดียว เราสามารถแบ่งบัฟเฟอร์ขนาด 4 KB ออกเป็นบัฟเฟอร์ขนาด 1 KB สี่บัฟเฟอร์ (ทรัพยากรที่เหมือนกัน) เซมาฟอร์สามารถเชื่อมโยงกับบัฟเฟอร์ทั้งสี่นี้ได้ ผู้บริโภคและผู้ผลิตสามารถทำงานกับบัฟเฟอร์ที่แตกต่างกันได้ในเวลาเดียวกัน

ข้อดีของสัญญาณธง

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

ข้อเสียของสัญญาณธง

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

ความแตกต่างระหว่างมิวเท็กซ์และเซมาฟอร์

ความเข้าใจผิดเกี่ยวกับมิวเท็กซ์และเซมาฟอร์

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

  • มิวเท็กซ์ (Mutex) คือกลไกการล็อกที่ใช้ในการซิงโครไนซ์การเข้าถึงทรัพยากร
  • มีเพียงงานเดียวเท่านั้น (อาจเป็นเธรดหรือกระบวนการ ขึ้นอยู่กับการทำงานแบบนามธรรมของระบบปฏิบัติการ) ที่สามารถเข้าถึงมิวเท็กซ์ได้
  • หมายความว่ามีการผูกสิทธิ์ความเป็นเจ้าของกับมิวเท็กซ์ และมีเพียงเจ้าของเท่านั้นที่สามารถปลดล็อก (มิวเท็กซ์) ได้

ในขณะที่เซมาฟอร์เป็นกลไกการส่งสัญญาณที่ใช้ควบคุมการเข้าถึงทรัพยากรที่ใช้ร่วมกันในระบบปฏิบัติการ ตัวอย่างเช่น ลองนึกภาพว่าคุณกำลังดาวน์โหลดไฟล์ขนาดใหญ่ลงในคอมพิวเตอร์ของคุณ (งาน A) ในขณะเดียวกันก็พยายามพิมพ์เอกสาร (งาน B) เมื่อเริ่มงานพิมพ์ ระบบจะกระตุ้นเซมาฟอร์เพื่อตรวจสอบว่าการดาวน์โหลดเสร็จสมบูรณ์หรือไม่

  • หากการดาวน์โหลดยังไม่เสร็จสิ้น สัญญาณเซมาฟอร์จะป้องกันไม่ให้งานพิมพ์ดำเนินการต่อ ซึ่งเป็นการบอกว่า "รอจนกว่าการดาวน์โหลดจะเสร็จสิ้น"
  • เมื่อการดาวน์โหลดเสร็จสมบูรณ์ สัญญาณเซมาฟอร์จะส่งสัญญาณว่างาน B สามารถเริ่มพิมพ์ได้
  • วิธีนี้ช่วยให้มั่นใจได้ว่าทั้งสองงานจะไม่รบกวนซึ่งกันและกัน และช่วยจัดการทรัพยากรระบบได้อย่างมีประสิทธิภาพ ทำให้งานต่างๆ ดำเนินไปได้อย่างราบรื่นโดยไม่มีข้อขัดแย้ง