ต้องการความเป็น Linearizability ใคร


13

ฉันได้อ่านเกี่ยวกับความแตกต่างระหว่างserializabilityและlinearizabilityซึ่งเป็นทั้งเกณฑ์ความสอดคล้องสำหรับระบบที่จำลองแบบเช่นฐานข้อมูลที่จำลองแบบ อย่างไรก็ตามฉันไม่ทราบว่าในกรณีใดความจำเป็นต้องใช้ความสามารถเชิงเส้นตรงถึงแม้ว่ามันจะแข็งแกร่งกว่าความสามารถเชิงอนุกรม

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


คุณสามารถตรวจสอบวิกิพีเดีย: en.wikipedia.org/wiki/…หรือบนกระดาษโดย Herlihy and Wing: "Linearizability: สภาพที่ถูกต้องสำหรับวัตถุที่เกิดขึ้นพร้อมกัน"
Eduardo Bezerra

คำตอบ:


5

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

นอกจากนี้ Linearizability เป็นคุณสมบัติที่ไม่ปิดกั้น: การดำเนินการทั้งหมด (กำหนดไว้สำหรับทุกสถานะวัตถุ) ไม่จำเป็นต้องบล็อก Serializability ไม่ใช่คุณสมบัติที่ไม่ปิดกั้นแทน ดังนั้นเพื่อเพิ่มระดับของการทำงานพร้อมกันผู้ออกแบบโครงสร้างข้อมูลที่เกิดขึ้นพร้อมกันจึงต้องพึ่งพา


1
นี่ไม่ใช่คำตอบที่ดีเพราะมันใช้แนวคิดอื่นที่ไม่สามารถอธิบายเพื่ออธิบายแนวความคิดนั้นได้อย่างสงสัย .. (การอ่านนี้เป็นการเสียเวลา) .. คำตอบด้านล่างดีกว่ามาก ...
Richard

ดูเหมือนว่าคุณไม่ได้อ่านคำถาม OP ต้นฉบับ OP ไม่ได้ถามว่า linearizability คืออะไรเขาถามว่า "ใครต้องการ linearizability" คำตอบของฉันมีความเหมาะสมเนื่องจากมันให้สถานการณ์ตัวอย่างแก่ OP (อย่างน้อยมันก็ถือว่าเหมาะสมและถูกเลือกโดย OP) ข้อเท็จจริงที่ว่าคุณไม่ทราบว่าโครงสร้างข้อมูลที่ไม่มีการรอคอยพร้อมกันนั้นเป็นข้อเท็จจริงที่แตกต่างไปจากเดิมอย่างสิ้นเชิง โดยวิธีการที่ OP รู้ว่าสิ่งที่ฉันกำลังพูดถึง หากเราต้องอธิบายทุกแนวคิดที่เราใช้ในคำตอบคำตอบจะไม่สิ้นสุด ;-)
Massimo Cafaro

10

ฉันอ่าน Herlihy และ Wing หลายครั้งในช่วง 15 ปีที่ผ่านมา มันอ่านยากมาก และนั่นก็โชคร้ายเพราะในขณะที่มีรายละเอียดปลีกย่อยรอบ ๆ แนวคิดพื้นฐานนั้นค่อนข้างสมเหตุสมผล

ในระยะสั้น: linearizability เหมือน serializability แต่มีข้อกำหนดเพิ่มเติมที่เป็นลำดับเคารพข้อ จำกัด การสั่งซื้อเพิ่มเติมระหว่างการทำธุรกรรม เป้าหมายคือช่วยให้คุณให้เหตุผลเกี่ยวกับโครงสร้างข้อมูลอะตอมแต่ละตัวอย่างจริงจังแทนที่จะต้องให้เหตุผลเกี่ยวกับระบบทั้งหมดในคราวเดียว

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

นี่คือคำจำกัดความที่ฉันจะใช้:

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

Serializability ไม่อนุญาตให้มีลักษณะของ interleaving การดำเนินงานระหว่างการทำธุรกรรมที่แตกต่างกันและต้องการให้การสั่งซื้อที่เลือกของการทำธุรกรรมเป็นไปตามเหตุผล (ถ้าธุรกรรม A เขียนค่า x และธุรกรรม B อ่านค่า x ที่เขียนแล้วธุรกรรม A จะต้องนำหน้าธุรกรรม B ใน ลำดับอนุกรมที่เลือก) แต่มันไม่ได้บอกอะไรเกี่ยวกับข้อ จำกัด อื่น ๆ ในการเรียงลำดับของการทำธุรกรรม (โดยเฉพาะมันไม่ได้พูดอะไรเกี่ยวกับกระบวนการและลำดับที่กระบวนการรับรู้เหตุการณ์)

