มีใครสามารถอธิบายแผนภาพนี้เกี่ยวกับการจัดสรร Slab ได้หรือไม่?


10

ฉันพยายามเข้าใจว่า Slab Allocation ทำงานอย่างไรและเหตุใดจึงแตกต่างหรือดีกว่าการจัดเพจทั่วไป

ฉันพบแผนภาพนี้ซึ่งฉันเชื่อว่าจะมีประโยชน์หากมีคำอธิบายเพิ่มเติม

บางคำถาม:

  • รายการ 3KB และ 7KB หมายถึงอะไร พวกเขาจะต้องเกี่ยวข้องอย่างใด? ทำไมพวกเขาถึงทำแบบนั้น?
  • ในคอลัมน์แคชกล่องสีเทาหรือกล่องสีขาว / สีน้ำเงินภายในกล่องสีเทาหรือไม่ กล่องสีเทาเป็นแพ็คเกจของแคชหรือไม่
  • แผ่นพื้นเป็นเพียงกล่องสีน้ำเงินหรือเป็น "แผ่นที่อยู่ติดกันทางกายภาพ" ทั้งหมดหรือไม่

ฉันขอขอบคุณความช่วยเหลือ ขอบคุณ!

การจัดสรรพื้น

คำตอบ:


15

ฉันเห็นว่าทำไมคุณถึงสับสน แผนภาพมีความสับสนเล็กน้อยและอาจไม่ถูกต้องจริง

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

หน้าคือ "หน่วย" ทั่วไปของการดำเนินงานหน่วยความจำ เมื่อแอปพลิเคชันพื้นที่ผู้ใช้จัดสรรหน่วยความจำหรือหน่วยความจำแมปไฟล์หรืออะไรทำนองนั้นโดยทั่วไปจะได้รับขนาดหน้ากระดาษหลายขนาด มีข้อยกเว้นบางอย่างที่น่าสังเกต Windows ใช้ 64k เป็นหน่วยการจัดสรรหน่วยความจำเสมือนไม่ว่าขนาดหน้าของ CPU คืออะไร อย่างไรก็ตามลองคิดแบบนี้

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

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

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

ตัวอย่างเช่นวัตถุที่แสดงถึงข้อมูลประจำตัวความปลอดภัยของกระบวนการ (คิดว่า ID ผู้ใช้และกลุ่ม id ใน POSIX พูด) อาจเป็นเพียง 16 ไบต์หรือดังนั้นในขณะที่ "กระบวนการ" หรือ "ด้าย" อาจขึ้นอยู่กับ ขนาด 1kb เห็นได้ชัดว่าคุณไม่ต้องการใช้ทั้งหน้าสำหรับบันทึกขนาดเล็กเหล่านี้ดังนั้นแนวคิดคือการใช้ตัวจัดสรรที่ด้านบนของหน้า

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

โครงสร้างข้อมูลบางอย่างมี "แคชเหมือน" โดยเนื้อแท้ ตัวอย่างเช่นระบบปฏิบัติการหลายระบบรักษาแคชของชื่อพา ธ ไปยังอ็อบเจ็กต์ระบบไฟล์เพื่อหลีกเลี่ยงการโยงของการค้นหาไดเรกทอรี (เรียกว่า "แคชชื่อ" หรือ "แคชชื่อ" ใน Unix-speak) วัตถุเหล่านี้จำเป็นสำหรับการทำงานเท่านั้นไม่ใช่ความถูกต้องดังนั้นคุณทำได้ (ในทางทฤษฎี) เพียงลืมทั้งหน้าเต็มของรายการหากหน่วยความจำแน่นและคุณต้องเพิ่มเฟรมหน้าอย่างรวดเร็ว

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

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

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

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

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

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

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

แผ่นพื้นบางส่วนอาจเป็นที่น่าสนใจที่สุดเนื่องจากตัวจัดสรรพื้นที่เก็บรักษารายการฟรีสำหรับแผ่นพื้นบางส่วนทั้งหมด (แผ่นพื้นแบบเต็มและแผ่นพื้นที่ว่างเปล่าไม่จำเป็นต้องมีรายการฟรี) วัตถุได้รับการจัดสรรจากแผ่นพื้นบางส่วนก่อน (และอาจมาจากแผ่นบางส่วนที่ "เต็ม" ส่วนใหญ่ก่อน) เพื่อพยายามหลีกเลี่ยงการจัดสรรหน้าเว็บที่ไม่จำเป็น

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

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

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

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

เพื่อสนับสนุนการจัดสรรวัตถุประสงค์ทั่วไป (เช่นอาร์เรย์ที่มีขนาดไม่เป็นที่รู้จักที่รวบรวมเวลา) ส่วนใหญ่ระบบปฏิบัติการ macrokernel ชนิดยังมีแคชซึ่งเป็นตัวแทนของวัตถุขนาดมากกว่าวัตถุประเภท ตัวอย่างเช่น FreeBSD รักษาแคชไว้สำหรับวัตถุที่ไม่รู้จักซึ่งมีขนาดเป็นพลังของ 2 ไบต์จาก 4 ถึง 256

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

ฉันหวังว่านี่จะช่วยได้. แจ้งให้เราทราบหากมีสิ่งใดต้องการคำชี้แจง


6

แนวคิดภายใต้ตัวจัดสรร slab คือระบบปฏิบัติการต้องการโครงสร้างข้อมูลที่ค่อนข้างเฉพาะ (เช่นโครงสร้าง PCB, เซมาฟอร์, เมทาดาทาไฟล์เป็นต้น) ที่แนะนำการใช้หน่วยความจำที่จำเป็นสำหรับพวกเขา

อัลกอริทึม Slab allocator จัดเตรียมสต็อคของพื้นที่หน่วยความจำที่ขนาดและการกำหนดค่าเริ่มต้นถูกปรับให้เหมาะสมสำหรับโครงสร้างข้อมูลมาตรฐานเหล่านี้ ตัวอย่างเช่นที่คุณเห็นจากรูปภาพสามารถมีวัตถุ 3kb รวมถึงวัตถุ 7kb อย่างไรก็ตามเรารู้ว่าเคอร์เนลจัดสรรหน่วยความจำเป็นทวีคูณของขนาดหน้า

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

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

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