posix_fadvise(2)

الاسم
posix_fadvise - الإعلان المسبق عن نمط وصول لبيانات الملف

المكتبة
مكتبة سي المعيارية (libc، -lc)

موجز
#include <fcntl.h>

int posix_fadvise(int fd, off_t offset, off_t size, int advice);

    متطلبات ماكروات اختبار الميزات لـ glibc (انظر feature_test_macros(7)):

posix_fadvise():
    _POSIX_C_SOURCE >= 200112L

الوصف
يمكن للبرامج استخدام posix_fadvise() للإعلان عن نية الوصول إلى بيانات الملف بنمط معين في المستقبل، مما يسمح للنواة بإجراء التحسينات المناسبة.

ينطبق advice على منطقة (ليست موجودة بالضرورة) تبدأ من offset وتمتد لـ size بايت (أو حتى نهاية الملف إذا كان size يساوي 0) داخل الملف المشار إليه بواسطة fd. advice غير ملزم؛ إنه يشكل فقط توقعًا نيابة عن التطبيق.

تشمل القيم المسموح بها لـ advice:

POSIX_FADV_NORMAL
    يشير إلى أن التطبيق ليس لديه نصيحة لتقديمها حول نمط الوصول الخاص به للبيانات المحددة. إذا لم يتم تقديم أي نصيحة لملف مفتوح، فهذا هو الافتراض المبدئي.

POSIX_FADV_SEQUENTIAL
    يتوقع التطبيق الوصول إلى البيانات المحددة بشكل تسلسلي (مع قراءة الإزاحات الأقل قبل الأعلى).

POSIX_FADV_RANDOM
    سيتم الوصول إلى البيانات المحددة بترتيب عشوائي.

POSIX_FADV_NOREUSE
    سيتم الوصول إلى البيانات المحددة مرة واحدة فقط.

    قبل Linux 2.6.18، كان لـ POSIX_FADV_NOREUSE نفس دلالات POSIX_FADV_WILLNEED. كان هذا على الأرجح خطأ؛ من Linux 2.6.18 حتى Linux 6.2 كانت هذه العلامة عملية فارغة. منذ Linux 6.3، تشير POSIX_FADV_NOREUSE إلى أن خوارزمية استبدال الصفحات في النواة يمكنها تجاهل الوصول إلى خبيئة الصفحات المعينة المميزة بهذه العلامة. هذا مفيد، على سبيل المثال، أثناء بث الملفات الكبيرة.

POSIX_FADV_WILLNEED
    سيتم الوصول إلى البيانات المحددة في المستقبل القريب.

    يبدأ POSIX_FADV_WILLNEED قراءة غير محظورة للمنطقة المحددة في خبيئة الصفحات. قد تقلل النواة كمية البيانات المقروءة اعتمادًا على حمل الذاكرة الافتراضية. (عادةً ما يتم تلبية بضعة ميغابايتات بالكامل، ونادرًا ما يكون المزيد مفيدًا.)

POSIX_FADV_DONTNEED
    لن يتم الوصول إلى البيانات المحددة في المستقبل القريب.

    يحاول POSIX_FADV_DONTNEED تحرير الصفحات المخبأة المرتبطة بالمنطقة المحددة. هذا مفيد، على سبيل المثال، أثناء بث الملفات الكبيرة. قد يطلب البرنامج دوريًا من النواة تحرير البيانات المخبأة التي تم استخدامها بالفعل، بحيث لا يتم التخلص من الصفحات المخبأة الأكثر فائدة بدلاً من ذلك.

    يتم تجاهل طلبات التخلص من الصفحات الجزئية. من الأفضل الحفاظ على البيانات المطلوبة بدلاً من التخلص من البيانات غير المطلوبة. إذا كان التطبيق يتطلب أن يتم النظر في التخلص من البيانات، فيجب أن يكون offset و size محاذيين للصفحة.

    قد تحاول التطبيق كتابة الصفحات المتسخة في المنطقة المحددة، لكن هذا غير مضمون. لن يتم تحرير أي صفحات متسخة غير مكتوبة. إذا رغب التطبيق في ضمان تحرير الصفحات المتسخة، فيجب عليه استدعاء fsync(2) أو fdatasync(2) أولاً.

