Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

การซิงโครไนซ์กระบวนการใน C/C++


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

ปัญหาส่วนวิกฤต

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

ด้านล่างนี้คือโครงสร้างของส่วนที่สำคัญของกระบวนการ P1 โดยเฉพาะ

การซิงโครไนซ์กระบวนการใน C/C++

มีข้อกำหนดสามประการที่ต้องปฏิบัติตามสำหรับส่วนที่สำคัญ

  • การยกเว้นร่วมกัน − หากกระบวนการใดกระบวนการหนึ่ง สมมติว่า P1 กำลังดำเนินการในส่วนที่สำคัญของมัน มากกว่ากระบวนการอื่น สมมติว่า P2 ไม่สามารถดำเนินการในส่วนที่สำคัญได้
  • ความคืบหน้า − หากไม่มีกระบวนการดำเนินการในส่วนที่สำคัญและมีกระบวนการที่ต้องการเข้าสู่ส่วนที่สำคัญ เฉพาะกระบวนการที่ไม่ได้ดำเนินการในส่วนที่เหลือเท่านั้นที่สามารถขอเข้าสู่ส่วนที่สำคัญและการเลือกสามารถเลื่อนออกไปได้ไม่มีกำหนด .
  • จำกัดการรอคอย − ในการรอที่มีขอบเขต มีขีดจำกัดหรือขอบเขตเกี่ยวกับจำนวนครั้งที่กระบวนการสามารถเข้าสู่ส่วนที่สำคัญได้หลังจากที่กระบวนการได้ส่งคำขอเพื่อเข้าสู่ส่วนที่สำคัญและก่อนที่จะได้รับคำขอนั้น

มีสองวิธีที่มักใช้ในระบบปฏิบัติการเพื่อจัดการกับส่วนที่สำคัญ

เคอร์เนลชั่วคราว − เคอร์เนลที่ยึดเอาไว้ชั่วคราวช่วยให้กระบวนการถูกจองไว้ก่อนในขณะที่ทำงานในโหมดเคอร์เนล

เคอร์เนลที่ไม่ยึดเอาเสียก่อน − เคอร์เนลแบบ non-preemptive ไม่อนุญาตให้กระบวนการที่ทำงานในโหมดเคอร์เนลถูกจองไว้

วิธีแก้ปัญหาของปีเตอร์สัน

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

  • พลิกกลับ;
  • ธงบูลีน[2];

ในที่นี้ การเลี้ยวแบบแปรผันจะระบุว่าเลี้ยวของใครที่จะเข้าสู่ส่วนวิกฤต และอาร์เรย์ธงระบุว่ากระบวนการพร้อมที่จะเข้าสู่ส่วนที่สำคัญหรือไม่

หากเทิร์น ==i แสดงว่าอนุญาตให้กระบวนการ Pi เข้าสู่ส่วนที่สำคัญได้

หาก flag[j] เป็น TRUE แสดงว่ากระบวนการ j พร้อมที่จะเข้าสู่ส่วนที่สำคัญ

ด้านล่างนี้คือโครงสร้างของกระบวนการ P ในโซลูชันของ Peterson

การซิงโครไนซ์กระบวนการใน C/C++

โซลูชันของ Peterson รักษาเงื่อนไขทั้งสามไว้ -

  • การยกเว้นร่วมกัน − ทีละกระบวนการสามารถเข้าถึงส่วนที่สำคัญได้
  • ความคืบหน้า − กระบวนการที่อยู่นอกส่วนที่สำคัญไม่ได้ปิดกั้นกระบวนการอื่น ๆ จากการเข้าสู่ส่วนที่สำคัญ
  • จำกัดการรอคอย − ทุกกระบวนการจะได้รับโอกาสในการเข้าสู่ส่วนที่สำคัญโดยไม่ต้องรออย่างไม่มีกำหนด

ฮาร์ดแวร์ซิงโครไนซ์

มันถูกใช้งานโดยใช้คำสั่งสองประเภท -

  • ทดสอบและตั้งค่า ()
  • สลับ()

ทดสอบและตั้งค่า () เป็นโซลูชันฮาร์ดแวร์เพื่อแก้ปัญหาการซิงโครไนซ์ ในนี้มีตัวแปรที่ใช้ร่วมกันซึ่งถูกแชร์โดยหลายกระบวนการที่เรียกว่า Lock ซึ่งสามารถมีค่าได้หนึ่งค่าตั้งแต่ 0 และ 1 โดยที่ 1 หมายถึงการได้รับ Lock และ 0 หมายถึงการปลดล็อก

เมื่อใดก็ตามที่กระบวนการพยายามที่จะเข้าสู่ส่วนที่สำคัญของพวกเขา พวกเขาจำเป็นต้องสอบถามเกี่ยวกับคุณค่าของการล็อค หากค่าของล็อคคือ 1 ก็ต้องรอจนกว่าค่าของล็อคจะไม่เปลี่ยนเป็น 0

ด้านล่างนี้คือการใช้งานการยกเว้นร่วมกันกับ TestAndSet()

การซิงโครไนซ์กระบวนการใน C/C++

สัญญาณ

Semaphore เป็นเครื่องมือซิงโครไนซ์ที่ใช้ในการเอาชนะปัญหาที่สร้างโดยคำสั่ง TestAndSet() และ Swap() สัญญาณ S เป็นตัวแปรจำนวนเต็มที่สามารถเข้าถึงได้ผ่านการดำเนินการปรมาณูมาตรฐานสองอย่างคือ wait() และ signal()

ฟังก์ชั่นรอ():

wait(S) {
   While S <= 0
   ; // no operation
   S--;
}

ฟังก์ชันสำหรับสัญญาณ ():

signal(S) {
   S++;
}

เมื่อกระบวนการหนึ่งกำลังแก้ไขค่าของสัญญาณ จะไม่มีกระบวนการอื่นใดที่สามารถจัดการค่าสัญญาณเดียวกันได้พร้อมกัน

ด้านล่างนี้คือการใช้งานการยกเว้นร่วมกันกับสัญญาณ

การซิงโครไนซ์กระบวนการใน C/C++

ระบบปฏิบัติการใช้ semsphores สองประเภทคือ −

การนับสัญญาณ − ค่าของสัญญาณประเภทนี้สามารถอยู่เหนือโดเมนที่ไม่จำกัด

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