Ich habe ein Problem mit dem Killen von Prozessen. Wenn meinem System der Strom ausgeht bekomme ich einen Interrupt, der von meinem Treiber auch richtig abgefangen wird. Ich will die restliche Zeit, bis der Strom ganz weg ist sinnvoll nutzen, in dem ich z.B. Daten in ein Flash schreibe. Ich muß aber alle unwichtigen Prozesse daran hindern, CPU-Zeit zu konsumieren, da diese für das wegsichern von Daten gebraucht wird.
Jetzt brauche ich eine Möglichkeit, Prozesse vom Treiber (Kernelspace) aus für immer zu stoppen, ohne diese zu killen, da das killen ja auch wieder Zeit braucht.
Ich habs zuerst damit versucht, daß ich bei unwichtigen Prozessen den Process-State auf STOPPED setze, das hat auch für einige Prozesse gut funktioniert, jedoch z.B. nicht für das Programm 'TOP'.
Dieses beinhaltet einen sleep(1); Damit hängt dieser Prozess in einer Waitingqueue (soweit ich glaube mich da auszukennen) und sein process-state wird nach ablauf dieser Zeit vom Kernel wieder auf RUNNING gesetzt.
Hab dann festgestellt, daß dies nicht der Fall ist, wenn ich den process-state auf DEAD stelle. Also damit theoretisch gelöst.
Praktisch hat das aber nicht funtkioniert, wenn ich mehrere (unwichtige Test-)Prozesse so abgeschossen habe.
Dann hab ich mir gedacht, ich probier noch einen illegalen Schritt weiter aus und entferne einfach alle unwichtigen Prozesse aus der Taskliste.
Damit waren die Tasks dann nicht mehr zu sehen (ps -ax), aber noch immer das selbe Problem:
Wenn ich mehrere Prozesse so stillegen will, friert das System komplett ein und ist tod.
Sicherlich ist das keine feine Art so brutal in den Prozesslisten rumzuhacken, aber nach dem der Saft der CPU sowieso nach ca. 1-2 Sekunden weg ist, geht es mir nur darum daß in den nächsten 2 Sekunden noch alle rund läuft. (Ob da dann irgendwelche Memoryleaks sind, weil nicht vernünftig zusammengeräumt wurde, ist mir dann egal.)
Würde mich über ein paar nette Beiträge freuen oder vielleicht weiss jemand ein Forum, das besser geeignet ist.
Danke,
WhyLee.
Treiberentwicklung: Stilllegen von Prozessen ohne kill
Ja, das hab ich ganz am Anfang gemacht. Nice +19 (oder +20?) direkt in die taskstruktur reingeschrieben. Das hat aber nicht dazu geführt, daß diese Tasks gestoppt haben. Ich kenne aber den Scheduler nicht so gut, daß ich voraussagen könnte, ob so ein low-priority-Task in den nächsten 2 Sekunden noch dran kommt, wenn es andere Tasks gibt, die volle CPU mit high-priority (Nice -20) brauchen. Soweit ich mich jetzt erinnern kann, hab ichs nur im 'Leerlauf' gestestet, und der Test-Task zum Abschießen war 'top'. Dieser hat aber auch bei niedrigster Priorität noch brav alle Sekunde die Taskliste rausgepinselt. Ich weiss aber nicht, wie sowas aussieht, wenn noch ein anderer Prozess läuft, der fast volle CPU-Zeit braucht.
Thanks,
WhyLee.
Thanks,
WhyLee.
- meandtheshell
- Beiträge: 4054
- Registriert: 14.01.2005 17:51:30
der prozess mit der höheren Priority hat Vorang - mehr gibt es dazu nicht zu sagen.Ich weiss aber nicht, wie sowas aussieht, wenn noch ein anderer Prozess läuft, der fast volle CPU-Zeit braucht.
Ob dieser dann noch in der verbleibenden Zeit abgearbeitet werden kann hängt von zwei Parametern ab:
1) die verbleibende Zeit
2) wie viel Arbeit hält dieser Prozess noch bereit - sprich wie groß ist er - geht es sich noch aus in der verbleibenden Zeit - ist das grundsätzlich nicht der Fall kannst du es drehen wie die willst, es geht nicht.
Wenn das wirklich so kritisch ist würde sich eine USV anbieten oder nicht? damit drehst du an Parameter 1). Um bei 2) was zu machen kannst du "schlau" programmieren oder eine schnellere cpu nehmen (wobei das ein zweischneidiges Schwert ist - eine Leistungsfähigere CPU benötigt mehr Leistung - wodurch das Magnetfeld der Spulen schneller seine im H-Feld gespeicherte Energie los wird - ist also nur ein verlagern des Problems)
markus
Zuletzt geändert von meandtheshell am 03.03.2005 18:13:23, insgesamt 2-mal geändert.
-
- Beiträge: 1581
- Registriert: 01.05.2004 13:21:26
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: DE
Da ich auch gerade mit Treibern zugange bin, hab mal in den Kernel-Headern(2.6.10) geschmökert. Vielleicht bietet dir stop_machine_run() das richtige. Du findest es in <linux/stop_machine.h> und es ist auch für up-Maschinen nutzbar. Die Funktion stoppt alles andere(schaltet irqs ab) und nimmt als Argument eine Funktion die während diesem "very hevy write lock" ausgeführt wird. Keine Ahnung, wie sowas tatsächlich gehen soll.
ciao, storm
ciao, storm
drivers/ata/libata-core.c: /* devices which puke on READ_NATIVE_MAX */
- meandtheshell
- Beiträge: 4054
- Registriert: 14.01.2005 17:51:30
@ storm
hallo - die Idee hatten schon mehr Leute - aber bedenke um das zu machen musst das System wissen was wo läuft wie die Prioritys der einzelnen Prozesse sind und dann muss das Ausgewertet und anschließend synchronisiert werden - in einfachen Worten es benötigt Zeit - die Zeit die du dir für einen Prozess damit holst vernichtest du alleine schon wieder durch die Tatsache das du es machst für den speziellen Fall das du noch 1 sec oder so hast ist das eher nichts - sonst kann man damit durchaus was machen
@whylee
da ich keine Ahnung habe was genau das für daten sind rate ich mal so ins blaue hinein ...
Beispiel Logfiles - hier wird mit der Syntax - (minus vorne) erreicht das Daten sofort (zum Zeitpunkt des Entstehens) auf einen persistenten speicher geschrieben werden.
Vielleicht ist das ein besserer Ansatz für dein Problem?
hallo - die Idee hatten schon mehr Leute - aber bedenke um das zu machen musst das System wissen was wo läuft wie die Prioritys der einzelnen Prozesse sind und dann muss das Ausgewertet und anschließend synchronisiert werden - in einfachen Worten es benötigt Zeit - die Zeit die du dir für einen Prozess damit holst vernichtest du alleine schon wieder durch die Tatsache das du es machst für den speziellen Fall das du noch 1 sec oder so hast ist das eher nichts - sonst kann man damit durchaus was machen
@whylee
da ich keine Ahnung habe was genau das für daten sind rate ich mal so ins blaue hinein ...
Beispiel Logfiles - hier wird mit der Syntax - (minus vorne) erreicht das Daten sofort (zum Zeitpunkt des Entstehens) auf einen persistenten speicher geschrieben werden.
Vielleicht ist das ein besserer Ansatz für dein Problem?
Ich bin zwar nicht besonders beschlagen in der Materie, aber es hoert sich so an, alsob du mit dem Prozess Refridgerator aus swsusp was anfangen kannst, da werden auf jeden Fall auch Prozesse eingefroren um danach in Ruhe Daten speicher zu koennen (wenn auch mit einem ganz anderen Ziel...).
Magic is always the best solution -- especially reliable magic.