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

ในวิศวกรรมคอมพิวเตอร์รีจิสเตอร์วินโดว์เป็นคุณลักษณะที่จัดสรรรีจิสเตอร์ให้กับซับรูทีนโดยการกำหนดชื่อแทนแบบไดนามิกให้กับกลุ่มย่อยของรีจิสเตอร์ภายในไปยังรีจิสเตอร์คงที่ที่โปรแกรมเมอร์มองเห็นได้ รีจิสเตอร์วินโดว์ถูกนำมาใช้เพื่อปรับปรุงประสิทธิภาพของโปรเซสเซอร์โดยการลดจำนวน การดำเนินการ บนสแต็ก ที่จำเป็นสำหรับการเรียกฟังก์ชันและการส่งคืนค่า รีจิสเตอร์ วินโดว์ เป็นหนึ่งในคุณลักษณะที่มีอิทธิพลมากที่สุดของ การออกแบบ RISC ของเบิร์กลีย์และต่อมาได้ถูกนำไปใช้ในสถาปัตยกรรมชุดคำสั่งต่างๆเช่นAMD Am29000 , Intel i960 , Sun Microsystems SPARCและ Intel Itanium
การดำเนินงานทั่วไป
มีการจัดเตรียมรีจิสเตอร์หลายชุดไว้สำหรับส่วนต่างๆ ของโปรแกรม รีจิสเตอร์เหล่านี้ถูกซ่อนไว้จากโปรแกรมเมอร์โดยเจตนา เพื่อบังคับให้ซับรูทีนหลายๆ ตัวใช้ทรัพยากรโปรเซสเซอร์ร่วมกัน
การทำให้รีจิสเตอร์มองไม่เห็นสามารถทำได้อย่างมีประสิทธิภาพ โดยซีพียูจะรับรู้การเปลี่ยนจากส่วนหนึ่งของโปรแกรมไปยังอีกส่วนหนึ่งระหว่างการเรียกใช้ฟังก์ชัน การดำเนินการนี้ทำได้โดยใช้คำสั่งจำนวนเล็กน้อย ( ส่วนนำ )และจบลงด้วยคำสั่งจำนวนเล็กน้อยเช่นกัน ( ส่วนท้าย )ในการออกแบบของเบิร์กลีย์ การเรียกใช้ฟังก์ชันเหล่านี้จะทำให้รีจิสเตอร์ชุดใหม่ถูก "สลับเข้ามา" ณ จุดนั้น หรือถูกทำเครื่องหมายว่า "เสีย" (หรือ "นำกลับมาใช้ใหม่ได้") เมื่อการเรียกใช้ฟังก์ชันสิ้นสุดลง
การประยุกต์ใช้ในซีพียู
ในการออกแบบ RISC ของเบิร์กลีย์ มีเพียง 8 รีจิสเตอร์จากทั้งหมด 64 ตัวเท่านั้นที่โปรแกรมสามารถมองเห็นได้ ชุดรีจิสเตอร์ทั้งหมดเรียกว่าไฟล์รีจิสเตอร์และชุดรีจิสเตอร์ 8 ตัวใดชุดหนึ่งเรียกว่าหน้าต่างไฟล์นี้อนุญาตให้มีการเรียกใช้ฟังก์ชันได้สูงสุด 8 ครั้ง โดยแต่ละครั้งจะมีชุดรีจิสเตอร์ของตนเอง ตราบใดที่โปรแกรมไม่เรียกใช้ฟังก์ชันต่อเนื่องกันเกิน 8 ครั้ง รีจิสเตอร์ก็ไม่จำเป็นต้อง ถูก บันทึกไปยังหน่วยความจำหลักหรือแคช ซึ่งเป็นกระบวนการที่ช้ากว่าการเข้าถึงรีจิสเตอร์
เมื่อเปรียบเทียบกันแล้ว สถาปัตยกรรม SPARC ของSun Microsystems ให้การมองเห็นพร้อมกันไปยังชุดรีจิสเตอร์สี่ชุด ชุดละแปดรีจิสเตอร์ โดยสามชุด ชุดละแปดรีจิสเตอร์นั้นถูก "แบ่งเป็นหน้าต่าง" รีจิสเตอร์แปดตัว (i0 ถึง i7) เป็นรีจิสเตอร์อินพุตสำหรับระดับขั้นตอนปัจจุบัน รีจิสเตอร์แปดตัว (L0 ถึง L7) เป็นรีจิสเตอร์เฉพาะที่ระดับขั้นตอนปัจจุบัน และรีจิสเตอร์แปดตัว (o0 ถึง o7) เป็นรีจิสเตอร์เอาต์พุตจากระดับขั้นตอนปัจจุบันไปยังระดับถัดไปที่เรียกใช้ เมื่อมีการเรียกใช้ขั้นตอน หน้าต่างรีจิสเตอร์จะเลื่อนไปสิบหกรีจิสเตอร์ ซ่อนรีจิสเตอร์อินพุตและรีจิสเตอร์เฉพาะที่เดิม และทำให้รีจิสเตอร์เอาต์พุตเดิมกลายเป็นรีจิสเตอร์อินพุตใหม่ รีจิสเตอร์ทั่วไป (รีจิสเตอร์เอาต์พุตเดิมและรีจิสเตอร์อินพุตใหม่) ใช้สำหรับการส่งผ่านพารามิเตอร์ สุดท้าย รีจิสเตอร์แปดตัว (g0 ถึง g7) สามารถมองเห็นได้ทั่วโลกสำหรับทุกระดับขั้นตอน
โปรเซสเซอร์ AMD 29000 ปรับปรุงการออกแบบโดยอนุญาตให้หน้าต่างมีขนาดแปรผันได้ ซึ่งช่วยในการใช้ประโยชน์ในกรณีทั่วไปที่ต้องการรีจิสเตอร์น้อยกว่าแปดตัวสำหรับการเรียกใช้ฟังก์ชัน นอกจากนี้ยังแยกรีจิสเตอร์ออกเป็นชุดส่วนกลาง 64 ตัว และอีก 128 ตัวสำหรับหน้าต่าง ในทำนองเดียวกัน สถาปัตยกรรม IA-64 (Itanium) ก็ใช้หน้าต่างขนาดแปรผัน โดยมีรีจิสเตอร์ส่วนกลาง 32 ตัว และรีจิสเตอร์สำหรับหน้าต่าง 96 ตัว
ใน สถาปัตยกรรม Infineon C166รีจิสเตอร์ส่วนใหญ่เป็นเพียงตำแหน่งใน RAM ภายในที่มีคุณสมบัติเพิ่มเติมคือสามารถเข้าถึงได้ในฐานะรีจิสเตอร์ ในบรรดารีจิสเตอร์เหล่านี้ ที่อยู่ของรีจิสเตอร์อเนกประสงค์ 16 ตัว (R0-R15) ไม่ได้ถูกกำหนดตายตัว แต่รีจิสเตอร์ R0 จะอยู่ที่ที่อยู่ซึ่งชี้โดยรีจิสเตอร์ "Context Pointer" (CP) และรีจิสเตอร์อีก 15 ตัวที่เหลือจะตามมาตามลำดับ[ 1 ]
หน้าต่างรีจิสเตอร์ยังช่วยให้การอัปเกรดทำได้ง่ายอีกด้วย เนื่องจากรีจิสเตอร์เพิ่มเติมเหล่านี้มองไม่เห็นในโปรแกรม จึงสามารถเพิ่มหน้าต่างเพิ่มเติมได้ตลอดเวลา ตัวอย่างเช่น การใช้การเขียนโปรแกรมเชิงวัตถุมักส่งผลให้มีการเรียกใช้ "ขนาดเล็ก" มากขึ้น ซึ่งสามารถรองรับได้โดยการเพิ่มหน้าต่างจากแปดเป็นสิบหก เป็นต้น นี่คือแนวทางที่ใช้ใน SPARC ซึ่งได้รวมหน้าต่างรีจิสเตอร์จำนวนมากขึ้นไว้ในสถาปัตยกรรมรุ่นใหม่ๆ ผลลัพธ์ที่ได้คือ การดำเนินการ เติมและระบาย หน้าต่างรีจิสเตอร์ที่ช้าลดลง เนื่องจากหน้าต่างรีจิสเตอร์ล้นน้อยลง
ใน GPU
กลไก Register windows เป็นกลไกที่ใช้กันอย่างแพร่หลายใน GPU โดยเฉพาะใน Execution Units ที่ทำหน้าที่ประมวลผลเธรดทั่วไป ตัวอย่างเช่น ในสถาปัตยกรรม GenX ของ Intel แต่ละ Execution Units ("cores") ที่ทำงานแบบขนานจำนวนมากจะมีไฟล์ register ของตัวเอง ซึ่งประกอบด้วย register ทั่วไปทางกายภาพ (เช่น) 256 ตัว แต่ละเธรดที่สร้างขึ้นบน core จะเข้าถึง register window ของตัวเองด้วยดัชนีแบบ zero-based ซึ่งฮาร์ดแวร์จะแมปไปยังชุด register ทางกายภาพที่ต่อเนื่องกันในไฟล์ register ของ core นั้น แต่ละ window อาจประกอบด้วยจำนวน register ที่แตกต่างกันไปขึ้นอยู่กับฟังก์ชันที่เธรดใช้งาน แต่โดยปกติจะจำกัดไม่เกินครึ่งหนึ่งของจำนวน register ทางกายภาพในไฟล์ เพื่อให้ (อย่างน้อย) เธรดที่สองสามารถรับช่วงต่อ core ที่ว่างอยู่ได้ทันทีเมื่อเธรดที่กำลังทำงานอยู่ก่อนหน้านี้ต้องหยุดชะงักด้วยเหตุผลบางอย่าง (โดยปกติเพื่อสื่อสารกับบัฟเฟอร์หน่วยความจำภายนอก)
การวิจารณ์
ข้อเสียของหน้าต่างรีจิสเตอร์คือ การสลับบริบทจำเป็นต้องบันทึกรีจิสเตอร์จำนวนมากไว้ในหน่วยความจำ การใช้งาน SPARC จะเลื่อนหน้าต่างรีจิสเตอร์ไปข้างหน้า 16 รีจิสเตอร์เสมอ ซึ่งหมายความว่าเมื่อเกิดเหตุการณ์นี้ รีจิสเตอร์ที่บันทึกไว้จำนวนมากอาจไม่มีข้อมูลที่เป็นประโยชน์ บางคนวิจารณ์การศึกษาดั้งเดิมที่นำไปสู่การใช้งานหน้าต่างรีจิสเตอร์ว่าพิจารณาเฉพาะโปรแกรมแบบแยกเดี่ยวและละเลยภาระงานมัลติทาสก์[ 2 ]
การใช้หน้าต่างรีจิสเตอร์ไม่ใช่หนทางเดียวในการปรับปรุงประสิทธิภาพของรีจิสเตอร์ กลุ่มที่ออกแบบMIPS ที่ มหาวิทยาลัยสแตนฟอร์ดได้เห็นงานของเบิร์กลีย์และตัดสินใจว่าปัญหาไม่ได้อยู่ที่การขาดแคลนรีจิสเตอร์ แต่เป็นการใช้รีจิสเตอร์ที่มีอยู่อย่างไม่มีประสิทธิภาพ พวกเขาจึงลงทุนเวลามากขึ้นในการจัดสรรรีจิสเตอร์ของคอมไพเลอร์เพื่อให้แน่ใจว่าได้ใช้ชุดรีจิสเตอร์ขนาดใหญ่ที่มีอยู่ใน MIPS อย่างชาญฉลาด ส่งผลให้ความซับซ้อนของชิปลดลง โดยมีจำนวนรีจิสเตอร์ทั้งหมดลดลงครึ่งหนึ่ง ในขณะที่อาจให้ประสิทธิภาพที่สูงขึ้นในกรณีที่กระบวนการเดียวสามารถใช้พื้นที่รีจิสเตอร์ที่มองเห็นได้ขนาดใหญ่กว่า ในที่สุด ด้วยคอมไพเลอร์สมัยใหม่ MIPS จึงใช้พื้นที่รีจิสเตอร์ได้อย่างมีประสิทธิภาพมากขึ้นแม้ในระหว่างการเรียกใช้กระบวนการ
อ่านเพิ่มเติม
- Frantzen, Mike; Shuey, Mike (2001). "StackGhost: การป้องกัน Stack ด้วยฮาร์ดแวร์" . รายงานการประชุมสัมมนาความปลอดภัย Usenix ครั้งที่ 10 . USENIX . หน้า 55– 66 . สืบค้นเมื่อ27 สิงหาคม 2010 .
- Magnusson, Peter (เมษายน 1997). "การทำความเข้าใจสแต็กและรีจิสเตอร์ในสถาปัตยกรรม Sparc" . สืบค้นเมื่อ27 สิงหาคม 2010 .
{{cite web}}: CS1 maint: deprecated archival service (link) - มุลเลอร์, แฟรงค์. "setjmp/longjmp" .อภิปรายเกี่ยวกับการใช้งาน Sparc ที่ซับซ้อนอันเนื่องมาจากการใช้ฟังก์ชันหน้าต่าง