ความหมายของ Semaphore- การนับประเภทไบนารีพร้อมตัวอย่าง

⚡ สรุปอย่างชาญฉลาด

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

  • 🔢 ความหมาย: เซมาฟอร์คือตัวแปรจำนวนเต็มที่ไม่ติดลบ ซึ่งใช้ส่งสัญญาณว่าทรัพยากรที่ใช้ร่วมกันนั้นพร้อมใช้งานสำหรับเธรดที่แข่งขันกันหรือไม่
  • ⚙️ สอง Operaชั่น: การดำเนินการรอ (P) จะร้องขอทรัพยากรและลดจำนวนลง ในขณะที่การดำเนินการส่งสัญญาณ (V) จะปล่อยทรัพยากรและเพิ่มจำนวนขึ้น
  • 🔁 ประเภทการนับ: เซมาฟอร์แบบนับจำนวนช่วยให้เธรดจำนวนหนึ่งสามารถใช้ทรัพยากรที่เหมือนกันได้พร้อมกัน
  • 🔒 ประเภทไบนารี: เซมาฟอร์แบบไบนารีมีค่าจำกัดแค่ 0 และ 1 ดังนั้นจึงทำงานเหมือนตัวล็อกแบบง่ายๆ สำหรับการกีดกันซึ่งกันและกัน
  • ⚠️ การแลกเปลี่ยน: Semaphoreกลไกเหล่านี้เป็นอิสระจากเครื่องจักรและมีความยืดหยุ่น แต่ก็มีความเสี่ยงที่จะเกิดการสลับลำดับความสำคัญและภาวะชะงักงันหากใช้งานไม่ถูกต้อง
  • 🤖 AI ช่วยเหลือ: การเรียนรู้ของเครื่องและผู้ช่วยการเขียนโค้ด AI สามารถจำลองการทำงานพร้อมกันและสร้างลำดับการรอและการส่งสัญญาณที่ถูกต้องได้

Semaphore in Operaระบบ ting

ความหมายของ Semaphore?

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

เซมาฟอร์อนุญาตหรือไม่อนุญาตการเข้าถึงทรัพยากร ซึ่งขึ้นอยู่กับวิธีการตั้งค่า

ลักษณะนิสัยของ Semaphore

ต่อไปนี้คือลักษณะเฉพาะของสัญญาณธง:

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

ประเภทของ Semaphores

สัญญาณธงสองประเภทที่พบได้ทั่วไป ได้แก่:

  • การนับเซมาฟอร์
  • สัญญาณไฟไบนารี

การนับ Semaphores

ประเภทนี้ Semaphore ใช้ตัวนับที่ช่วยให้สามารถรับหรือปล่อยงานได้หลายครั้ง หากค่าเริ่มต้นเท่ากับ 0 เซมาฟอร์นับควรถูกสร้างขึ้นในสถานะไม่พร้อมใช้งาน

การนับ Semaphores

อย่างไรก็ตาม หากจำนวนเป็น > 0 เซมาฟอร์จะถูกสร้างขึ้นในสถานะที่มีอยู่ และจำนวนโทเค็นที่มีจะเท่ากับจำนวน

เลขฐานสอง Semaphores

เซมาฟอร์แบบไบนารีมีความคล้ายคลึงกับเซมาฟอร์แบบนับ แต่ค่าของมันถูกจำกัดไว้ที่ 0 และ 1 ในเซมาฟอร์ประเภทนี้ การดำเนินการรอจะทำงานได้ก็ต่อเมื่อเซมาฟอร์ = 1 และการดำเนินการส่งสัญญาณจะสำเร็จเมื่อเซมาฟอร์ = 0 การใช้งานเซมาฟอร์แบบนี้ง่ายกว่าเซมาฟอร์แบบนับ

เลขฐานสอง Semaphores

ตัวอย่างของการ 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 มีแนวโน้มที่จะเกิดข้อผิดพลาดของโปรแกรมเมอร์มากขึ้น
  • อาจทำให้ การหยุดชะงัก หรือการละเมิดการยกเว้นร่วมกันเนื่องจากข้อผิดพลาดของโปรแกรมเมอร์

คำถามที่พบบ่อย

เอ็ดสเกอร์ ไดจ์กสตรา เป็นผู้ริเริ่มใช้เซมาฟอร์ในปี 1965 การทำงานของการรอและการส่งสัญญาณเรียกอีกอย่างว่า P และ V ซึ่งมาจากคำภาษาดัตช์ว่า proberen (ทดสอบ) และ verhogen (เพิ่มขึ้น)

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

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

มิวเท็กซ์มีเจ้าของ ดังนั้นเฉพาะเธรดที่ล็อกอยู่เท่านั้นที่จะปลดล็อกได้ ในขณะที่เซมาฟอร์แบบไบนารีไม่มีเจ้าของ ดังนั้นเธรดใดก็ได้สามารถส่งสัญญาณไปยังเซมาฟอร์ได้ ทั้งสองอย่างไม่เหมือนกัน

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

แพลตฟอร์มสมัยใหม่ส่วนใหญ่มีเซมาฟอร์ให้ใช้งาน: POSIX sem_t ในภาษา C, Semaphore ชั้นเรียนใน JavaและการเธรดSemaphore in Pythonนักพัฒนาซอฟต์แวร์ไม่ค่อยสร้างมันขึ้นมาเองตั้งแต่เริ่มต้น

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

ใช่แล้ว ผู้ช่วย AI อย่างเช่น GitHub Copilot สามารถสร้างข้อความตัวอย่างสำหรับการรอและการส่งสัญญาณ แนะนำลำดับการล็อก และอธิบายสภาวะการแข่งขัน (race condition) ได้ Revตรวจสอบผลลัพธ์อย่างละเอียด เนื่องจากภาวะติดตายที่ซับซ้อนอาจซ่อนอยู่ได้ง่าย

สรุปโพสต์นี้ด้วย: