set_mempolicy(2)

الاسم
set_mempolicy - ضبط سياسة ذاكرة NUMA المبدئية لخيط ونسله

المكتبة
مكتبة سياسات NUMA (الوصول غير الموحد للذاكرة) (libnuma، -lnuma)

موجز
#include <numaif.h>

long set_mempolicy(int mode, const unsigned long *nodemask,
                   unsigned long maxnode);

الوصف
تضبط set_mempolicy() سياسة ذاكرة NUMA للخيط المستدعي، والتي تتكون من نمط سياسة وصفر أو أكثر من العقد، إلى القيم المحددة بواسطة وسيطات mode وnodemask وmaxnode.

تمتلك آلة NUMA متحكمات ذاكرة مختلفة بمسافات متفاوتة عن وحدات معالجة مركزية (CPUs) محددة. تحدد سياسة الذاكرة من أي عقدة تُخَصَّص الذاكرة للخيط.

يعرّف استدعاء النظام هذا السياسة المبدئية للخيط. تحكم سياسة الخيط تخصيص الصفحات في مساحة عنوان العملية خارج نطاقات الذاكرة التي يتحكم بها سياسة أكثر تحديدًا مضبوطة بواسطة mbind(2). كما تتحكم السياسة المبدئية للخيط في تخصيص أي صفحات للملفات المعينة في الذاكرة والمخصصة باستخدام استدعاء mmap(2) مع العلم MAP_PRIVATE والتي يقرأ منها (يُحملها) الخيط فقط، وللملفات المعينة في الذاكرة والمخصصة باستخدام استدعاء mmap(2) مع العلم MAP_SHARED، بغض النظر عن نوع الوصول. تُطبق السياسة فقط عند تخصيص صفحة جديدة للخيط. وبالنسبة للذاكرة المجهولة، يحدث هذا عند وصول الخيط للصفحة لأول مرة.

يجب أن تحدد وسيطة mode أحد الأنماط MPOL_DEFAULT، أو MPOL_BIND، أو MPOL_INTERLEAVE، أو MPOL_WEIGHTED_INTERLEAVE، أو MPOL_PREFERRED، أو MPOL_PREFERRED_MANY، أو MPOL_LOCAL (الموصوفة بالتفصيل أدناه). تتطلب جميع الأنماط باستثناء MPOL_DEFAULT من المستدعي تحديد العقدة أو العقد التي ينطبق عليها النمط، عبر وسيطة nodemask.

قد يتضمن المعامل mode أيضًا علم وضع اختياري. أعلام الوضع المدعومة هي:

MPOL_F_NUMA_BALANCING (منذ لينكس 5.12)
    عندما يكون mode هو MPOL_BIND، فَعّل موازنة NUMA في النواة للمهمة إذا كانت مدعومة من النواة. إذا كان العلم غير مدعوم من النواة، أو استُخدم مع mode غير MPOL_BIND، تُعاد القيمة -1 ويُضبط errno على EINVAL.

MPOL_F_RELATIVE_NODES (منذ لينكس 2.6.26)
    يحدد nodemask غير الفارغ معرفات عقدة نسبية لمجموعة معرفات العقد المسموح بها بواسطة cpuset الحالي للعملية.

MPOL_F_STATIC_NODES (منذ لينكس 2.6.26)
    يحدد nodemask غير الفارغ معرفات عقدة فيزيائية. لن يعيد لينكس تعيين nodemask عندما تنتقل العملية إلى سياق cpuset مختلف، ولا عندما تتغير مجموعة العقد المسموح بها بواسطة سياق cpuset الحالي للعملية.

يشير nodemask إلى قناع بتات لمعرفات العقد يحتوي على بتات حتى maxnode. يُقرّب حجم قناع البتات إلى المضاعف التالي لـ sizeof(unsigned long)، لكن النواة ستستخدم البتات حتى maxnode فقط. تحدد قيمة NULL لـ nodemask أو قيمة صفر لـ maxnode المجموعة الفارغة من العقد. إذا كانت قيمة maxnode صفرًا، تُتجاهل وسيطة nodemask.

حيثما يكون nodemask مطلوبًا، يجب أن يحتوي على عقدة واحدة على الأقل تكون متصلة، ومسموح بها بواسطة سياق cpuset الحالي للعملية (ما لم يُحدد علم النمط MPOL_F_STATIC_NODES)، وتحتوي على ذاكرة. إذا ضُبط MPOL_F_STATIC_NODES في mode واحتوى nodemask المطلوب على عقد غير مسموح بها بواسطة سياق cpuset الحالي للعملية، تعود سياسة الذاكرة إلى تخصيص محلي. يلغي هذا فعليًا السياسة المحددة حتى يتضمن سياق cpuset للعملية عقدة واحدة أو أكثر من العقد المحددة بواسطة nodemask.

يجب أن يتضمن المعامل mode إحدى القيم التالية:

MPOL_DEFAULT
    يحدد هذا النمط إزالة أي سياسة ذاكرة خيط غير مبدئية، بحيث "تتراجع" سياسة الذاكرة إلى السياسة المبدئية للنظام. السياسة المبدئية للنظام هي "تخصيص محلي"—أي تخصيص الذاكرة على عقدة وحدة المعالجة المركزية التي أطلقت التخصيص. يجب تحديد nodemask كـ NULL. إذا كانت "العقدة المحلية" لا تحتوي على ذاكرة حرة، سيحاول النظام تخصيص ذاكرة من عقدة "قريبة".

