futex(7)

الاسم
futex - قفل سريع في مساحة المستخدم

موجز
#include <linux/futex.h>

الوصف
نواة لينكس توفر futexes ("مُعالجات الإقصاء المتبادل السريعة في مساحة المستخدم") ككتلة بناء للإقفال السريع والإشارات الثنائية في مساحة المستخدم. Futexes أساسية جدًا وتصلح جيدًا لبناء تجريدات إقفال عالية المستوى مثل معالجات الإقصاء المتبادل، متغيرات الشرط، أقفال القراءة-الكتابة، الحواجز، والإشارات الثنائية.

معظم المبرمجين في الواقع لن يستخدموا futexes مباشرة بل سيعتمدون بدلاً من ذلك على مكتبات النظام المبنية عليها، مثل مكتبة خيوط POSIX الأصلية (NPTL) (انظر pthreads(7)).

يُعرّف futex بقطعة ذاكرة يمكن مشاركتها بين العمليات أو الخيوط. في هذه العمليات المختلفة، لا يلزم أن يكون للـ futex عناوين متطابقة. في شكله الأساسي، يمتلك futex دلالات إشارة ثنائية؛ إنه عداد يمكن زيادته وإنقاصه ذريًا؛ يمكن للعمليات الانتظار حتى تصبح القيمة موجبة.

عملية futex تحدث بالكامل في مساحة المستخدم للحالة غير المتنازع عليها. النواة تُشرك فقط للتحكيم في الحالة المتنازع عليها. نظرًا لأن أي تصميم سليم سيسعى لعدم التنازع، فإن futexes مُحسّنة أيضًا لهذه الحالة.

في شكله الأساسي، futex هو عدد صحيح مُحاذى يُلمس فقط بواسطة تعليمات المُجمّع الذرية. هذا العدد الصحيح طوله أربعة بايتات على جميع المنصات. يمكن للعمليات مشاركة هذا العدد الصحيح باستخدام mmap(2)، عبر قطاعات الذاكرة المشتركة، أو لأنها تشارك مساحة الذاكرة، وفي هذه الحالة يُطلق على التطبيق عادةً اسم متعدد الخيوط.

  الدلالات
أي عملية futex تبدأ في مساحة المستخدم، لكن قد يكون من الضروري التواصل مع النواة باستخدام استدعاءات النظام futex(2) أو futex_waitv(2).

لـ "رفع" futex، نَفّذ تعليمات المُجمّع المناسبة التي ستجعل وحدة المعالجة المركزية المضيفة تزيد العدد الصحيح ذريًا. بعد ذلك، تحقق مما إذا كان قد تغير بالفعل من 0 إلى 1، وفي هذه الحالة لم يكن هناك منتظرون واكتملت العملية. هذه هي الحالة غير المتنازع عليها وهي سريعة ويجب أن تكون شائعة.

في الحالة المتنازع عليها، غيّرت الزيادة الذرية العداد من -1 (أو رقم سالب آخر). إذا تم اكتشاف ذلك، فهناك منتظرون. يجب على مساحة المستخدم الآن ضبط العداد على 1 وتوجيه النواة لإيقاظ أي منتظرين باستخدام عملية FUTEX_WAKE.

الانتظار على futex، لـ "خفضه"، هو العملية العكسية. أنقِص العداد ذريًا وتحقق مما إذا كان قد تغير إلى 0، وفي هذه الحالة اكتملت العملية وكان الـ futex غير متنازع عليه. في جميع الظروف الأخرى، يجب على العملية ضبط العداد على -1 وطلب من النواة الانتظار حتى ترفع عملية أخرى الـ futex. يتم ذلك باستخدام عملية FUTEX_WAIT.

يمكن اختياريًا تمرير مهلة زمنية لاستدعاءات النظام futex(2) و futex_waitv(2) تحدد المدة التي يجب أن تنتظرها النواة لرفع الـ futex. في هذه الحالة، الدلالات أكثر تعقيدًا ويُحال المبرمج إلى futex(2) لمزيد من التفاصيل. نفس الشيء ينطبق على انتظار futex غير المتزامن.

الإصدارات
دعم futex الأولي دُمج في لينكس 2.5.7 ولكن بدلالات مختلفة عن تلك الموصوفة أعلاه. الدلالات الحالية متاحة من لينكس 2.5.40 فصاعدًا.

ملاحظات
للتأكيد، futexes الأساسية ليست مُخصصة كتجريد سهل الاستخدام للمستخدمين النهائيين. يُتوقع من المنفذين أن يكونوا مُلمّين بلغة المُجمّع وأن يكونوا قد قرأوا مصادر مكتبة futex في مساحة المستخدم المُشار إليها أدناه.

صفحة الدليل هذه توضح الاستخدام الأكثر شيوعًا لبدائيات futex(2)؛ إنها ليست الوحيدة بأي حال من الأحوال.

انظر أيضًا
clone(2)، futex(2)، futex_waitv(2)، get_robust_list(2)، set_robust_list(2)، set_tid_address(2)، pthreads(7)

Fuss, Futexes and Furwocks: Fast Userlevel Locking in Linux (وقائع ندوة أوتاوا لينكس 2002)، مكتبة أمثلة futex، futex-*.tar.bz2 https://mirrors.kernel.org/pub/linux/kernel/people/rusty/.

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

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

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