มีแนวคิดที่เกี่ยวข้องอื่นที่จะเพิ่มข้อ จำกัด เกี่ยวกับลำดับที่กระบวนการดำเนินการดำเนินการ (แต่ไม่ได้พูดคุยเกี่ยวกับการทำธุรกรรมเฉพาะการดำเนินการอ่าน / เขียนแต่ละรายการ):

ระบบมีความสอดคล้องกันตามลำดับหากผลลัพธ์ของการดำเนินการใด ๆ เหมือนกับว่าการดำเนินการของกระบวนการทั้งหมดถูกดำเนินการในลำดับต่อเนื่องบางส่วนและการดำเนินการของแต่ละกระบวนการจะปรากฏในลำดับนี้ตามลำดับที่ระบุโดยโปรแกรม ( Lamport "วิธีสร้างคอมพิวเตอร์แบบมัลติโพรเซสเซอร์ที่เรียกใช้งานโปรแกรมมัลติโพรเซสเซอร์อย่างถูกต้อง", IEEE T Comp 28: 9 (690-691), 1979 )

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

Linearizability มีความตั้งใจที่ดีในการ (a) การรวมความคิดของการทำธุรกรรม (จากอนุกรม) กับความคิดที่กระบวนการคาดหวังว่าการดำเนินการที่พวกเขาออกให้เสร็จสมบูรณ์ตามลำดับ (จากความสอดคล้องตามลำดับ) และ (b) วัตถุในการแยกมากกว่าบังคับให้คุณให้เหตุผลเกี่ยวกับระบบโดยรวม (ฉันต้องการที่จะสามารถที่จะพูดว่าการดำเนินการวัตถุของฉันถูกต้องแม้จะอยู่ในระบบที่มีวัตถุอื่น ๆ ที่ไม่ได้ linearizable ได้.) ผมเชื่อว่าเฮอร์ลิฮีและปีกอาจได้พยายามอย่างจริงจังกำหนดจอภาพ

ส่วน (a) คือ "ง่าย": ความต้องการเหมือนความสอดคล้องตามลำดับคือธุรกรรมบนวัตถุที่ออกโดยแต่ละกระบวนการจะปรากฏในลำดับผลลัพธ์ตามลำดับที่ระบุโดยโปรแกรม ความต้องการเหมือนซีเรียลไลซ์เซชั่นคือการทำธุรกรรมบนวัตถุล้วน แต่ไม่เกิดร่วมกัน (สามารถต่อเนื่องกันได้)

ความซับซ้อนมาจากวัตถุประสงค์ (b) (ความสามารถในการพูดคุยเกี่ยวกับแต่ละวัตถุเป็นอิสระจากคนอื่น ๆ ทั้งหมด)

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

ตัวอย่างเช่นสมมติว่าฉันพยายามโต้แย้งเกี่ยวกับความถูกต้องของวัตถุ A ซึ่งเป็นคิวสมมติว่าวัตถุ B เป็นตำแหน่งหน่วยความจำและสมมติว่าฉันมีประวัติการดำเนินการต่อไปนี้: เธรด 1: A.enqueue (x), A. dequeue () (ส่งคืน y) หัวข้อที่ 2: A.enqueue (y), A.dequeue () (ส่งคืน x) มีการแทรกเหตุการณ์ที่จะทำให้การดำเนินการของคิวถูกต้องหรือไม่ ใช่:

Thread 1                           Thread 2
A.enqueue(x)                       ...
...                                A.enqueue(y)
...                                A.dequeue() (returns x)
A.dequeue(y) (returns y)           ...

แต่ตอนนี้จะเกิดอะไรขึ้นถ้าประวัติ ( รวมถึงวัตถุ B ) คือ: B เริ่มต้นด้วยค่า 0 เธรด 1: A.enqueue (x), A.dequeue () (ส่งคืน y), B.write (1) หัวข้อที่ 2: B.read () (ส่งคืน 1) A.enqueue (y), A.dequeue () (ส่งคืน x)

Thread 1                           Thread 2
A.enqueue(x)                       ...
A.dequeue() (returns y)            ...                       (uh oh!)
B.write(1)                         ...
...                                B.read() (returns 1)
...                                A.enqueue(y)
...                                A.dequeue() (returns x)

ตอนนี้เราต้องการคำจำกัดความของ "ความถูกต้อง" เพื่อบอกว่าประวัติศาสตร์นี้บ่งชี้ว่าการใช้งานของ A คือบั๊กซีหรือการใช้ B เป็นบั๊กเพราะไม่มีการจัดลำดับที่ "สมเหตุสมผล" (ทั้งเธรด 2 จำเป็นต้องอ่าน ค่าจาก B ที่ยังไม่ได้เขียนหรือเธรด 1 ต้องการ dequeue ค่าจาก A ที่ยังไม่ถูกจัดคิว) ดังนั้นในขณะที่การทำธุรกรรมซีเรียลไลซ์เซชั่นดั้งเดิมของเราบน A ดูเหมือนจะสมเหตุสมผล อนุญาตให้ประวัติเช่นเดียวกับที่สองจากนั้นมันไม่ถูกต้องชัดเจน

