Livelock: อะไรคือความแตกต่างกับ Deadlock

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

Livelock คือสถานการณ์การทำงานพร้อมกันที่กระบวนการต่างๆ เปลี่ยนสถานะของตนเองอย่างต่อเนื่องเพื่อตอบสนองต่อกันและกัน แต่ไม่มีความคืบหน้าใดๆ เกิดขึ้นจริง ยังคงทำงานอยู่และใช้ทรัพยากร CPU โดยไม่สามารถทำงานให้เสร็จสิ้นหรือหยุดทำงานได้เลย

  • 🔁 ความหมาย: Livelock เกิดขึ้นเมื่อกระบวนการต่างๆ เปลี่ยนสถานะอยู่ตลอดเวลาเพื่อปรับตัวเข้าหากัน แต่ไม่สามารถดำเนินการต่อไปได้ ซึ่งแตกต่างจากกระบวนการที่หยุดนิ่งใน Deadlock
  • 🚶 ตัวอย่าง: คนสองคนก้าวping การเคลื่อนที่ไปมาในทางเดินเพื่อให้กันและกันผ่าน แสดงให้เห็นถึงภาวะชะงักงัน คือการเคลื่อนที่อย่างต่อเนื่องแต่ไม่เคยตัดกัน
  • 🧮 สาเหตุ: การตรวจสอบและพยายามขอสิทธิ์ล็อกซ้ำๆ โดยมีข้อจำกัดเรื่องจำนวนช่องในตารางกระบวนการ ทำให้กระบวนการต่างๆ เข้าสู่ภาวะหยุดชะงักโดยที่ไม่มีกระบวนการใดหยุดทำงาน
  • 🇧🇷 การเปรียบเทียบ: ภาวะติดตาย (Deadlock) ทำให้กระบวนการหยุดชะงัก ภาวะอดอยาก (Starvation) ทำให้ขาดทรัพยากรอย่างไม่มีกำหนด และภาวะติดขัด (Livelock) ทำให้กระบวนการทำงานอยู่ตลอดเวลาโดยไม่มีความคืบหน้า
  • 🛡️ การป้องกัน: การหน่วงเวลาแบบสุ่ม การจำกัดจำนวนครั้งในการลองใหม่ และการจัดลำดับความสำคัญ จะช่วยแก้ไขปัญหาการลองใหม่แบบสมมาตรที่ก่อให้เกิดภาวะติดขัด
  • 🤖 มุมมองด้าน AI: แมชชีนเลิร์นนิงจะตรวจจับรูปแบบการทำงานของ CPU ที่ไม่มีความคืบหน้า และ Copilot จะช่วยเขียนโค้ดสำหรับการหน่วงเวลาและการจัดลำดับการล็อกเพื่อหลีกเลี่ยงภาวะหยุดชะงัก (livelock)

การติดอยู่ในภาวะชะงักงัน Operaระบบ ting

ไลฟ์ล็อคคืออะไร?

A Livelock เป็นสถานการณ์ที่คำขอการล็อกแบบพิเศษถูกปฏิเสธซ้ำ ๆ เนื่องจากมีการทับซ้อนกันจำนวนมากping ล็อกที่ใช้ร่วมกันมักรบกวนซึ่งกันและกัน กระบวนการต่างๆ เปลี่ยนแปลงสถานะอยู่ตลอด ทำให้ไม่สามารถทำงานให้เสร็จสมบูรณ์ได้

ตัวอย่างของ Livelock

1 ตัวอย่าง:

ตัวอย่างที่ง่ายที่สุดของภาวะติดขัด (Livelock) คือคนสองคนที่พบกันในทางเดิน และต่างคนต่างหลบทางให้กันเดินผ่าน พวกเขาจึงขยับไปมาโดยไม่คืบหน้าไปไหน เพราะต่างก็ขยับไปในทิศทางเดียวกันและในเวลาเดียวกัน ในกรณีนี้ พวกเขาจึงไม่เคยเดินสวนกันเลย

2 ตัวอย่าง:

ตัวอย่างของระบบล็อกประตูใน Operaระบบ ting

