هل يمكنك تخصيص جزء كبير جدًا من الذاكرة (> 4 جيجابايت) في لغة c أو c++؟

StackOverflow https://stackoverflow.com/questions/181050

  •  05-07-2019
  •  | 
  •  

سؤال

مع وجود كميات كبيرة جدًا من ذاكرة الوصول العشوائي هذه الأيام، كنت أتساءل، هل من الممكن تخصيص جزء واحد من الذاكرة أكبر من 4 جيجابايت؟أم هل أحتاج إلى تخصيص مجموعة من الأجزاء الأصغر والتعامل مع التبديل بينها؟

لماذا؟؟؟أنا أعمل على معالجة بعض بيانات opentreetmap xml وهذه الملفات ضخمة.أقوم حاليًا ببثها لأنني لا أستطيع تحميلها جميعًا في جزء واحد ولكني أشعر بالفضول بشأن الحدود العليا لـ malloc أو الجديد.

هل كانت مفيدة؟

المحلول

والجواب باختصار: ليس من المرجح

في الترتيب لهذا العمل، لو كنت على الاطلاق على هل لديك لاستخدام معالج 64 بت. ثانيا، فإنه يعتمد على دعم نظام التشغيل لتخصيص أكثر من 4G من ذاكرة الوصول العشوائي لعملية واحدة.

في الناحية النظرية، كان من الممكن، ولكن سيكون لديك لقراءة وثائق مخصص الذاكرة. سيكون عليك أيضا أن تكون أكثر عرضة للمشكلات تجزئة الذاكرة.

وهناك معلومات جيدة عن إدارة الذاكرة ويندوز .

نصائح أخرى

كتاب تمهيدي عن تخطيطات الذاكرة الفعلية والافتراضية

ستحتاج إلى وحدة المعالجة المركزية (CPU) ونظام التشغيل/التشغيل (O/S) 64 بت وذاكرة كافية تقريبًا لتجنب تحطيم مجموعة العمل الخاصة بك.قليلا من الخلفية:

يحتوي جهاز 32 بت (بشكل عام) على سجلات يمكنها تخزين واحدة من 2 ^ 32 (4،294،967،296) قيمة فريدة.هذا يعني أن مؤشر 32 بت يمكنه معالجة أي موقع من مواقع الذاكرة الفريدة البالغ عددها 2^32، ومن هنا يأتي الحد السحري البالغ 4 جيجابايت.

تحتوي بعض أنظمة 32 بت مثل SPARCV8 أو Xeon على وحدات MMU التي تسحب خدعة للسماح بمزيد من الذاكرة الفعلية.يسمح هذا لعمليات متعددة بشغل ذاكرة إجمالية تزيد عن 4 جيجابايت، ولكن كل عملية تقتصر على مساحة العنوان الافتراضية الخاصة بها والتي تبلغ 32 بت.بالنسبة لعملية واحدة تبحث في مساحة عنوان افتراضية، يمكن تعيين 2^32 موقعًا فعليًا مميزًا فقط بواسطة مؤشر 32 بت.

لن أخوض في التفاصيل ولكن هذا العرض (تحذير:PowerPoint) يصف كيفية عمل ذلك.تحتوي بعض أنظمة التشغيل على تسهيلات (مثل تلك الموصوفة هنا - بفضل FP أعلاه) لمعالجة MMU وتبديل المواقع الفعلية المختلفة في مساحة العنوان الافتراضية تحت التحكم على مستوى المستخدم.

سيشغل نظام التشغيل والإدخال/الإخراج المعين للذاكرة بعضًا من مساحة العنوان الافتراضية، لذلك ليس كل هذا الـ 4 جيجابايت متاحًا بالضرورة للعملية.على سبيل المثال، يأخذ نظام Windows افتراضيًا 2 غيغابايت من هذا، ولكن يمكن ضبطه ليأخذ 1 غيغابايت فقط إذا تم استدعاء رمز التبديل /3G عند التمهيد.وهذا يعني أن عملية واحدة على بنية 32 بت من هذا النوع يمكنها فقط إنشاء بنية بيانات متجاورة تقل إلى حد ما عن 4 جيجابايت في الذاكرة.

هذا يعني أنه سيتعين عليك استخدام باي المرافق على نظام التشغيل Windows أو مرافق مكافئة على لينكس للتبديل يدويًا في التراكبات.وهذا ليس بالأمر الصعب بالضرورة، ولكنه سيستغرق بعض الوقت حتى يبدأ العمل.

وبدلاً من ذلك، يمكنك الحصول على صندوق 64 بت به الكثير من الذاكرة وستختفي هذه المشكلات بشكل أو بآخر.يمكن لبنية 64 بت مع مؤشرات 64 بت إنشاء بنية بيانات متجاورة مع ما يصل إلى 2^64 (18,446,744,073,709,551,616) عناوين فريدة، على الأقل من الناحية النظرية.وهذا يسمح ببناء وإدارة هياكل بيانات متجاورة أكبر.

