การซิงโครไนซ์กระบวนการเป็นเทคนิคในการเอาชนะปัญหาการเข้าถึงข้อมูลที่ใช้ร่วมกันพร้อมกัน ซึ่งอาจส่งผลให้ข้อมูลไม่สอดคล้องกัน กระบวนการร่วมมือเป็นกระบวนการที่อาจส่งผลกระทบหรือได้รับผลกระทบจากกระบวนการอื่นซึ่งจะนำไปสู่ความไม่สอดคล้องกันในกระบวนการข้อมูล ดังนั้นการซิงโครไนซ์กระบวนการจึงจำเป็นสำหรับความสอดคล้องของข้อมูล
ปัญหาส่วนวิกฤต
ทุกกระบวนการมีส่วนของรหัสที่สงวนไว้ซึ่งเรียกว่า ส่วนที่สำคัญ . ในส่วนนี้ กระบวนการสามารถเปลี่ยนตัวแปรทั่วไป อัปเดตตาราง เขียนไฟล์ ฯลฯ จุดสำคัญที่ควรทราบเกี่ยวกับส่วนที่สำคัญคือเมื่อกระบวนการหนึ่งดำเนินการในส่วนที่สำคัญ ไม่มีกระบวนการอื่นใดที่สามารถดำเนินการในส่วนที่สำคัญได้ แต่ละกระบวนการต้องขออนุญาตก่อนที่จะเข้าสู่ส่วนที่สำคัญและส่วนของรหัสที่ใช้คำขอนี้คือ ส่วนการเข้า ส่วนท้ายของรหัสคือ ส่วนทางออก และโค้ดที่เหลือคือส่วนที่เหลือ
ด้านล่างนี้คือโครงสร้างของส่วนที่สำคัญของกระบวนการ P1 โดยเฉพาะ
มีข้อกำหนดสามประการที่ต้องปฏิบัติตามสำหรับส่วนที่สำคัญ
- การยกเว้นร่วมกัน − หากกระบวนการใดกระบวนการหนึ่ง สมมติว่า P1 กำลังดำเนินการในส่วนที่สำคัญของมัน มากกว่ากระบวนการอื่น สมมติว่า P2 ไม่สามารถดำเนินการในส่วนที่สำคัญได้
- ความคืบหน้า − หากไม่มีกระบวนการดำเนินการในส่วนที่สำคัญและมีกระบวนการที่ต้องการเข้าสู่ส่วนที่สำคัญ เฉพาะกระบวนการที่ไม่ได้ดำเนินการในส่วนที่เหลือเท่านั้นที่สามารถขอเข้าสู่ส่วนที่สำคัญและการเลือกสามารถเลื่อนออกไปได้ไม่มีกำหนด .
- จำกัดการรอคอย − ในการรอที่มีขอบเขต มีขีดจำกัดหรือขอบเขตเกี่ยวกับจำนวนครั้งที่กระบวนการสามารถเข้าสู่ส่วนที่สำคัญได้หลังจากที่กระบวนการได้ส่งคำขอเพื่อเข้าสู่ส่วนที่สำคัญและก่อนที่จะได้รับคำขอนั้น
มีสองวิธีที่มักใช้ในระบบปฏิบัติการเพื่อจัดการกับส่วนที่สำคัญ
เคอร์เนลชั่วคราว − เคอร์เนลที่ยึดเอาไว้ชั่วคราวช่วยให้กระบวนการถูกจองไว้ก่อนในขณะที่ทำงานในโหมดเคอร์เนล
เคอร์เนลที่ไม่ยึดเอาเสียก่อน − เคอร์เนลแบบ non-preemptive ไม่อนุญาตให้กระบวนการที่ทำงานในโหมดเคอร์เนลถูกจองไว้
วิธีแก้ปัญหาของปีเตอร์สัน
โซลูชันของ Peterson เป็นโซลูชันซอฟต์แวร์แบบคลาสสิกสำหรับปัญหาส่วนสำคัญ จำกัดไว้เพียงสองกระบวนการที่สลับการดำเนินการระหว่างส่วนที่สำคัญและส่วนที่เหลือ ส่วนของ Peterson ต้องการการแบ่งปันข้อมูลสองรายการระหว่างสองกระบวนการ เช่น
- พลิกกลับ;
- ธงบูลีน[2];
ในที่นี้ การเลี้ยวแบบแปรผันจะระบุว่าเลี้ยวของใครที่จะเข้าสู่ส่วนวิกฤต และอาร์เรย์ธงระบุว่ากระบวนการพร้อมที่จะเข้าสู่ส่วนที่สำคัญหรือไม่
หากเทิร์น ==i แสดงว่าอนุญาตให้กระบวนการ Pi เข้าสู่ส่วนที่สำคัญได้
หาก flag[j] เป็น TRUE แสดงว่ากระบวนการ j พร้อมที่จะเข้าสู่ส่วนที่สำคัญ
ด้านล่างนี้คือโครงสร้างของกระบวนการ P ในโซลูชันของ Peterson
โซลูชันของ Peterson รักษาเงื่อนไขทั้งสามไว้ -
- การยกเว้นร่วมกัน − ทีละกระบวนการสามารถเข้าถึงส่วนที่สำคัญได้
- ความคืบหน้า − กระบวนการที่อยู่นอกส่วนที่สำคัญไม่ได้ปิดกั้นกระบวนการอื่น ๆ จากการเข้าสู่ส่วนที่สำคัญ
- จำกัดการรอคอย − ทุกกระบวนการจะได้รับโอกาสในการเข้าสู่ส่วนที่สำคัญโดยไม่ต้องรออย่างไม่มีกำหนด
ฮาร์ดแวร์ซิงโครไนซ์
มันถูกใช้งานโดยใช้คำสั่งสองประเภท -
- ทดสอบและตั้งค่า ()
- สลับ()
ทดสอบและตั้งค่า () เป็นโซลูชันฮาร์ดแวร์เพื่อแก้ปัญหาการซิงโครไนซ์ ในนี้มีตัวแปรที่ใช้ร่วมกันซึ่งถูกแชร์โดยหลายกระบวนการที่เรียกว่า Lock ซึ่งสามารถมีค่าได้หนึ่งค่าตั้งแต่ 0 และ 1 โดยที่ 1 หมายถึงการได้รับ Lock และ 0 หมายถึงการปลดล็อก
เมื่อใดก็ตามที่กระบวนการพยายามที่จะเข้าสู่ส่วนที่สำคัญของพวกเขา พวกเขาจำเป็นต้องสอบถามเกี่ยวกับคุณค่าของการล็อค หากค่าของล็อคคือ 1 ก็ต้องรอจนกว่าค่าของล็อคจะไม่เปลี่ยนเป็น 0
ด้านล่างนี้คือการใช้งานการยกเว้นร่วมกันกับ TestAndSet()
สัญญาณ
Semaphore เป็นเครื่องมือซิงโครไนซ์ที่ใช้ในการเอาชนะปัญหาที่สร้างโดยคำสั่ง TestAndSet() และ Swap() สัญญาณ S เป็นตัวแปรจำนวนเต็มที่สามารถเข้าถึงได้ผ่านการดำเนินการปรมาณูมาตรฐานสองอย่างคือ wait() และ signal()
ฟังก์ชั่นรอ():
wait(S) { While S <= 0 ; // no operation S--; }
ฟังก์ชันสำหรับสัญญาณ ():
signal(S) { S++; }
เมื่อกระบวนการหนึ่งกำลังแก้ไขค่าของสัญญาณ จะไม่มีกระบวนการอื่นใดที่สามารถจัดการค่าสัญญาณเดียวกันได้พร้อมกัน
ด้านล่างนี้คือการใช้งานการยกเว้นร่วมกันกับสัญญาณ
ระบบปฏิบัติการใช้ semsphores สองประเภทคือ −
การนับสัญญาณ − ค่าของสัญญาณประเภทนี้สามารถอยู่เหนือโดเมนที่ไม่จำกัด
สัญญาณไบนารี − ค่าของเซมาฟอร์ประเภทนี้สามารถเกินระหว่าง 0 ถึง 1 พวกมันยังเป็นที่รู้จักในชื่อ Mutex Locks ระบบปฏิบัติการใช้ประโยชน์จากสิ่งนี้เพื่อแก้ไขปัญหาในส่วนที่สำคัญในหลายกระบวนการ