ความหมายของ Semaphore- การนับประเภทไบนารีพร้อมตัวอย่าง
⚡ สรุปอย่างชาญฉลาด
Semaphore ในระบบปฏิบัติการ ตัวแปรจำนวนเต็มที่ไม่ติดลบนี้จะใช้ร่วมกันระหว่างเธรดต่างๆ เพื่อประสานการเข้าถึงทรัพยากรที่ใช้ร่วมกันผ่านการดำเนินการพื้นฐานสองอย่าง คือ wait และ signal ซึ่งจะช่วยป้องกันสภาวะการแข่งขัน (race condition) ในระหว่างการซิงโครไนซ์กระบวนการ
ความหมายของ Semaphore?
Semaphore เป็นเพียงตัวแปรที่ไม่เป็นลบและแชร์กันระหว่างเธรด เซมาโฟร์เป็นกลไกการส่งสัญญาณ และเธรดที่กำลังรอเซมาโฟร์สามารถส่งสัญญาณโดยเธรดอื่นได้ โดยใช้การดำเนินการอะตอมมิกสองอย่างคือ 1) รอ และ 2) Signal เพื่อการซิงโครไนซ์กระบวนการ
เซมาฟอร์อนุญาตหรือไม่อนุญาตการเข้าถึงทรัพยากร ซึ่งขึ้นอยู่กับวิธีการตั้งค่า
ลักษณะนิสัยของ Semaphore
ต่อไปนี้คือลักษณะเฉพาะของสัญญาณธง:
- เป็นกลไกที่สามารถนำไปใช้ให้เกิดการซิงโครไนซ์งานได้
- เป็นกลไกการซิงโครไนซ์ระดับต่ำ
- Semaphore จะเก็บค่าจำนวนเต็มที่ไม่เป็นลบเสมอ
- Semaphore สามารถใช้งานได้โดยใช้การดำเนินการทดสอบและการขัดจังหวะ ซึ่งควรดำเนินการโดยใช้ตัวอธิบายไฟล์
ประเภทของ Semaphores
สัญญาณธงสองประเภทที่พบได้ทั่วไป ได้แก่:
- การนับเซมาฟอร์
- สัญญาณไฟไบนารี
การนับ Semaphores
ประเภทนี้ Semaphore ใช้ตัวนับที่ช่วยให้สามารถรับหรือปล่อยงานได้หลายครั้ง หากค่าเริ่มต้นเท่ากับ 0 เซมาฟอร์นับควรถูกสร้างขึ้นในสถานะไม่พร้อมใช้งาน
อย่างไรก็ตาม หากจำนวนเป็น > 0 เซมาฟอร์จะถูกสร้างขึ้นในสถานะที่มีอยู่ และจำนวนโทเค็นที่มีจะเท่ากับจำนวน
เลขฐานสอง Semaphores
เซมาฟอร์แบบไบนารีมีความคล้ายคลึงกับเซมาฟอร์แบบนับ แต่ค่าของมันถูกจำกัดไว้ที่ 0 และ 1 ในเซมาฟอร์ประเภทนี้ การดำเนินการรอจะทำงานได้ก็ต่อเมื่อเซมาฟอร์ = 1 และการดำเนินการส่งสัญญาณจะสำเร็จเมื่อเซมาฟอร์ = 0 การใช้งานเซมาฟอร์แบบนี้ง่ายกว่าเซมาฟอร์แบบนับ
ตัวอย่างของการ Semaphore
โปรแกรมด้านล่างนี้เป็นการใช้งานและการประกาศเซมาฟอร์แบบทีละขั้นตอน
Shared var mutex: semaphore = 1;
Process i
begin
.
.
P(mutex);
execute CS;
V(mutex);
.
.
End;
รอและ Signal Operaต่างๆใน Semaphores
ทั้งสองการดำเนินการนี้ใช้เพื่อดำเนินการ การซิงโครไนซ์กระบวนการเป้าหมายของการดำเนินการเซมาโฟร์นี้คือเพื่อให้ได้มาซึ่งการแยกกันซึ่งกันและกัน
รอ Operaการ
การดำเนินการเซมาโฟร์ประเภทนี้ช่วยให้คุณควบคุมการเข้าสู่ส่วนวิกฤตของงานได้ อย่างไรก็ตาม หากค่าของการรอเป็นบวก ค่าของอาร์กิวเมนต์การรอ X ก็จะลดลง ในกรณีที่มีค่าเป็นลบหรือเป็นศูนย์ จะไม่มีการดำเนินการใดๆ เกิดขึ้น เรียกอีกอย่างว่าการดำเนินการ P(S)
หลังจากที่ค่าเซมาฟอร์ลดลงซึ่งกลายเป็นลบ คำสั่งจะถูกพักไว้จนกว่าจะตรงตามเงื่อนไขที่ต้องการ
P(S)
{
while (S<=0);
S--;
}
Signal การดำเนินการ
ประเภทนี้ Semaphore การดำเนินการนี้ใช้เพื่อควบคุมการออกจากงานจากส่วนที่สำคัญ โดยจะช่วยเพิ่มค่าของอาร์กิวเมนต์ขึ้น 1 ซึ่งแสดงเป็น V(S)
P(S)
{
while (S>=0);
S++;
}
การนับ Semaphore เทียบกับไบนารี่ Semaphore
ต่อไปนี้เป็นข้อแตกต่างที่สำคัญบางประการระหว่างการนับและสัญญาณไบนารี:
| การนับ Semaphore | เลขฐานสอง Semaphore |
| ไม่มีการยกเว้นซึ่งกันและกัน | การกีดกันซึ่งกันและกัน |
| ค่าจำนวนเต็มใดๆ | ค่าเพียง 0 และ 1 |
| มากกว่าหนึ่งช่อง | ช่องเดียวเท่านั้น |
| จัดเตรียมชุดของกระบวนการ | มันมีกลไกการกีดกันซึ่งกันและกัน |
ความแตกต่างระหว่าง Semaphore เทียบกับ Mutex
ตารางด้านล่างนี้เปรียบเทียบ เซมาฟอร์ที่มีมิวเท็กซ์ ในหลายแง่มุม:
| พารามิเตอร์ | Semaphore | มิวเท็กซ์ |
| กลไก | เป็นกลไกการส่งสัญญาณชนิดหนึ่ง | มันเป็นกลไกการล็อค |
| ประเภทข้อมูล | Semaphore เป็นตัวแปรจำนวนเต็ม | Mutex เป็นเพียงวัตถุ |
| การเปลี่ยนแปลง | การดำเนินการรอและสัญญาณสามารถปรับเปลี่ยนเซมาโฟร์ได้ | ได้รับการแก้ไขโดยกระบวนการที่อาจร้องขอหรือปล่อยทรัพยากรเท่านั้น |
| การจัดการทรัพยากร | หากไม่มีทรัพยากรใดว่าง กระบวนการจะต้องใช้ทรัพยากรที่จะดำเนินการรอ ควรจะรอจนกว่าจำนวนเซมาโฟร์จะมากกว่า 0 | หากถูกล็อค กระบวนการต้องรอ ควรเก็บกระบวนการไว้ในคิว จำเป็นต้องเข้าถึงสิ่งนี้เฉพาะเมื่อมีการปลดล็อค mutex เท่านั้น |
| ด้าย | คุณสามารถมีเธรดโปรแกรมได้หลายเธรด | คุณสามารถมีเธรดโปรแกรมได้หลายเธรดในมิวเท็กซ์แต่ไม่พร้อมกันได้ |
| กรรมสิทธิ์ | ค่าสามารถเปลี่ยนแปลงได้โดยกระบวนการใดๆ ที่ปล่อยหรือรับทรัพยากร | การล็อคอ็อบเจ็กต์จะถูกปล่อยโดยกระบวนการเท่านั้น ซึ่งได้รับการล็อคไว้แล้วเท่านั้น |
| ประเภท | ประเภทของ Semaphore กำลังนับเซมาโฟร์และไบนารีเซมาโฟร์ | Mutex ไม่มีชนิดย่อย |
| Operaการ | Semaphore ค่าจะถูกแก้ไขโดยใช้การดำเนินการ wait () และ signal () | อ็อบเจ็กต์ Mutex ถูกล็อคหรือปลดล็อค |
| การครอบครองทรัพยากร | จะถูกครอบครองถ้าทรัพยากรทั้งหมดถูกใช้ไปแล้ว และกระบวนการร้องขอทรัพยากรดำเนินการรอ () และบล็อกตัวเองจนกว่าจำนวนซีมาโฟร์จะกลายเป็น >1 | ในกรณีที่อ็อบเจ็กต์ถูกล็อคอยู่แล้ว กระบวนการที่ร้องขอทรัพยากรจะรอและเข้าคิวโดยระบบก่อนที่จะปลดล็อค |
ข้อดีของการ Semaphores
นี่คือข้อดี/ประโยชน์ของการใช้ Semaphore:
- มันอนุญาตให้เธรดมากกว่าหนึ่งเธรดเข้าถึงส่วนที่สำคัญได้
- Semaphores เป็นอิสระจากเครื่องจักร
- Semaphores ถูกนำไปใช้ในโค้ดที่ไม่ขึ้นอยู่กับเครื่องของไมโครเคอร์เนล
- พวกเขาไม่อนุญาตให้หลายกระบวนการเข้าสู่ส่วนที่สำคัญ
- เนื่องจากมีงานยุ่งในการรอสัญญาณ จึงไม่มีการสิ้นเปลืองเวลาและทรัพยากรของกระบวนการ
- พวกมันไม่ขึ้นกับเครื่องจักร ซึ่งควรรันในโค้ดที่ไม่ขึ้นกับเครื่องจักรของไมโครเคอร์เนล
- ช่วยให้สามารถจัดการทรัพยากรได้อย่างยืดหยุ่น
ข้อเสียของ Semaphores
ต่อไปนี้คือข้อเสีย/ข้อจำกัดของการใช้สัญญาณธง:
- ข้อจำกัดที่ใหญ่ที่สุดประการหนึ่งของเซมาฟอร์คือการผกผันลำดับความสำคัญ
- ระบบปฏิบัติการต้องคอยรักษาข้อมูลเหล่านั้นไว้ track ของการเรียกทั้งหมดเพื่อรอและส่งสัญญาณเซมาฟอร์
- การใช้งานของพวกเขาไม่เคยมีการบังคับใช้ แต่เป็นไปตามแบบแผนเท่านั้น
- เพื่อหลีกเลี่ยงการหยุดชะงักในเซมาโฟร์ การรอและ Signal การดำเนินการต้องดำเนินการตามลำดับที่ถูกต้อง
- Semaphore การเขียนโปรแกรมนั้นซับซ้อน ดังนั้นจึงมีโอกาสที่การบรรลุการกีดกันซึ่งกันและกันจะไม่สำเร็จ
- นอกจากนี้ยังไม่ใช่วิธีการในทางปฏิบัติสำหรับการใช้งานขนาดใหญ่เนื่องจากการใช้งานนำไปสู่การสูญเสียความเป็นโมดูล
- Semaphore มีแนวโน้มที่จะเกิดข้อผิดพลาดของโปรแกรมเมอร์มากขึ้น
- อาจทำให้ การหยุดชะงัก หรือการละเมิดการยกเว้นร่วมกันเนื่องจากข้อผิดพลาดของโปรแกรมเมอร์