وميزة ملفات الذاكرة المعينة هو أنه يمكنك فتح ملف أكبر بكثير من 4GB (لانهائية تقريبا على NTFS!) ولها عدة <النوافذ ذاكرة 4GB فيه.
و إنها أكثر من ذلك بكثير يتسم بفعالية من فتح الملف وقراءته في الذاكرة، على معظم أنظمة التشغيل التي تستخدم المدمج في دعم الترحيل.

وهذا لا ينبغي أن يكون هناك مشكلة مع نظام تشغيل 64 بت (وجهاز يحتوي أن الكثير من الذاكرة).

إذا malloc لا يمكن التعامل ثم فإن OS بالتأكيد توفر واجهات برمجة التطبيقات التي تسمح لك لتخصيص الذاكرة مباشرة. تحت ويندوز يمكنك استخدام VirtualAlloc API.

وذلك يعتمد على أي مترجم C الذي تستخدمه، وعلى ما منصة (طبعا) ولكن ليس هناك سبب جوهري لماذا لا يمكن تخصيص الجزء الاكبر من الذاكرة المتوفرة متاخم - والتي قد تكون أقل مما تحتاج. وبالطبع قد تضطر إلى استخدام نظام 64 بت لمعالجة الكثير من ذاكرة الوصول العشوائي ...

Malloc للحصول على تفاصيل التاريخ و

HeapMax في alloc.h للحصول على أكبر حجم كتلة المتاحة

هل تعتبر استخدام ملفات الذاكرة المعينة؟ منذ كنت تقوم بتحميل في ملفات ضخمة حقا، يبدو أن هذا قد يكون أفضل طريقة للذهاب.

وهذا يعتمد على ما إذا كان نظام التشغيل سوف تعطيك مساحة العنوان الظاهري الذي يسمح معالجة الذاكرة أعلاه 4GB وما إذا كان المترجم يدعم تخصيص باستخدام جديد / malloc.

لويندوز 32 بت لن تكون قادرة على الحصول على قطعة واحدة أكبر من 4GB، حيث أن حجم المؤشر 32 بت، مما يحد من مساحة العنوان الظاهري إلى 4GB. (هل يمكن استخدام ملحق العنوان الفيزيائي للحصول على المزيد من ذاكرة 4GB، ولكن أعتقد أن لديك لتعيين تلك الذاكرة في الفضاء virtualaddress من 4GB نفسك)

لويندوز 64 بت، مترجم VC ++ يدعم مؤشرات 64 بت مع الحد النظري من مساحة العنوان الظاهري ل8TB.

وأظن أن نفس الشيء ينطبق على لينكس / دول مجلس التعاون الخليجي - 32 بت لا يسمح لك، في حين أن 64 بت يسمح لك

.

كما أشار روب، يعد برنامج VirtualAlloc لنظام التشغيل Windows خيارًا جيدًا لهذا الغرض، كما هو الحال مع تعيين الملفات المجهولة.ومع ذلك، فيما يتعلق بسؤالك على وجه التحديد، فإن الإجابة على "إذا كان من الممكن تخصيص C أو C++"، فإن الإجابة هي لا، هذا غير مدعوم حتى على WIN7 RC 64

في مواصفات PE/COFF لملفات exe، يكون الحقل الذي يحدد احتياطي HEAP والتزام HEAP، عبارة عن كمية 32 بت.يتماشى هذا مع قيود الحجم الفعلي لتطبيق الكومة الحالية في Windows CRT، والتي تقل قليلاً عن 4 جيجابايت.لذلك، لا توجد طريقة لتخصيص أكثر من 4 جيجابايت من C/C++ (الاتصال الفني بمرافق دعم نظام التشغيل الخاصة بـ CreateFileMapping وVirtualAlloc/VirtualAllocNuma وما إلى ذلك...ليست C أو C++).

يكون أيضا واعي أن هناك بنية أساسية لـ x86 أو amd64 ABI تُعرف باسم جدول الصفحات.هذا سوف في الواقع، افعل ما يهمك، وخصص أجزاء أصغر لطلبك الأكبر، على الرغم من أن هذا يحدث في ذاكرة kernel، إلا أن هناك تأثيرًا على النظام بأكمله، وهذه الجداول محدودة.

إذا كنت تقوم بتخصيص الذاكرة في مثل هذه المزاعم الكبيرة، فمن المستحسن أن تقوم بالتخصيص بناءً على دقة التخصيص (التي يفرضها VirtualAlloc) وأيضًا تحديد العلامات أو الأساليب الاختيارية لتمكين الصفحات الأكبر حجمًا.

