Memory management
Memory management (also dynamic memory management, dynamic storage allocation, or dynamic memory allocation) is a form of resource management applied to computer memory. The essential requirement of memory management is to provide ways to dynamically allocate portions of memory to programs at their request, and free it for reuse when no longer needed. This is critical to any advanced computer system where more than a single process might be underway (multitasking) at any time.[1]
Several methods have been devised that increase the effectiveness of memory management. Virtual memory systems separate the memory addresses used by a process from actual physical addresses, allowing separation of processes and increasing the size of the virtual address space beyond the available amount of RAM using paging or swapping to secondary storage. The quality of the virtual memory manager can have an extensive effect on overall system performance. The system allows a computer to appear as if it may have more memory available than physically present, thereby allowing multiple processes to share it.
In some operating systems, e.g. Burroughs/Unisys MCP,[2] and OS/360 and successors,[3] memory is managed by the operating system.[note 1] In other operating systems, e.g. Unix-like operating systems, memory is managed at the application level.
Memory management within an address space is generally categorized as either manual memory management or automatic memory management.
Manual memory management

The task of fulfilling an allocation request consists of locating a block of unused memory of sufficient size. Memory requests are satisfied by allocating portions from a large pool[note 2] of memory called the heap[note 3] or free store. At any given time, some parts of the heap are in use, while some are "free" (unused) and thus available for future allocations. In the C language, the function which allocates memory from the heap is called malloc and the function which takes previously allocated memory and marks it as "free" (to be used by future allocations) is called free.[note 4]
Several issues complicate the implementation, such as external fragmentation, which arises when there are many small gaps between allocated memory blocks, which invalidates their use for an allocation request. The allocator's metadata can also inflate the size of (individually) small allocations. This is often managed by chunking. The memory management system must track outstanding allocations to ensure that they do not overlap and that no memory is ever "lost" (i.e. that there are no "memory leaks").
Efficiency
The specific dynamic memory allocation algorithm implemented can impact performance significantly. A study conducted in 1994 by Digital Equipment Corporation illustrates the overheads involved for a variety of allocators. The lowest average instruction path length required to allocate a single memory slot was 52 (as measured with an instruction level profiler on a variety of software).[1]
Implementations
Since the precise location of the allocation is not known in advance, the memory is accessed indirectly, usually through a pointerreference. The specific algorithm used to organize the memory area and allocate and deallocate chunks is interlinked with the kernel, and may use any of the following methods:
Fixed-size blocks allocation
Fixed-size blocks allocation, also called memory pool allocation, uses a free list of fixed-size blocks of memory (often all of the same size). This works well for simple embedded systems where no large objects need to be allocated but suffers from fragmentation especially with long memory addresses. However, due to the significantly reduced overhead, this method can substantially improve performance for objects that need frequent allocation and deallocation, and so it is often used in video games.
Buddy blocks
في هذا النظام، تُوزَّع الذاكرة على عدة مجموعات بدلاً من مجموعة واحدة، حيث تمثل كل مجموعة كتلًا من الذاكرة بحجم قوة معينة للعدد اثنين ، أو كتلًا ذات تدرج حجم مناسب آخر. تُحفظ جميع الكتل ذات الحجم المحدد في قائمة مرتبطة مرتبة أو شجرة ، وتُضاف جميع الكتل الجديدة التي تُشكَّل أثناء التخصيص إلى مجموعات الذاكرة الخاصة بها لاستخدامها لاحقًا. إذا طُلب حجم أصغر من الحجم المتاح، يُختار أصغر حجم متاح ويُقسَّم. عند تقسيم كتلة، تُقسَّم إلى كتلتين أصغر، وتصبح كل كتلة أصغر "مُرافقة" فريدة للأخرى. يُختار أحد الجزأين الناتجين، وتتكرر العملية حتى يكتمل الطلب. عند تخصيص كتلة، يبدأ المُخصِّص بأصغر كتلة كبيرة بما يكفي لتجنب تقسيم الكتل دون داعٍ. عند تحرير كتلة، تُقارن بكتلتها المُرافقة. إذا كانتا حرتين، تُدمجان وتُوضعان في قائمة الكتل المُرافقة الأكبر حجمًا.
تخصيص الشرائح
تُخصّص آلية تخصيص الذاكرة هذه مسبقًا أجزاءً من الذاكرة مناسبة لاستيعاب كائنات من نوع أو حجم معين. [ 5 ] تُسمى هذه الأجزاء "ذاكرة التخزين المؤقت"، ولا يحتاج مُخصِّص الذاكرة إلا إلى تتبع قائمة بمساحات ذاكرة التخزين المؤقت الفارغة. عند إنشاء كائن، يتم استخدام أيٍّ من مساحات ذاكرة التخزين المؤقت الفارغة، وعند تدمير كائن، تُضاف مساحة إلى قائمة مساحات ذاكرة التخزين المؤقت الفارغة. تُخفف هذه التقنية من تجزئة الذاكرة، وهي فعّالة لعدم الحاجة إلى البحث عن جزء مناسب من الذاكرة، إذ تكفي أي مساحة مفتوحة.
تخصيص المكدس
تُطبّق العديد من الأنظمة الشبيهة بنظام يونكس، بالإضافة إلى نظام مايكروسوفت ويندوز، دالةً تُسمى ` allocaalloca` لتخصيص ذاكرة المكدس ديناميكيًا بطريقة مشابهة للتخصيص القائم على الكومة malloc. يقوم المُصرّف عادةً بترجمتها إلى تعليمات مُضمّنة تُعالج مؤشر المكدس. [ 6 ] على الرغم من عدم الحاجة إلى تحرير الذاكرة المُخصصة يدويًا بهذه الطريقة، حيث يتم تحريرها تلقائيًا عند انتهاء الدالة المُستدعاة alloca، إلا أن هناك خطرًا لحدوث تجاوز سعة المكدس. ولأن `alloca` عبارة عن توسيع مُخصّص يُستخدم في العديد من الأنظمة ولكنه غير موجود في معيار POSIX أو معيار لغة C، فإن سلوكه في حالة تجاوز سعة المكدس غير مُحدد.
يوجد إصدار أكثر أمانًا من دالة alloca يُسمى _malloca، والذي يُبلغ عن الأخطاء، على نظام التشغيل مايكروسوفت ويندوز. ويتطلب هذا الإصدار استخدام مكتبة gnulib _freea. [ 7 ] توفر مكتبة gnulib واجهة مكافئة، ولكن بدلًا من طرح استثناء SEH عند تجاوز سعة الذاكرة، فإنها تُحيل الأمر إلى دالة malloc عند اكتشاف حجم كبير جدًا. [ 8 ] يمكن محاكاة ميزة مماثلة باستخدام المحاسبة اليدوية وفحص الحجم، كما هو الحال في استخدامات دالة alloca alloca_accountفي مكتبة glibc. [ 9 ]
إدارة الذاكرة الآلية
تُعد الإدارة السليمة للذاكرة في التطبيق مشكلة صعبة، وقد تم ابتكار العديد من الاستراتيجيات المختلفة للتعامل مع إدارة الذاكرة.
الإدارة التلقائية لمتغيرات مكدس الاستدعاءات
في العديد من تطبيقات لغات البرمجة، يقوم بيئة التشغيل تلقائيًا بتخصيص مساحة في مكدس الاستدعاءات للمتغيرات المحلية غير الثابتة للروتين الفرعي ، والتي تُسمى المتغيرات التلقائية ، عند استدعاء هذا الروتين، ثم يُحرر هذه المساحة تلقائيًا عند الخروج منه. قد تسمح بعض التصريحات الخاصة للمتغيرات المحلية بالاحتفاظ بقيمها بين استدعاءات الإجراء، أو قد تسمح لروتينات فرعية أخرى بالوصول إليها. يُتيح التخصيص التلقائي للمتغيرات المحلية إمكانية الاستدعاء الذاتي ، ضمن نطاق محدود بالذاكرة المتاحة.
جمع القمامة
تُعدّ عملية جمع البيانات المهملة استراتيجيةً للكشف التلقائي عن الذاكرة المخصصة للكائنات التي لم تعد قابلةً للاستخدام في البرنامج، وإعادة تلك الذاكرة المخصصة إلى مجموعة من مواقع الذاكرة الحرة. يختلف هذا الأسلوب عن إدارة الذاكرة "اليدوية" حيث يقوم المبرمج بكتابة طلبات الذاكرة وتحريرها صراحةً في البرنامج. مع أن جمع البيانات المهملة التلقائي يتميز بتقليل عبء العمل على المبرمج ومنع أنواع معينة من أخطاء تخصيص الذاكرة، إلا أنه يتطلب موارد ذاكرة خاصة به، وقد يتنافس مع البرنامج على وقت المعالج.
عدّ المراجع
عدّ المراجع هو استراتيجية لاكتشاف أن الذاكرة لم تعد قابلة للاستخدام من قِبل البرنامج، وذلك من خلال الاحتفاظ بعداد لعدد المؤشرات المستقلة التي تشير إلى الذاكرة. عندما يشير مؤشر جديد إلى جزء من الذاكرة، يُفترض أن يزيد المبرمج قيمة العداد. وعندما يتغير موقع المؤشر، أو عندما يتوقف عن الإشارة إلى أي منطقة، أو عندما يتم تحريره، يجب أن ينخفض العداد. وعندما يصل العداد إلى الصفر، تُعتبر الذاكرة غير مستخدمة ويتم تحريرها. تتطلب بعض أنظمة عدّ المراجع تدخل المبرمج، بينما يتم تنفيذ بعضها الآخر تلقائيًا بواسطة المُصرّف. من عيوب عدّ المراجع إمكانية تكوّن مراجع دائرية ، مما يؤدي إلى تسرب الذاكرة. يمكن التخفيف من هذه المشكلة إما بإضافة مفهوم " المرجع الضعيف " (وهو مرجع لا يشارك في عدّ المراجع، ولكنه يُخطر عندما تصبح المنطقة التي يشير إليها غير صالحة)، أو بدمج عدّ المراجع مع جمع البيانات المهملة.
مجموعات الذاكرة
مجمع الذاكرة هو أسلوب لتحرير الذاكرة تلقائيًا بناءً على حالة التطبيق، مثل دورة حياة طلب أو معاملة. الفكرة هي أن العديد من التطبيقات تُنفذ أجزاءً كبيرة من التعليمات البرمجية التي قد تُولّد تخصيصات للذاكرة، ولكن هناك نقطة في التنفيذ تُصبح عندها جميع هذه الأجزاء غير صالحة. على سبيل المثال، في خدمة ويب، بعد كل طلب، لا تحتاج الخدمة إلى أي من الذاكرة المُخصصة أثناء تنفيذ الطلب. لذلك، بدلًا من تتبع ما إذا كانت الذاكرة قيد الاستخدام حاليًا أم لا، يتم تخصيص الذاكرة وفقًا للطلب أو مرحلة دورة الحياة المرتبطة بها. عند انتهاء هذا الطلب أو تلك المرحلة، يتم تحرير جميع الذاكرة المرتبطة بها في وقت واحد.
أنظمة ذات ذاكرة افتراضية
الذاكرة الافتراضية هي طريقة لفصل تنظيم الذاكرة عن المكونات المادية. تعمل التطبيقات على الذاكرة عبر عناوين افتراضية . كل محاولة من التطبيق للوصول إلى عنوان ذاكرة افتراضية معين تؤدي إلى ترجمة هذا العنوان إلى عنوان فعلي . [ 10 ] وبهذه الطريقة، تتيح إضافة الذاكرة الافتراضية تحكمًا دقيقًا في أنظمة الذاكرة وطرق الوصول إليها.
في أنظمة الذاكرة الافتراضية، يحد نظام التشغيل من كيفية وصول العمليات إلى الذاكرة. تُعرف هذه الميزة بحماية الذاكرة ، ويمكن استخدامها لمنع أي عملية من قراءة أو كتابة بيانات في ذاكرة غير مخصصة لها، مما يحول دون تداخل التعليمات البرمجية الضارة أو المعيبة في برنامج ما مع عمل برنامج آخر.
على الرغم من أن الذاكرة المخصصة لعمليات محددة تكون عادةً معزولة، إلا أن العمليات قد تحتاج أحيانًا إلى تبادل المعلومات. وتُعد الذاكرة المشتركة إحدى أسرع تقنيات التواصل بين العمليات .
تُصنف الذاكرة عادةً حسب معدل الوصول إلى الذاكرة الأساسية والذاكرة الثانوية . وتتولى أنظمة إدارة الذاكرة، من بين عمليات أخرى، نقل المعلومات بين هذين المستويين من الذاكرة.
إدارة الذاكرة في أنظمة Burroughs/Unisys MCP [ 2 ]
يدير نظام التشغيل موارد متنوعة في نظام الحوسبة. ويُعدّ نظام الذاكرة الفرعي عنصر النظام المسؤول عن إدارة الذاكرة، حيث يجمع بين موارد الذاكرة المادية وبرنامج نظام التشغيل الذي يدير هذه الموارد.
يدير نظام الذاكرة الذاكرة الفعلية والذاكرة الافتراضية للنظام (وكلاهما جزء من موارد الأجهزة). تعمل الذاكرة الافتراضية على توسيع الذاكرة الفعلية باستخدام مساحة إضافية على جهاز طرفي، عادةً ما يكون قرصًا. يتولى نظام الذاكرة مسؤولية نقل التعليمات والبيانات بين الذاكرة الرئيسية والذاكرة الافتراضية في عملية تُعرف بالتراكب. كان بوروز أول من طبّق الذاكرة الافتراضية تجاريًا (على الرغم من تطويرها في جامعة مانشستر لحاسوب فيرانتي أطلس)، وقد دمج الذاكرة الافتراضية مع تصميم نظام B5000 منذ البداية (عام 1961) دون الحاجة إلى وحدة إدارة ذاكرة خارجية (MMU). [ 11 ] : 48
يتولى نظام الذاكرة الفرعي مسؤولية ربط الطلبات المنطقية لكتل الذاكرة بأجزاء الذاكرة الفيزيائية (القطاعات) الموجودة في قائمة القطاعات الحرة. تُدار كل كتلة مُخصصة بواسطة مُعرِّف القطاع، [ 12 ] وهو كلمة تحكم خاصة تحتوي على بيانات وصفية ذات صلة بالقطاع، بما في ذلك العنوان والطول ونوع الجهاز، بالإضافة إلى بتة "الوجود" التي تُشير إلى ما إذا كانت الكتلة موجودة في الذاكرة الرئيسية أم يجب تحميلها من العنوان المُحدد في المُعرِّف.
تُعدّ المُعرّفات أساسيةً لضمان سلامة وأمان الذاكرة، بحيث لا يمكن للعمليات تجاوز أو نقص سعة الكتلة المُشار إليها (المعروفة باسم تجاوز سعة المخزن المؤقت). وتُعتبر المُعرّفات كلمات تحكم محمية لا يمكن التلاعب بها إلا لعناصر مُحددة من نظام التشغيل MCP (يتم تفعيلها بواسطة توجيه الكتلة UNSAFE في NEWP ).
يصف دونالد كنوث نظامًا مشابهًا في القسم 2.5 "تخصيص التخزين الديناميكي" من كتاب "الخوارزميات الأساسية" .
إدارة الذاكرة في نظام التشغيل OS/360 والأنظمة اللاحقة
لا يدعم نظام IBM System/360 الذاكرة الافتراضية. [ ملاحظة 5 ] يُمكن عزل الذاكرة الخاصة بالمهام باستخدام مفاتيح الحماية ، حيث يتم تخصيص مفتاح مختلف لكل مهمة، 0 للمشرف أو من 1 إلى 15. إدارة الذاكرة في نظام التشغيل OS/360 هي وظيفة للمشرف . يتم طلب التخزين باستخدام GETMAINالماكرو وتحريره باستخدام FREEMAINالماكرو، مما يستدعي استدعاء المشرف ( SVC ) لتنفيذ العملية.
في نظام التشغيل OS/360، تختلف التفاصيل حسب كيفية إنشاء النظام ، على سبيل المثال، بالنسبة لـ PCP و MFT و MVT .
في نظام التشغيل OS/360 MVT، يعتمد تخصيص الذاكرة الفرعية داخل منطقة المهمة أو منطقة قائمة انتظار النظام المشتركة (SQA) على مجموعات فرعية ، وهي مناطق بحجم مضاعفات 2 كيلوبايت - وهو حجم المنطقة المحمية بمفتاح حماية. تُرقّم المجموعات الفرعية من 0 إلى 255. [ 13 ] داخل المنطقة، تُخصص للمجموعات الفرعية إما حماية تخزين المهمة أو مفتاح المشرف، وهو المفتاح 0. تتلقى المجموعات الفرعية من 0 إلى 127 مفتاح المهمة. في البداية، تُنشأ المجموعة الفرعية صفر فقط، وتُلبى جميع طلبات تخزين المستخدم من المجموعة الفرعية صفر، ما لم يُحدد مفتاح آخر في طلب الذاكرة. تُنشأ المجموعات الفرعية من 250 إلى 255 بناءً على طلبات الذاكرة التي يُقدمها المشرف نيابةً عن المهمة. يُخصص المفتاح 0 لمعظم هذه المجموعات، بينما يحصل عدد قليل منها على مفتاح المهمة. أرقام المجموعات الفرعية مهمة أيضًا في MFT، على الرغم من أن التفاصيل أبسط بكثير. [ 14 ] يستخدم MFT أقسامًا ثابتة قابلة لإعادة التعريف بواسطة المشغل بدلاً من المناطق الديناميكية، ويحتوي PCP على قسم واحد فقط.
يتم ربط كل مجموعة فرعية بقائمة من كتل التحكم التي تحدد كتل الذاكرة المخصصة وغير المخصصة داخل المجموعة الفرعية. يتم تخصيص الذاكرة إما بإيجاد مساحة خالية ذات حجم كافٍ، أو بتخصيص كتل إضافية في المجموعة الفرعية، حتى يصل حجم منطقة المهمة. من الممكن تحرير كل أو جزء من مساحة الذاكرة المخصصة. [ 15 ]
تتشابه تفاصيل نظام التشغيل OS/VS1 [ 16 ] مع تفاصيل MFT وMVT؛ أما تفاصيل نظام التشغيل OS/VS2 فتتشابه مع تفاصيل MVT، باستثناء أن حجم الصفحة يبلغ 4 كيلوبايت. وبالنسبة لكل من نظامي التشغيل OS/VS1 وOS/VS2، فإن منطقة قائمة انتظار النظام المشتركة (SQA) غير قابلة للترحيل.
In MVS the address space[17] includes an additional pageable shared area, the Common Storage Area (CSA), and two additional private areas, the nonpageable local system queue area (LSQA) and the pageable System Work area (SWA). Also, the storage keys 0–7 are all reserved for use by privileged code.
See also
Notes
- ↑However, the run-time environment for a language processor may subdivide the memory dynamically acquired from the operating system, e.g., to implement a stack.
- ↑In some operating systems, e.g., OS/360, the free storage may be subdivided in various ways, e.g., subpools in OS/360, below the line, above the line and above the bar in z/OS.
- ↑Not to be confused with the unrelated heap data structure.
- ↑A simplistic implementation of these two functions can be found in the article "Inside Memory Management".[4]
- ↑Except on the Model 67
References
- 12Detlefs, D.; Dosser, A.; Zorn, B. (June 1994). "Memory allocation costs in large C and C++ programs"(PDF). Software: Practice and Experience. 24 (6): 527–542. CiteSeerX 10.1.1.30.3073. doi:10.1002/spe.4380240602. S2CID 14214110.
- 12"Unisys MCP Managing Memory". System Operations Guid. Unisys.
- ↑"Main Storage Allocation"(PDF). IBM Operating System/360 Concepts and Facilities(PDF). IBM Systems Reference Library (First ed.). IBM Corporation. 1965. p. 74. Retrieved Apr 3, 2019.
- ↑Jonathan Bartlett. "Inside Memory Management". IBM DeveloperWorks.
- ↑Silberschatz, Abraham; Galvin, Peter B. (2004). Operating system concepts. Wiley. ISBN 0-471-69466-5.
- ↑ – Linux Programmer's Manual – Library Functions from Manned.org
- ↑"_malloca". Microsoft CRT Documentation. 26 October 2022.
- ↑"gnulib/malloca.h". GitHub. Retrieved 24 November 2019.
- ↑ "glibc/include/alloca.h" . مرايا بيرين مينور. 23 نوفمبر 2019.
- ↑ تانينباوم، أندرو س. (1992). أنظمة التشغيل الحديثة . إنجلوود كليفس، نيوجيرسي: برنتيس هول. ص 90. ISBN 0-13-588187-0.
- ↑ وايشوف، ريتشارد. "قصص عن جهاز B5000 والأشخاص الذين كانوا هناك" (ملف PDF) . متحف تاريخ الحاسوب .
- ↑ الوصف (ملف PDF) . شركة بوروز . فبراير 1961.
- ↑ OS360Sup ، الصفحات 82-85 .
- ↑ OS360Sup ، ص 82 .
- ↑ منطق البرنامج: مشرف MVT لنظام التشغيل IBM System/360 (ملف PDF) . شركة IBM. مايو 1973. الصفحات 107-137 . تم الاطلاع عليه في 3 أبريل 2019 .
- ↑ OSVS1Dig ، ص 2.37-2.39 .
- ↑ "تخطيط التخزين الافتراضي" (ملف PDF) . مقدمة إلى نظام التشغيل/VS2 الإصدار 2 (ملف PDF) . الأنظمة ( الطبعة الأولى). IBM . مارس 1973. ص 37. GC28-0661-1 . تم الاطلاع عليه في 15 يوليو 2024 .
فهرس
- دونالد كنوث . الخوارزميات الأساسية ، الطبعة الثالثة. أديسون-ويسلي، 1997. ISBN 0-201-89683-4القسم 2.5: تخصيص التخزين الديناميكي، الصفحات 435-456.
- خوارزميات بسيطة لتخصيص الذاكرة، مؤرشفة في 5 مارس 2016 على موقع Wayback Machine (نُشرت أصلاً على مجتمع OSDEV)
- ويلسون، بي آر؛ جونستون، إم إس؛ نيلي، إم؛ بولز، دي (1995). "تخصيص التخزين الديناميكي: دراسة استقصائية ومراجعة نقدية" (ملف PDF) . إدارة الذاكرة . سلسلة محاضرات في علوم الحاسوب. المجلد 986. الصفحات 1-116. CiteSeerX 10.1.1.47.275 . doi : 10.1007 / 3-540-60368-9_19 . ISBN 978-3-540-60368-9.
- بيرغر، إي دي؛ زورن، بي جي؛ ماكينلي، كيه إس (يونيو 2001). "تأليف مُخصِّصات ذاكرة عالية الأداء" (ملف PDF) . وقائع مؤتمر ACM SIGPLAN 2001 حول تصميم لغات البرمجة وتنفيذها . PLDI '01. الصفحات 114-124 . CiteSeerX 10.1.1.1.2112 . doi : 10.1145/378795.378821 . ISBN 1-58113-414-2. S2CID 7501376 .
- بيرغر، إي دي؛ زورن، بي جي؛ ماكينلي، كيه إس (نوفمبر 2002). "إعادة النظر في تخصيص الذاكرة المخصص" (ملف PDF) . وقائع المؤتمر السابع عشر لجمعية ACM SIGPLAN حول البرمجة كائنية التوجه، والأنظمة، واللغات، والتطبيقات . OOPSLA '02. الصفحات 1-12 . CiteSeerX 10.1.1.119.5298 . doi : 10.1145/582419.582421 . ISBN 1-58113-471-1. S2CID 481812 .
- OS360Sup
- إصدار نظام التشغيل 21، خدمات مشرف نظام التشغيل IBM System/360 وتعليمات الماكرو (ملف PDF) . مكتبة مراجع أنظمة IBM ( الطبعة الثامنة). IBM . سبتمبر 1974. GC28-6646-7.
- OSVS1Dig
- دليل مرجعي للمبرمجين لنظام التشغيل OS/VS1، الإصدار 6 (ملف PDF) . الأنظمة (الطبعة السادسة ). شركة IBM . 15 سبتمبر 1976. GC24-5091-5 مع TNLs.
روابط خارجية
- إدارة الذاكرة
- هندسة الحاسوب