قيمة الإرجاع
عند النجاح، يتم إرجاع صفر. عند الخطأ، يتم إرجاع رقم خطأ.

الأخطاء

EBADF
    وسيطة fd لم تكن واصف ملف صالح.

EINVAL
    تم تحديد قيمة غير صالحة لـ advice.

ESPIPE
    يشير واصف الملف المحدد إلى أنبوب أو FIFO. (ESPIPE هو الخطأ المحدد بواسطة POSIX، لكن قبل Linux 2.6.16، أعاد Linux EINVAL في هذه الحالة.)

الإصدارات
تحت Linux، يضبط POSIX_FADV_NORMAL نافذة القراءة المسبقة على الحجم المبدئي لجهاز الدعم؛ يضاعف POSIX_FADV_SEQUENTIAL هذا الحجم، ويعطل POSIX_FADV_RANDOM القراءة المسبقة للملف بالكامل. لا يعدل POSIX_FADV_NOREUSE حجم نافذة القراءة المسبقة. تؤثر هذه التغييرات على الملف بأكمله، وليس فقط المنطقة المحددة (لكن مقابض الملفات المفتوحة الأخرى لنفس الملف لا تتأثر).

  الاختلافات بين مكتبة C والنواة
اسم دالة الغلاف في مكتبة C هو posix_fadvise(). يُسمى استدعاء النظام الأساسي fadvise64() (أو، على بعض البنى، fadvise64_64())؛ الفرق بينهما هو أن استدعاء النظام الأول يفترض أن نوع وسيطة size هو size_t، بينما يتوقع الثاني loff_t هناك.

  متغيرات خاصة بالبنية
تتطلب بعض البنى محاذاة الوسائط ذات 64 بت في زوج مناسب من السجلات (انظر syscall(2) لمزيد من التفاصيل). في مثل هذه البنى، فإن توقيع استدعاء posix_fadvise() الموضح في الملخص سيجبر على إهدار سجل كحشو بين وسيطي fd وoffset. لذلك، تعرّف هذه البنى نسخة من استدعاء النظام ترتب الوسائط بشكل مناسب، ولكنها بخلاف ذلك مطابقة تمامًا لـ posix_fadvise().

على سبيل المثال، منذ Linux 2.6.14، تمتلك ARM استدعاء النظام التالي:

    long arm_fadvise64_64(int fd, int advice,
                          loff_t offset, loff_t size);

تُخفى هذه التفاصيل الخاصة بالبنى عمومًا عن التطبيقات بواسطة دالة الغلاف posix_fadvise() في glibc، والتي تستدعي استدعاء النظام المناسب الخاص بالبنية.

المعايير
POSIX.1-2024.

التاريخ
POSIX.1-2001.

ظهر دعم النواة لأول مرة في Linux 2.5.60؛ يُسمى استدعاء النظام الأساسي fadvise64(). تم توفير دعم المكتبة منذ glibc 2.2، عبر دالة الغلاف posix_fadvise().

منذ Linux 3.18، أصبح دعم استدعاء النظام الأساسي اختياريًا، اعتمادًا على إعداد خيار التهيئة CONFIG_ADVISE_SYSCALLS.

تم تغيير نوع الوسيط size من size_t إلى off_t في POSIX.1-2001 TC1.

ملاحظات
يمكن مسح محتويات خبيئة المخزن المؤقت للنواة عبر واجهة /proc/sys/vm/drop_caches الموضحة في proc(5).

يمكن الحصول على لقطة لصفحات الملف المقيمة في خبيئة المخزن المؤقت بفتح ملف، وربطه باستخدام mmap(2)، ثم تطبيق mincore(2) على الربط.

العلل
قبل Linux 2.6.6، إذا تم تحديد size كـ 0، فكان يُفسر حرفيًا على أنه "صفر بايت"، بدلاً من أن يعني "جميع البايتات حتى نهاية الملف".

انظر أيضًا
fincore(1), mincore(2), readahead(2), sync_file_range(2), posix_fallocate(3), posix_madvise(3)

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

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

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