كانت الصفحات بحجم 4 كيلو بايت هي الحجم الأولي للصفحة البالغ عددها 386، وبعد ذلك أضاف البنتيوم 4 ميجابايت.اليوم هو AMD64 (دليل تحسين البرامج لمعالجات AMD Family 10h) يبلغ الحد الأقصى لحجم إدخال جدول الصفحات 1 جيجابايت.هذا يعني بالنسبة لحالتك هنا، لنفترض أنك قمت للتو بمساحة 4 غيغابايت، سيتطلب الأمر 4 إدخالات فريدة فقط في دليل kernel لتحديد موقع/تخصيص ذاكرة العملية الخاصة بك والإذن بها.

أصدرت Microsoft هذا أيضًا يدوي يوضح بعض النقاط الدقيقة في ذاكرة التطبيق واستخدامها لنظام التشغيل Vista/2008 والإصدارات الأحدث.

محتويات

مقدمة.4

حول مدير الذاكرة 4

مساحة العنوان الافتراضية.5

التخصيص الديناميكي لمساحة العنوان الافتراضي kernel.5

تفاصيل معماريات x86.6

تفاصيل عن بنيات 64 بت.7

مكدس الوضع kernel القفز في بنيات x86.7

استخدام ذاكرة التجمع الزائدة.8

حماية:تخطيط مساحة العنوان التعشيه.9

تأثير ASLR على تحميل الصورة عناوين.9

فوائد ASLR..11

كيفية إنشاء قائم على أساس ديناميكي الصور.11

عرض النطاق الترددي للإدخال/الإخراج.11

مايكروسوفت سوبر فيتش.12

يكتب ملف الصفحة.12

تنسيق إدارة الذاكرة و مدير ذاكرة التخزين المؤقت 13

تجميع نمط الجلب المسبق.14

إدارة الملفات الكبيرة 15

السبات والاستعداد.16

نموذج الفيديو المتقدم 16

دعم نوما 17

تخصيص الموارد.17

العقدة الافتراضية والتقارب.18

مقاطعة التقارب.19

وظائف نظام NUMA-Aware ل التطبيقات.19

وظائف نظام NUMA-Aware ل برامج تشغيل.19

الترحيل.20

قابلية التوسع.20

الكفاءة والتوازي..20

رقم إطار الصفحة وقاعدة بيانات PFN.20

صفحات كبيرة.21

تخصيص تجمع محاذاة لذاكرة التخزين المؤقت.21

الأجهزة الظاهرية.22

توزيع الحمل.22

تحسينات إضافية.23

سلامة النظام.23

تشخيص أخطاء الأجهزة.23

سلامة الكود وتوقيع السائق.24

الحفاظ على البيانات أثناء عمليات فحص الأخطاء.24

ماذا يجب ان تفعل.24

لمصنعي الأجهزة.24

لمطوري برامج التشغيل.24

لمطوري التطبيقات.25

لمسؤولي النظام.25

موارد.25

إذا size_t أكبر من 32 بت على النظام الخاص بك، وكنت قد مسح العقبة الأولى. ولكن المعايير C و C ++ ليست مسؤولة عن تحديد ما إذا كان أي دعوة خاصة لmalloc جديد أو نجحت (باستثناء malloc مع حجم 0). هذا يعتمد كليا على نظام التشغيل والوضع الحالي للالكومة.

ومثل كل شخص آخر وقال، والحصول على آلة 64BIT هو الطريق للذهاب. ولكن حتى على آلة 32BIT وإنتل، يمكنك معالجة أكبر من المناطق 4GB من الذاكرة إذا كان نظام التشغيل الخاص بك، ودعم وحدة المعالجة المركزية الخاصة بك <لأ href = "http://en.wikipedia.org/wiki/Physical_Address_Extension" يختلط = "نوفولو noreferrer" > PAE . للأسف، 32BIT ويندوز إكس بي لا تفعل هذا (لا 32BIT فيستا؟). لينكس يتيح لك القيام بذلك عن طريق الافتراضي، ولكن سوف يكون مقصورا على المناطق 4GB، حتى مع mmap () منذ المؤشرات لا تزال 32BIT و.

وماذا عليك أن تفعل ذلك، هو السماح للنظام التشغيل رعاية إدارة ذاكرة لك. الحصول على بيئة التي يمكن التعامل مع أن الكثير من ذاكرة الوصول العشوائي، ثم قراءة ملف XML (ق) في (أ) بنية بيانات (ق)، والسماح لها تخصيص مساحة لك. ثم تعمل على بنية البيانات في الذاكرة، وبدلا من أن تعمل على ملف XML نفسها.

وحتى في أنظمة 64BIT على الرغم من أنك لن يكون لها الكثير من السيطرة على ما أجزاء من البرنامج يجلس في الواقع في ذاكرة الوصول العشوائي، في ذاكرة التخزين المؤقت، أو ترحيلها إلى القرص، على الأقل في معظم الحالات، منذ OS و وMMU التعامل مع هذا أنفسهم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top