หากฉันใช้ตัวล็อคอัลกอริทึมของฉันยังคงสามารถล็อคได้หรือไม่?


10

คำจำกัดความทั่วไปของการล็อกฟรีคือกระบวนการอย่างน้อยหนึ่งกระบวนการกำลังดำเนินการอยู่ 1

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

ดังนั้นมันตรงตามคำจำกัดความของล็อคฟรีหรือไม่?


1ดูเช่น M. Herlihy, V. Luchangco และ M. Moir การซิงโครไนซ์ที่ไม่มีสิ่งกีดขวาง: ตัวอย่างคิวคู่สิ้นสุด ใน Distributed Computing, 2003. "มันไม่ล็อคถ้ามันทำให้แน่ใจว่าเฉพาะเธรดบางตัวเท่านั้นที่ทำให้เกิดความคืบหน้า"


3
ฉันมักจะเข้าใจ "ล็อคฟรี" เพื่ออธิบายโครงสร้างข้อมูลและชุดของอัลกอริทึมที่ไม่ใช้การล็อกเพียงชุดเล็ก ๆ ของการดำเนินการหน่วยความจำอะตอม เช่นdrdobbs.com/parallel/writing-lock-free-code-a-corrected-queue/ …
พอลจอห์นสัน

คำตอบ:


16

ไม่มีคำจำกัดความสำหรับล็อคฟรี

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

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


1
ฉันใช้คำจำกัดความจาก M. Herlihy วิธีการสำหรับการนำวัตถุข้อมูลที่มีความพร้อมสูงมาใช้ ธุรกรรมในภาษาและระบบของโปรแกรม 2536 "เงื่อนไขการล็อคฟรีรับประกันได้ว่ากระบวนการบางอย่างจะดำเนินการต่อไปแม้จะมีข้อผิดพลาดในการหยุดหรือความล่าช้าโดยกระบวนการอื่น ๆ "
Joe Pension

12
@ โจ: นั่นไม่ใช่คำจำกัดความมันอธิบายถึงความหมาย ระวังการเข้าใจผิดตรรกะของสิ่งที่ตรงกันข้าม
Ben Voigt

2
อาจอ้างถึง M. Herlihy, V. Luchangco และ M. Moir การซิงโครไนซ์ที่ไม่มีสิ่งกีดขวาง: ตัวอย่างคิวคู่สิ้นสุด ใน Distributed Computing, 2003. "มันไม่ล็อคถ้ามันทำให้แน่ใจว่าเฉพาะเธรดบางตัวเท่านั้นที่ทำให้เกิดความคืบหน้า"
Joe Pension

1
นอกจากนี้ยังมีความอดอยากฟรีซึ่งมีความเฉพาะเจาะจงมากกว่าการหยุดชะงักฟรี (ทุกขั้นตอนจะไปไม่ว่ากระบวนการอื่นจะทำอะไร) โปรดทราบว่า CaS ลูป (ไม่ยึดตามแบบดั้งเดิมของอะตอม) ไม่ใช่
ratchet freak

5
@ โจ: ถ้าคนทั่วโลกเรียกว่าปราศจากการหยุดชะงักของทรัพย์สินฉันจะใช้คำนั้น ไม่ตัวอย่างที่เรียบง่ายของคุณไม่ปลอดการล็อค เพื่อรับประกันว่าสิ่งที่ไม่มีการหยุดชะงักคุณไม่เพียง แต่ต้องการการซิงโครไนซ์เท่านั้น แต่เป็นการรับประกันว่าไม่มีเธรดที่ทำการดำเนินการบล็อกใด ๆ ในขณะที่ถือล็อค "ทำในสิ่งที่ต้องการ" นั้นคลุมเครือเป็นอย่างมากและไม่ปรากฏให้การรับประกันนี้
Ben Voigt

11

ฉันได้ศึกษา The Art of Multiprocessor Programming 1และข้อความของพวกเขาขาดความชัดเจนเช่นเดียวกับหนังสือที่คุณอ้างถึง นี่คือคำพูดจาก TAMPP:

อ้างอิง 1 (คำจำกัดความของล็อคฟรี)

วิธีการล็อคฟรีถ้ามันรับประกันว่ามักจะเรียกวิธีการบางอย่างเสร็จสิ้นในขั้นตอนจำนวน จำกัด

อ้างอิง 2 (ความหมายของการไม่บล็อก)

การร้องขอที่รอดำเนินการของวิธีการทั้งหมดไม่จำเป็นต้องรอให้การร้องขอที่รอดำเนินการอื่นเสร็จสิ้น