ดังนั้นข้อ จำกัด ที่การเพิ่มเชิงเส้นจึงค่อนข้างสมเหตุสมผล (และจำเป็นสำหรับโครงสร้างข้อมูลอย่างง่ายเช่นคิว FIFO) สิ่งเหล่านี้คือ: "การดำเนินการของคุณควรไม่อนุญาตให้ dequeue () ค่าที่จะไม่ถูกจัดคิว () จนกว่าจะถึงเวลา อนาคต." Linearizability ค่อนข้างง่าย (และเป็นธรรมชาติ) เพื่อให้บรรลุ: เพียงเชื่อมโยง mutex กับวัตถุของคุณและแต่ละธุรกรรมเริ่มต้นด้วยการล็อกและสิ้นสุดโดยการปลดล็อก การให้เหตุผลเกี่ยวกับ linearizability เริ่มมีความยุ่งยากเมื่อคุณพยายามที่จะนำอะตอมมิกซิตี้ของคุณมาใช้ด้วยเทคนิคที่ไม่มีการบล็อคหรือล็อคฟรีหรือปราศจากการรอคอยแทนที่จะกลายเป็น mutex ง่าย ๆ

หากคุณสนใจพอยน์เตอร์ในวรรณกรรมฉันพบสิ่งต่อไปนี้ (แม้ว่าฉันคิดว่าการอภิปรายเกี่ยวกับ "เรียลไทม์" เป็นหนึ่งใน herrings สีแดงที่ทำให้ linearizabilty ยากขึ้นกว่าที่มันต้องการ) https: // stackoverflow.com/questions/4179587/difference-between-linearizability-and-serializability


คุณหมายถึงอะไรโดยอ้างว่า `` ฉันเชื่อว่า Herlihy and Wing อาจพยายามกำหนดจอมอนิเตอร์อย่างจริงจัง '' คุณช่วยเพิ่มรายละเอียดได้ไหม (ฉันกำลังอ่านบทความของ Herlihy and Wing)
hengxin

1
ฉันไม่คิดว่าฉันหมายถึงอะไรลึก ก่อนที่ฉันจะอ่าน Herlihy and Wing สิ่งที่ฉันได้อ่านเกี่ยวกับจอภาพล้วนแล้วแต่ใช้งานได้ บางอย่างเช่น "จอแสดงผลเป็นชนิดข้อมูลนามธรรมที่ปริยายมี mutex และวิธีการประเภททุกแร่ mutex ที่จุดเริ่มต้นและเผยแพร่ mutex ที่สิ้นสุด" ตามด้วยการอภิปรายเกี่ยวกับความซับซ้อนเมื่อมันจะถูกและwait() notify()Linearizability ให้วิธีการพูดคุยเกี่ยวกับความถูกต้องของการใช้งานจอภาพที่ซับซ้อน / ปรับให้เหมาะสมมากขึ้น
หลงทางตรรกะ

มันสมเหตุสมผลสำหรับฉัน ขอบคุณ. วันนี้ฉันได้อ่านRelated Workส่วนหนึ่งของกระดาษของ Herlihy and Wing พวกเขาไม่ได้กล่าวถึงเป็นตัวอย่างของการเรียกร้องของพวกเขาว่าmonitor Our notion of linearizability generalizes and unifies similar notions found in specific examples in the literatureอย่างไรก็ตามคำถามทั่วไป: แนวคิดเรื่อง linearizability ได้รับการยอมรับอย่างกว้างขวางในระบบมัลติโปรเซสเซอร์ (เช่นฮาร์ดแวร์คอมไพเลอร์ภาษาโปรแกรมและโครงสร้างข้อมูลที่เกิดขึ้นพร้อมกัน)? (เมื่อมองในระยะสั้นฉันรู้ แต่เพียงสิ่งต่าง ๆ เช่นจอมอนิเตอร์) ถ้าไม่ใช่อุปสรรคคืออะไร? สถานะของศิลปะคืออะไร?
hengxin

ฉันคิดว่ามันเป็นคุณสมบัติที่พึงประสงค์ซึ่งบางครั้งมันแพงเกินไปที่จะบังคับใช้ ดูตัวอย่าง: courses.csail.mit.edu/6.852/01/papers/p91-attiya.pdf ในทางปฏิบัติฉันคิดว่า hashmaps ที่เกิดขึ้นพร้อมกันส่วนใหญ่มีการล็อคต่อที่ฝากข้อมูล แต่ไม่มีการล็อคระดับโลกและอาจมีพฤติกรรมแปลก ๆ เมื่อใดก็ตามที่การแทรก / การลบทำให้ตารางแฮชได้รับการปรับขนาด
หลงทางตรรกะ

