posix_fadvise(2)

NUME
posix_fadvise - predeclară un model de acces pentru datele din fișiere

BIBLIOTECA
Biblioteca C standard (libc, -lc)

SINOPSIS
#include <fcntl.h>

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

    Cerințe pentru macrocomenzi de testare a caracteristicilor pentru glibc (consultați feature_test_macros(7)):

posix_fadvise():
    _POSIX_C_SOURCE >= 200112L

DESCRIERE
Programele pot utiliza posix_fadvise() pentru a anunța intenția de a accesa în viitor datele unui fișier după un anumit model, permițând astfel nucleului să efectueze optimizările corespunzătoare.

Argumentul advice se aplică unei regiuni (care nu există neapărat) care începe la offset și se întinde pe size octeți (sau până la sfârșitul fișierului dacă size este 0) în cadrul fișierului la care se face referire prin fd. advice nu este obligatoriu; acesta constituie doar o așteptare din partea aplicației.

Valorile admise pentru advice includ:

POSIX_FADV_NORMAL
    Indică faptul că aplicația nu are nici o indicație „advice” de dat cu privire la modelul său de acces pentru datele specificate. În cazul în care nu se oferă niciun sfat pentru un fișier deschis, aceasta este presupunerea implicită.

POSIX_FADV_SEQUENTIAL
    Aplicația se așteaptă să acceseze datele specificate în mod secvențial (cu citirea pozițiilor inferioare înaintea celor superioare).

POSIX_FADV_RANDOM
    Datele specificate vor fi accesate în ordine aleatorie.

POSIX_FADV_NOREUSE
    Datele specificate vor fi accesate o singură dată.

    Înainte de Linux 2.6.18, POSIX_FADV_NOREUSE avea aceeași semantică ca POSIX_FADV_WILLNEED. Aceasta a fost probabil o eroare; de la Linux 2.6.18 până la Linux 6.2, acest fanion a fost un no-op. Începând cu Linux 6.3, POSIX_FADV_NOREUSE semnalează faptul că algoritmul de înlocuire a paginilor din nucleu poate ignora accesul la memoria cache a paginilor cartografiate marcate de acest fanion. Acest lucru este util, de exemplu, în timpul transmiterii de fișiere mari.

POSIX_FADV_WILLNEED
    Datele specificate vor fi accesate în viitorul apropiat.

    POSIX_FADV_WILLNEED inițiază o citire fără blocaj a regiunii specificate în memoria cache de pagină. Cantitatea de date citite poate fi diminuată de către nucleu în funcție de încărcarea memoriei virtuale; (câțiva megaocteți vor fi de obicei pe deplin satisfăcători, iar mai mult este rareori util).

POSIX_FADV_DONTNEED
    Datele specificate nu vor fi accesate în viitorul apropiat.

    POSIX_FADV_DONTNEED încearcă să elibereze paginile din memoria cache asociate cu regiunea specificată. Acest lucru este util, de exemplu, în timpul transmiterii în flux a fișierelor mari. Un program poate solicita periodic nucleului să elibereze datele din memoria cache care au fost deja utilizate, astfel încât paginile mai utile din memoria cache să nu fie eliminate în schimb.

    Solicitările de eliminare a paginilor parțiale sunt ignorate. Este preferabil să se păstreze datele necesare decât să se renunțe la datele inutile. Dacă aplicația cere ca datele să fie luate în considerare pentru a fi eliminate, atunci offset și size trebuie să fie aliniate la pagină.

    Implementarea poate încerca să scrie înapoi paginile „murdare” (scrise parțial) din regiunea specificată, dar acest lucru nu este garantat. Toate paginile „murdare” nescrise nu vor fi eliberate. Dacă aplicația dorește să se asigure că paginile „murdare” vor fi eliberate, trebuie să apeleze mai întâi fsync(2) sau fdatasync(2).

VALOAREA RETURNATĂ
În caz de succes, se returnează zero. În caz de eroare, se returnează un număr de eroare.

ERORI-IEȘIRE

EBADF
    Argumentul fd nu este un descriptor de fișier valid.

EINVAL
    A fost specificată o valoare nevalidă pentru advice.

ESPIPE
    Descriptorul de fișier specificat se referă la o conductă sau FIFO; (ESPIPE este eroarea specificată de POSIX, dar înainte de Linux 2.6.16, Linux a returnat EINVAL în acest caz).

VERSIUNI
În Linux, POSIX_FADV_NORMAL stabilește fereastra de citire-anticipată la dimensiunea implicită pentru dispozitivul de rezervă; POSIX_FADV_SEQUENTIAL dublează această dimensiune, iar POSIX_FADV_RANDOM dezactivează complet citire-anticipată a fișierelor. POSIX_FADV_NOREUSE nu modifică dimensiunea ferestrei de citire-anticipată. Aceste modificări afectează întregul fișier, nu doar regiunea specificată (dar alte gestionare de fișier deschise pentru același fișier nu sunt afectate).

  Diferențe între biblioteca C și nucleu
Numele funcției de învăluire din biblioteca C este posix_fadvise(). Apelul de sistem subiacent se numește fadvise64() (sau, pe unele arhitecturi, fadvise64_64()); diferența dintre cele două este că primul apel de sistem presupune că tipul argumentului size este size_t, în timp ce al doilea se așteaptă la loff_t.

  Variante specifice arhitecturii
Unele arhitecturi necesită ca argumentele pe 64 de biți să fie aliniate într-o pereche adecvată de registre (a se vedea syscall(2) pentru mai multe detalii). Pe astfel de arhitecturi, semnătura de apelare a posix_fadvise() prezentată în SINOPSIS ar forța irosirea unui registru ca umplutură între argumentele fd și offset. Prin urmare, aceste arhitecturi definesc o versiune a apelului de sistem care ordonează în mod corespunzător argumentele, dar care, în rest, este exact la fel ca posix_fadvise().

De exemplu, începând cu Linux 2.6.14, ARM are următorul apel de sistem:

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

Aceste detalii specifice arhitecturii sunt, în general, ascunse aplicațiilor de către funcția de învăluire glibc posix_fadvise(), care invocă apelul de sistem specific arhitecturii corespunzătoare.

STANDARDE
POSIX.1-2024.

ISTORIC
POSIX.1-2001.

Suportul pentru nucleu a apărut pentru prima dată în Linux 2.5.60; apelul de sistem subiacent se numește fadvise64(). Suportul pentru bibliotecă a fost furnizat începând cu glibc 2.2, prin intermediul funcției de învăluire posix_fadvise().

Începând cu Linux 3.18, suportul pentru apelul de sistem subiacent este opțional, în funcție de valoarea opțiunii de configurare CONFIG_ADVISE_SYSCALLS.

Tipul argumentului size a fost schimbat din size_t în off_t în POSIX.1-2001 TC1.

NOTE
Conținutul cache-ului tampon al nucleului poate fi șters prin intermediul interfeței /proc/sys/vm/drop_caches descrisă în proc(5).

Se poate obține o imagine instantanee a paginilor dintr-un fișier care se află în memoria cache tampon deschizând un fișier, cartografiindu-l cu mmap(2) și apoi aplicând mincore(2) la cartografiere.

ERORI
Înainte de Linux 2.6.6, dacă lsize era specificat ca fiind 0, atunci acest lucru era interpretat literal ca fiind „zero octeți”, în loc să însemne „toți octeții până la sfârșitul fișierului”.

CONSULTAȚI ȘI
fincore(1), mincore(2), readahead(2), sync_file_range(2), posix_fallocate(3), posix_madvise(3)

TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 (https://www.gnu.org/licenses/gpl-3.0.html) sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.