ความหมายของคำศัพท์ที่เกี่ยวข้องกับความจำคืออะไร?


103

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

"ตัวอย่างถัดไปของการทำให้เป็นอนุกรมประกอบด้วยกลยุทธ์ที่เรียกว่าการจัดสรรหน่วยความจำจากเวทีเฉพาะ"

"... สิ่งนี้มีประโยชน์เมื่อจัดการกับการรั่วไหลของหน่วยความจำหรือเมื่อจัดสรรจากอารีน่าเฉพาะ"

"... ถ้าเราต้องการ deallocate หน่วยความจำแล้วเราจะ deallocate ทั้งเวที ."

ผู้เขียนใช้คำว่า 100 กว่าครั้งในหนึ่งบท คำจำกัดความเดียวในอภิธานศัพท์คือ:

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

ใครสามารถกำหนดเวทีให้ฉันด้วยบริบทเหล่านี้?


ชื่อหนังสืออะไร
yaobin

1
@yaobin Memory เป็นแนวคิดการเขียนโปรแกรมใน C และ C ++ โดย Frantisek Franek
Nocturno

คำตอบ:


113

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

char * arena = malloc(HUGE_NUMBER);

unsigned int current = 0;

void * my_malloc(size_t n) { current += n; return arena + current - n; }

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

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

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


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

13
@AndreasHaferburg: ตัวจัดสรรหน่วยความจำจากไลบรารีมาตรฐานโดยอัตโนมัติมีข้อได้เปรียบอย่างมากในการเขียนแบบกำหนดเองของคุณเองกล่าวคือคุณไม่จำเป็นต้องเขียน / ทดสอบ / แก้จุดบกพร่อง / บำรุงรักษา ฯลฯ แม้ว่าคุณจะแน่ใจโดยไม่มีหลักฐานว่าคุณ สามารถปรับปรุงประสิทธิภาพได้โดยการจัดการการจัดสรรของคุณเองคุณยังต้องมีหลักฐานที่ดีก่อนที่จะตัดสินใจว่าการปรับปรุงนี้คุ้มค่ากับการแลกเปลี่ยน
ruakh

18
@ruakh ฉันไม่ชอบความคิดเกี่ยวกับลัทธิขนส่งสินค้าที่ทำซ้ำเป็นล้าน ๆ ครั้งในทุกที่ในฐานะ "เทพแห่ง C ++ มอบให้เราจึงต้องใช้" และสิ่งที่ฉันชอบ: "มันคือเวทมนตร์" ไม่มันไม่ใช่เวทมนตร์ เป็นเพียงอัลกอริทึมที่ง่ายมากจนแม้แต่คอมพิวเตอร์ก็สามารถเรียกใช้งานได้ ในหนังสือของฉันมันค่อนข้างห่างไกลจากเวทมนตร์ ฉันเดา: คุณประเมินว่าการจัดสรรหน่วยความจำที่ส่งผลกระทบต่อประสิทธิภาพการทำงานต่ำเกินไปและประเมินค่าสูงเกินไปว่าโดยสิ้นเชิงมีความซับซ้อนเพียงใด ประสิทธิภาพสำคัญกว่าเวลาของนักพัฒนาหรือไม่เป็นการตัดสินใจทางธุรกิจที่ไม่มีจุดหมายที่จะพูดคุยเกี่ยวกับ SO
Andreas Haferburg

8
@AndreasHaferburg: แน่นอนว่า tcmalloc ใช้อัลกอริทึมเฉพาะบางอย่างและแนวคิดเบื้องหลังนั้นง่ายพอที่จะอธิบายได้ แต่การนำไปใช้งานยังคงซับซ้อนและไม่สำคัญ สิ่งสำคัญที่สุดคือต้องใช้ความรู้เฉพาะแพลตฟอร์มเพื่อให้การจัดลำดับหน่วยความจำถูกต้อง ฉันใช้ "เวทมนตร์" สำหรับสิ่งที่ผู้ใช้ไม่สามารถเขียนแบบพกพาได้เลย (เช่น mutex ที่มีประสิทธิภาพหรือ tcmalloc หรือชื่อประเภทของแลมบ์ดา) หรือเฉพาะกับความกล้าหาญที่รุนแรง (เช่น std :: function); ฉันไม่ได้หมายความว่า "ไม่เข้าใจ"
Kerrek SB