ขอบคุณสำหรับคำตอบยาว ๆ แต่ฉันเกรงว่าคุณไม่ได้บอกฉันว่า linearizability น่าสนใจเพียง แต่กำหนดไว้และสำหรับเรื่องนั้นคุณนิยามผิด: ไม่เพียงพอที่แต่ละกระบวนการจะเห็นการดำเนินการใน คำสั่งที่พวกเขาออก คำสั่งซื้อในกระบวนการทั้งหมดจะต้องสอดคล้องกัน แต่แก้ไขให้ถูกต้องถ้าฉันผิด ...
Eduardo Bezerra

2

ประการแรกความเป็นเชิงเส้นและความต่อเนื่องไม่ได้เทียบเคียงได้โดยตรง ดังตารางด้านล่างแสดงความแตกต่างที่สำคัญคือที่ด้านซ้ายมือการดำเนินการแต่ละรายการเป็นแบบอะตอม (เช่นมีจาวาsynchronizedรอบแต่ละ op) ทางด้านขวาหน่วยของอะตอมมิกนั้นเป็นธุรกรรมการดำเนินการแต่ละรายการไม่ใช่อะตอมมิก ซึ่งเป็นสาเหตุที่ Serializability เป็นส่วนหนึ่งของวรรณคดีฐานข้อมูลเสมอในขณะที่ด้านซ้ายมือเป็นหัวข้อของวรรณคดีหน่วยความจำหน่วยประมวลผล (อ่าน / เขียน op เป็นอะตอม) ร้านค้า Key-Value ดั้งเดิม (เช่น dbm และ memcached) เริ่มต้นที่ด้านซ้ายมือ (get / put is atomic) แต่สิ่งที่ใหม่กว่านั้นรองรับการทำธุรกรรมมากขึ้น (เช่น spanner ของ Google)

obj การดำเนินงานเป็นอะตอม ธุรกรรมเป็นอะตอม
-------------------------------- + ----------------- ----------------
Linearizability |
ความสอดคล้องตามลำดับ | Serializability
ความสอดคล้องเชิงสาเหตุ
ความสอดคล้องของแคช

Linearizability ต้องการให้ระบบของวัตถุในการตั้งค่าพร้อมกันต้องทำงานเหมือนระบบลำดับที่จัดการหนึ่งการดำเนินงาน (คู่ขอ / ตอบสนอง) ในเวลา - ในจักรวาลคู่ขนาน - ในลักษณะที่ (a) ลูกค้า ในจักรวาลทั้งสองเห็นว่าคำตอบเดียวกัน (b) คำสั่งชั่วคราวจะถูกเก็บรักษาไว้ (เพิ่มเติมด้านล่างนี้)

ความหมายของ Serializability เช่น Sequential Consistency ต้องใช้เกณฑ์แรกเท่านั้น

การเก็บรักษาคำสั่งชั่วคราวหมายถึงสิ่งนี้: ถ้า A: x.op1 () (A คือลูกค้า, x เป็นวัตถุและ op1 เป็นการดำเนินการ) เสร็จสิ้นก่อนการดำเนินการอื่น B: y.op2 () เริ่มต้นจากนั้นในจักรวาลตามลำดับ คำขอได้รับการจัดการในลำดับเดียวกัน สิ่งนี้ไม่จำเป็นใน Sequential Consistency (SC); วัตถุได้รับอนุญาตให้จัดคิวคำขอของลูกค้าตอบสนองต่อลูกค้าแล้วประเมินในภายหลัง นอกจากนี้วัตถุอาจจัดการการร้องขอในภายหลังจากไคลเอนต์อื่น ๆ บางอย่างออกจากการประเมินก่อนที่จะรับคนแรก

การไม่รักษาระเบียบชั่วคราวเป็นปัญหา หลังจาก A: x.op1 () สมมติว่า A ยกหูโทรศัพท์และบอก B เกี่ยวกับมันแล้ว B เรียกว่า x.op2 () ไม่มีทางที่ระบบจะรู้เกี่ยวกับสาเหตุของเหตุการณ์นี้เนื่องจากขั้นตอนที่สองเกี่ยวข้องกับข้อความที่ไม่ได้ติดตามโดยระบบ ในหลายกรณีจริงมันไม่สมเหตุสมผลสำหรับ A ที่จะสมมติว่าเมื่อ x ตอบสนองแล้วการร้องขอของ B สามารถพึ่งพาสถานะที่อัปเดตได้ หากคำสั่งทางโลกไม่ได้รับการเก็บรักษาไว้ A และ B ก็เข้าสู่ความประหลาดใจ สิ่งนี้จะไม่เกิดขึ้นในระบบเชิงเส้น

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

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