Wie lange dauert es, bis ein nicht blockiertes Signal geliefert wird?

9
  1. Wenn ein Prozess ein Signal an einen anderen Prozess sendet, unter welchen Umständen wartet der Empfangsprozess, bis er neu geplant wird?
  2. Unter welchen Umständen wird der installierte Signalhandler sofort aufgerufen?
  3. Wie viel Aufwand entsteht beim Signalaufbau im Vergleich zum Aufruf des entsprechenden Signal-Handlers?
WiSaGaN 30.07.2012, 15:03
quelle

2 Antworten

5

Über die Lieferung von Signalen gibt TLPI an, dass Signale "normal" geliefert werden, wenn eine Task als nächstes geplant wird, wenn vom Kernel-Modus in den Benutzermodus gewechselt wird oder "sofort" wenn die Task bereits läuft (vermutlich "sofort") passieren, indem zuerst ein Interrupt ausgelöst wird, sonst wie könnte es das tun). Nun, was auch immer das bedeutet, es ist nicht unbedingt bindend, aber es ist sehr nah dran, was passiert.

Sie müssen unterscheiden zwischen Echtzeit- und "normalen" Signalen sowie zwischen "normalen" Signalen, die synchron erzeugt werden, meistens aufgrund eines Hardware-Ereignisses (z. B. Segmentierungsfehler) und solchen, die nicht reynateallyynchronically).

Realtime-Signale sind in der Warteschlange , normale Signale sind nicht . Das bedeutet, dass die Implementierung von normalen Signalen höchstwahrscheinlich nur etwas wie ein pro-Aufgabe-Wort ist, das als Bitmaske dient.
Das Erzeugen eines "normalen" Signals bedeutet das Setzen eines Bits, und wenn das OS als nächstes entscheidet, ob ein Signal zu liefern ist, testet es das Wort gegen Null und ermittelt gegebenenfalls, welches Bit (s) gesetzt wurde und ruft den Signal-Handler auf (s), falls vorhanden, entsprechend.
Der einzige praktische Grund, warum man dies wissen muss, ist, dass es möglich ist, Signale zu "verlieren". Wenn zwei oder mehr Signale erzeugt werden, bevor das erste geliefert wird, ist es immer noch nur ein Signal.

Die Implementierung von Echtzeitsignalen (die erforderlich sind, um in eine implementierungsabhängige Länge zu schreiben) ist offensichtlich viel komplizierter.

Signale, die aufgrund eines Hardware-Ereignisses (z. B. segfault) auftreten, werden synchron erzeugt, genauso wie wenn der Prozess kill auf sich selbst (Kapitel 22.4 TLPI) heißt, dh sie werden "sofort" geliefert, und zwar aus zwei Gründen . Erstens macht es keinen Sinn, etwas anderes zu tun, und zweitens gibt es bereits einen Kernel / Benutzerwechsel, wenn der Trap-Handler zurückkehrt. Die Lieferung ist also immer "sofort".

    
Damon 30.07.2012, 15:40
quelle
0

Grundsätzlich sind Signale asynchron. Sie verlassen sich auf Signalhandler, um Code auszuführen, wenn ein Signal empfangen wird, weil Sie nie wissen, wann dies aufgrund von Faktoren wie dem Prozessplaner sein wird. Die Latenz des Sendens eines Signals basiert auf dem Hardware / Software-Interrupt, der auf der Taktgeschwindigkeit basiert.

Wenn Sie herausfinden möchten, wie etwas unter Linux implementiert wird, sehen Sie in den POSIX Standards nach.

Großartige Informationen zu Signalen:

Ссылка

  

Wenn ein Signal generiert wird, wird es ausstehend . Normalerweise bleibt es   nur für kurze Zeit ausstehend und dann an geliefert   Prozess, der signalisiert wurde. Allerdings, wenn diese Art von Signal ist   Derzeit blockiert , kann es auf unbestimmte Zeit ausstehend bleiben - bis Signale   von dieser Art sind entsperrt . Einmal entsperrt, wird es geliefert   sofort.

Ein weiterer Auszug:

  

Wenn das Signal ausgelöst wird, egal ob sofort oder nach einer langen Zeit   Verzögerung wird die spezifizierte Aktion für dieses Signal genommen.

    
Alex W 30.07.2012 15:09
quelle

Tags und Links