ฉันอ่าน 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