ตัวรวบรวมขยะจะหลีกเลี่ยงการล้นสแต็กได้อย่างไร


23

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

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

ดังนั้นนักสะสมขยะจะสำรวจโครงสร้างโดยพลการอย่างไร? เทคนิคการสำรวจเส้นทางนี้จะหลีกเลี่ยงการล้นได้อย่างไร


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

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

ฉันคิดว่ามันจะทำกับ bitvector ในขนาดของวัตถุที่มีขนาดใหญ่กว่า 16 ไบต์ดังนั้นหัวส่วนบนจะเป็นอย่างน้อย 1,000 ครั้งเป็นอย่างน้อย
เจค

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

คำตอบ:


13

โปรดทราบว่าฉันไม่ใช่ผู้เชี่ยวชาญด้านการรวบรวมขยะ คำตอบนี้ให้เพียงตัวอย่างของเทคนิค ฉันไม่อ้างว่าเป็นภาพรวมที่เป็นตัวแทนของเทคนิคการรวบรวมขยะ

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

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

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


2
เทคนิคที่อธิบายไว้ในวรรคสุดท้ายมักจะเรียกว่า " การกลับตัวชี้ "
หลงทางตรรกะ

@WanderingLogic ใช่การกลับตัวชี้เป็นวิธีที่ฉันเรียกมันในคำตอบของฉันเอง มันเกิดจาก Deutsch, Schorr และ Waite (1967) อย่างไรก็ตามมันไม่ถูกต้องที่จะระบุว่ามันทำงานในหน่วยความจำคงที่: มันต้องใช้บิตเพิ่มเติมสำหรับแต่ละเซลล์ที่มีp pointers แม้ว่าจะสามารถลดลงได้โดยการใช้บิตสแต็ค คำตอบที่ได้รับการยอมรับที่คุณอ้างอิงนั้นไม่ถูกต้องหรือสมบูรณ์ด้วยเหตุผลเดียวกัน log2pพี
babou

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

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


11

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

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

คำถามคือเพ่งความสนใจไปที่ค่าใช้จ่ายหน่วยความจำของการติดตามเพื่อติดตามชุด: ชุด (สำหรับ untraced) ของเซลล์หน่วยความจำที่เข้าถึงได้ซึ่งยังคงมีตัวชี้ที่ยังไม่ได้ติดตาม นี่เป็นเพียงครึ่งหนึ่งของปัญหาหน่วยความจำU สำหรับการรวบรวมขยะ GC จะต้องติดตามชุดอื่น: ชุด (สำหรับเยี่ยมชม) ของเซลล์ทั้งหมดที่พบว่าสามารถเข้าถึงได้เพื่อที่จะเรียกคืนเซลล์อื่น ๆ ทั้งหมดในตอนท้ายของกระบวนการ การพูดคุยอย่างใดอย่างหนึ่งและไม่ใช่เรื่องอื่นทำให้รู้สึก จำกัด เนื่องจากอาจมีค่าใช้จ่ายที่คล้ายคลึงกันใช้วิธีแก้ไขปัญหาที่คล้ายกันV

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

  • ชุด (เยี่ยมชม) ของเซลล์พบว่าสามารถเข้าถึงได้โดยMutatorเช่นโปรแกรมหรืออัลกอริทึมที่ GC ดำเนินการ ชุดVถูกแบ่งพาร์ติชันออกเป็นชุดย่อยที่แยกกันสองชุด: V = U T ;VVV=UT

  • set (untraced) ของเซลล์ที่เยี่ยมชมพร้อมด้วยพอยน์เตอร์ที่ยังไม่ได้ติดตามU

  • ชุด (ติดตาม) ของเซลล์ที่เยี่ยมชมซึ่งมีการติดตามพอยน์เตอร์ทั้งหมดT

  • เรายังทราบชุดของเซลล์ทั้งหมดในกองไม่ว่าจะมีการใช้งานหรือไม่H

เฉพาะและUหรือUและTเท่านั้นที่ต้องแสดงอัลกอริธึมในการทำงานVUUT

ขั้นตอนวิธีการเริ่มต้นจากบางส่วนชี้รากที่เป็นที่รู้จักกับระบบเวลาทำงาน (มักจะชี้ในการจัดสรรหน่วยความจำสแต็ค) และทำให้เซลล์ทั้งหมดที่พวกเขาชี้ไปในชุด untraced (เพราะฉะนั้นในVเกินไป)UV

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

UUV=TVHVVในฮีปจะกำหนดว่าเซลล์ใดที่ไม่สามารถเข้าถึงได้โดยโปรแกรม mutator และสามารถเรียกคืนได้โดยตัวสะสมสำหรับการจัดสรรในอนาคตให้กับ mutator

VUUTซึ่งแสดงอย่างมีประสิทธิภาพ

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

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