ใบเสนอราคา 3 (อ้างว่าล็อคฟรีไม่ใช่การปิดกั้น)

เงื่อนไขความคืบหน้าการไม่บล็อกการล็อคที่ปราศจากการรอและปราศจากล็อครับประกันได้ว่าการคำนวณโดยรวมทำให้เกิดความคืบหน้าโดยไม่ขึ้นกับว่าระบบจะจัดตารางเธรด

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

หมายเหตุเฉพาะวลีที่ค่อนข้างคลุมเครือในใบเสนอราคา 3: "เป็นอิสระจากการที่ระบบจัดตารางเวลาเธรด" สิ่งนี้ไม่ได้นำหน้าด้วยคำอธิบายอย่างเป็นทางการใด ๆ ของ "ระบบการจัดตารางเวลาเธรด" ดังนั้นเราจึงปล่อยให้สร้างคุณสมบัติขึ้นใหม่ตามความเห็นของเราเกี่ยวกับคำจำกัดความที่ควรมีความหมาย:

  1. ระบบรันคำสั่งของเธรดบางตัวเสมอ;
  2. มันอาจไม่รันคำสั่งของเธรดที่กำหนดใด ๆ
  3. กระทู้ทั้งหมดจะถูกเรียกใช้วิธีการภายใต้การพิจารณา

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

คำจำกัดความที่ถูกต้องของล็อคฟรี

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

1 Maurice Herlihy, Nir Shavit, ศิลปะการเขียนโปรแกรมแบบหลายโปรเซสเซอร์, Elsevier 2008, pp. 58-60


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

ใช่ภาษาไม่ชัดเจน "บ่อยครั้ง" คืออะไร ฉันคิดว่าพวกเขาหมายถึง "ในประวัติศาสตร์การกระทำที่ไม่มีที่สิ้นสุดเหตุการณ์พิเศษนี้เกิดขึ้นได้หลายครั้งอย่างไม่สิ้นสุด"
Marko Topolnik

5

คำศัพท์ไม่สอดคล้องกันเสมอไป แต่ฉันคิดว่าสิ่งสำคัญคือการถามคำถามต่อไปนี้เกี่ยวกับอัลกอริทึมหรือระบบที่เสนอ:

  1. มีลำดับเหตุการณ์ใดบ้างที่เธรดอาจติดรอซึ่งกันและกันแม้ว่าเธรดทั้งหมดจะได้รับอนุญาตตลอดเวลา CPU ที่สามารถใช้ [ถ้าเป็นเช่นนั้นไม่ใช่การหยุดชะงักฟรี]
  2. หากเธรดหนึ่งถูกบล็อกเป็นเวลานาน ๆ อาจทำให้เธรดอื่นหยุดทำงานหรือทำให้ระบบปฏิบัติการเสียหายเป็นเวลานานโดยไม่ตั้งใจ [ถ้าเป็นเช่นนั้นไม่ใช่การปิดกั้น]
  3. มีการรวมกันของการจัดตารางเวลาเธรดอย่างน้อยในทางทฤษฎีซึ่งอาจทำให้เธรดทั้งหมดลองซ้ำการดำเนินการเดียวกันซ้ำ ๆ ในขณะที่ทำให้การทำงานของกันและกันไม่ถูกต้องโดยไม่มีใครก้าวหน้า [ถ้าใช่ไม่ใช่ล็อคฟรี]
  4. หากเธรดบางตัวได้รับเวลา CPU ที่เพียงพอเมื่อเทียบกับเธรดอื่นพวกเขาสามารถบังคับเธรดหลังให้ลองดำเนินการต่อไปเรื่อย ๆ [ถ้าเป็นเช่นนั้นมันจะไม่รอเลย]

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


สิ่งนี้แตกต่างจากคำศัพท์มาตรฐาน: 2 ของคุณหมายถึงความหมายมาตรฐานของการไม่บล็อกขณะที่ 3. หมายถึงอิสรภาพล็อค
Marko Topolnik

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

ฉันคิดว่ามีฉันทามติที่คำศัพท์ที่นำเสนอในการเขียนโปรแกรมศิลปะของมัลติโปรเซสเซอร์เป็น "มาตรฐาน"
Marko Topolnik

@MarkoTopolnik: ฉันจะแก้ไขโพสต์เพื่อให้พอดีกับตอนนั้น คุณชอบเวอร์ชั่นใหม่ไหม?
supercat

