Synchronization (การประสานงาน)
จุดเด่นของบทนี้ การผลิต / ปัญหาผู้บริโภค บริการปรับปรุง หากต้องการทราบวิธีแก้ไขปัญหานี้เราต้องเรียนรู้เกี่ยวกับแนวคิดส่วน 'critical section' กระบวนการแต่ละคนมีส่วนของรหัสเรียกว่า critical section ในกระบวนการที่อาจจะเปลี่ยนตัวแปรร่วมกัน
การแก้ปัญหาส่วนวิกฤติ (The Critical-Section Problem) การเขียนแสดงรูปแบบขั้นตอนวิธีสำหรับแก้ปัญหาส่วนวิกฤติจะมีการกำหนดเฉพาะตัวแปรที่ใช้เพื่อการประสานอย่างได้จังหวะกันเท่านั้น และบอกถึงโปรเซสเฉพาะบางโปรเซส Pi ซึ่งส่วนเริ่มต้นและส่วนจบของการทำงานในส่วนวิกฤติจะล้อมอยู่ในกรอบรูปสี่เหลี่ยมเพื่อเน้นถึงความสำคัญของส่วนนี้
คำตอบสำหรับการแก้ปัญหาส่วนวิกฤติต้อวงเป็นไปตามเงื่อนไขทั้งสามข้อต่อไปนี้ การกีดกัน (Mutual exclusion) ความก้าวหน้า (Progress) การรออย่างมีขอบเขต (Bounded waiting)
ปัญหา critical-section สามารถแก้ปัญหาได้ง่ายๆในสภาพแวดล้อมของหน่วยประมวลผลกลางหนึ่ง ถ้าเราสามารถป้องกัน การขัดจังหวะที่เกิดขึ้นในขณะที่มีการแชร์ตัวแปรที่อยู่ขณะแก้ไข ในลักษณะนี้เราสามารถมั่นใจได้ว่าลำดับปัจจุบันของคำแนะนำจะได้รับอนุญาตให้ดำเนินการในลำดับโดยการจอง ไม่มีคำแนะนำอื่นๆที่จะรัน ดังนั้นไม่มีการเปลี่ยนแปลงที่คาดไม่ถึงที่ส่งผลไปถึงตัวแปรที่ใช้งานร่วมกัน นี่คือวิธีการใช้โดย nonpreemptive kernels
Synchronization (การประสานข้อมูลฮาร์ดแวร์) คุณลักษณะของฮาร์ดแวร์สามารถทำให้การเขียนโปรแกรมใดๆ โดยสามารถทำให้ง่ายขึ้นและปรับปรุงประสิทธิภาพของระบบ ในส่วนนี้เราแสดงบางคำแนะนำฮาร์ดแวร์ในปัจจุบันง่ายๆที่มีอยู่ในหลายๆระบบและแสดงวิธีการที่สามารถนำมาใช้อย่างมีประสิทธิภาพในการแก้ปัญหา critical-section
รูปที่ 1 The definition of the TestAnSet () instruction วิธีการปัญหานี้ไม่เหมาะสมในสิ่งแวดล้อมของหลายๆหน่วยประมวลผลกลาง การหยุดการขัดจังหวะในหลายๆหน่วยประมวลผลกลางอาจต้องใช้เวลามาก ดังเช่น boolean TestAndSet (Boolean *target) { boolean rv = *target ; *target = TRUE ; Return rv ; } รูปที่ 1 The definition of the TestAnSet () instruction
รูปที่ 2 Mutual-exclusion implementation with TestAndSet () do { while (TestAndSetLock (&lock)) ; // do nothing // critical section Lock = FALSE ; // remainder section } while (TRUE) ; รูปที่ 2 Mutual-exclusion implementation with TestAndSet () ข้อความที่ผ่านไปยังโปรเซสเซอร์ทั้งหมด การผ่านข้อความนี้เกิดล่าช้าเมื่อเข้าไปสู่แต่ละ critical-section และประสิทธิภาพของระบบลดลง นอกจากนี้ควรพิจารณาผลในระบบ clock หาก clock ที่เก็บไว้มีการอัปเดทแล้วโดยการขัดจังหวะ(interrupt)
คำสั่ง TestAndSet () สามารถกำหนดไว้ตามที่แสดงในรูปที่ 1 ลักษณะที่สำคัญคือจะรันคำสั่งนี้ atomically ดังนั้นหากคำสั่ง TestAndSet () สองคำสั่งที่รันในขณะเดียวกัน (แต่ทำบน CPU ที่แตกต่างกัน) คำสั่งนี้จะถูก รันตามลำดับในบางลำดับแบบสุ่ม หากเครื่องสนับสนุนคำสั่ง TestAndSet () แล้วเราสามารถทำการเอาออกร่วมกันโดยมีการแจ้งการล็อคตัวแปร Boolean ในการเริ่มต้นจะเป็นเท็จ โครงสร้างของกระบวนการ Pi จะแสดงในรูปที่ 2
คำสั่ง Swap() จะตรงกันข้ามกับคำสั่ง TestAndSet () คำสั่ง Swap() จะทำงานในเนื้อหาของคำสองคำ กำหนดไว้ตามที่แสดงในรูปที่ 3 เช่นเดียวกับคำสั่ง TestAndSet () จะรัน atomically หากเครื่องสนับสนุนคำสั่ง Swap() แล้วการเอาออกทั้งสองฝ่ายโดยมีเงื่อนไขดังนี้ การล็อคตัวแปร global Boolean จะถูกประกาศและทำให้เป็นเท็จในเริ่มต้น นอกจากนี้แต่ละกระบวนการมีคีย์ของตัวแปร local Boolean โครงสร้างของกระบวนการ Pi จะปรากฏในรูปที่ 4
Void Swap (boolean *a, boolean *b) { boolean temp = *a; *a = *b; *b = temp; } รูปที่ 3 The definition of the Swap () instruction do { key = TRUE ; while (key = = TRUE ) Swap (&lock, &key) , // critical section Lock = FALSE; // remainder section } while (TRUE) ; รูปที่ 4 Mutual-exclusion implementation with the Swap () instruction
จัดทำโดย นางสาววีราภรณ์ หามนตรี รหัส 50036436 กลุ่ม 1