ในกรณีที่การใช้งานที่รู้จักแตกต่างกันนั้นเป็นไปตามที่ชุดเหล่านี้ถูกนำเสนอจริง มีการใช้เทคนิคหลายอย่างจริง:

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

  • หรือคุณอาจมีพื้นที่สำหรับแท็กบิตพิเศษ (หรือ 2) ในแต่ละเซลล์เพื่อทำเครื่องหมาย

  • log2pp

  • คุณอาจทดสอบภาคแสดงเกี่ยวกับเนื้อหาของเซลล์และพอยน์เตอร์ของมัน

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

  • VTTU

  • คุณอาจรวมเทคนิคเหล่านี้เข้าด้วยกันแม้จะเป็นชุดเดียวก็ตาม

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

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

เห็นได้ชัดว่าไม่มีการเรียกซ้ำและไม่จำเป็นต้องใช้อัลกอริธึม Mutator

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

ฉันไม่ได้ให้การอ้างอิงถึงอัลกอริทึมเฉพาะจำนวนมากซึ่งเป็นผลมาจากการรวมกันของเทคนิคเหล่านี้เนื่องจากดูเหมือนจะนานพอ


4

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


เมื่อเรียก GC แล้วฮีปมักจะเต็ม ประเด็นก็คือว่ามันเกิดขึ้นที่กองและกองเติบโตจากปลายทั้งสองของพื้นที่หน่วยความจำเดียวกัน ..
Babou

4

ในคำอธิบาย "คลาสสิค" ของการเก็บขยะ (เช่น Mark Wilson, " Uniprocessor Garbage Collection Techniques ", Int'l Workshop เกี่ยวกับการจัดการหน่วยความจำ , 1992, ( ลิงค์สำรอง ) หรือคำอธิบายในการใช้งานคอมไพเลอร์สมัยใหม่ของ Andrew Appel (Cambridge University Press, 1998)) นักสะสมจัดเป็น "ทำเครื่องหมายและกวาด" หรือ "คัดลอก"

นักสะสม Mark และ Sweep หลีกเลี่ยงการต้องการพื้นที่เพิ่มเติมโดยใช้ตัวชี้การกลับรายการตามที่อธิบายไว้ในคำตอบของ @ Gilles Appel กล่าวว่า Knuth ให้ข้อมูลอัลกอริธึมการย้อนกลับของตัวชี้ไปยัง Peter Deutsch และ Herbert Schorr และ WM Waite

การคัดลอกตัวรวบรวมขยะใช้สิ่งที่มักเรียกว่าอัลกอริธึมของ Cheyneyเพื่อดำเนินการสำรวจเส้นทางคิวโดยไม่ต้องการพื้นที่เพิ่มเติม อัลกอริทึมนี้ถูกนำมาใช้ใน CJ Cheyney "อัลกอริทึมการบีบอัดรายการที่ไม่ใช่แบบเรียกซ้ำ", Comm ACM , 13 (11): 677-678 1970

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

ตัวอย่างอัลกอริทึมของ Cheyney

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


ที่จริงตามที่อธิบายไว้ในคำตอบของฉันทั้งชุด Mark + Sweep และ Copy เป็นอัลกอริทึมกราฟนามธรรมที่เหมือนกัน การรวบรวม MS และการคัดลอกนั้นแตกต่างกันในวิธีที่ชุดที่ใช้โดยอัลกอริธึมนามธรรมถูกนำมาใช้และทั้งสองตระกูลนั้นมีหลายตัวแปรในการรวมกันของเทคนิคการใช้ชุดที่ฉันอธิบายในคำตอบของฉัน ตัวแปร GC บางตัวผสม MS และ Copy จริง ๆ ใน GC เดียวกัน บางคนมองว่าการแยก MS และการคัดลอกนั้นเป็นวิธีที่สะดวกในการจัดโครงสร้างหนังสือ แต่มันก็เป็นกฎเกณฑ์และฉันเชื่อว่าวิสัยทัศน์ที่ล้าสมัย
babou

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

@supercat ฉันไม่แน่ใจว่าสิ่งที่คุณกำลังพยายามที่จะพูดความตั้งใจของคุณคืออะไร ข้อความบางส่วนของคุณดูเหมือนถูกต้อง แต่ฉันไม่เข้าใจวิธีที่คุณสามารถใช้จากอวกาศก่อนที่วงรอบ GC จะสิ้นสุดลง (มันมีตัวชี้การส่งต่อ) และมันจะเป็นแผ่นสำหรับอะไร ลดความซับซ้อนของ algoritm ได้อย่างไร เกี่ยวกับหลายเธรดตัวดำเนินการที่ดำเนินการในขณะที่ GC กำลังเกิดขึ้นนี่เป็นปัญหาแบบมุมฉากแม้ว่ามันอาจส่งผลกระทบต่อการใช้งานอย่างรุนแรง ฉันจะไม่พยายามพูดถึงความคิดเห็นนั้น ควรทำให้เกิดปัญหาน้อยลงในการเข้าถึงแบบอ่านอย่างเดียว แต่มารอยู่ในรายละเอียด
babou
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.