Domanda

Perché sono i mutex POSIX considerato più pesante o più lento rispetto futexes?Dove è il sovraccarico provenienti da in pthread mutex tipo?Ho sentito dire che pthread mutex sono basati su futexes, e quando non contestati, non effettua chiamate nel kernel.Sembra, quindi, che una pthread mutex è semplicemente un "wrapper" intorno a un futex.

È il sovraccarico semplicemente in funzione wrapper chiamata e la necessità per il mutex funzione "setup" il futex (cioè, in sostanza il programma di installazione di stack per pthread mutex funzione di chiamata)?O ci sono alcuni extra barriera di memoria passi con i pthread mutex?

È stato utile?

Soluzione

Perché rimanere in userspace per quanto possibile, il che significa che richiedono un minor numero di chiamate di sistema, che è intrinsecamente più veloce di quanto il cambio di contesto tra l'utente e il kernel mode è costoso.

Presumo che tu stia parlando kernel thread quando si parla di thread POSIX.È del tutto possibile avere un'interamente in userspace implementazione dei thread POSIX, che non richiedono chiamate di sistema, ma hanno altri problemi di loro.

La mia comprensione è che un futex è a metà strada tra un kernel thread POSIX e un userspace thread POSIX.

Altri suggerimenti

I futesi sono stati creati per migliorare le prestazioni dei mutex PThread. NPTL usa futex, futex precedenti di LinuxThread, che penso sia dove arriva la considerazione "più lenta". I mutex NPTL possono avere un overhead aggiuntivo, ma non dovrebbe essere molto.

Modificare:Il sovraccarico effettivo consiste sostanzialmente su:

  • Selezione dell'algoritmo corretto per il tipo Mutex (normale, ricorsivo, adattivo, check di errori; normale, robusto, ereditario prioritario, protetto da priorità), in cui il codice suggerisce pesantemente al compilatore che probabilmente stiamo usando un normale mutex (così Dovrebbe comunicarlo alla logica di previsione del ramo della CPU),
  • e una scrittura dell'attuale proprietario del mutex se riusciamo a prenderlo che dovrebbe essere normalmente veloce, poiché risiede nella stessa linea di cache del blocco effettivo che abbiamo appena preso, a meno che il blocco non sia fortemente contento e altri La CPU accedeva al blocco tra il tempo in cui l'abbiamo preso e quando abbiamo tentato di scrivere il proprietario (questa scrittura non è necessaria per i normali mutex, ma necessaria per il controllo degli errori e i mutex ricorsivi).

Quindi, alcuni cicli (caso tipico) a alcuni cicli + una predicazione di una filiale + una cache aggiuntiva miss (caso molto peggiore).

La risposta breve alla tua domanda è che i futuri sono noti per essere implementati nel modo più efficiente possibile, mentre un mutex pThread può o meno essere. Come minimo, un pThread Mutex ha un sovraccarico associato a determinare il tipo di mutex e futex no. Quindi un Futex sarà quasi sempre efficiente come un pThread Mutex, fino a quando qualcuno non pensa a una struttura più leggera di un Futex e quindi rilascia un'implementazione di Pthreads che lo utilizza per il suo mutex predefinito.

Tecnicamente parlando pthread mutex non sono più lento o più veloce di futexes.pthread è solo una API standard, quindi se sono lento o veloce, dipende il implementazione di API.

In particolare in Linux pthread mutex sono implementati come futexes e sono quindi veloce.In realtà, non si desidera utilizzare il futex API di se stesso in quanto è molto difficile da usare, non hanno le opportune funzioni wrapper in glibc e richiede la codifica in assemblea, che non portatile.Fortunatamente per noi la glibc manutentori già codificato tutto questo per noi sotto il cofano della pthread mutex API.

Ora, poiché la maggior parte dei sistemi operativi non implementare futexes quindi i programmatori di solito significa pthread mutex è il rendimento che si ottiene dal solito attuazione di pthread mutex, che è lento.

Quindi è un fatto statistico che, nella maggior parte dei sistemi operativi POSIX compatibile con i pthread mutex è implementato nel kernel spazio ed è più lento di un futex.In Linux hanno le stesse prestazioni.Potrebbe essere che ci sono altri sistemi operativi dove pthread mutex sono implementati in spazio utente (in uncontended caso) e quindi avere prestazioni migliori, ma io sono solo a conoscenza di Linux, a questo punto.

Su AMD64 un futex è 4 byte, mentre un nptl pthread_mutex_t è 56 byte! Sì, c'è un sovraccarico significativo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top