จำกัด เฉพาะคอลเล็กชันที่ปลอดล็อคหรือไม่


10

David Rodríguez - dribeas เขียนไว้ในความคิดเห็นเกี่ยวกับ StackOverflowว่า "คอลเลกชันบางอย่างอาจไม่สามารถใช้งานได้โดยไม่ล็อค" ฉันไม่แน่ใจว่านี่เป็นเรื่องจริงหรือไม่และฉันไม่สามารถหาข้อพิสูจน์ได้

คำสั่งนี้ไม่แม่นยำมาก แต่ให้ฉันลองใช้คำใหม่อย่างเป็นทางการเล็กน้อย: สำหรับคอลเลกชันทุกประเภทCมีคอลเลกชันประเภทล็อคฟรีCLFที่มีชุดปฏิบัติการเดียวกันและที่แต่ละการดำเนินการบนCLFมีความซับซ้อนขนาดใหญ่-O Cเช่นเดียวกับการดำเนินงานที่สอดคล้องกันใน

ฉันไม่คิดว่าจะมีการเปลี่ยนแปลงอีกต่อไป


1
ในฐานะที่ไม่ใช่ผู้เชี่ยวชาญฉันสงสัยว่า "ไม่ล็อค" สามารถกำหนดได้อย่างเข้มงวด
Tsuyoshi Ito

1
@Suresh: อาจเป็นคำพ้องสำหรับ "โครงสร้างข้อมูล"?
Tsuyoshi Ito

2
ถ้าคุณเพิ่งใช้งาน STM (หน่วยความจำทรานแซคชั่นของซอฟต์แวร์) โดยไม่มีการล็อคและใช้โครงสร้างข้อมูลใด ๆ
Jukka Suomela

5
@Tsuyoshi: ฉันคิดว่าไม่มีคำจำกัดความที่เป็นทางการว่าไม่มีล็อค หมายความว่าคุณไม่ได้ใช้คำสั่ง LOCK ของ CPU ซึ่งช้าและยึดติดกับการเปรียบเทียบและสลับที่เร็วขึ้น เนื่องจาก LOCK สามารถจำลองด้วยการเปรียบเทียบและสลับจึงเป็นการยากที่จะวางขอบเขตที่ยากระหว่าง "คุณใช้การเปรียบเทียบและการแลกเปลี่ยนที่นี่เพื่อจำลองการล็อก (หรือธุรกรรมสำหรับเรื่องนั้น)" และ "โอ้นี่คือ การใช้การเปรียบเทียบและการแลกเปลี่ยนที่ชาญฉลาดจริงๆและไม่ได้ดูเลยราวกับว่ามันเป็นการจำลองการทำงานระดับสูงกว่าที่เรารู้ "
Radu GRIGore

1
เท่าที่ฉันเข้าใจมันล็อคฟรีเป็นที่เข้าใจกันว่าที่นี่มีความหมายเหมือนกันกับการไม่ปิดกั้น สิ่งนี้ไม่เกี่ยวข้องกับLOCKคำสั่งของ CPU แต่ตัวจัดกำหนดการเธรดผ่าน mutexes / semaphores / etc
MSalters

คำตอบ:


11

เนื่องจากฉันเองค่อนข้างสับสนฉันเริ่มด้วยการอธิบายแนวคิดบางอย่างในคำถาม

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

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

ด้วยคำจำกัดความเหล่านี้ฉันคิดว่า Herlihy และบอสพูดโดยทั่วไปว่าคำตอบคือเปลี่ยนภูมิภาคที่สำคัญเป็นธุรกรรม

แต่คุณอาจถามว่าสิ่งนี้มีความซับซ้อนเหมือนกันหรือไม่? ฉันไม่แน่ใจว่าคำถามนี้สมเหตุสมผลหรือไม่ push(x) { lock(); stack[size++] = x; unlock(); }พิจารณา นี่เป็นการทำงานตามเวลาที่แน่นอนหรือไม่? หากคุณเพิกเฉยต่อการล็อคดังนั้นผู้ใช้รายอื่นจึงสามารถตอบ YES ได้ หากคุณไม่ต้องการเพิกเฉยต่อผู้ใช้คนอื่น ๆ ก็ไม่มีทางที่จะบอกได้ว่าการกดจะทำงานในเวลาที่แน่นอนหรือไม่ หากคุณเพิ่มขึ้นหนึ่งระดับและดูว่าสแต็กมีการใช้งานอย่างไรโดยอัลกอริทึมบางอย่างคุณจะสามารถพูดได้ว่าการกดจะใช้เวลาคงที่เสมอ (วัดได้ในแง่ของสิ่งที่เกิดขึ้นกับอินพุตของอัลกอริทึมขนานของคุณ) แต่ที่จริงเป็นทรัพย์สินของอัลกอริทึมของคุณจึงไม่ได้ทำให้ความรู้สึกที่จะกล่าวว่าการผลักดัน คือการดำเนินการเวลาคง

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


