.\" -*- coding: UTF-8 -*- .\" Copyright 2008, Silicon Graphics, Inc. .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: GPL-2.0-only .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH cpuset 7 "8 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم cpuset \- حصر العمليات في مجموعات فرعية من المعالجات وعقد الذاكرة .SH الوصف واجهة نظام ملفات cpuset هي واجهة نظام ملفات وهمي لآلية cpuset في النواة، والتي تُستخدم للتحكم في موضع المعالج وموضع الذاكرة للعمليات. تُوصَل عادةً عند \fI/dev/cpuset\fP. .P في الأنظمة ذات النوى المجمعة بدعم مدمج لـ cpusets، تُربط جميع العمليات بـ cpuset، وتكون cpusets موجودة دائمًا. إذا كان النظام يدعم cpusets، فسيكون لديه المدخل \fBnodev cpuset\fP في الملف \fI/proc/filesystems\fP. من خلال وصل نظام ملفات cpuset (انظر قسم \fBEXAMPLES\fP أدناه)، يمكن للمسؤول ضبط cpusets على النظام للتحكم في موضع المعالج والذاكرة للعمليات على ذلك النظام. مبدئيًا، إذا لم يُعدل ضبط cpuset على النظام أو إذا لم يُوصل نظام ملفات cpuset أصلاً، فإن آلية cpuset، رغم وجودها، ليس لها أي تأثير على سلوك النظام. .P تُعرف cpuset قائمة من وحدات المعالجة المركزية (CPUs) وعقد الذاكرة. .P تشمل وحدات المعالجة المركزية للنظام جميع وحدات المعالجة المنطقية التي يمكن للعملية التنفيذ عليها، بما في ذلك، إذا وجدت، نوى معالجة متعددة داخل حزمة واحدة وخيوط فرائقة (Hyper\-Threads) داخل نواة المعالج. تشمل عقد الذاكرة جميع بنوك الذاكرة الرئيسة المتمايزة؛ عادةً ما تحتوي الأنظمة الصغيرة وأنظمة SMP على عقدة ذاكرة واحدة فقط تحتوي على كامل الذاكرة الرئيسة للنظام، بينما تحتوي أنظمة NUMA (الوصول غير الموحد للذاكرة) على عقد ذاكرة متعددة. .P تُمثل cpusets كأدلة في نظام ملفات وهمي هرمي، حيث يمثل الدليل الرئيس في الهرم (\fI/dev/cpuset\fP) النظام بأكمله (جميع وحدات المعالجة المركزية وعقد الذاكرة المتصلة) وأي cpuset تكون ابنة (سليلة) لـ cpuset أب أخرى تحتوي على مجموعة فرعية من وحدات المعالجة والذاكرة الخاصة بذلك الأب. للأدلة والملفات التي تمثل cpusets أذونات نظام ملفات عادية. .P تنتمي كل عملية في النظام إلى cpuset واحدة بالضبط. تُحصر العملية للعمل فقط على وحدات المعالجة المركزية في cpuset التي تنتمي إليها، ولتخصيص الذاكرة فقط على عقد الذاكرة في تلك cpuset. عندما تقوم عملية بـ \fBfork\fP(2)، توضع العملية الابنة في نفس cpuset الخاصة بأبيها. بامتيازات كافية، يمكن نقل عملية من cpuset إلى أخرى، ويمكن تغيير وحدات المعالجة وعقد الذاكرة المسموح بها لـ cpuset موجودة. .P عندما يبدأ النظام بالإقلاع، تُعرف cpuset واحدة تشمل جميع وحدات المعالجة وعقد الذاكرة في النظام، وتكون جميع العمليات في تلك cpuset. خلال عملية الإقلاع، أو لاحقًا خلال تشغيل النظام العادي، يمكن إنشاء cpusets أخرى، كأدلة فرعية من هذه الـ cpuset الرئيسة، تحت تحكم مسؤول النظام، ويمكن وضع العمليات في هذه الـ cpusets الأخرى. .P تُدمج cpusets مع آلية تقارب الجدولة \fBsched_setaffinity\fP(2) وآليات موضع الذاكرة \fBmbind\fP(2) و \fBset_mempolicy\fP(2) في النواة. لا تسمح أي من هذه الآليات للعملية باستخدام وحدة معالجة أو عقدة ذاكرة غير مسموح بها بواسطة cpuset الخاصة بتلك العملية. إذا تعارضت التغييرات في موضع cpuset لعملية ما مع هذه الآليات الأخرى، فسيُفرض موضع cpuset حتى لو كان ذلك يعني تجاوز هذه الآليات الأخرى. تحقق النواة هذا التجاوز من خلال تقييد وحدات المعالجة وعقد الذاكرة المطلوبة بواسطة هذه الآليات الأخرى بصمت لتقتصر على تلك المسموح بها بواسطة cpuset العملية المستدعية. يمكن أن يؤدي هذا إلى إرجاع هذه الاستدعاءات الأخرى لخطأ، إذا انتهى مثل هذا الاستدعاء بطلب مجموعة فارغة من وحدات المعالجة أو عقد الذاكرة، بعد تقييد الطلب بـ cpuset العملية المستدعية. .P عادةً، تُستخدم cpuset لإدارة حصر وحدة المعالجة وعقدة الذاكرة لمجموعة من العمليات المتعاونة، مثل وظيفة مجدول دفعات، وتُستخدم هذه الآليات الأخرى لإدارة موضع العمليات الفردية أو مناطق الذاكرة داخل تلك المجموعة أو الوظيفة. .SH الملفات يمثل كل دليل تحت \fI/dev/cpuset\fP مجموعة cpuset ويحتوي على مجموعة ثابتة من الملفات الوهمية التي تصف حالة تلك الـ cpuset. .P تُنشأ مجموعات cpuset جديدة باستخدام استدعاء النظام \fBmkdir\fP(2) أو الأمر \fBmkdir\fP(1). تُستعلم خصائص cpuset وتُعدل، مثل أعلامها، ووحدات المعالجة وعقد الذاكرة المسموح بها، والعمليات المرتبطة بها، من خلال القراءة أو الكتابة في الملف المناسب في دليل cpuset تلك، كما هو موضح أدناه. .P تُنشأ الملفات الوهمية في كل دليل cpuset آليًا عند إنشاء الـ cpuset، كنتيجة لاستدعاء \fBmkdir\fP(2). لا يمكن إضافة أو إزالة هذه الملفات الوهمية مباشرة. .P يمكن إزالة دليل cpuset الذي لا يحتوي على أدلة cpuset ابنة، وليس له عمليات مرتبطة به، باستخدام \fBrmdir\fP(2) أو \fBrmdir\fP(1). ليس من الضروري، أو الممكن، إزالة الملفات الوهمية داخل الدليل قبل إزالته. .P الملفات الوهمية في كل دليل cpuset هي ملفات نصية صغيرة يمكن قراءتها وكتابتها باستخدام أدوات الصدفة التقليدية مثل \fBcat\fP(1) و \fBecho\fP(1)، أو من برنامج باستخدام وظائف مكتبة إدخال/إخراج الملفات أو استدعاءات النظام، مثل \fBopen\fP(2) و \fBread\fP(2) و \fBwrite\fP(2) و \fBclose\fP(2). .P .\" ====================== tasks ====================== تمثل الملفات الوهمية في دليل cpuset حالة النواة الداخلية وليس لها أي صورة مستمرة على القرص. كل من هذه الملفات الخاصة بكل cpuset مدرج وموصوف أدناه. .TP \fItasks\fP قائمة بمعرفات العمليات (PIDs) للعمليات في تلك الـ cpuset. تُنسق القائمة كسلسلة من الأرقام العشرية بترميز ASCII، يتبع كل منها سطر جديد. يمكن إضافة عملية إلى cpuset (وإزالتها آليًا من الـ cpuset التي كانت تحتوي عليها سابقًا) عن طريق كتابة معرفها (PID) في ملف \fItasks\fP الخاص بتلك الـ cpuset (مع أو بدون سطر جديد في النهاية). .IP .\" =================== notify_on_release =================== \fBتحذير:\fP يمكن كتابة معرف عملية (PID) واحد فقط في ملف \fItasks\fP في المرة الواحدة. إذا كُتبت سلسلة تحتوي على أكثر من معرف واحد، فسيُستخدم الأول فقط. .TP \fInotify_on_release\fP .\" Sx .\" ====================== cpus ====================== علم (0 أو 1). إذا ضُبط على (1)، فستتلقى cpuset تلك معاملة خاصة بعد إطلاقها، أي بعد أن تكف جميع العمليات عن استخدامها (أي تنتهي أو تُنقل إلى cpuset مختلفة) وتُزال جميع أدلة cpuset الابنة. انظر قسم \fBNotify On Release\fP أدناه. .TP \fIcpuset.cpus\fP .\" Sx قائمة بالأرقام المادية لوحدات المعالجة المركزية التي يُسمح للعمليات في تلك الـ cpuset بالتنفيذ عليها. انظر \fBList Format\fP أدناه للحصول على وصف لتنسيق \fIcpus\fP. .IP .\" ==================== cpu_exclusive ==================== يمكن تغيير وحدات المعالجة المسموح بها لـ cpuset عن طريق كتابة قائمة جديدة في ملف \fIcpus\fP الخاص بها. .TP \fIcpuset.cpu_exclusive\fP علم (0 أو 1). إذا ضُبط على (1)، يكون لـ cpuset استخدام حصري لوحدات المعالجة الخاصة بها (لا يجوز لأي cpuset شقيقة أو ابنة عم تداخل وحدات المعالجة). مبدئيًا، يكون هذا متوقفًا (0). كما أن cpusets المنشأة حديثًا تضبط هذا مبدئيًا على الإيقاف (0). .IP .\" ====================== mems ====================== تكون مجموعتا cpuset \fIشقيقتين\fP إذا تشاركتا نفس الـ cpuset الأب في هيكل \fI/dev/cpuset\fP. وتكون مجموعتا cpuset \fIأبناء عمومة\fP إذا لم تكن إحداهما سلفًا للأخرى. بغض النظر عن ضبط \fIcpu_exclusive\fP، إذا كانت إحدى الـ cpuset سلفًا للأخرى، وإذا كان لكلتا الـ cpusets قيم \fIcpus\fP غير فارغة، فيجب أن تتداخل \fIcpus\fP الخاصة بهما، لأن \fIcpus\fP لأي cpuset هي دائمًا مجموعة فرعية من \fIcpus\fP الخاصة بالـ cpuset الأب. .TP \fIcpuset.mems\fP .\" Sx .\" ==================== mem_exclusive ==================== قائمة بعقد الذاكرة التي يُسمح للعمليات في هذه الـ cpuset بتخصيص الذاكرة عليها. انظر \fBList Format\fP أدناه للحصول على وصف لتنسيق \fImems\fP. .TP \fIcpuset.mem_exclusive\fP .\" Sx علم (0 أو 1). إذا ضُبط على (1)، يكون لـ cpuset استخدام حصري لعقد الذاكرة الخاصة بها (لا يجوز لأي شقيق أو ابن عم التداخل). وأيضًا إذا ضُبط على (1)، تكون الـ cpuset هي cpuset من نوع \fBHardwall\fP (انظر أدناه). مبدئيًا، يكون هذا متوقفًا (0). كما أن cpusets المنشأة حديثًا تضبط هذا مبدئيًا على الإيقاف (0). .IP .\" ==================== mem_hardwall ==================== بغض النظر عن ضبط \fImem_exclusive\fP، إذا كانت إحدى الـ cpuset سلفًا للأخرى، فيجب أن تتداخل عقد الذاكرة الخاصة بهما، لأن عقد الذاكرة لأي cpuset هي دائمًا مجموعة فرعية من عقد الذاكرة للـ cpuset الأب. .TP \fIcpuset.mem_hardwall\fP (منذ لينكس 2.6.26) .\" ==================== memory_migrate ==================== علم (0 أو 1). إذا ضُبط على (1)، تكون الـ cpuset هي cpuset من نوع \fBHardwall\fP (انظر أدناه). على عكس \fBmem_exclusive\fP، لا يوجد قيود على ما إذا كان بإمكان cpusets الملحوظة بـ \fBmem_hardwall\fP الحصول على عقد ذاكرة متداخلة مع cpusets الشقيقة أو أبناء العمومة. مبدئيًا، يكون هذا متوقفًا (0). كما أن cpusets المنشأة حديثًا تضبط هذا مبدئيًا على الإيقاف (0). .TP \fIcpuset.memory_migrate\fP (منذ لينكس 2.6.16) .\" Sx .\" ==================== memory_pressure ==================== علم (0 أو 1). إذا ضُبط على (1)، يُمكّن نقل الذاكرة. مبدئيًا، يكون هذا متوقفًا (0). انظر قسم \fBMemory Migration\fP أدناه. .TP \fIcpuset.memory_pressure\fP (منذ لينكس 2.6.16) .\" Sx .\" ================= memory_pressure_enabled ================= مقياس لمقدار ضغط الذاكرة الذي تسببه العمليات في هذه الـ cpuset. انظر قسم \fBMemory Pressure\fP أدناه. ما لم يُفعل \fImemory_pressure_enabled\fP، تكون القيمة دائمًا صفرًا (0). هذا الملف للقراءة فقط. انظر قسم \fBWARNINGS\fP أدناه. .TP \fIcpuset.memory_pressure_enabled\fP (منذ لينكس 2.6.16) .\" Sx .\" ================== memory_spread_page ================== علم (0 أو 1). يتوفر هذا الملف في الـ cpuset الرئيسة فقط، وعادةً ما يكون \fI/dev/cpuset\fP. إذا ضُبط على (1)، تُفعل حسابات \fImemory_pressure\fP لجميع cpusets في النظام. مبدئيًا، يكون هذا متوقفًا (0). انظر قسم \fBMemory Pressure\fP أدناه. .TP \fIcpuset.memory_spread_page\fP (منذ لينكس 2.6.17) .\" Sx .\" ================== memory_spread_slab ================== علم (0 أو 1). إذا ضُبط على (1)، تُوزع الصفحات في خبيئة صفحات النواة (درئات نظام الملفات) بشكل موحد عبر الـ cpuset. مبدئيًا، يكون هذا متوقفًا (0) في الـ cpuset الرئيسة، ويُورث من الـ cpuset الأب في الـ cpusets المنشأة حديثًا. انظر قسم \fBMemory Spread\fP أدناه. .TP \fIcpuset.memory_spread_slab\fP (منذ لينكس 2.6.17) .\" Sx .\" ================== sched_load_balance ================== علم (0 أو 1). إذا ضُبط على (1)، تُوزع خبيئات الشرائح (slab caches) في النواة لمدخلات/مخرجات الملفات (بنى الأدلة والـ inodes) بشكل موحد عبر الـ cpuset. مبدئيًا، يكون هذا متوقفًا (0) في الـ cpuset الرئيسة، ويُورث من الـ cpuset الأب في الـ cpusets المنشأة حديثًا. انظر قسم \fBMemory Spread\fP أدناه. .TP \fIcpuset.sched_load_balance\fP (منذ لينكس 2.6.24) .\" Sx .\" ================== sched_relax_domain_level ================== علم (0 أو 1). إذا ضُبط على (1، وهو المبدئي) ستقوم النواة آليًا بموازنة حمل العمليات في تلك الـ cpuset عبر وحدات المعالجة المسموح بها فيها. إذا مُسح (0)، ستتجنب النواة موازنة حمل العمليات في هذه الـ cpuset، \fIما لم\fP تكن هناك cpuset أخرى بوحدات معالجة متداخلة ضُبط فيها علم \fIsched_load_balance\fP. انظر \fBScheduler Load Balancing\fP أدناه لمزيد من التفاصيل. .TP \fIcpuset.sched_relax_domain_level\fP (منذ لينكس 2.6.26) .\" Sx .\" ================== proc cpuset ================== عدد صحيح، بين \-1 وقيمة موجبة صغيرة. يتحكم \fIsched_relax_domain_level\fP في عرض نطاق وحدات المعالجة التي يقوم مجدول النواة عبرها بإعادة توازن فوري للمهام القابلة للتنفيذ. إذا عُطل \fIsched_load_balance\fP، فإن ضبط \fIsched_relax_domain_level\fP لا يهم، حيث لا يتم إجراء موازنة حمل. أما إذا فُعل \fIsched_load_balance\fP، فكلما زادت قيمة \fIsched_relax_domain_level\fP، اتسع نطاق وحدات المعالجة التي تُحاول موازنة الحمل الفورية عبرها. انظر \fBScheduler Relax Domain Level\fP أدناه لمزيد من التفاصيل. .P .\" ================== proc status ================== بالإضافة إلى الملفات الوهمية المذكورة أعلاه في كل دليل تحت \fI/dev/cpuset\fP، لكل عملية ملف وهمي، \fI/proc/\fPpid\fI/cpuset\fP، يعرض مسار دليل cpuset الخاص بالعملية بالنسبة إلى جذر نظام ملفات cpuset. .P .\" Sx .\" Sx أيضًا يحتوي ملف \fI/proc/\fPpid\fI/status\fP لكل عملية على أربعة أسطر مضافة، تعرض \fICpus_allowed\fP للعملية (وحدات المعالجة التي يمكن جدولتها عليها) و \fIMems_allowed\fP (عقد الذاكرة التي يمكنها الحصول على ذاكرة منها)، بالتنسيقين \fBMask Format\fP و \fBList Format\fP (انظر أدناه) كما هو موضح في المثال التالي: .P .in +4n .EX Cpus_allowed: ffffffff,ffffffff,ffffffff,ffffffff Cpus_allowed_list: 0\-127 Mems_allowed: ffffffff,ffffffff Mems_allowed_list: 0\-63 .EE .in .P .\" ================== EXTENDED CAPABILITIES ================== أُضيفت حقول "allowed" في لينكس 2.6.24؛ وأُضيفت حقول "allowed_list" في لينكس 2.6.26. .SH "القدرات الممتدة" .\" ================== Exclusive Cpusets ================== بالإضافة إلى التحكم في أي \fIcpus\fP و \fImems\fP يُسمح للعملية باستخدامها، توفر cpusets القدرات الممتدة التالية. .SS "مجموعات cpuset الحصرية" إذا لُحظت cpuset بـ \fIcpu_exclusive\fP أو \fImem_exclusive\fP، فلا يجوز لأي cpuset أخرى، باستثناء السلف المباشر أو السليل، مشاركة أي من وحدات المعالجة أو عقد الذاكرة نفسها. .P .\" ================== Hardwall ================== تقيد cpuset التي تكون \fImem_exclusive\fP تخصيصات النواة لصفحات خبيئة الدرئ وصفحات بيانات النواة الداخلية الأخرى التي تتشاركها النواة عادةً عبر مستخدمين متعددين. تقيد جميع الـ cpusets، سواء كانت \fImem_exclusive\fP أم لا، تخصيصات الذاكرة لمساحة المستخدم. وهذا يتيح ضبط النظام بحيث يمكن لعدة وظائف مستقلة مشاركة بيانات النواة المشتركة، مع عزل تخصيص المستخدم لكل وظيفة في الـ cpuset الخاصة بها. للقيام بذلك، أنشئ cpuset كبيرة من نوع \fImem_exclusive\fP لتحتوي على جميع الوظائف، وأنشئ cpusets ابنة غير \fImem_exclusive\fP لكل وظيفة فردية. يُسمح فقط بوضع كمية صغيرة من ذاكرة النواة، مثل طلبات معالجات المقاطعة، على عقد ذاكرة خارج حتى cpuset من نوع \fImem_exclusive\fP. .SS Hardwall تعد الـ cpuset التي ضُبط فيها \fImem_exclusive\fP أو \fImem_hardwall\fP هي cpuset من نوع \fIhardwall\fP. تقيد cpuset الـ \fIhardwall\fP تخصيصات النواة للصفحات، والدرئ، والبيانات الأخرى التي تتشاركها النواة عادةً عبر مستخدمين متعددين. تقيد جميع الـ cpusets، سواء كانت \fIhardwall\fP أم لا، تخصيصات الذاكرة لمساحة المستخدم. .P وهذا يتيح ضبط النظام بحيث يمكن لعدة وظائف مستقلة مشاركة بيانات النواة المشتركة، مثل صفحات نظام الملفات، مع عزل تخصيص المستخدم لكل وظيفة في الـ cpuset الخاصة بها. للقيام بذلك، أنشئ cpuset كبيرة من نوع \fIhardwall\fP لتحتوي على جميع الوظائف، وأنشئ cpusets ابنة لكل وظيفة فردية ليست من نوع \fIhardwall\fP. .P .\" ================== Notify On Release ================== يُسمح فقط بأخذ كمية صغيرة من ذاكرة النواة، مثل طلبات معالجات المقاطعة، خارج حتى الـ cpuset من نوع \fIhardwall\fP. .SS "الإشعار عند الإطلاق" إذا فُعل علم \fInotify_on_release\fP (1) في cpuset، فعندما تغادر آخر عملية في الـ cpuset (تخرج أو ترتبط بـ cpuset أخرى) وتُزال آخر cpuset ابنة لها، فستقوم النواة بتشغيل الأمر \fI/sbin/cpuset_release_agent\fP، مع تزويده باسم المسار (بالنسبة لنقطة وصل نظام ملفات cpuset) للـ cpuset المتروكة. وهذا يتيح الإزالة الآلية لـ cpusets المتروكة. .P القيمة المبدئية لـ \fInotify_on_release\fP في الـ cpuset الرئيسة عند إقلاع النظام هي التعطيل (0). والقيمة المبدئية للـ cpusets الأخرى عند الإنشاء هي القيمة الحالية لضبط \fInotify_on_release\fP الخاص بالأب. .P يُستدعى الأمر \fI/sbin/cpuset_release_agent\fP، مع اسم الـ cpuset المراد إطلاقها (المسار النسبي لـ \fI/dev/cpuset\fP) في \fIargv[1]\fP. .P المحتويات المعتادة للأمر \fI/sbin/cpuset_release_agent\fP هي ببساطة نص صدفة برمجى: .P .in +4n .EX #!/bin/sh rmdir /dev/cpuset/$1 .EE .in .P .\" ================== Memory Pressure ================== كما هو الحال مع قيم الأعلام الأخرى أدناه، يمكن تغيير هذا العلم عن طريق كتابة رقم ASCII‏ 0 أو 1 (مع سطر جديد اختياري في النهاية) في الملف، لمسح أو ضبط العلم، على التوالي. .SS "ضغط الذاكرة" يوفر \fImemory_pressure\fP للـ cpuset متوسطًا متحركًا بسيطًا لكل cpuset لمعدل محاولة العمليات فيها لتحرير الذاكرة المستخدمة على عقد الذاكرة الخاصة بها لتلبية طلبات ذاكرة إضافية. .P وهذا يتيح لمديري الدفعات الذين يراقبون الوظائف التي تعمل في cpusets مخصصة اكتشاف مستوى ضغط الذاكرة الذي تسببه تلك الوظيفة بكفاءة. .P هذا مفيد في الأنظمة المدارة بدقة التي تشغل مزيجًا واسعًا من الوظائف المقدمة، والتي قد تختار إنهاء أو إعادة ترتيب أولويات الوظائف التي تحاول استخدام ذاكرة أكثر مما هو مسموح به في العقد المخصصة لها، ومع وظائف الحوسبة العلمية المتوازية بشكل كبير، والطويلة الأمد، والمترابطة بإحكام والتي ستفشل بشكل كبير في تحقيق أهداف الأداء المطلوبة إذا بدأت في استخدام ذاكرة أكثر مما هو مسموح لها. .P توفر هذه الآلية طريقة اقتصادية للغاية لمدير الدفعات لمراقبة cpuset بحثًا عن علامات ضغط الذاكرة. والأمر متروك لمدير الدفعات أو كود المستخدم الآخر لقرر الإجراء الذي يجب اتخاذه إذا اكتشف علامات ضغط الذاكرة. .P .\" Sx ما لم يُفعل حساب ضغط الذاكرة عن طريق ضبط الملف الوهمي \fI/dev/cpuset/cpuset.memory_pressure_enabled\fP، فلن يُحسب لأي cpuset، وستعيد القراءات من أي \fImemory_pressure\fP دائمًا صفرًا، كما هو متمثل بالسلسلة "0\[rs]n" بترميز ASCII. انظر قسم \fBWARNINGS\fP أدناه. .P يُستخدم المتوسط المتحرك لكل cpuset للأسباب التالية: .IP \[bu] 3 نظرًا لأن هذا المقياس هو لكل cpuset بدلاً من أن يكون لكل عملية أو لكل منطقة ذاكرة وهمية، فإن حمل النظام الذي يفرضه مجدول الدفعات الذي يراقب هذا المقياس ينخفض بشكل كبير في الأنظمة الكبيرة، لأنه يمكن تجنب فحص قائمة المهام عند كل مجموعة من الاستعلامات. .IP \[bu] نظرًا لأن هذا المقياس هو متوسط متحرك وليس عدادًا تراكميًا، يمكن لمجدول الدفعات اكتشاف ضغط الذاكرة بقراءة واحدة، بدلاً من الاضطرار إلى القراءة وتراكم النتائج لفترة من الزمن. .IP \[bu] نظرًا لأن هذا المقياس هو لكل cpuset بدلاً من أن يكون لكل عملية، يمكن لمجدول الدفعات الحصول على المعلومات الرئيسية \- ضغط الذاكرة في cpuset \- بقراءة واحدة، بدلاً من الاضطرار إلى الاستعلام وتراكم النتائج عبر جميع مجموعة العمليات (المتغيرة ديناميكيًا) في الـ cpuset. .P يُحسب \fImemory_pressure\fP لـ cpuset باستخدام مرشح رقمي بسيط لكل cpuset يُحتفظ به داخل النواة. لكل cpuset، يتتبع هذا المرشح المعدل الأخير الذي تدخل فيه العمليات المرتبطة بتلك الـ cpuset في كود استرداد النواة المباشر. .P يُدخل إلى كود استرداد النواة المباشر عندما يتعين على العملية تلبية طلب صفحة ذاكرة من خلال العثور أولاً على صفحة أخرى لإعادة تخصيصها، بسبب نقص أي صفحات خالية متاحة بسهولة. تُعاد تخصيص صفحات نظام الملفات المتسخة (dirty) من خلال كتابتها أولاً على القرص. أما صفحات درئ نظام الملفات غير المعدلة فتُعاد تخصيصها ببساطة عن طريق إسقاطها، ورغم ذلك إذا كانت تلك الصفحة مطلوبة مرة أخرى، فسيتحتم إعادة قراءتها من القرص. .P .\" ================== Memory Spread ================== يوفر ملف \fIcpuset.memory_pressure\fP عددًا صحيحًا يمثل المعدل الأخير (عمر نصف قدره 10 ثوانٍ) لمرات الدخول إلى كود الاسترداد المباشر الذي تسببت فيه أي عملية في الـ cpuset، بوحدات محاولات الاسترداد في الثانية، مضروبة في 1000. .SS "نشر الذاكرة" يوجد ملفا أعلام منطقية لكل cpuset يتحكمان في مكان تخصيص النواة للصفحات لدرئات نظام الملفات وبنى بيانات النواة ذات الصلة. يُطلق عليهما \fIcpuset.memory_spread_page\fP و \fIcpuset.memory_spread_slab\fP. .P إذا ضُبط ملف العلم المنطقي \fIcpuset.memory_spread_page\fP لكل cpuset، فستقوم النواة بنشر درئات نظام الملفات (خبيئة الصفحة) بالتساوي عبر جميع العقد التي يُسمح للعملية المسببة للخطأ باستخدامها، بدلاً من تفضيل وضع تلك الصفحات في العقدة التي تعمل فيها العملية. .P إذا ضُبط ملف العلم المنطقي \fIcpuset.memory_spread_slab\fP لكل cpuset، فستقوم النواة بنشر بعض خبيئات الشرائح (slab caches) المتعلقة بنظام الملفات، مثل تلك الخاصة بالـ inodes ومدخلات الأدلة، بالتساوي عبر جميع العقد التي يُسمح للعملية المسببة للخطأ باستخدامها، بدلاً من تفضيل وضع تلك الصفحات في العقدة التي تعمل فيها العملية. .P لا يؤثر ضبط هذه الأعلام على مقطع البيانات (انظر \fBbrk\fP(2)) أو صفحات مقطع المكدس للعملية. .P مبدئيًا، كلا النوعين من نشر الذاكرة متوقفان وتفضل النواة تخصيص صفحات الذاكرة في العقدة المحلية لمكان تشغيل العملية الطالبة. إذا لم تكن تلك العقدة مسموحًا بها بموجب سياسة ذاكرة NUMA للعملية أو ضبط cpuset أو إذا لم تكن هناك صفحات ذاكرة خالية كافية في تلك العقدة، فستبحث النواة عن أقرب عقدة مسموح بها وبها ذاكرة خالية كافية. .P عند إنشاء cpusets جديدة، فإنها ترث إعدادات نشر الذاكرة من أبيها. .P يؤدي ضبط نشر الذاكرة إلى جعل تخصيصات صفحات الذاكرة أو خبيئات الشرائح المتأثرة تتجاهل سياسة ذاكرة NUMA للعملية وتُنشر بدلاً من ذلك. ومع ذلك، فإن تأثير هذه التغييرات في موضع الذاكرة الناتج عن نشر الذاكرة المحدد بواسطة cpuset يكون مخفيًا عن استدعاءات \fBmbind\fP(2) أو \fBset_mempolicy\fP(2). تظهر هاتان الاستدعاءتان لسياسة ذاكرة NUMA دائمًا وكأنه لا يوجد نشر ذاكرة محدد بواسطة cpuset، حتى لو كان مفعلًا. وإذا أُوقف نشر ذاكرة cpuset لاحقًا، تُطبق سياسة ذاكرة NUMA المحددة مؤخرًا بواسطة هذه الاستدعاءات آليًا. .P كلا من \fIcpuset.memory_spread_page\fP و \fIcpuset.memory_spread_slab\fP هما ملفا أعلام منطقية. مبدئيًا، يحتويان على "0"، مما يعني أن الميزة معطلة لتلك الـ cpuset. إذا كُتب "1" في هذا الملف، فسيتم تفعيل الميزة المذكورة. .P يتصرف نشر الذاكرة المحدد بواسطة cpuset بشكل مشابه لما يُعرف (في سياقات أخرى) باسم موضع الذاكرة الدوري (round\-robin) أو المتشابك (interleave). .P يمكن أن يوفر نشر الذاكرة المحدد بواسطة cpuset تحسينات جوهرية في الأداء للوظائف التي: .IP \[bu] 3 الحاجة إلى وضع البيانات المحلية للخيوط (thread\-local) على عقد ذاكرة قريبة من وحدات المعالجة المركزية التي تشغل الخيوط الأكثر وصولاً لهذه البيانات؛ ولكن أيضًا .IP \[bu] الحاجة للوصول إلى مجموعات بيانات كبيرة في نظام ملفات يجب توزيعها عبر عدة عقد في مجموعة المعالجات (cpuset) الخاصة بالمهمة لكي تسعها. .P .\" ================== Memory Migration ================== بدون هذه السياسة، قد يصبح تخصيص الذاكرة عبر العقد في مجموعة معالجات المهمة غير متساوٍ للغاية، لا سيما في المهام التي قد تحتوي على خيط واحد فقط يهيئ أو يقرأ مجموعة البيانات. .SS "هجرة الذاكرة" عادةً، في ظل الإعداد المبدئي (المعطل) لـ \fIcpuset.memory_migrate\fP، بمجرد تخصيص صفحة (إعطائها صفحة فيزيائية من الذاكرة الرئيسية)، تظل تلك الصفحة في أي عقدة خُصصت فيها طالما بقيت مخصصة، حتى لو تغيرت سياسة وضع الذاكرة \fImems\fP لمجموعة المعالجات لاحقًا. .P عند تفعيل هجرة الذاكرة في مجموعة معالجات، إذا تغير إعداد \fImems\fP للمجموعة، فإن أي صفحة ذاكرة مستخدمة من قبل أي عملية في المجموعة موجودة على عقدة ذاكرة لم تعد مسموحة ستُنقل إلى عقدة ذاكرة مسموحة. .P علاوة على ذلك، إذا نُقلت عملية إلى مجموعة معالجات مفعّل فيها \fImemory_migrate\fP، فإن أي صفحات ذاكرة تستخدمها كانت على عقد ذاكرة مسموحة في مجموعتها السابقة، ولكنها غير مسموحة في مجموعتها الجديدة، ستُنقل إلى عقدة ذاكرة مسموحة في المجموعة الجديدة. .P .\" ================== Scheduler Load Balancing ================== يُحفظ الموضع النسبي للصفحة المنقولة داخل مجموعة المعالجات أثناء عمليات الهجرة هذه قدر الإمكان. على سبيل المثال، إذا كانت الصفحة في العقدة الصالحة الثانية لمجموعة المعالجات السابقة، فستوضع الصفحة في العقدة الصالحة الثانية للمجموعة الجديدة، إن أمكن. .SS "موازنة حمل المجدول" يقوم مجدول النواة بموازنة حمل العمليات آليًا. إذا كانت إحدى وحدات المعالجة المركزية غير مستغلة كفاية، فستبحث النواة عن عمليات في وحدات معالجة أخرى أكثر حملاً وتنقل تلك العمليات إلى الوحدة غير المستغلة، ضمن قيود آليات الموضع مثل مجموعات المعالجات و \fBsched_setaffinity\fP(2). .P تزداد التكلفة الخوارزمية لموازنة الحمل وتأثيرها على هياكل بيانات النواة المشتركة الرئيسة (مثل قائمة العمليات) بشكل أكبر من الخطي مع زيادة عدد وحدات المعالجة المركزية التي تجري موازنتها. على سبيل المثال، تكلف موازنة الحمل عبر مجموعة واحدة كبيرة من المعالجات أكثر مما تكلفه الموازنة عبر مجموعتين أصغر، حجم كل منهما نصف المجموعة الكبيرة. (تعتمد العلاقة الدقيقة بين عدد المعالجات وتكلفة موازنة الحمل على تفاصيل تنفيذ مجدول عمليات النواة، والتي تخضع للتغيير بمرور الوقت مع تنفيذ خوارزميات مجدول محسنة). .P يوفر علم \fIsched_load_balance\fP الخاص بكل مجموعة معالجات آلية لكبح موازنة حمل المجدول الآلية هذه في الحالات التي لا تكون فيها ضرورية وحيث يحقق كبحها فوائد أداء قيمة. .P .\" Sx بشكل مبدئي، تُجرى موازنة الحمل عبر جميع وحدات المعالجة المركزية، باستثناء تلك المعلمة كمعزولة باستخدام معطى وقت إقلاع النواة "isolcpus=". (انظر \fBمستوى استرخاء نطاق المجدول\fP أدناه لتغيير هذا الافتراض). .P موازنة الحمل المبدئية هذه عبر جميع المعالجات لا تناسب الحالتين التاليتين: .IP \[bu] 3 في الأنظمة الكبيرة، تكون موازنة الحمل عبر العديد من المعالجات مكلفة. إذا كان النظام يُدار باستخدام مجموعات معالجات لوضع مهام مستقلة على مجموعات منفصلة من المعالجات، فإن موازنة الحمل الكاملة تصبح غير ضرورية. .IP \[bu] الأنظمة التي تدعم الزمن الحقيقي (real\-time) على بعض المعالجات تحتاج إلى تقليل الأعباء الإضافية للنظام على تلك المعالجات، بما في ذلك تجنب موازنة حمل العمليات إذا لم تكن هناك حاجة إليها. .P عند تفعيل علم \fIsched_load_balance\fP (الإعداد المبدئي)، فإنه يطلب موازنة الحمل عبر جميع وحدات المعالجة المركزية المسموح بها في تلك المجموعة، مما يضمن أن موازنة الحمل يمكنها نقل عملية (غير مقيدة بطريقة أخرى، كما في \fBsched_setaffinity\fP(2)) من أي معالج في تلك المجموعة إلى أي معالج آخر فيها. .P عند تعطيل علم \fIsched_load_balance\fP، سيتجنب المجدول موازنة الحمل عبر المعالجات في تلك المجموعة، \fIإلا\fP بالقدر الضروري بسبب وجود مجموعة معالجات متداخلة مفعّل فيها \fIsched_load_balance\fP. .P لذا، على سبيل المثال، إذا كان لمجموعة المعالجات العليا علم \fIsched_load_balance\fP مفعلاً، فسيقوم المجدول بموازنة الحمل عبر جميع المعالجات، ولن يكون لإعداد علم \fIsched_load_balance\fP في مجموعات المعالجات الأخرى أي تأثير، لأننا نقوم بالفعل بموازنة حمل كاملة. .P وبناءً عليه، في الحالتين المذكورتين أعلاه، ينبغي تعطيل علم \fIsched_load_balance\fP في المجموعة العليا، وتفعيله فقط في بعض المجموعات الفرعية الأصغر. .P عند القيام بذلك، لا يُفضل عادةً ترك أي عمليات غير مقيدة في المجموعة العليا قد تستهلك قدراً غير قليل من المعالج، لأن هذه العمليات قد تُقيد قسرياً بمجموعة فرعية من المعالجات بناءً على تفاصيل إعداد هذا العلم في المجموعات المنحدرة. وحتى لو استطاعت مثل هذه العملية استخدام دورات معالج شاغرة في معالجات أخرى، فقد لا ينظر مجدول النواة في إمكانية موازنة حمل تلك العملية إلى المعالج غير المستغل. .P .\" ================== Scheduler Relax Domain Level ================== بالطبع، يمكن ترك العمليات المقيدة بمعالج معين في مجموعة معالجات تعطل \fIsched_load_balance\fP لأن تلك العمليات لن تذهب إلى أي مكان آخر على أي حال. .SS "مستوى استرخاء نطاق المجدول" يقوم مجدول النواة بموازنة حمل فورية كلما أصبح المعالج متاحاً أو أصبحت مهمة أخرى قابلة للتشغيل. تعمل موازنة الحمل هذه لضمان توظيف أكبر عدد ممكن من المعالجات بشكل مفيد في تشغيل المهام. كما تقوم النواة بموازنة حمل دورية بناءً على ساعة البرمجيات الموصوفة في \fBtime\fP(7). ينطبق إعداد \fIsched_relax_domain_level\fP فقط على موازنة الحمل الفورية. وبغض النظر عن إعداد \fIsched_relax_domain_level\fP، تُحاول موازنة الحمل الدورية عبر جميع المعالجات (ما لم تُعطل عن طريق إيقاف \fIsched_load_balance\fP). وفي كل الأحوال، ستُجدول المهام للعمل فقط على المعالجات المسموح بها من قبل مجموعة معالجاتها، كما تُعدلها نداءات النظام \fBsched_setaffinity\fP(2). .P في الأنظمة الصغيرة، مثل تلك التي تحتوي على عدد قليل من المعالجات، تكون موازنة الحمل الفورية مفيدة لتحسين تفاعلية النظام وتقليل دورات المعالج الضائعة في وضع الخمول. ولكن في الأنظمة الكبيرة، قد يكون محاولة موازنة الحمل الفورية عبر عدد كبير من المعالجات أكثر تكلفة مما تستحق، اعتماداً على خصائص الأداء الخاصة بمزيج المهام والعتاد. .P سيعتمد المعنى الدقيق لقيم الأعداد الصحيحة الصغيرة لـ \fIsched_relax_domain_level\fP على تفاصيل التنفيذ الداخلية لكود مجدول النواة وعلى بنية العتاد غير الموحدة. وكلاهما سيتطور بمرور الوقت ويختلف باختلاف بنية النظام وإصدار النواة. .P حتى وقت كتابة هذا، عندما قُدمت هذه الميزة في لينكس 2.6.26، كان للقيم الموجبة لـ \fIsched_relax_domain_level\fP في بعض البنى الشهيرة المعاني التالية. .P .PD 0 .TP \fB1\fP إجراء موازنة حمل فورية عبر أشقاء خيوط المعالجة الفائقة (Hyper\-Thread) في نفس النواة. .TP \fB2\fP إجراء موازنة حمل فورية عبر النوى الأخرى في نفس الحزمة (package). .TP \fB3\fP إجراء موازنة حمل فورية عبر المعالجات الأخرى في نفس العقدة أو النصلة (blade). .TP \fB4\fP إجراء موازنة حمل فورية عبر عدة عقد (تفصيل تنفيذي) [في أنظمة NUMA]. .TP \fB5\fP إجراء موازنة حمل فورية عبر جميع المعالجات في النظام [في أنظمة NUMA]. .PD .P تعني قيمة الصفر (0) لـ \fIsched_relax_domain_level\fP دائماً عدم إجراء موازنة حمل فورية، وبالتالي تُجرى موازنة الحمل بشكل دوري فقط، وليس فوراً عندما يصبح المعالج متاحاً أو تصبح مهمة أخرى قابلة للتشغيل. .P تعني قيمة ناقص واحد (\-1) لـ \fIsched_relax_domain_level\fP دائماً استخدام القيمة المبدئية للنظام. يمكن أن تختلف القيمة المبدئية للنظام باختلاف البنية وإصدار النواة. يمكن تغيير هذه القيمة المبدئية عن طريق معطى وقت إقلاع النواة "relax_domain_level=". .P في حالة وجود مجموعات معالجات متعددة متداخلة لها قيم \fIsched_relax_domain_level\fP متعارضة، فإن القيمة الأعلى هي التي تُطبق على جميع المعالجات في أي من المجموعات المتداخلة. وفي مثل هذه الحالات، تُعتبر \fB\-1\fP هي القيمة الأدنى، وتُلغى بأي قيمة أخرى، و \fB0\fP هي القيمة الأدنى التالية. .SH التنسيقات .\" ================== Mask Format ================== تُستخدم التنسيقات التالية لتمثيل مجموعات وحدات المعالجة المركزية وعقد الذاكرة. .SS "تنسيق القناع" يُستخدم تنسيق القناع لتمثيل أقنعة البتات لمعالجات وعقد الذاكرة في ملف \fI/proc/\fPpid\fI/status\fP. .P يعرض هذا التنسيق كل كلمة بطول 32 بت بالنظام الست عشري (باستخدام محارف ASCII "0" \- "9" و "a" \- "f")؛ وتُملأ الكلمات بأصفار بادئة عند الحاجة. وبالنسبة للأقنعة التي تزيد عن كلمة واحدة، تُستخدم الفاصلة للفصل بين الكلمات. تُعرض الكلمات بترتيب الـ big\-endian، حيث تظهر البتات الأكثر أهمية أولاً. والأرقام الست عشرية داخل الكلمة تكون أيضاً بترتيب big\-endian. .P عدد الكلمات ذات الـ 32 بت المعروضة هو الحد الأدنى اللازم لعرض جميع بتات قناع البتات، بناءً على حجم القناع. .P Examples of the \fBMask\ Format\fP: .P .in +4n .EX 00000001 # تعيين البت 0 فقط 40000000,00000000,00000000 # تعيين البت 94 فقط 00000001,00000000,00000000 # تعيين البت 64 فقط 000000ff,00000000 # تعيين البتات 32\-39 00000000,000e3862 # تعيين 1، 5، 6، 11\-13، 17\-19 .EE .in .P قناع بتات بتعيين البتات 0، 1، 2، 4، 8، 16، 32، و 64 يظهر كالتالي: .P .in +4n .EX 00000001,00000001,00010117 .EE .in .P .\" ================== List Format ================== الرقم "1" الأول للبت 64، والثاني للبت 32، والثالث للبت 16، والرابع للبت 8، والخامس للبت 4، والرقم "7" للبتات 2 و 1 و 0. .SS "تنسيق القائمة" تنسيق القائمة لـ \fIcpus\fP و \fImems\fP هو قائمة مفصولة بفواصل لأرقام ونطاقات أرقام المعالجات أو عقد الذاكرة، بنظام ASCII العشري. .P Examples of the \fBList\ Format\fP: .P .in +4n .EX 0\-4,9 # تعيين البتات 0، 1، 2، 3، 4، و 9 0\-2,7,12\-14 # تعيين البتات 0، 1، 2، 7، 12، 13، و 14 .EE .in .\" ================== RULES ================== .SH قواعد تنطبق القواعد التالية على كل مجموعة معالجات: .IP \[bu] 3 يجب أن تكون معالجاتها وعقد ذاكرتها مجموعة فرعية (قد تكون مساوية) من تلك الخاصة بوالدتها. .IP \[bu] لا يمكن تعليمها كـ \fIcpu_exclusive\fP إلا إذا كانت والدتها معلمة بذلك. .IP \[bu] لا يمكن تعليمها كـ \fImem_exclusive\fP إلا إذا كانت والدتها معلمة بذلك. .IP \[bu] إذا كانت \fIcpu_exclusive\fP، فلا يجوز لمعالجاتها أن تتداخل مع أي مجموعة شقيقة. .IP \[bu] .\" ================== PERMISSIONS ================== إذا كانت \fImem_exclusive\fP، فلا يجوز لعقد ذاكرتها أن تتداخل مع أي مجموعة شقيقة. .SH الأذونات تُحدد أذونات مجموعة المعالجات من خلال أذونات الأدلة والملفات الوهمية في نظام ملفات مجموعات المعالجات، والذي يُوصل عادةً عند \fI/dev/cpuset\fP. .P على سبيل المثال، يمكن لعملية أن تضع نفسها في مجموعة معالجات أخرى (غير مجموعتها الحالية) إذا كان بإمكانها الكتابة في ملف \fItasks\fP الخاص بتلك المجموعة. يتطلب هذا إذن التنفيذ على الأدلة المحيطة وإذن الكتابة على ملف \fItasks\fP. .P يُطبق قيد إضافي على طلبات وضع عملية أخرى في مجموعة معالجات. لا يجوز لعملية أن تربط أخرى بمجموعة معالجات إلا إذا كان لديها إذن بإرسال إشارة لتلك العملية (انظر \fBkill\fP(2)). .P يجوز لعملية إنشاء مجموعة معالجات فرعية إذا كان بإمكانها الوصول إلى دليل مجموعة المعالجات الوالدة والكتابة فيه. ويمكنها تعديل المعالجات أو عقد الذاكرة في مجموعة ما إذا كان بإمكانها الوصول إلى دليل تلك المجموعة (أذونات التنفيذ على كل من الأدلة الأبوية) والكتابة في ملف \fIcpus\fP أو \fImems\fP المقابل. .P هناك فرق بسيط واحد بين الطريقة التي تُقيم بها هذه الأذونات والطريقة التي تُقيم بها أذونات عمليات نظام الملفات العادية. تفسر النواة أسماء المسارات النسبية بدءاً من دليل العمل الحالي للعملية. حتى لو كان المرء يعمل على ملف مجموعة معالجات، فإن المسارات النسبية تُفسر بالنسبة لدليل عمل العملية الحالي، وليس بالنسبة لمجموعة معالجات العملية الحالية. الطرق الوحيدة التي يمكن من خلالها استخدام مسارات مجموعة معالجات نسبية لمجموعة العملية الحالية هي إما أن يكون دليل عمل العملية الحالي هو نفسه دليل مجموعتها (بأن تكون قد أجرت \fBcd\fP أو \fBchdir\fP(2) إلى دليل مجموعتها تحت \fI/dev/cpuset\fP، وهو أمر غير معتاد) أو إذا قام كود المستخدم بتحويل مسار مجموعة المعالجات النسبي إلى مسار نظام ملفات كامل. .P .\" ================== WARNINGS ================== نظرياً، يعني هذا أن كود المستخدم يجب أن يحدد مجموعات المعالجات باستخدام مسارات مطلقة، مما يتطلب معرفة نقطة وصل نظام ملفات مجموعات المعالجات (عادةً، ولكن ليس بالضرورة، \fI/dev/cpuset\fP). وعملياً، فإن كل كود مستوى المستخدم الذي يعلمه المؤلف يفترض ببساطة أنه إذا وُصل نظام ملفات مجموعات المعالجات، فإنه موصول عند \fI/dev/cpuset\fP. علاوة على ذلك، من الممارسات الشائعة للكود المكتوب بعناية التحقق من وجود الملف الوهمي \fI/dev/cpuset/tasks\fP للتأكد من أن نظام الملفات الوهمي لمجموعات المعالجات موصول حالياً. .SH تحذيرات .SS "تفعيل memory_pressure" بشكل مبدئي، يحتوي ملف \fIcpuset.memory_pressure\fP الخاص بكل مجموعة دائماً على الصفر (0). وما لم تُفعل هذه الميزة بكتابة "1" في الملف الوهمي \fI/dev/cpuset/cpuset.memory_pressure_enabled\fP، فإن النواة لن تحسب \fImemory_pressure\fP لكل مجموعة معالجات. .SS "استخدام أمر echo" .\" Gack! csh(1)'s echo does this عند استخدام أمر \fBecho\fP في محث الصدفة لتغيير قيم ملفات مجموعة المعالجات، انتبه إلى أن أمر \fBecho\fP المدمج في بعض الصدفات لا يعرض رسالة خطأ إذا فشل نداء النظام \fBwrite\fP(2). على سبيل المثال، إذا فشل الأمر: .P .in +4n .EX echo 19 > cpuset.mems .EE .in .P بسبب عدم السماح بعقدة الذاكرة 19 (ربما لا يحتوي النظام الحالي على عقدة ذاكرة بهذا الرقم)، فقد لا يعرض أمر \fBecho\fP أي خطأ. من الأفضل استخدام الأمر الخارجي \fB/bin/echo\fP لتغيير إعدادات ملف مجموعة المعالجات، حيث سيعرض هذا الأمر أخطاء \fBwrite\fP(2)، كما في المثال: .P .in +4n .EX /bin/echo 19 > cpuset.mems /bin/echo: write error: Invalid argument .EE .in .\" ================== EXCEPTIONS ================== .SH استثناءات .SS "موضع الذاكرة" ليست كل تخصيصات ذاكرة النظام مقيدة بمجموعات المعالجات، وذلك للأسباب التالية. .P إذا استخدمت ميزة التوصيل السريع (hot\-plug) لإزالة جميع المعالجات المخصصة حالياً لمجموعة ما، فستقوم النواة آلياً بتحديث \fIcpus_allowed\fP لجميع العمليات المرتبطة بالمعالجات في تلك المجموعة للسماح بجميع المعالجات. وعندما تتوفر ميزة التوصيل السريع للذاكرة لإزالة عقد الذاكرة، يُتوقع تطبيق استثناء مماثل هناك أيضاً. وبشكل عام، تفضل النواة خرق قيود موضع مجموعة المعالجات بدلاً من تجويع عملية أُخرجت جميع معالجاتها أو عقد ذاكرتها المسموحة عن الخدمة (offline). يجب على كود المستخدم إعادة ضبط مجموعات المعالجات للإشارة فقط إلى المعالجات وعقد الذاكرة المتصلة عند استخدام التوصيل السريع لإضافة أو إزالة مثل هذه الموارد. .P هناك بضع طلبات تخصيص ذاكرة داخلية حرجة للنواة، معلمة بـ GFP_ATOMIC، يجب توفيرها فوراً. قد تُسقط النواة بعض الطلبات أو تتعطل إذا فشل أحد هذه التخصيصات. وإذا تعذر توفير مثل هذا الطلب داخل مجموعة معالجات العملية الحالية، فإننا نرخي قيود المجموعة ونبحث عن الذاكرة في أي مكان يمكننا العثور فيه عليها. من الأفضل خرق قيود المجموعة بدلاً من إجهاد النواة. .P تخصيصات الذاكرة التي تطلبها مشغلات النواة أثناء معالجة مقاطعة تفتقر إلى أي سياق عملية ذي صلة، ولا تقيدها مجموعات المعالجات. .SS "إعادة تسمية مجموعات المعالجات" .\" ================== ERRORS ================== يمكنك استخدام نداء النظام \fBrename\fP(2) لإعادة تسمية مجموعات المعالجات. يُدعم فقط إعادة التسمية البسيطة؛ أي أن تغيير اسم دليل المجموعة مسموح به، لكن نقل دليل إلى دليل مختلف غير مسموح به. .SH الأخطاء يقوم تنفيذ النواة لينكس لمجموعات المعالجات بتعيين \fIerrno\fP لتحديد سبب فشل نداء النظام الذي يؤثر على مجموعات المعالجات. .P إعدادات \fIerrno\fP المحتملة ومعانيها عند تعيينها في نداء فاشل لمجموعة معالجات هي كما هو مدرج أدناه. .TP \fBE2BIG\fP محاولة إجراء \fBwrite\fP(2) على ملف مجموعة معالجات خاص بطول أكبر من حد أقصى تحدده النواة لطول مثل هذه الكتابات. .TP \fBEACCES\fP محاولة \fBwrite\fP(2) لمعرف العملية (PID) لعملية ما في ملف \fItasks\fP لمجموعة معالجات مع الافتقار للإذن بنقل تلك العملية. .TP \fBEACCES\fP محاولة إضافة معالج أو عقدة ذاكرة إلى مجموعة باستخدام \fBwrite\fP(2)، بينما لم يكن هذا المعالج أو تلك العقدة موجودين بالفعل في والدتها. .TP \fBEACCES\fP محاولة ضبط \fIcpuset.cpu_exclusive\fP أو \fIcpuset.mem_exclusive\fP باستخدام \fBwrite\fP(2) على مجموعة تفتقر والدتها لنفس الإعداد. .TP \fBEACCES\fP محاولة إجراء \fBwrite\fP(2) لملف \fIcpuset.memory_pressure\fP. .TP \fBEACCES\fP محاولة إنشاء ملف في دليل مجموعة معالجات. .TP \fBEBUSY\fP محاولة إزالة مجموعة معالجات مرتبطة بها عمليات باستخدام \fBrmdir\fP(2). .TP \fBEBUSY\fP محاولة إزالة مجموعة معالجات لها مجموعات فرعية باستخدام \fBrmdir\fP(2). .TP \fBEBUSY\fP محاولة إزالة معالج أو عقدة ذاكرة من مجموعة وهي موجودة أيضاً في مجموعة فرعية لتلك المجموعة. .TP \fBEEXIST\fP حُووِل إنشاء مجموعة معالجات (cpuset)، باستخدام \fBmkdir\fP(2)، موجودة بالفعل. .TP \fBEEXIST\fP حُووِل تغيير اسم \fBrename\fP(2) مجموعة معالجات إلى اسم موجود بالفعل. .TP \fBEFAULT\fP حُووِل قراءة \fBread\fP(2) أو كتابة \fBwrite\fP(2) ملف مجموعة معالجات باستخدام مخزن مؤقت خارج مساحة العناوين التي يمكن لعمليات الكتابة الوصول إليها. .TP \fBEINVAL\fP حُووِل تغيير مجموعة معالجات، باستخدام \fBwrite\fP(2)، بطريقة تنتهك سمة \fIcpu_exclusive\fP أو \fImem_exclusive\fP لتلك المجموعة أو أي من أشقائها. .TP \fBEINVAL\fP حُووِل كتابة \fBwrite\fP(2) قائمة \fIcpuset.cpus\fP أو \fIcpuset.mems\fP فارغة إلى مجموعة معالجات مرتبطة بعمليات أو مجموعات معالجات فرعية. .TP \fBEINVAL\fP حُووِل كتابة \fBwrite\fP(2) قائمة \fIcpuset.cpus\fP أو \fIcpuset.mems\fP تتضمن نطاقًا يكون فيه الرقم الثاني أصغر من الرقم الأول. .TP \fBEINVAL\fP حُووِل كتابة \fBwrite\fP(2) قائمة \fIcpuset.cpus\fP أو \fIcpuset.mems\fP تتضمن محرفًا غير صالح في السلسلة النصية. .TP \fBEINVAL\fP حُووِل كتابة \fBwrite\fP(2) قائمة إلى ملف \fIcpuset.cpus\fP لا تتضمن أي معالجات متصلة (online). .TP \fBEINVAL\fP حُووِل كتابة \fBwrite\fP(2) قائمة إلى ملف \fIcpuset.mems\fP لا تتضمن أي عقد ذاكرة متصلة. .TP \fBEINVAL\fP حُووِل كتابة \fBwrite\fP(2) قائمة إلى ملف \fIcpuset.mems\fP تتضمن عقدة لا تحتوي على ذاكرة. .TP \fBEIO\fP حُووِل كتابة \fBwrite\fP(2) سلسلة نصية إلى ملف \fItasks\fP الخاص بمجموعة معالجات لا تبدأ بعدد صحيح عشري بترميز ASCII. .TP \fBEIO\fP حُووِل تغيير اسم \fBrename\fP(2) مجموعة معالجات إلى دليل مختلف. .TP \fBENAMETOOLONG\fP حُووِل قراءة \fBread\fP(2) ملف \fI/proc/\fPpid\fI/cpuset\fP لمسار مجموعة معالجات أطول من حجم صفحة النواة. .TP \fBENAMETOOLONG\fP حُووِل إنشاء مجموعة معالجات، باستخدام \fBmkdir\fP(2)، يكون اسم دليلها الأساس أطول من 255 محرفًا. .TP \fBENAMETOOLONG\fP حُووِل إنشاء مجموعة معالجات، باستخدام \fBmkdir\fP(2)، يكون مسارها الكامل، بما في ذلك بادئة نقطة الوصل (عادةً "/dev/cpuset/")، أطول من 4095 محرفًا. .TP \fBENODEV\fP أُزيلت مجموعة المعالجات بواسطة عملية أخرى في نفس الوقت الذي حُووِل فيه إجراء كتابة \fBwrite\fP(2) على أحد الملفات الوهمية في دليل المجموعة. .TP \fBENOENT\fP حُووِل إنشاء مجموعة معالجات، باستخدام \fBmkdir\fP(2)، داخل مجموعة معالجات أب غير موجودة. .TP \fBENOENT\fP حُووِل الوصول \fBaccess\fP(2) أو فتح \fBopen\fP(2) ملف غير موجود في دليل مجموعة معالجات. .TP \fBENOMEM\fP الذاكرة المتاحة داخل النواة غير كافية؛ يمكن أن يحدث هذا في مجموعة متنوعة من نداءات النظام التي تؤثر على مجموعات المعالجات، ولكن فقط إذا كان النظام يعاني من نقص حاد في الذاكرة. .TP \fBENOSPC\fP حُووِل كتابة \fBwrite\fP(2) معرف العملية (PID) لعملية ما إلى ملف \fItasks\fP الخاص بمجموعة معالجات عندما كان إعداد \fIcpuset.cpus\fP أو \fIcpuset.mems\fP الخاص بالمجموعة فارغًا. .TP \fBENOSPC\fP حُووِل كتابة \fBwrite\fP(2) إعداد \fIcpuset.cpus\fP أو \fIcpuset.mems\fP فارغ إلى مجموعة معالجات مرتبطة بمهام. .TP \fBENOTDIR\fP حُووِل تغيير اسم \fBrename\fP(2) مجموعة معالجات غير موجودة. .TP \fBEPERM\fP حُووِل إزالة ملف من دليل مجموعة معالجات. .TP \fBERANGE\fP حُدّدت قائمة \fIcpuset.cpus\fP أو \fIcpuset.mems\fP للنواة تتضمن رقمًا كبيرًا جدًا بحيث لا تستطيع النواة ضبطه في أقنعة البتات الخاصة بها. .TP \fBESRCH\fP .\" ================== VERSIONS ================== حُووِل كتابة \fBwrite\fP(2) معرف العملية (PID) لعملية غير موجودة في ملف \fItasks\fP الخاص بمجموعة معالجات. .SH الإصدارات .\" ================== NOTES ================== ظهرت مجموعات المعالجات في لينكس 2.6.12. .SH ملاحظات .\" ================== BUGS ================== على الرغم من اسمه، فإن معلمة \fIpid\fP هي في الواقع معرف خيط (thread ID)، وكل خيط في مجموعة خيوط يمكن ربطه بمجموعة معالجات مختلفة. القيمة المعادة من استدعاء \fBgettid\fP(2) يمكن تمريرها في المعطى \fIpid\fP. .SH العلل .\" ================== EXAMPLES ================== يمكن فتح ملفات \fIcpuset.memory_pressure\fP للكتابة أو الإنشاء أو الاقتطاع، ولكن بعدها ستفشل عملية الكتابة \fBwrite\fP(2) مع ضبط \fIerrno\fP على \fBEACCES\fP، ولن يكون لخيارات الإنشاء والاقتطاع في \fBopen\fP(2) أي تأثير. .SH أمثلة توضح الأمثلة التالية الاستعلام عن خيارات مجموعة المعالجات وضبطها باستخدام أوامر الصدفة. .SS "إنشاء مجموعة معالجات والارتباط بها." لإنشاء مجموعة معالجات جديدة وربط صدفة الأوامر الحالية بها، اتبع الخطوات التالية: .P .PD 0 .IP (1) 5 mkdir /dev/cpuset (إذا لم يكن قد أُنشئ بالفعل) .IP (2) mount \-t cpuset none /dev/cpuset (إذا لم يكن قد وُصل بالفعل) .IP (3) أنشئ مجموعة المعالجات الجديدة باستخدام \fBmkdir\fP(1). .IP (4) خصّص المعالجات وعقد الذاكرة لمجموعة المعالجات الجديدة. .IP (5) اربط الصدفة بمجموعة المعالجات الجديدة. .PD .P على سبيل المثال، سيقوم تسلسل الأوامر التالي بإعداد مجموعة معالجات تسمى "Charlie"، تحتوي فقط على المعالجين 2 و 3، وعقدة الذاكرة 1، ثم يربط الصدفة الحالية بتلك المجموعة. .P .in +4n .EX $\fB mkdir /dev/cpuset\fP $\fB mount \-t cpuset cpuset /dev/cpuset\fP $\fB cd /dev/cpuset\fP $\fB mkdir Charlie\fP $\fB cd Charlie\fP $\fB /bin/echo 2\-3 > cpuset.cpus\fP $\fB /bin/echo 1 > cpuset.mems\fP $\fB /bin/echo $$ > tasks\fP # الصدفة الحالية تعمل الآن في مجموعة المعالجات Charlie # السطر التالي يجب أن يعرض \[aq]/Charlie\[aq] $\fB cat /proc/self/cpuset\fP .EE .in .\" .SS "تهجير مهمة إلى عقد ذاكرة مختلفة." لتهجير مهمة (مجموعة العمليات المرتبطة بمجموعة معالجات) إلى معالجات وعقد ذاكرة مختلفة في النظام، بما في ذلك نقل صفحات الذاكرة المخصصة حاليًا لتلك المهمة، اتبع الخطوات التالية. .P .PD 0 .IP (1) 5 لنفترض أننا نريد نقل المهمة في مجموعة \fIalpha\fP (المعالجات 4\[en]7 و عقد الذاكرة 2\[en]3) إلى مجموعة جديدة \fIbeta\fP (المعالجات 16\[en]19 و عقد الذاكرة 8\[en]9). .IP (2) أنشئ أولاً مجموعة المعالجات الجديدة \fIbeta\fP. .IP (3) ثم اسمح بالمعالجات 16\[en]19 وعقد الذاكرة 8\[en]9 في \fIbeta\fP. .IP (4) ثم مكن \fImemory_migration\fP في \fIbeta\fP. .IP (5) ثم انقل كل عملية من \fIalpha\fP إلى \fIbeta\fP. .PD .P يحقق تسلسل الأوامر التالي هذا الغرض. .P .in +4n .EX $\fB cd /dev/cpuset\fP $\fB mkdir beta\fP $\fB cd beta\fP $\fB /bin/echo 16\-19 > cpuset.cpus\fP $\fB /bin/echo 8\-9 > cpuset.mems\fP $\fB /bin/echo 1 > cpuset.memory_migrate\fP $\fB while read i; do /bin/echo $i; done < ../alpha/tasks > tasks\fP .EE .in .P من المفترض أن ينقل ما سبق أي عمليات في \fIalpha\fP إلى \fIbeta\fP، وأي ذاكرة تحتفظ بها هذه العمليات في عقد الذاكرة 2\[en]3 إلى عقد الذاكرة 8\[en]9، على التوالي. .P لاحظ أن الخطوة الأخيرة من التسلسل أعلاه لم تنفذ: .P .in +4n .EX $\fB cp ../alpha/tasks tasks\fP .EE .in .P كانت حلقة \fIwhile\fP ضرورية، بدلاً من الاستخدام الذي يبدو أسهل لأمر \fBcp\fP(1)، لأنه لا يمكن كتابة سوى معرف عملية (PID) واحد فقط في كل مرة إلى ملف \fItasks\fP. .P يمكن تحقيق نفس التأثير (كتابة معرف عملية واحد في كل مرة) مثل حلقة \fIwhile\fP بشكل أكثر كفاءة، وبعدد أقل من ضربات المفاتيح وبصيغة تعمل على أي صدفة، ولكن للأسف بشكل أكثر غموضًا، باستخدام الخيار \fB\-u\fP (غير مخزن مؤقتًا) لأمر \fBsed\fP(1): .P .in +4n .EX $\fB sed \-un p < ../alpha/tasks > tasks\fP .EE .in .\" ================== SEE ALSO ================== .SH "انظر أيضًا" \fBtaskset\fP(1), \fBget_mempolicy\fP(2), \fBgetcpu\fP(2), \fBmbind\fP(2), \fBsched_getaffinity\fP(2), \fBsched_setaffinity\fP(2), \fBsched_setscheduler\fP(2), \fBset_mempolicy\fP(2), \fBCPU_SET\fP(3), \fBproc\fP(5), \fBcgroups\fP(7), \fBnuma\fP(7), \fBsched\fP(7), \fBmigratepages\fP(8), \fBnumactl\fP(8) .P \fIDocumentation/admin\-guide/cgroup\-v1/cpusets.rst\fP في شجرة مصدر نواة لينكس .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .