سؤال

عند استخدام mmap() بالنسبة للذاكرة المشتركة (من Linux ، أو غيرها من الأنظمة التي تشبه UNIX) ، فهل من الممكن (والمحمول) الاستخدام fcntl() (أو flock() أو lockf() وظائف) لتنسيق الوصول إلى التعيين؟

الردود على هذا السؤال جدا يبدو أنه يشير إلى أنه يجب أن يعمل.

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

من الناحية النظرية ، فإن كل عملية تبادل رسم خرائط الملف ستؤدي mmap(), ، ابحث عن كتلة مجانية فيه ، واكتسح قفلًا لمنطقة العملية/الصفحة ، وقم بتحديث ذلك بمهمته الخاصة ، ثم قم بإصدار القفل ثم استمر في عمله. يمكن لأي عملية البحث عن تعيينات قديمة (باستخدام kill() مع صفر كإشارة) وتنظيف رسم خرائط جدول العملية/الصفحة.

(بعبارات تقريبية ، عامة ، أنا أتعامل مع محرك معالجة المنتج/المستهلك باستخدام الذاكرة المشتركة من Python على Linux ؛ أود أن يكون الحل قابلاً للحمل إلى BSD ولغات البرمجة الأخرى --- طالما الدعم mmap() والواجهات اللازمة ل fcntl(), flock() أو lockf(). سأكون مهتمًا أيضًا برمز PSUEDO الذي يوضح كيف يمكن للمرء قياس خلاف القفل والكشف عن أي فشل المزامنة. أنا أدرك أن الخيوط و المعالجة متعددة مع كل منها Queue() الكائنات هي الطريقة الأكثر وضوحًا لتنفيذ نموذج معالجة المنتج/المستهلكين).

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

المحلول

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

لقد فعلت شيئًا مشابهًا لهذا من C ، لكنني استخدمت spinlocks الذرية في الذاكرة المشتركة نفسها. كان من المعتاد أنه كان عليك القيام ببعض التجميع المضمّن ، ولكن لدى GCC الآن بعض العمليات الجوهرية التي يمكنك استخدامها:

http://gcc.gnu.org/onlinedocs/gcc/atomic-builtins.html

إذا كنت على استعداد لكتابة امتداد بسيطة للغاية ، فيمكنك لف __sync_lock_test_and_set (...) و __sync_lock_release (...) القيام بما تحتاجه. يجب أن تكون هذه محمولة جدا.

أعتقد أن هناك طريقة لوضع pthread mutexes في الذاكرة المشتركة أيضًا ، لكن ليس لدي أي خبرة في ذلك. مرة أخرى ، يجب عليك كتابة امتداد C بسيط للوصول إلى ذلك من Python.

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