ฉันไม่แน่ใจเกินไปว่าคุณสามารถพิจารณาได้จริงหรือไม่ว่าการpushดำเนินการตามที่ระบุไว้ข้างต้นไม่ใช่การดำเนินการตามเวลาที่แน่นอน สำหรับจำนวนตัวประมวลผลที่แน่นอนและการใช้งานทั่วไปlockที่รับประกันว่าจะไม่มีความอดอยากการดำเนินการข้างต้น (ในกรณีที่เลวร้ายที่สุดสำหรับตัวประมวลผลใดก็ตามที่ใช้ N_proc * O (1) ซึ่งสามารถสันนิษฐานได้ว่าเป็น O (1) ( จำนวนโปรเซสเซอร์ที่รวมอยู่ในค่าคงที่ที่ซ่อนอยู่)
David Rodríguez - dribeas

n(n)

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

ในขณะที่สมมติฐานว่าจำนวนตัวประมวลผลเป็นค่าคงที่ค่อนข้างใช้งานได้จริงฉันจะหลีกเลี่ยง ปัญหาก็คือความซับซ้อนไม่สามารถวิเคราะห์ได้ในมิติเดียวเนื่องจากขนาดของปัญหาจะเพิ่มขึ้นทั้งขนาดของอินพุตและจำนวนตัวประมวลผลซึ่งทั้งสองเป็นมิติมุมฉาก สมมติว่าคอนเทนเนอร์เฉพาะในไลบรารีมาตรฐาน C ++ (ฉันเห็นได้ชัดว่าเลือกยาก) หนึ่งในข้อกำหนดคือองค์ประกอบทั้งหมดจะถูกเก็บไว้ในบล็อกหน่วยความจำต่อเนื่อง
David Rodríguez - dribeas

ตอนนี้การผนวกองค์ประกอบเข้ากับเวกเตอร์เป็นการดำเนินการเวลาคงที่ที่ตัดจำหน่าย (ถ้าไม่พอดีกับบล็อกที่จัดสรรไว้ก่อนหน้านี้การโทรจะใช้เวลาเชิงเส้นกับจำนวนองค์ประกอบในคอนเทนเนอร์ แต่ถ้าบล็อกสงวนของหน่วยความจำคือ ได้มาตามลำดับเลขชี้กำลังค่าตัดจำหน่ายเป็นค่าคงที่) หากคุณติดตั้งคอนเทนเนอร์ที่ปลอดภัยของเธรดคุณจะล็อกแล้วทำการเปลี่ยนแปลงค่าใช้จ่ายของการดำเนินการจะแปรผันกับต้นทุนของการล็อก - ซึ่งฉันไม่รู้จริง ๆ ... แต่ในการประมาณครั้งแรกคุณสามารถพิจารณาเป็นส่วนใหญ่ ค่าคงที่
David Rodríguez - dribeas

3

ฉันคิดว่า "COLLECTIONS" หมายถึง "คิวสแต็ครายการที่ลิงก์ต้นไม้" ...

จากhttp://www.cl.cam.ac.uk/research/srg/netos/lock-free/

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

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

ถ้า "ไม่ล็อค" หมายถึง "อย่าใช้ semaphores ของระบบปฏิบัติการ, mutex, จอภาพ, ... "ฉันคิดว่า (แต่ฉันไม่ใช่ผู้เชี่ยวชาญ) ว่าทุกคอลเลกชันสามารถทำล็อกได้โดยใช้อะตอมอ่าน - เขียน - แก้ไขดั้งเดิมที่ต้องได้รับการสนับสนุนจากฮาร์ดแวร์

O()

เอกสารครบถ้วนสมบูรณ์เกี่ยวกับเรื่องสามารถพบได้ทั่วไป:

http://www.google.it/search?q=lock+free+algorithm+filetype%3Apdf

(... และการอ้างอิงเพิ่มเติมในตอนท้ายของแต่ละเอกสาร)

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