So verhindern Sie, dass ein zeitabhängiger C-Prozess den Kontext wechselt

So verhindern Sie, dass ein zeitabhängiger C-Prozess den Kontext wechselt

Wir haben einen Prozess, der für die Abfrage der Hardware in zeitabhängigen Intervallen zuständig ist. Wir möchten diesem Prozess einen CPU-Kern zuweisen. Beispielsweise möchten wir, dass dieser Prozess jederzeit lauffähig bleibt.

Unser erster Versuch, dieses Problem zu lösen, war der folgende:

# Set process to highest priority
nice -n -20 cmd

# Set thread affinity in C for our hardware sampling thread
pthread_setaffinity_np(...)

Beide oben genannten Schritte funktionieren wie erwartet. Unser Thread bleibt dort, core3wo wir ihn festgelegt haben, und niceist -20oben.

Bei erneuter Ausführung ftracealsgemäß dieser DiskussionUnddieses Problemsehen wir häufig Folgendes:

> cat trace | grep " 3)" | grep " => "
 3)  rhd_loc-2735  =>    <idle>-0   
 3)    <idle>-0    =>  rhd_loc-2735 
 3)  rhd_loc-2735  =>    <idle>-0   
 3)    <idle>-0    =>  rhd_loc-2735 
 3)  rhd_loc-2735  =>    <idle>-0   
 3)    <idle>-0    =>  rhd_loc-2735 

rhd_loc-2735ist unser Prozess.

Zusätzlich zu dem, was oben gezeigt ist, sehen wir viele Fälle, in denen kworker-2703Switches und manchmal andere Prozesse mit niedrigerer Priorität in den Kern eingebunden werden.

Wir glauben, dass der Grund für die Kontextwechsel darin liegt, dass unser Prozess mit SPI(Serial Peripheral Interface) kommuniziert, das darauf wartet IRQs, und außerdem SPImit einer um ein Vielfaches langsameren Taktrate als der CPU-Kern läuft. Daher verbringt unser Prozess einen Großteil seiner Zeit damit, auf SPI/IRQs zu warten, d. h. er befindet sich nicht in einem RunnableZustand. Unabhängig von der Priorität oder Affinität kann der Kernel dem Kern andere Prozesse zuweisen.

Dies führt dazu, dass unsere Hardware-Abtastrate variabler und niedriger ist als sie sein könnte, da unser CPU-Kern nicht immer sofort bereit ist, den nächsten Wert zu verarbeiten SPIund dann eine neue Abtastanforderung zu senden.

Frage:

Können wir entweder 1) alle anderen Prozesse zwingen, sich außerhalb des Kerns zu befinden, damit unser Prozess sofort auf Unterbrechungsanforderungen reagieren kann, oder 2) unseren Hauptthread ausführbar halten, damit er immer für die Verarbeitung der nächsten Anforderung verfügbar ist?

verwandte Informationen