MPOL_BIND
    يعرف هذا النمط سياسة صارمة تقيد تخصيص الذاكرة بالعقد المحددة في nodemask. إذا حدد nodemask أكثر من عقدة واحدة، ستأتي تخصيصات الصفحات من العقدة ذات معرف العقدة الرقمي الأقل أولاً، حتى لا تحتوي تلك العقدة على ذاكرة حرة. ستأتي التخصيصات بعد ذلك من العقدة ذات معرف العقدة الأعلى التالي المحدد في nodemask وهكذا، حتى لا تحتوي أي من العقد المحددة على ذاكرة حرة. لن تُخصص الصفحات من أي عقدة غير محددة في nodemask.

MPOL_INTERLEAVE
    يدرج هذا النمط تخصيصات الصفحات عبر العقد المحددة في nodemask بترتيب معرف العقدة الرقمي. يحسن هذا من عرض النطاق بدلاً من زمن الوصول عن طريق توزيع الصفحات ووصولات الذاكرة لتلك الصفحات عبر عقد متعددة. ومع ذلك، ستظل الوصولات إلى صفحة واحدة محدودة بعرض نطاق ذاكرة عقدة واحدة.

MPOL_WEIGHTED_INTERLEAVE (منذ لينكس 6.9)
    يُبادل هذا الوضع تخصيصات الصفحات عبر العقد المحددة في nodemask وفقًا للأوزان في /sys/kernel/mm/mempolicy/weighted_interleave. على سبيل المثال، إذا ضُبطت البتات 0 و2 و5 في nodemask، وكانت محتويات /sys/kernel/mm/mempolicy/weighted_interleave/node0، و /sys/.../node2، و /sys/.../node5 هي 4 و7 و9 على التوالي، فستُخصص الصفحات في هذه المنطقة على العقد 0 و2 و5 بنسبة 4:7:9.

MPOL_PREFERRED
    يضبط هذا النمط العقدة المفضلة للتخصيص. ستحاول النواة تخصيص الصفحات من هذه العقدة أولاً والتراجع إلى العقد "القريبة" إذا كانت العقدة المفضلة منخفضة في الذاكرة الحرة. إذا حدد nodemask أكثر من معرف عقدة واحد، ستُختار العقدة الأولى في القناع كعقدة مفضلة. إذا حددت وسيطتا nodemask وmaxnode المجموعة الفارغة، تحدد السياسة "تخصيصًا محليًا" (مثل السياسة المبدئية للنظام التي نوقشت أعلاه).

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

MPOL_LOCAL (منذ لينكس 3.8)
    يحدد هذا النمط "تخصيصًا محليًا"؛ تُخصص الذاكرة على عقدة وحدة المعالجة المركزية التي أطلقت التخصيص ("العقدة المحلية"). يجب أن تحدد وسيطتا nodemask وmaxnode المجموعة الفارغة. إذا كانت "العقدة المحلية" منخفضة في الذاكرة الحرة، ستحاول النواة تخصيص ذاكرة من عقد أخرى. ستخصص النواة ذاكرة من "العقدة المحلية" كلما كانت الذاكرة متاحة لهذه العقدة. إذا لم تكن "العقدة المحلية" مسموحًا بها بواسطة سياق cpuset الحالي للعملية، ستحاول النواة تخصيص ذاكرة من عقد أخرى. ستخصص النواة ذاكرة من "العقدة المحلية" كلما أصبحت مسموحًا بها بواسطة سياق cpuset الحالي للعملية.

تُحفظ سياسة ذاكرة الخيط عبر execve(2)، وتُورث بواسطة الخيوط الفرعية المنشأة باستخدام fork(2) أو clone(2).

قيمة الإرجاع
عند النجاح، تُرجع set_mempolicy() 0؛ وعند الخطأ، تُرجع -1 ويُضبط errno للإشارة إلى الخطأ.

الأخطاء

EFAULT
    جزء من أو كل نطاق الذاكرة المحدد بواسطة nodemask و maxnode يشير إلى خارج مساحة العناوين التي يمكنك الوصول إليها.

EINVAL
    ‏mode غير صالح. أو mode هو MPOL_DEFAULT و nodemask غير فارغ، أو mode هو MPOL_BIND أو MPOL_INTERLEAVE و nodemask فارغ. أو يحدد maxnode أكثر من سعة صفحة من البتات. أو يحدد nodemask معرف عقدة واحد أو أكثر أكبر من الحد الأقصى لمعرفات العقد المدعومة. أو لا يوجد أي من معرفات العقد المحددة بواسطة nodemask متصلة ومسموح بها بواسطة سياق cpuset الحالي للعملية، أو لا تحتوي أي من العقد المحددة على ذاكرة. أو حددت وسيطة mode كلاً من MPOL_F_STATIC_NODES و MPOL_F_RELATIVE_NODES. أو MPOL_F_NUMA_BALANCING غير مدعوم من النواة، أو استُخدم مع mode غير MPOL_BIND.

ENOMEM
    ذاكرة النواة المتوفرة غير كافية.

المعايير
لينكس.

التاريخ
لينكس 2.6.7.

ملاحظات
لا تُحفظ سياسة الذاكرة إذا نُقلت الصفحة إلى ذاكرة التبادل (swapped out). وعند إعادة استدعاء هذه الصفحة، ستستخدم سياسة الخيط أو نطاق الذاكرة الساري في وقت تخصيص الصفحة.

للحصول على معلومات حول دعم المكتبات، انظر numa(7).

انظر أيضًا
get_mempolicy(2)،‏ getcpu(2)،‏ mbind(2)،‏ mmap(2)،‏ numa(3)،‏ cpuset(7)،‏ numa(7)،‏ numactl(8)

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.