12
@AndreasHaferburg: และคำแนะนำสุดท้ายของฉันไม่ได้บอกมากนักว่าโดยหลักการแล้วมันยากที่จะ "รู้ดีกว่าค่าเริ่มต้น" แต่ค่าใช้จ่ายในการบำรุงรักษาโซลูชันที่กำหนดเองนั้นสูง (ต้องมีคนเขียนจัดทำเอกสารให้ได้ ถูกต้องและคนอื่นต้องแก้ไขข้อบกพร่องและทุกคนจะต้องตรวจสอบและยืนยันสมมติฐานเดิมอีกครั้งเมื่อการใช้งานแพร่กระจาย) และคุณต้องมีหลักฐานเพื่อพิสูจน์ค่าใช้จ่ายนั้น
Kerrek SB

10

ฉันจะตอบข้อนี้เป็นคำตอบที่เป็นไปได้

•Memory Arena (also known as break space)--the area where dynamic runtime memory is stored. The memory arena consists of the heap and unused memory. The heap is where all user-allocated memory is located. The heap grows up from a lower memory address to a higher memory address.

ฉันจะเพิ่มคำพ้องความหมายของ Wikipedia : ภูมิภาคโซนเวทีพื้นที่หรือบริบทหน่วยความจำ

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


5

คิดว่ามันเป็นคำพ้องความหมายของ 'heap' โดยปกติกระบวนการของคุณจะมีฮีป / เวทีเดียวเท่านั้นและการจัดสรรหน่วยความจำทั้งหมดจะเกิดขึ้นจากที่นั่น

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

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


5

จากhttp://www.bozemanpass.com/info/linux/malloc/Linux_Heap_Contention.html :

ไลบรารีที่ใช้ร่วมกัน libc.so.x มีคอมโพเนนต์ glibc และฮีปโค้ดอยู่ภายใน การใช้งานฮีปในปัจจุบันใช้ฮีปย่อยอิสระหลายตัวที่เรียกว่า arenas แต่ละเวทีมี mutex ของตัวเองสำหรับการป้องกันการทำงานพร้อมกัน ดังนั้นหากมีพื้นที่เพียงพอภายในกระบวนการ 'ฮีปและกลไกในการกระจายการเข้าถึงฮีปของเธรดอย่างเท่าเทียมกันระหว่างพวกเขาความเป็นไปได้ในการโต้แย้งสำหรับ mutexes ควรมีน้อยที่สุด ปรากฎว่าสิ่งนี้ใช้ได้ดีสำหรับการจัดสรร ใน malloc () มีการทดสอบเพื่อดูว่า mutex สำหรับเวทีเป้าหมายปัจจุบันสำหรับเธรดปัจจุบันว่างหรือไม่ (trylock) ถ้าเป็นเช่นนั้นเวทีจะถูกล็อคและการจัดสรรจะดำเนินต่อไป หาก mutex ไม่ว่างแต่ละอารีน่าที่เหลือจะถูกลองและใช้หาก mutex ไม่ว่าง ในกรณีที่ไม่สามารถล็อกอารีน่าได้โดยไม่มีการปิดกั้นจะมีการสร้างอารีน่าใหม่ขึ้นมา เวทีนี้ตามคำจำกัดความยังไม่ได้ล็อคดังนั้นการจัดสรรสามารถดำเนินการต่อไปได้โดยไม่ต้องปิดกั้น สุดท้าย ID ของอารีน่าที่เธรดใช้ล่าสุดจะถูกเก็บไว้ในที่จัดเก็บเธรดโลคัลและต่อมาถูกใช้เป็นอารีน่าแรกเพื่อลองเมื่อ malloc () ถูกเรียกโดยเธรดนั้น ดังนั้นการโทรไปยัง malloc () ทั้งหมดจะดำเนินการโดยไม่มีการปิดกั้น

คุณสามารถอ้างถึงลิงค์นี้:

http://www.codeproject.com/Articles/44850/Arena-Allocator-DTOR-and-Embedded-Preallocated-Buf


3
FYI เมื่อโพสต์ลิงก์คุณควรโพสต์สรุปเพื่อที่ว่าหากบทความที่เชื่อมโยงหายไปโพสต์ของคุณก็ยังมีประโยชน์
stonemetal

5
ดูเหมือนว่าจะเป็นการคัดลอกวางจากbozemanpass.com/info/linux/malloc/Linux_Heap_Contention.htmlโปรดให้เครดิตแหล่งที่มาของคุณเมื่อคุณใช้คำต่อคำ
jscs
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.