2

Ich habe wenig Zweifel hinsichtlich der Synchronisierung im Linux-Kernel, d. H. Welche Art von Sperrtechnik eignet sich zwischen Interrupt-Kontextmodus und Prozesskontext zum Schutz der kritischen Region.Wie Synchronisierung zwischen Interrupt-Kontext und Prozesskontext

Dank im Voraus .....

+0

Ich weiß nicht speziell über Linux, aber im Allgemeinen für die meisten Betriebssysteme, gibt es eine "Dispatch benötigt" -Flag, das gesetzt wird, wenn ein Interrupt-Handler eine höhere als aktuelle Priorität Thread bereit stellt. In diesem Fall wird der Interrupt-Handler über den Dispatcher (für einen Kontextwechsel) beendet, anstatt nur zurückzukehren. Um verschachtelte Interrupts zu behandeln, gibt es auch ein Flag, um zu verfolgen, welcher Interrupt der erste Interrupt war, so dass nur der ursprüngliche Interrupt optional über den Dispatcher ausgegeben wird (die verschachtelten Interpreter würden einfach zurückkehren). – rcgldr

+1

Es ist wichtig zu beachten, dass ein Interrupt-Handler nicht schlafen kann; Es hat keinen Aufgabenkontext. Wenn Sie also eine Ressource mit dem Interrupt-Handler synchronisieren müssen, können Sie keinen Mutex oder Semaphor verwenden (diese könnten schlafen). es muss ein Spinlock oder das Äquivalent sein. Was natürlich impliziert, dass Sie die Sperre nicht lange halten sollten (und Sie können nichts im Task-Kontext tun, das blockieren könnte, während Sie es halten). –

+0

Nun, Sie können sicherlich Einheiten zu einem Semaphor buchen. –

Antwort

0

Chija definitions Lösungen wie: Semaphoren (oder Mutex), testandset und OFC spinlocks bietet Schutz kritischen Code: es ist entweder durch eine atomare Operation garunteeing (Verriegelungsmittel für Beispiel wird genau 1 Operation nehmen, um die Sperre abzuschließen, Protokolle wie das Bäckereiprotokoll und die Vorabnahme des Prozesses zu deaktivieren (und das ist, was Sie wollen) - once gesperrt, niemand sonst kann diesen kritischen Code eingeben (sagen wir, Sie haben Shared Memory verwendet) oder so ähnlich. Selbst wenn es einen Kontextwechsel gibt und zwei Threads zusammen laufen, werden wir versprochen, dass nur einer auf diesen Code zugreifen kann, die Sache ist, dass alle Threads angenommen werden, die diesen Speicher oder w/e benutzen und eine kritische haben Region haben das gleiche Art der Sperre aquire

für weitere Informationen über spinlock (die peeamption der CPU deaktivieren) bezeichnen dies: http://www.linuxinternals.org/blog/2014/05/07/spinlock-implementation-in-linux-kernel/ Hinweis, dass spinlock ein „busy wait“ tut - Mittel, während die preeamption aktiviert ist und Sie haben nicht aquire die Sperre der CPU-Rechenzeit „Wasting“ in nutzlosen Schleife auf Lauf

Sie auch die irq \ preempt verwenden können Befehle direkt, aber das ist ziemlich gefährlich zB:

preempt_enable()  decrement the preempt counter 
preempt_disable()  increment the preempt counter 
preempt_enable_no_resched() decrement, but do not immediately preempt 
preempt_check_resched()  if needed, reschedule 
preempt_count()   return the preempt counter 

seit ich weiß nicht wirklich, was du versuchst es zu erreichen, es ist k Inda schwer, spezifisch zu gehen und Ihre Bedürfnisse zu beantworten, aber ich grabe wirklich schläfrige Semaphore: http://www.makelinux.net/books/lkd2/ch09lev1sec4 im Gegensatz zum Rest der Lösung, die ich angeboten habe, werden sie nicht beschäftigt warten, was Rechenzeit spart.

ich hoffe wirklich, dass ich dabei geholfen habe ... gl!