ความหมายของ Semaphore- การนับประเภทไบนารีพร้อมตัวอย่าง
ความหมายของ 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)
หลังจากที่ค่าเซมาฟอร์ลดลงซึ่งกลายเป็นลบ คำสั่งจะถูกพักไว้จนกว่าจะตรงตามเงื่อนไขที่ต้องการ
Copy CodeP(S) { while (S<=0); S--; }
Signal การดำเนินการ
ประเภทนี้ Semaphore การดำเนินการนี้ใช้เพื่อควบคุมการออกจากงานจากส่วนที่สำคัญ โดยจะช่วยเพิ่มค่าของอาร์กิวเมนต์ขึ้น 1 ซึ่งแสดงเป็น V(S)
Copy CodeP(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 ถูกนำไปใช้ในโค้ดที่ไม่ขึ้นอยู่กับเครื่องของไมโครเคอร์เนล
- พวกเขาไม่อนุญาตให้หลายกระบวนการเข้าสู่ส่วนที่สำคัญ
- เนื่องจากมีงานยุ่งในการรอสัญญาณ จึงไม่มีการสิ้นเปลืองเวลาและทรัพยากรของกระบวนการ
- พวกมันไม่ขึ้นกับเครื่องจักร ซึ่งควรรันในโค้ดที่ไม่ขึ้นกับเครื่องจักรของไมโครเคอร์เนล
- ช่วยให้สามารถจัดการทรัพยากรได้อย่างยืดหยุ่น
ข้อเสียของเซมาฟอร์
นี่คือข้อเสีย/ข้อเสียของเซมาฟอร์
- ข้อจำกัดที่ใหญ่ที่สุดประการหนึ่งของเซมาฟอร์คือการผกผันลำดับความสำคัญ
- ระบบปฏิบัติการจะต้องติดตามการโทรทั้งหมดเพื่อรอและส่งสัญญาณเซมาโฟร์
- การใช้งานของพวกเขาไม่เคยมีการบังคับใช้ แต่เป็นไปตามแบบแผนเท่านั้น
- เพื่อหลีกเลี่ยงการหยุดชะงักในเซมาโฟร์ การรอและ Signal การดำเนินการต้องดำเนินการตามลำดับที่ถูกต้อง
- Semaphore การเขียนโปรแกรมมีความซับซ้อน ดังนั้นจึงมีโอกาสที่จะไม่บรรลุการกีดกันซึ่งกันและกัน
- นอกจากนี้ยังไม่ใช่วิธีการในทางปฏิบัติสำหรับการใช้งานขนาดใหญ่เนื่องจากการใช้งานนำไปสู่การสูญเสียความเป็นโมดูล
- Semaphore มีแนวโน้มที่จะเกิดข้อผิดพลาดของโปรแกรมเมอร์มากขึ้น
- อาจทำให้ การหยุดชะงัก หรือการละเมิดการยกเว้นร่วมกันเนื่องจากข้อผิดพลาดของโปรแกรมเมอร์
สรุป
- Semaphore ถูกกำหนดให้เป็นตัวแปรที่ไม่ติดลบและใช้ร่วมกันระหว่างเธรด
- เป็นกลไกที่สามารถนำไปใช้ให้เกิดการซิงโครไนซ์งานได้
- การนับเซมาฟอร์ใช้การนับที่ช่วยให้งานได้รับหรือปล่อยหลายครั้ง
- เซมาฟอร์ไบนารีค่อนข้างคล้ายกับการนับเซมาฟอร์ แต่ค่าของพวกมันถูกจำกัดไว้ที่ 0 และ 1
- การดำเนินการรอช่วยให้คุณควบคุมการป้อนงานลงในส่วนที่สำคัญได้
- Signal การดำเนินการเซมาโฟร์ใช้เพื่อควบคุมการออกจากงานจากส่วนที่สำคัญ
- การนับ Semaphore ไม่มีการกีดกันซึ่งกันและกันในขณะที่ไบนารี Semaphore มีการกีดกันซึ่งกันและกัน
- Semaphore หมายถึงกลไกการส่งสัญญาณ ในขณะที่มิวเท็กซ์เป็นกลไกการล็อค
- Semaphore อนุญาตให้มีมากกว่าหนึ่งเธรดในการเข้าถึงส่วนที่สำคัญ
- ข้อจำกัดที่ใหญ่ที่สุดประการหนึ่งของเซมาฟอร์คือการผกผันลำดับความสำคัญ