move_pages(2)

الاسم
move_pages - نقل صفحات فردية من عملية إلى عقدة أخرى

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

موجز
#include <numaif.h>

long move_pages(int pid, unsigned long count, void *pages[count],
                const int nodes[count], int status[count],
                int flags);

الوصف
تنقل move_pages() الصفحات pages المحددة من العملية pid إلى عقد الذاكرة المحددة بواسطة nodes. تنعكس نتيجة النقل في status. تشير flags إلى القيود على الصفحات المراد نقلها.

pid هو معرف العملية التي ستنقل فيها الصفحات. إذا كان pid يساوي 0، فإن move_pages() تنقل صفحات العملية المستدعية.

يتطلب نقل الصفحات في عملية أخرى الامتيازات التالية:

•   حتى Linux 4.12 وما يشملها: يجب أن يكون المستدعي متمتعًا بالامتيازات (CAP_SYS_NICE) أو يجب أن يتطابق معرف المستخدم الحقيقي أو الفعّال للعملية المستدعية مع معرف المستخدم الحقيقي أو المحفوظ للعملية الهدف.

•   سمحت القواعد القديمة للمستدعي باكتشاف خيارات متنوعة للعناوين الافتراضية التي يتخذها النواة، مما قد يؤدي إلى إبطال عشوائية تخطيط مساحة العنوان لعملية مملوكة لنفس UID للمستدعي، لذلك تم تغيير القواعد بدءًا من Linux 4.13. منذ Linux 4.13، يُحكم الإذن بواسطة فحص وضع الوصول ptrace PTRACE_MODE_READ_REALCREDS فيما يتعلق بالعملية الهدف؛ انظر ptrace(2).

count هو عدد الصفحات المراد نقلها. يحدد حجم المصفوفات الثلاث pages وnodes وstatus.

pages هو مصفوفة من المؤشرات إلى الصفحات التي يجب نقلها. هذه مؤشرات يجب أن تكون محاذية لحدود الصفحات. تُحدد العناوين كما تراها العملية المحددة بواسطة pid.

nodes هو مصفوفة من الأعداد الصحيحة التي تحدد الموقع المطلوب لكل صفحة. كل عنصر في المصفوفة هو رقم عقدة. يمكن أن يكون nodes أيضًا NULL، وفي هذه الحالة لا تنقل move_pages() أي صفحات بل ستعيد العقدة التي توجد فيها كل صفحة حاليًا، في مصفوفة status. قد يكون الحصول على حالة كل صفحة ضروريًا لتحديد الصفحات التي تحتاج إلى النقل.

status هو مصفوفة من الأعداد الصحيحة التي تعيد حالة كل صفحة. تحتوي المصفوفة على قيم صالحة فقط إذا لم تُرجع move_pages() خطأ. يمكن أن يساعد التهيئة المسبقة للمصفوفة بقيمة لا تمثل عقدة numa حقيقية أو خطأ صالح في مصفوفة الحالة في تحديد الصفحات التي تم ترحيلها.

تحدد flags أنواع الصفحات المراد نقلها. يعني MPOL_MF_MOVE أنه سيتم نقل الصفحات التي هي قيد الاستخدام الحصري من قبل العملية فقط. يعني MPOL_MF_MOVE_ALL أنه يمكن أيضًا نقل الصفحات المشتركة بين عمليات متعددة. يجب أن تكون العملية متمتعة بالامتيازات (CAP_SYS_NICE) لاستخدام MPOL_MF_MOVE_ALL.

  حالات الصفحات في مصفوفة الحالة
يمكن إرجاع القيم التالية في كل عنصر من مصفوفة status.

0..MAX_NUMNODES
    يحدد العقدة التي توجد عليها الصفحة.

-EACCES
    الصفحة معمّلة بواسطة عمليات متعددة ويمكن نقلها فقط إذا تم تحديد MPOL_MF_MOVE_ALL.

-EBUSY
    الصفحة مشغولة حاليًا ولا يمكن نقلها. حاول مرة أخرى لاحقًا. يحدث هذا إذا كانت الصفحة تخضع للإدخال/الإخراج أو إذا كان نظام فرعي آخر من النواة يحمل مرجعًا للصفحة.

-EFAULT
    هذه صفحة صفرية أو منطقة الذاكرة غير معمّلة من قبل العملية.

-EIO
    تعذرت إعادة كتابة صفحة. يجب إعادة كتابة الصفحة لنقلها لأن الصفحة متسخة ولا يوفر نظام الملفات وظيفة ترحيل تسمح بنقل الصفحات المتسخة.

-EINVAL
    لا يمكن نقل صفحة متسخة. لا يوفر نظام الملفات وظيفة ترحيل وليس لديه القدرة على إعادة كتابة الصفحات.

-ENOENT
    الصفحة غير موجودة.

-ENOMEM
    تعذر تخصيص ذاكرة على العقدة الهدف.

قيمة الإرجاع
عند النجاح، تُرجع move_pages() صفرًا. عند الخطأ، تُرجع -1، وتضبط errno للإشارة إلى الخطأ. إذا تم إرجاع قيمة موجبة، فهي عدد الصفحات غير المرحّلة.

الأخطاء

قيمة موجبة
    عدد الصفحات غير المرحّلة إذا كانت نتيجة لأسباب غير قاتلة (منذ Linux 4.17).

E2BIG
    عدد كبير جدًا من الصفحات لنقلها. منذ لينكس 2.6.29، لم يعد النواة تولّد هذا الخطأ.

EACCES
    إحدى العقد الهدف غير مسموح بها بواسطة مجموعة وحدة المعالجة المركزية الحالية.

EFAULT
    تعذر الوصول إلى مصفوفة المعاملات.

EINVAL
    تم تحديد أعلام غير MPOL_MF_MOVE و MPOL_MF_MOVE_ALL أو جرت محاولة لترحيل صفحات من خيط نواة.

ENODEV
    إحدى العقد الهدف غير متصلة بالإنترنت.

EPERM
    حدد المتصل MPOL_MF_MOVE_ALL دون صلاحيات كافية (CAP_SYS_NICE). أو، حاول المتصل نقل صفحات من عملية تابعة لمستخدم آخر لكنه لم يملك صلاحية فعل ذلك (CAP_SYS_NICE).

ESRCH
    العملية غير موجودة.

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

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

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

استخدم get_mempolicy(2) مع العلم MPOL_F_MEMS_ALLOWED للحصول على مجموعة العقد المسموح بها بواسطة مجموعة وحدة المعالجة المركزية الحالية. لاحظ أن هذه المعلومات قابلة للتغيير في أي وقت عن طريق إعادة تشكيل يدوي أو آلي لمجموعة وحدة المعالجة المركزية.

قد يؤدي استخدام هذه الدالة إلى صفحات ينتهك موقعها (العقدة) سياسة الذاكرة المقررة للعناوين المحددة (انظر mbind(2)) و/أو العملية المحددة (انظر set_mempolicy(2)). أي أن سياسة الذاكرة لا تقيد العقد الوجهة المستخدمة بواسطة move_pages().

ترويسة <numaif.h> غير مضمنة في glibc، ولكنها تتطلب تثبيت libnuma-devel أو حزمة مماثلة.

انظر أيضًا
get_mempolicy(2)، وmbind(2)، وset_mempolicy(2)، وnuma(3)، وnuma_maps(5)، وcpuset(7)، وnuma(7)، وmigratepages(8)، وnumastat(8)

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

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

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