เมื่อใช้เป็นสแต็กการโทรสปาเก็ตตี้ที่ไม่มีขยะจะกลายเป็น DAG หรือไม่?


9

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

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

แต่ความเข้าใจของฉันเกี่ยวกับการใช้งานนี้ค่อนข้างคลุมเครือดังนั้นฉันคิดว่าฉันอาจจะพลาดอะไรบางอย่างไป ฉันหวังว่าใครบางคนสามารถสอนฉันที่นี่ใน "spaghetti call stacks" ซึ่งฉันหมายถึงโครงสร้างข้อมูลที่ใช้ใน Scheme และ / หรือ SML / NJ เพื่อนำกระบวนการ CPS ไปใช้

  1. รับสายสปาเก็ตตี้ดังต่อไปนี้:

    [exit point] <-- ... <-- [frame A] <-- [frame B (active)]
                                    ^
                                     `---- [frame C]
    

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

  2. แทนที่จะเป็นสถานการณ์ก่อนหน้านี้ฉันคิดว่าสถานการณ์ไร้ขยะต่อไปนี้อาจเกิดขึ้น:

    [exit point] <-- ... <-- [frame W] <-- [frame X] <-- [frame Z (active)]
                                    ^                     |
                                     `---- [frame Y] <---´
    

    ตัวอย่างเช่นฉันสามารถจินตนาการว่าเฟรม Z เป็นฟังก์ชันการตัดสินใจบางอย่างซึ่งดำเนินการต่อด้วยเฟรม X หรือเฟรม Y (ซึ่งจะกลับไปเป็น W) ซึ่งหมายความว่าการโทรแบบสปาเก็ตตี้ไม่ได้เป็น " ต้นไม้พอยน์เตอร์หลัก "

  3. อย่างไรก็ตามฉันไม่สามารถจินตนาการถึงสถานการณ์ใด ๆ ที่สามารถสร้างลูปได้ ใช้สถานการณ์ต่อไปนี้ตัวอย่างเช่น:

    [exit point] <-- ... <-- [frame P] --> [frame Q (active)]
                                    ^             |
                                    |             v
                                     `---- [frame R]
    

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

จากการสังเกตเหล่านี้ฉันต้องสรุปว่าสายสปาเก็ตตี้ (ไม่มีขยะ) เป็น DAG ถูกต้องหรือไม่ หรือฉันเข้าใจผิดวัตถุประสงค์ของโครงสร้างข้อมูลนี้


ปรับปรุง:

  • ฉันอ่านสำเนาของเอกสารต่อไปนี้ผ่านทาง:

    EA Hauck และ BA Dent พ.ศ. 2511 กลไกสแต็ค B6500 / B7500 ของ Burroughs ในการดำเนินการของวันที่ 30 เมษายน - 2 พฤษภาคม 1968 การประชุมคอมพิวเตอร์ร่วมฤดูใบไม้ผลิ (AFIPS '68 (ฤดูใบไม้ผลิ)) พลอากาศเอกนิวยอร์กนิวยอร์กสหรัฐอเมริกา 245-251 DOI = http://dx.doi.org/10.1145/1468075.1468111

    บทความนี้ดูเหมือนจะกำหนดระบบ Suguaro Stack เมื่อปรากฎว่าระบบ Suguaro Stack นี้เป็น call stack แบบดั้งเดิมที่อนุญาตให้ "งาน" หลายรายการสามารถเดินผ่านเฟรมของสแต็กที่แบ่งใช้บางส่วนได้ มันไม่เกี่ยวข้องกับการต่อเนื่องอย่างแน่นอน

  • บทความต่อไปนี้ (และเอกสารฉบับเต็ม 1996) อธิบายว่าเกิดอะไรขึ้นในคอมไพเลอร์ SML / NJ:

    Zhong Shao และ Andrew W. Appel 2000. การแปลงปิดอย่างมีประสิทธิภาพและปลอดภัยสำหรับพื้นที่ ACM Trans โปรแกรม. หรั่ง Syst 22, 1 (มกราคม 2000), 129-161 DOI = http://dx.doi.org/10.1145/345099.345125

    ฉันคิดว่าฉันควรอ่านบทความนี้ ( คัดลอกบนเว็บไซต์ของผู้เขียน ) ก่อนที่จะทำสิ่งใดกับคำถามนี้ แนวคิด "Safely Linked Closures" นั้นคล้ายกับระบบ Suguaro Stack มากซึ่งมันตื้นมากและมีจุดประสงค์เพื่อแบ่งปันตัวแปรอิสระเท่านั้น:

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

    บทความนี้ยังกล่าวอย่างชัดเจนว่ามันไม่ได้ใช้ "runtime stack ใด ๆ ":

    แต่เราจะปฏิบัติกับเร็กคอร์ดการเปิดใช้งานทั้งหมดเพื่อปิดฟังก์ชั่นความต่อเนื่องและจัดสรรให้ในการลงทะเบียนในฮีป

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


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

คำตอบ:


2

สปาเก็ตตี้เรียงกันเป็นต้นไม้พ่อแม่ - พอยน์เตอร์หรือไม่

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

แต่ละกระบวนการในระบบจะมีหนึ่งในรายการเหล่านี้ซึ่งแสดงถึงกองควบคุมของมัน ส่วนหัวของรายการอยู่ด้านบนสุดของสแต็ก (เช่นเฟรมที่ใช้งานอยู่) nextตัวชี้มันอ้างอิงเฟรมหลัก

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

สปาเก็ตตี้เรียงเป็น DAG หรือไม่?

เนื่องจากกองสปาเก็ตตี้เป็นต้นไม้หลักตัวชี้จึงเป็น DAG แต่มีเพียง DAG ที่เป็นต้นไม้เท่านั้นที่สามารถเป็นกองสปาเก็ตตี้ได้ ดังนั้นไม่สปาเก็ตตี้ไม่สร้าง DAG ที่ไม่ใช่ต้นไม้

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

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