set_mempolicy(2)

NUME
set_mempolicy - stabilește politica implicită de memorie NUMA pentru un fir și copiii acestuia

BIBLIOTECA
Biblioteca de politici NUMA („Non-Uniform Memory Access”: acces neuniform la memorie) (libnuma, -lnuma)

SINOPSIS
#include <numaif.h>

long set_mempolicy(int mod, const unsigned long *nodemask,
                   unsigned long maxnode);

DESCRIERE
set_mempolicy() stabilește politica de memorie NUMA a firului apelant, care constă într-un mod de politică și zero sau mai multe noduri, la valorile specificate de argumentele mode, nodemask și maxnode.

O mașină NUMA are diferite controloare de memorie cu distanțe diferite față de diferitele CPU-uri. Politica de memorie definește din ce nod este alocată memoria pentru firul de execuție.

Acest apel de sistem definește politica implicită pentru firele de execuție. Politica firelor de execuție guvernează alocarea de pagini în spațiul de adrese al procesului în afara intervalelor de memorie controlate de o politică mai specifică stabilită de mbind(2). Politica implicită a firelor de execuție controlează, de asemenea, alocarea oricăror pagini pentru fișierele cu memorie alocată utilizând apelul mmap(2) cu fanionul MAP_PRIVATE și care sunt citite (încărcate) numai de către firul de execuție și a fișierelor cu memorie alocată utilizând apelul mmap(2) cu fanionul MAP_SHARED, indiferent de tipul de acces. Politica este aplicată numai atunci când o nouă pagină este alocată pentru firul de execuție. Pentru memoria anonimă, acest lucru se întâmplă atunci când pagina este accesată pentru prima dată de către firul de execuție.

Argumentul mod trebuie să specifice unul dintre MPOL_DEFAULT, MPOL_BIND, MPOL_INTERLEAVE, MPOL_WEIGHTED_INTERLEAVE, MPOL_PREFERRED, MPOL_PREFERRED_MANY sau MPOL_LOCAL (care sunt descrise în detaliu în continuare). Toate modurile, cu excepția MPOL_DEFAULT, necesită ca apelantul să specifice nodul sau nodurile la care se aplică modul, prin intermediul argumentului nodemask.

Argumentul mod poate include, de asemenea, un fanion de mod opțional. Fanioanele mod acceptate sunt:

MPOL_F_NUMA_BALANCING (începând cu Linux 5.12)
    Atunci când mod este MPOL_BIND, se activează echilibrarea NUMA a nucleului pentru sarcină, dacă aceasta este acceptată de nucleu. Dacă fanionul nu este acceptat de nucleu sau este utilizat cu un mod altul decât MPOL_BIND, se returnează -1 și errno este configurată la EINVAL.

MPOL_F_RELATIVE_NODES (începând cu Linux 2.6.26)
    Un argument nodemask nevid specifică ID-urile nodurilor care sunt relative la setul de ID-uri ale nodurilor permise de „cpuset-ul” curent al procesului (limitarea la subseturile de noduri de procesare și de memorie actuală a procesului).

MPOL_F_STATIC_NODES (începând cu Linux 2.6.26)
    Un argument nodemask nevid specifică ID-urile nodurilor fizice. Linux nu va repoziționa nodemask atunci când procesul se mută într-un context cpuset diferit și nici atunci când se schimbă setul de noduri permise de contextul cpuset curent al procesului.

nodemask indică o mască de biți a ID-urilor nodurilor care conține până la maxnode biți. Dimensiunea măștii de biți este rotunjită la următorul multiplu de sizeof(unsigned long), dar nucleul va utiliza biți numai până la maxnode. O valoare NULL a nodemask sau o valoare maxnode de zero specifică setul gol de noduri. Dacă valoarea lui maxnode este zero, argumentul nodemask este ignorat.

Atunci când este necesară o mască de noduri nodemask, aceasta trebuie să conțină cel puțin un nod care este activ, permis de contextul cpuset curent al procesului (cu excepția cazului în care este specificat fanionul de mod MPOL_F_STATIC_NODES) și conține memorie. Dacă MPOL_F_STATIC_NODES este definit în mod și o mască de noduri nodemask necesară nu conține noduri care sunt permise de contextul cpuset curent al procesului, politica de memorie revine la alocarea locală local allocation. Aceasta prevalează efectiv asupra politicii specificate până când contextul cpuset al procesului include unul sau mai multe noduri specificate de nodemask.

Argumentul mod trebuie să includă una dintre următoarele valori:

MPOL_DEFAULT
    Acest mod specifică faptul că orice politică de memorie a firelor de execuție care nu este implicită este eliminată, astfel încât politica de memorie „revine” la politica implicită a sistemului. Politica implicită a sistemului este „alocare locală” -- adică, alocarea memoriei pe nodul CPU care a declanșat alocarea. Masca de noduri nodemask trebuie să fie specificată ca NULL. Dacă „nodul local” nu conține memorie liberă, sistemul va încerca să aloce memorie de pe un nod „apropiat”.

