การเขียนการจัดสรรหน่วยความจำ
ตัวอย่างสำหรับการจัดสรรหน่วยความจำใน C
หน่วยความจำจัดสรร 101 - เขียนตัวจัดสรรหน่วยความจำอย่างง่าย
void * malloc ( size_t size );
void free ( void * ptr );
Block * merge_blocks ( Block * block );
// the above three will be implemented first later calloc and realloc กำหนดโครงสร้างข้อมูล : คุณจะต้องมีโครงสร้างข้อมูลเพื่อติดตามขนาดและสถานะการจัดสรรของแต่ละบล็อก นี่อาจเป็นโครงสร้างที่เรียบง่ายที่มีขนาดและธงที่ระบุว่าบล็อกนั้นฟรีหรือไม่
เริ่มต้นฮีป : เมื่อโปรแกรมของคุณเริ่มต้นคุณจะต้องจัดสรรหน่วยความจำก้อนเพื่อทำหน้าที่เป็นกองของคุณ สามารถทำได้โดยใช้การโทรระบบ mmap()
ใช้ malloc() : ฟังก์ชั่นนี้ควรหาบล็อกฟรีที่มีขนาดใหญ่พอที่จะตอบสนองคำขอ หากไม่มีบล็อกดังกล่าวควรเพิ่มขนาดของกอง เมื่อพบบล็อกที่เหมาะสมควรทำเครื่องหมายว่าจัดสรรและที่อยู่กลับมา
ใช้งาน free() : ฟังก์ชั่นนี้ควรใช้ตัวชี้ไปยังบล็อกของหน่วยความจำทำเครื่องหมายเป็นฟรีและอาจลดขนาดของกองหากบล็อกอิสระอยู่ที่ท้าย
ใช้งาน realloc() : ฟังก์ชั่นนี้ควรปรับขนาดบล็อกที่จัดสรร สิ่งนี้อาจเกี่ยวข้องกับการค้นหาบล็อกใหม่และคัดลอกข้อมูลเก่า
จัดการการกระจายตัว : เมื่อเวลาผ่านไปกองสามารถแยกส่วนด้วยบล็อกฟรีที่กระจัดกระจายไปทั่ว คุณอาจต้องการใช้กลยุทธ์สำหรับการจัดเรียงกลุ่มกองเช่นการรวมตัวกันของบล็อกฟรีที่อยู่ติดกัน
ในบริบทของการจัดสรรกอง "บล็อก" หมายถึงชิ้นหน่วยความจำภายในกอง นี่คือเหตุผลที่คุณต้องการพวกเขาและวิธีการทำงาน:
ทำไมต้องบล็อก? : เมื่อคุณจัดการหน่วยความจำมันจะมีประโยชน์ในการแบ่งออกเป็นชิ้นที่จัดการได้หรือ "บล็อก" แต่ละบล็อกสามารถจัดสรรและจัดการอย่างอิสระ สิ่งนี้ช่วยให้การใช้หน่วยความจำมีประสิทธิภาพเนื่องจากคุณสามารถจัดสรรหน่วยความจำได้มากเท่าที่คุณต้องการไม่มากและไม่น้อย
โครงสร้างบล็อก : แต่ละบล็อกมักจะมีข้อมูลเมตาเกี่ยวกับบล็อก (เช่นขนาดของมันและไม่ว่าจะเป็นฟรีหรือจัดสรร) และข้อมูลจริงที่เก็บไว้ในบล็อก เมตาดาต้าถูกใช้โดยผู้จัดสรรเพื่อจัดการหน่วยความจำ
การจัดสรร : เมื่อคุณโทรหา malloc() ผู้จัดสรรจะมองหาบล็อกฟรีที่มีขนาดใหญ่พอที่จะเก็บจำนวนข้อมูลที่ร้องขอ หากพบหนึ่งมันจะทำเครื่องหมายที่บล็อกว่าจัดสรรและส่งคืนตัวชี้ไปยังส่วนข้อมูลของบล็อก
DEALLOCATION : เมื่อคุณโทร free() ผู้จัดสรรทำเครื่องหมายบล็อกเป็นฟรีทำให้พร้อมสำหรับการจัดสรรในอนาคต หากบล็อกอิสระอยู่ที่ปลายกองผู้จัดสรรอาจลดขนาดของกองเพื่อเพิ่มหน่วยความจำให้เพิ่มขึ้น
การกระจายตัว : เมื่อเวลาผ่านไปเมื่อมีการจัดสรรบล็อกและจัดการที่วางไว้กองสามารถแยกส่วน ซึ่งหมายความว่าหน่วยความจำอิสระแบ่งออกเป็นบล็อกขนาดเล็กที่ไม่ต่อเนื่องกัน สิ่งนี้สามารถทำให้ยากที่จะหาบล็อกขนาดใหญ่พอสำหรับการโทร malloc() แม้ว่าจะมีหน่วยความจำฟรีทั้งหมดเพียงพอ ในการจัดการสิ่งนี้การจัดสรรมักจะรวมถึงตรรกะเพื่อ defragment กองเช่นการรวมตัวกันของบล็อกฟรีที่อยู่ติดกัน