futex(7)

Från Wiki.linux.se
Version från den 25 november 2024 kl. 07.42 av Admin (diskussion | bidrag) (Skapade sidan med '== NAMN == futex - snabba användarutrymmet-lås == SAMMANFATTNING == #include <linux/futex.h> == BESKRIVNING == Linuxkärnan tillhandahåller futexar ("Fast user-space mutexes") som en byggsten för snabba användarutrymmet-lås och semaforer. Futexar är mycket grundläggande och lämpar sig väl för att bygga högre nivåers låsabstraktioner såsom mutexar, tillståndsvariabler, läs-/skrivlås, barriärer och semaforer. De flesta programmerare använder säl...')
(skillnad) ← Äldre version | Nuvarande version (skillnad) | Nyare version → (skillnad)
Hoppa till navigering Hoppa till sök

NAMN

futex - snabba användarutrymmet-lås

SAMMANFATTNING

   #include <linux/futex.h>

BESKRIVNING

Linuxkärnan tillhandahåller futexar ("Fast user-space mutexes") som en byggsten för snabba användarutrymmet-lås och semaforer. Futexar är mycket grundläggande och lämpar sig väl för att bygga högre nivåers låsabstraktioner såsom mutexar, tillståndsvariabler, läs-/skrivlås, barriärer och semaforer.

De flesta programmerare använder sällan futexar direkt utan förlitar sig istället på systembibliotek som bygger på dem, såsom Native POSIX Thread Library (NPTL) (se pthreads(7)).

En futex identifieras av en minnesbit som kan delas mellan processer eller trådar. Dessa processer behöver inte ha samma adress för futexen. Futexar har semaforliknande semantik i sin grundform; de fungerar som en räknare som kan ökas och minskas atomärt, och processer kan vänta på att värdet blir positivt.

Futexoperationer sker helt i användarutrymmet för okontenderade fall. Kärnan engageras endast för att medla vid kontenderade fall. Då de flesta designs strävar efter att minimera konkurrens är futexar optimerade för dessa situationer.

I sin enklaste form är en futex ett justerat heltal som endast hanteras av atomära assemblerinstruktioner. Detta heltal är fyra byte långt på alla plattformar. Processer kan dela detta heltal med hjälp av mmap(2), via delade minnessegment eller genom att dela minnesutrymme, vilket är vanligt i multitrådade applikationer.

Semantik

Alla futexoperationer börjar i användarutrymmet men kan behöva kommunicera med kärnan via systemanropet futex(2).

För att "höja" en futex, använd de rätta assemblerinstruktionerna för att atomärt öka heltalet. Kontrollera därefter om det faktiskt ändrades från 0 till 1; i så fall fanns inga väntande processer och operationen är klar. Detta är det okontenderade fallet, som är snabbt och bör vara vanligt.

I det kontenderade fallet ändrades det atomära heltalet från -1 (eller ett annat negativt tal). Detta indikerar att det finns väntande processer. Användarutrymmet ska nu sätta räknaren till 1 och instruera kärnan att väcka väntande processer med operationen `FUTEX_WAKE`.

För att "sänka" en futex, görs motsatsen. Atomiskt minska räknaren och kontrollera om det ändrades till 0; i så fall är operationen klar och futexen var okontenderad. Annars ska processen sätta räknaren till -1 och begära att kärnan väntar på att en annan process höjer futexen. Detta görs med operationen `FUTEX_WAIT`.

Systemanropet futex(2) kan också ta emot en timeout som specificerar hur länge kärnan ska vänta. Semantiken blir mer komplex i sådana fall; se futex(2) för detaljer. Detsamma gäller asynkron väntan.

VERSIONER

Futexstöd introducerades i Linux 2.5.7 men med annorlunda semantik än de som beskrivs ovan. Nuvarande semantik är tillgängliga från Linux 2.5.40 och framåt.

NOTERINGAR

Återigen, futexar är inte avsedda som en lättanvänd abstraktion för slutanvändare. Implementatörer förväntas vara kunniga i assembler och ha läst källkoden för det användarutrymmet-bibliotek som refereras nedan.

Denna manual beskriver de vanligaste användningarna av futex(2), men det finns många fler tillämpningar.

SE ÄVEN

För mer information, se "Fuss, Futexes and Furwocks: Fast Userlevel Locking in Linux" (föredrag från Ottawa Linux Symposium 2002), samt exempelbibliotek för futex: ⟨https://mirrors.kernel.org/pub/linux/kernel/people/rusty/⟩.

COLOPHON

Denna sida är en del av man-sidorna (Linux kärna och C-bibliotekets användarrymmet-gränssnittsdokumentation). Information om projektet finns på ⟨https://www.kernel.org/doc/man-pages/⟩. Om du har en buggrapport för denna manual, se ⟨https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/tree/CONTRIBUTING⟩.

Sidan hämtades från arkivet man-pages-6.9.1.tar.gz från ⟨https://mirrors.edge.kernel.org/pub/linux/docs/man-pages/⟩ den 2024-06-26.

Linux man-sidor 6.9.1 2024-05-02 futex(7)

Sidor som refererar till denna sida

futex(2), pthreads(7)


Sidslut

Orginalhemsidan på Engelska :https://man7.org/linux/man-pages/man7/futex.7.html


Det här är en maskinöversättning av Linux man sidor till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på https://www.linux.se/kontaka-linux-se/

Tack till Datorhjälp som har sponsrat Linux.se med webbhotell.