ในภาพด้านบน กระบวนการทั้งสองต้องการทรัพยากรสองอย่าง และใช้การตรวจสอบสถานะเบื้องต้น (polling) เพื่อพยายามขอรับล็อกที่ต้องการ หากความพยายามครั้งแรกไม่สำเร็จ วิธีการนี้จะลองอีกครั้ง

  1. กระบวนการ A ถือครองทรัพยากร Y
  2. กระบวนการ B ถือทรัพยากร X
  3. กระบวนการ A ต้องการทรัพยากร X
  4. กระบวนการ B ต้องการทรัพยากร Y

สมมติว่ากระบวนการ A ทำงานก่อนและได้รับทรัพยากร X จากนั้นกระบวนการ B ทำงานและได้รับทรัพยากร Y ไม่ว่ากระบวนการใดจะทำงานก่อน กระบวนการทั้งสองก็จะไม่สามารถดำเนินการต่อไปได้

อย่างไรก็ตาม กระบวนการทั้งสองไม่ได้ถูกบล็อก พวกมันใช้ทรัพยากร CPU ซ้ำ ๆ โดยไม่คืบหน้าใด ๆ แต่ก็ไม่เคยหยุดเพื่อรอการประมวลผลบล็อกเลย

ดังนั้น สถานการณ์นี้จึงไม่ใช่ การหยุดชะงักเนื่องจากไม่มีกระบวนการใดถูกบล็อกเลย แต่เรากลับเผชิญกับสถานการณ์ที่เทียบเท่ากับภาวะชะงักงัน ซึ่งเรียกว่าภาวะชะงักงันแบบมีชีวิต (LIVELOCK)

อะไรนำไปสู่ ​​Livelock?

ภาวะติดขัด (Livelock) เกี่ยวข้องกับจำนวนกระบวนการที่ระบบอนุญาต ซึ่งกำหนดโดยจำนวนรายการทั้งหมดในตารางกระบวนการ ดังนั้น ช่องในตารางกระบวนการเหล่านี้จึงถือเป็นทรัพยากรที่มีจำกัด เมื่อกระบวนการต่างๆ พยายามเข้าถึงทรัพยากรที่จำกัดเหล่านี้ซ้ำแล้วซ้ำเล่า ในขณะที่ต่างฝ่ายต่างยอมให้กันและกันอยู่ตลอดเวลา ก็จะไม่มีกระบวนการใดคืบหน้า และระบบก็จะเข้าสู่ภาวะติดขัด

Deadlock คืออะไร?

A การหยุดชะงัก เดดล็อก (Deadlock) คือสถานการณ์ที่เกิดขึ้นในระบบปฏิบัติการ เมื่อกระบวนการหนึ่งเข้าสู่สถานะรอคอย เนื่องจากกระบวนการรอคอยอื่นกำลังครอบครองทรัพยากรที่ต้องการอยู่ เดดล็อกเป็นปัญหาที่พบได้บ่อยในระบบมัลติโปรเซสซิ่ง ซึ่งหลายกระบวนการใช้ทรัพยากรเฉพาะประเภทหนึ่งร่วมกัน ซึ่งเรียกว่าซอฟต์ล็อกหรือซอฟต์แวร์ล็อก (Softlock หรือ Software Lock)

ตัวอย่างของ Deadlock

  • ตัวอย่างในโลกแห่งความเป็นจริงก็คือ การจราจรที่วิ่งไปในทิศทางเดียวเท่านั้น
  • ที่นี่สะพานถือเป็นทรัพยากร
  • เมื่อเกิดภาวะชะงักงัน สามารถแก้ไขได้ง่ายโดยการถอยรถคันใดคันหนึ่ง (แย่งชิงทรัพยากรและถอยกลับ)
  • รถหลายคันอาจต้องจอดสำรองหากเกิดสถานการณ์ทางตัน
  • ดังนั้น ความอดอยากจึงเป็นไปได้

ตัวอย่างของภาวะติดตายใน Operaระบบ ting

ตัวอย่างของ Deadlock

ความอดอยากคืออะไร?

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

ในบางอัลกอริทึม กระบวนการบางอย่างอาจไม่ได้รับการบริการที่ต้องการ แม้ว่าจะไม่ได้อยู่ในภาวะหยุดชะงักก็ตาม ภาวะอดอยากเกิดขึ้นเมื่อเธรดบางส่วนทำให้ทรัพยากรที่ใช้ร่วมกันไม่สามารถใช้งานได้เป็นเวลานาน

