GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wer verwendet POSIX-Echtzeitsignale und warum?

Es ist eine alte Frage, aber immer noch.

POSIX-Threads unter Linux in glibc (NPTL) werden mit zwei Echtzeitsignalen implementiert. Sie sind vor dem Benutzer verborgen (durch Anpassen der Min/Max-Zahlenkonstanten). Alle Ereignisse, bei denen der Bibliotheksaufruf an alle Threads weitergegeben werden muss (wie 06 ) erfolgen über diese:Der aufrufende Thread sendet ein Signal an alle Threads, um die Änderung zu übernehmen, wartet auf eine Bestätigung und fährt fort.


Asynchrone E/A.

Echtzeitsignale sind der Mechanismus für den Kernel, um Ihr System zu informieren, wenn eine E/A-Operation abgeschlossen ist.

16 stellt die Verbindung zwischen einer asynchronen I/O-Anforderung und einer Signalnummer her.


Beachten Sie zunächst, dass Bens Antwort richtig ist. Soweit ich das beurteilen kann, ist der gesamte Zweck von Echtzeitsignalen in POSIX ein Echtzeit-Übermittlungsmechanismus für AIO, Nachrichtenwarteschlangenbenachrichtigungen, Timer-Abläufe und anwendungsdefinierte Signale (sowohl intern als auch zwischen Prozessen).

Abgesehen davon sind Signale im Allgemeinen eine wirklich schlechte Art, Dinge zu tun:

  • Signal-Handler sind asynchron, und wenn Sie nicht sicherstellen, dass sie eine asynchrone signalunsichere Funktion nicht unterbrechen, können sie nur asynchrone signalsichere Funktionen verwenden, was ihre Möglichkeiten stark einschränkt.
  • Signalhandler sind globale Zustände. Eine Bibliothek kann keine Signale verwenden, ohne einen Vertrag mit dem aufrufenden Programm darüber zu haben, welche Signale sie verwenden darf, ob es erlaubt ist, sie zum Unterbrechen von Systemaufrufen zu machen usw. Und im Allgemeinen ist der globale Status nur eine schlechte Sache .
  • Wenn Sie 23 verwenden (oder Linux 37 Erweiterung) und nicht Signal-Handler zum Verarbeiten von Signalen, sie sind nicht besser als andere IPC/Benachrichtigungsmechanismen und möglicherweise noch schlechter.

Asynchrones IO wird viel besser erreicht, indem die schlecht konzipierte POSIX-AIO-API ignoriert und einfach ein Thread erstellt wird, um normales Blockieren von IO auszuführen und 46 aufzurufen oder 54 wenn der Vorgang beendet ist. Oder, wenn Sie sich ein wenig Leistungseinbußen leisten können, können Sie sogar die gerade gelesenen Daten über eine Pipe oder ein Socketpair an sich selbst weiterleiten und den Haupt-Thread reguläre Dateien mit 66 oder 78 genauso wie Sockets/Pipes/ttys.


Linux
  1. Warum Daten wichtig sind und wie man sie schützt

  2. Linux – Warum verwenden wir Su – und nicht nur Su?

  3. Ausgang begrenzen und Signal 13 vermeiden?

  4. Grundlagen zu Linux-Signalen – Teil I

  5. signalfd() verpasst Signale

Was ist eine virtuelle Maschine und warum sollte man sie verwenden?

Gründe, warum ich die Verwendung von Debian Linux empfehle

IPC mit Signalen unter Linux

Wann wird ein Signal behandelt und warum frieren einige Informationen ein?

Warum ist Port 1111 offen und ist das sicher?

Kann das Signal ignoriert (verloren) werden?