MPOL_BIND
    Acest mod definește o politică strictă care restricționează alocarea de memorie la nodurile specificate în nodemask. Dacă nodemask specifică mai mult de un nod, alocările de pagini vor proveni mai întâi de la nodul cu cel mai mic ID de nod numeric, până când nodul respectiv nu conține memorie liberă. Alocările vor veni apoi de la nodul cu următorul ID de nod cel mai mare specificat în nodemask și așa mai departe, până când niciunul dintre nodurile specificate nu conține memorie liberă. Paginile nu vor fi alocate din niciun nod care nu este specificat în nodemask.

MPOL_INTERLEAVE
    Acest mod intercalează alocările de pagini între nodurile specificate în nodemask în ordinea numerică a ID-ului nodului. Acest lucru optimizează lățimea de bandă în loc de latență prin repartizarea paginilor și a accesărilor de memorie la acele pagini pe mai multe noduri. Cu toate acestea, accesul la o singură pagină va fi în continuare limitat la lățimea de bandă de memorie a unui singur nod.

MPOL_WEIGHTED_INTERLEAVE (începând cu Linux 6.9)
    Acest mod intercalează alocările de pagini între nodurile specificate în nodemask în funcție de ponderile din /sys/kernel/mm/mempolicy/weighted_interleave. De exemplu, dacă biții 0, 2 și 5 sunt definiți în nodemask, iar conținutul /sys/kernel/mm/mempolicy/weighted_interleave/node0, /sys/... /node2, și /sys/.../node5 sunt 4, 7 și, respectiv, 9, atunci paginile din această regiune vor fi alocate nodurilor 0, 2 și 5 într-un raport 4:7:9.

MPOL_PREFERRED
    Acest mod stabilește nodul preferat pentru alocare. Nucleul va încerca să aloce mai întâi pagini din acest nod și va reveni la nodurile „apropiate” dacă nodul preferat are puțină memorie liberă. Dacă nodemask specifică mai mult de un ID de nod, primul nod din mască va fi selectat ca nod preferat. Dacă argumentele nodemask și maxnode specifică setul gol, atunci politica specifică „alocare locală” (precum politica implicită a sistemului discutată mai sus).

MPOL_PREFERRED_MANY (începând cu Linux 5.15)
    Acest mod specifică o preferință pentru nodurile din care nucleul va încerca să aloce. Acesta diferă de MPOL_PREFERRED prin faptul că acceptă un set de noduri față de un singur nod. Această politică este destinată să avantajeze alocările de pagini în care anumite tipuri de memorie (adică, memoria nevolatilă, cu lățime de bandă mare sau memoria acceleratorului) sunt mai importante decât locația nodului.

MPOL_LOCAL (începând cu Linux 3.8)
    Acest mod specifică „alocare locală”; memoria este alocată pe nodul CPU care a declanșat alocarea („nodul local”). Argumentele nodemask și maxnode trebuie să specifice setul gol. Dacă „nodul local” are puțină memorie liberă, nucleul va încerca să aloce memorie din alte noduri. Nucleul va aloca memorie din „nodul local” ori de câte ori este disponibilă memorie pentru acest nod. Dacă „nodul local” nu este permis de contextul cpuset curent al procesului, nucleul va încerca să aloce memorie din alte noduri. Nucleul va aloca memorie din „nodul local” ori de câte ori aceasta devine permisă de contextul cpuset curent al procesului.

Politica de memorie a firelor de execuție este păstrată pe parcursul unui apel execve(2) și este moștenită de firele de execuție copii create utilizând fork(2) sau clone(2).

VALOAREA RETURNATĂ
În caz de succes, set_mempolicy() returnează 0; în caz de eroare, se returnează -1 și errno este configurată pentru a indica eroarea.

ERORI-IEȘIRE

EFAULT
    O parte din tot intervalul de memorie specificat de nodemask și maxnode indică în afara spațiului de adrese accesibil.

EINVAL
    Argumentul mod nu este valid. Sau, mod este MPOL_DEFAULT și masca de noduri nodemask nu este goală, sau mod este MPOL_BIND sau MPOL_INTERLEAVE și nodemask este goală. Sau, maxnode specifică mai mult de o pagină de biți. Sau, nodemask specifică unul sau mai multe ID-uri de nod care sunt mai mari decât ID-ul maxim de nod acceptat. Sau, niciunul dintre ID-urile de nod specificate de nodemask nu este activ și permis de contextul cpuset curent al procesului, sau niciunul dintre nodurile specificate nu conține memorie. Sau argumentul mod a specificat atât MPOL_F_STATIC_NODES, cât și MPOL_F_RELATIVE_NODES. Sau, MPOL_F_NUMA_BALANCING nu este acceptat de nucleu sau este utilizat cu un mod altul decât MPOL_BIND.

ENOMEM
    Nu a fost disponibilă suficientă memorie pentru nucleu.

STANDARDE
Linux.

ISTORIC
Linux 2.6.7.

NOTE
Politica de memorie nu este reținută dacă pagina este transferată. Atunci când o astfel de pagină este reimportată în memoriei, aceasta va utiliza politica firului sau a intervalului de memorie care este în vigoare la momentul alocării paginii.

Pentru informații privind suportul de bibliotecă, consultați numa(7).

CONSULTAȚI ȘI
get_mempolicy(2), getcpu(2), mbind(2), mmap(2), numa(3), cpuset(7), numa(7), numactl(8)

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.