ตัวอย่างความอดอยาก

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

ความแตกต่างระหว่าง Deadlock, Starvation และ Livelock

  • ภาวะติดตาย (Deadlock) คือสถานการณ์ที่เกิดขึ้นในระบบปฏิบัติการ เมื่อกระบวนการหนึ่งเข้าสู่สถานะรอคอย เนื่องจากทรัพยากรที่ต้องการนั้นถูกกระบวนการอื่นที่รอคอยอยู่ครอบครองอยู่
  • ในทางกลับกัน ภาวะติดขัดแบบมีชีวิต (livelock) เกือบจะคล้ายกับภาวะติดตาย (deadlock) เพียงแต่สถานะของกระบวนการที่เกี่ยวข้องในภาวะติดขัดแบบมีชีวิตจะเปลี่ยนแปลงอยู่ตลอดเวลาเพื่อตอบสนองต่อกันและกัน โดยไม่มีกระบวนการใดคืบหน้าไปได้
  • ดังนั้น ภาวะชะงักงันจึงเป็นกรณีพิเศษของการขาดแคลนทรัพยากร

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

ปัญหาการติดขัด (Livelock) จะลดลงได้ด้วยการเพิ่มความสุ่มหรือลำดับในการลองใหม่ เทคนิคต่างๆ ได้แก่ การหน่วงเวลาแบบสุ่มหรือแบบเลขชี้กำลังก่อนลองใหม่ และการจำกัดจำนวนครั้งping จำนวนครั้งที่พยายามใหม่ และการบังคับใช้ลำดับการได้มาซึ่งล็อกที่ตายตัว เพื่อป้องกันไม่ให้กระบวนการต่างๆ เลียนแบบการเคลื่อนไหวของกันและกัน

ไม่ กระบวนการที่ติดอยู่ในภาวะ Livelock จะไม่ถูกบล็อก — มันจะยังคงทำงานต่อไปและใช้ทรัพยากร CPU ผ่านการลองใหม่อย่างต่อเนื่องโดยไม่คืบหน้าใดๆ ในกรณีของภาวะ Deadlock กระบวนการที่เกี่ยวข้องจะหยุดและรอ ดังนั้นจึงไม่ได้ใช้ CPU

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

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

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

โมเดลการเรียนรู้ของเครื่องจะศึกษาแบบแผนการใช้งาน CPU การจัดตารางเวลา และทรัพยากร เพื่อระบุโปรเซสที่ใช้ทรัพยากรมากเกินไปโดยไม่คืบหน้า ซึ่งช่วยให้ผู้ดูแลระบบตรวจจับภาวะติดขัดได้เร็วกว่าเกณฑ์ที่กำหนดไว้ โดยเฉพาะอย่างยิ่งในระบบคลาวด์และศูนย์ข้อมูลขนาดใหญ่ที่มีโปรเซสที่โต้ตอบกันจำนวนมาก

ใช่แล้ว GitHub Copilot สามารถแนะนำการหน่วงเวลาแบบสุ่ม การหมดเวลา และรูปแบบการจัดลำดับการล็อกที่สม่ำเสมอ ซึ่งจะช่วยลดความเสี่ยงทั้งภาวะล็อกค้างและภาวะล็อกตายได้ นักพัฒนาควรตรวจสอบตรรกะการทำงานพร้อมกันที่สร้างขึ้นอย่างละเอียดถี่ถ้วน เนื่องจากข้อผิดพลาดด้านเวลาเล็กน้อยนั้นมองข้ามได้ง่าย

บางครั้ง หากจังหวะเวลาเปลี่ยนแปลงไป เช่น ผ่านช่วงเวลาการลองใหม่แบบสุ่ม กระบวนการอาจทำลายรูปแบบและดำเนินการต่อไปได้ หากไม่มีการเปลี่ยนแปลงดังกล่าว ภาวะติดขัดอาจคงอยู่ตลอดไป ทำให้สิ้นเปลือง CPU ในขณะที่ไม่มีกระบวนการใดทำงานเสร็จสิ้น

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