set_mempolicy - stabilește politica implicită de
memorie NUMA pentru un fir și copiii acestuia
Biblioteca de politici NUMA („Non-Uniform Memory
Access”: acces neuniform la memorie) (libnuma,
-lnuma)
#include <numaif.h>
long set_mempolicy(int mod, const unsigned long *nodemask,
unsigned long maxnode);
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 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_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).
În caz de succes, set_mempolicy() returnează
0; în caz de eroare, se returnează -1 și errno
este configurată pentru a indica eroarea.
- 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.
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).
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 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.