เจ๋งดีมาก
Marko Topolnik

4

คุณต้องดูที่ "คำจำกัดความ" ที่คุณพูดในบริบท :

วิธีดั้งเดิมในการใช้โครงสร้างข้อมูลที่ใช้ร่วมกันคือการใช้การแยกกัน (ล็อค) เพื่อให้แน่ใจว่าการดำเนินการที่เกิดขึ้นพร้อมกันจะไม่รบกวนซึ่งกันและกัน การล็อคมีข้อเสียมากมายเกี่ยวกับวิศวกรรมซอฟต์แวร์ความทนทานต่อข้อผิดพลาดและความสามารถในการปรับขนาด (ดู [8]) ในการตอบสนองนักวิจัยได้ตรวจสอบความหลากหลายของ เทคนิคการประสานทางเลือกที่ไม่ได้จ้างยกเว้นร่วมกัน เทคนิคการซิงโครไนซ์จะไม่มีการรอถ้ามันช่วยให้มั่นใจได้ว่าทุกเธรดจะยังคงดำเนินต่อไปในการเผชิญกับความล่าช้าโดยพลการ (หรือแม้แต่ความล้มเหลว) ของเธรดอื่น มันเป็นล็อคฟรีถ้ามันทำให้แน่ใจว่าเฉพาะบางกระทู้ที่ทำให้ความคืบหน้า

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


2

หากฉันใช้ตัวล็อคอัลกอริทึมของฉันยังคงสามารถล็อคได้หรือไม่?

อาจเป็นไปได้ แต่ขึ้นอยู่กับอัลกอริทึม

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

ดังนั้นมันตรงตามคำจำกัดความของล็อคฟรีหรือไม่?

หมายเหตุต่อ se

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

อย่างไรก็ตามหากเงื่อนไขเหล่านั้นไม่เป็นที่น่าพอใจอย่างน้อยก็มีศักยภาพสำหรับการหยุดชะงัก ...


หลังจากการศึกษาบางส่วนของข้อความในการเขียนโปรแกรม The Art of Multiprocessor ฉันได้ข้อสรุปว่า mutexes ทำให้คำจำกัดความของการล็อกไม่ถูกต้องแน่นอนเมื่อคำจำกัดความสะกดถูกต้อง ฉันได้เพิ่มคำตอบลงในหน้านี้เพื่อชี้แจง
Marko Topolnik

1

ตัวอย่างที่คุณให้ไม่ล็อคฟรีด้วยเหตุผลดังต่อไปนี้

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

โดยทั่วไปแล้วอัลกอริธึมที่ใช้ล็อคไม่ได้ล็อคฟรี

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


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

@MarkoTopolnik ความคิดเห็นของคุณไม่สมเหตุสมผลเลย ล็อค - เสรีภาพครอบคลุมการอุดตัน - อิสระ สิ่งใดก็ตามที่ไม่ล็อคจะต้องไม่มีสิ่งกีดขวาง และคำจำกัดความที่คุณระบุไม่ได้ยกเว้นการหยุดเธรด
Chaoran

โปรดใช้ความระมัดระวังในการแยกแยะ "การทำให้เข้าใจ" และ "ถูกต้อง" ความคิดเห็นของฉันไม่ถูกต้องตามที่เห็นได้จากคำตอบที่ตามมาของฉัน แต่คำนิยามของ Wikipedia นั้นผิดหรืออย่างน้อยก็คลุมเครือ
Marko Topolnik

@MarkoTopolnik เนื่องจากคุณยอมรับว่าความคิดเห็นของคุณไม่ถูกต้องคุณควรลบออกเพื่อหลีกเลี่ยงการทำให้ผู้อ่านอื่นสับสน Wikipedia มักจะไม่ถูกต้องหรือคลุมเครือ คุณควรค้นหาคำจำกัดความที่ละเอียดอ่อนเช่น "ล็อคอิสระ" ในเอกสารทางวิชาการเช่นcs.rochester.edu/~scott/papers/2006_PPoPP_synch_queues.pdf (คำจำกัดความของล็อคฟรีอยู่ในหัวข้อ 2.1)
Chaoran

ใช่รวมถึงคุณสมบัติการปิดกั้นเป็นส่วนหนึ่งของคำจำกัดความของล็อคอิสระเป็นวิธีหนึ่งที่จะทำ ที่ระบุไว้ในการแก้ไขคำตอบของฉันก่อนหน้านี้
Marko Topolnik
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.