Lowlevel
Lowlevel => OS-Design => Thema gestartet von: Cjreek am 19. August 2009, 02:47
-
Hi,
Folgende Geschichte:
Habe eben mal wieder Lust gehabt mit dem Editor von Warcraft III eine Map zu basteln. Bzw nur etwas damit rumzuspielen. Mir kam die Idee eine Einheit zu basteln, die bei ihrem Tod 2 weitere ihres Typs spawnt.
Habe damit etwas rumexperimentiert.. Diese Experimente sind z.T. etwas nach hinten losgegangen und haben meinen PC nach wenigen Sekunden in die Knie gezwungen und ich war gezwungen den Resetknopf zu drücken, da ich es nicht geschafft habe Warcraft 3 zu beenden.
Idee:
Nun kam mir eine Idee. Ich dachte mir, dass es doch ganz nützlich wäre wenn der Kernel eine Funktion bereitstellen würde, die den angeforderten Speicher und die benutzte CPU-Power eines jeden Prozesses überwacht. Sollte nun ein Prozess (über Sekunden hinweg) eine ungesund hohe CPU Auslastung erzeugen oder auffällig/übertrieben viel Speicher anfordern (Speicherleck?), dann unterbricht der Kernel das auffällige Programm und fragt den Benutzer ob dieses Verhalten so in Ordnung/erwünscht ist und nun darf der Benutzer dann entscheiden ob er das Programm beenden möchte oder ob alles seine Richtigkeit hat und das Programm fortgeführt werden soll.
Was haltet ihr von der Idee? Natürlich sollte dieses Feature abgestellt werden können und ggf. Ausnahmen hinzugefügt werden können etc. falls einem User das zu lästig werden sollte.
Lg
Cjreek
-
Hallo,
nützlich währe es IMHO wenn ein Prozess der mehr CPU-Leistung benötigt automatisch eine niedrigere Priorität bekommt. Also quasi ein Faktor der umgekehrt proportional zu seiner CPU-Last ist auf die eingestellte Basis-Priorität draufgerechnet wird.
Das würde sicherstellen das der PC benutzbar bleibt.
Was auch nicht schlecht währe wenn der Scheduler den CPU-Fraß pro Prozess begrenzen kann, z.B. auf 50%. Dafür könnte es natürlich spezielle User gesetzte Ausnahmen geben die dann aber zwingend mit einer niedrigen Priorität einher gehen.
Den Speicherfraß zu begrenzen halte ich nicht für sehr sinnvoll, das einzigste was mir da vorschwebt währe das es eine Obergrenze (z.B. 90%) an insgesamt zugeteiltem Speicher gibt nach deren überschreiten nur noch Programme mit Root-Rechten weiteren Speicher bekommen sowas wie die Quotas auf einem Dateisystem.
Es geht doch im wesentlichen darum das man ein System auch in Ausnahme-Situationen wenigstens noch geordnet runterfahren kann oder man zumindest eine Root-Konsole bekommt um ein Amok laufendes Programm zu beenden.
Grüße
Erik
-
Also wenn ich meinen Rechner einen Kernel kompilieren lasse, will ich nicht eine Stunde statt einer halben Stunde warten, weil der Compiler nur 50% der CPU-Leistung benutzen darf...
-
das ist meiness wissens nur ein problem von windows.
unter linux tut die konsole fast immer. und von dort lässt sich auch meist der prozess dann schön killen. zur not von einem anderen rechner remot über ssh einlogen, rootrechte besorgen und dann killen.
Ich glaube das Linux parameter für die Maximale grenzen für resorcen hat, um solche amoklaufenden Prozesse zu stoppen, bzw zu begrenzen.
-
Also meine Erfahrung ist, dass das unter Linux genauso auftritt bzw. auftreten kann.
-
Hallo,
ich hab noch mal etwas über dieses Thema gegrübelt.
Tasks einfach nur eine begrenzte Nutzung der Ressource CPU-Zeit zu gewähren ist in der Tat keine gute Idee. Nicht nur Compiler würden darunter leiden, auch Media-Player benötigen (manchmal) die gesamte verfügbare CPU-Leistung um eine komplexe Szene flüssig auf den Monitor zu bringen und es gibt noch viele andere Fälle wo Programme die volle CPU-Leistung benötigen und der User das auch erstmal so möchte. Vielmehr geht es darum das der PC immer für den User benutzbar bleibt. Mit "benutzbar" meine ich das "wichtige" Programme gestartet werden können und auch noch in der Lage sind den PC zu beeinflussen. Hier müsste man im Vorfeld definieren welche diese wichtigen Programme sind. Eine Shell und alles was in /sbin liegt kann wohl als "wichtig" gelten der Rest eben nicht. Trotzdem sollte ein normales Programm das mehr will als eine bestimmte Schwelle erlaubt dafür etwas oder in mehreren Stufen herab gestuft werden. Wenn nichts anderes nebenher läuft bekommt der Compiler oder Media-Player trotzdem alle verfügbare CPU-Leistung aber es ist eben auch möglich das sie für "wichtige" Programme platz machen. Im Gegenzug für die höheren Privilegien welche die wichtigen Programme bekommen (möglicherweise unabhängig vom User in dessen Kontext sie laufen) muss man aber auch erwarten das deren Programmierer besondere Sorgfalt auf den schonenden Umgang mit Ressourcen legen.
Ob man das alles nur Root erlauben möchte sollte man sich gut überlegen. Es währe schön wenn auch ein normaler User zumindest die Möglichkeit hätte eigene Programme zu killen wenn diese Amok laufen. Deshalb bin ich dafür den Kreis der "wichtigen" Programme vorher zu definieren, als zusätzliche Sicherheit könnte man da ja eine digitale Signatur benutzen damit der OS-Kernel die wichtigen Programme erkennt und auch kein Virus oder böser User das Konzept einfach umgehen kann.
Ein weiterer Punkt sind die Dienste/Services die wichtige Basis-Funktionalitäten anbieten. Als Beispiel möchte ich mal den IP-Stack benutzen. Dieser ist sehr wichtig und sollte immer "benötigte" Ressourcen bekommen andererseits ist er von außen angreifbar (wenn IPv6 kommt hängt ja wieder jeder private PC direkt im Internet ohne einen NAT-Router o.ä. dazwischen) und sollte sich von daher selber beschränken können. Auch hier ist wieder ein möglichst einfaches aber wirkungsvolles Regelwerk erforderlich das dem IP-Stack sagt was dem User wichtig ist und wofür er sich auch in engen Verhältnissen noch weitere Ressourcen genehmigen darf bzw. welche Dinge weniger wichtig sind und nur dann ausgeführt werden sollen wenn ausreichend Kapazitäten verfügbar sind. Auf einem File-Server wird man das sicherlich anders definieren als auf einem einfachen Surf-PC.
Beim RAM würde ich schon mit einer simplen Quota arbeiten wollen, über eines gewisse Schwelle hinaus bekommen nur noch die "wichtigen" Programme weiteren Speicher zugeteilt. Im Falle des IP-Stack z.B. sollten eben diese Programme möglichst nur dann dieses Privileg beanspruchen wenn es der Erfüllung einer wichtigen Aufgabe dient.
Schlussendlich bin ich der Meinung das das ein komplexes Thema ist dem man schon in der Konzept-Phase (fürs OS und dessen Basis-Funktionalitäten) entsprechende Aufmerksamkeit widmen sollte (falls einem dieses Thema wichtig ist).
So jetzt habe ich das Wort "wichtig" oft genug benutzt und es würde mich freuen wenn Ihr meine Gedanken mal analysiert/kritisiert.
Grüße
Erik
-
Hi,
Ich bin mir nicht sicher ob die meisten hier richtig verstanden haben was ich gemeint habe. Es geht nicht darum direkt Alarm zu schlagen wenn ein Prozess mal 100% erzeugt. Aber wenn er das auffällig lange tut oder so viel Speicher anfordert, dass der Kernel absehen kann, dass dieser Speicherverbrauch auf Dauer nicht gut geht. DANN soll der Kernel das Programm kurz pausieren und den Benutzer fragen, ob das so in seinem Sinn ist. Eben um zu verhindern, dass der Benutzer in so eine Situation gerät dass er nichts mehr tun kann.
Ich konnte z.B. Warcraft 3 nicht mehr minimieren, der Taskmanager ist nicht aufgetaucht etc. In so Situationen fände ich sinnvoll wenn der Kernel Warcraft3 unterbricht und den User fragt ob das so in Ordnung ist oder der Kernel diesen Prozess für den User beenden soll.
Sowas in der Art gibt es in Windows ja schon. Manchmal gibt es ja dieses
----------------------------------------------------------------------
Programmtitel (reagiert nicht mehr) [-] [ ] [x]
----------------------------------------------------------------------
und wenn man dann auf das Fenster klickt ploppt auch ein Dialog auf in dem man gefragt wird ob man dieses Programm beenden möchte.
Lg
Cjreek
-
Ich finde die Idee gut,
denn solche Vielfrassprogramme gibt es mit sicherheit in jeden Betriebssystem.
Jedoch wird es nervtötent wenn man immer gefragt wird
"Programm frisst zu viel.
Wollen sie es beenden?".
Dass nervt.
Ich finde das der normale User auch die möglichkeit haben sollte diesen Programmen zu erlauben so viel Speicher in anspruch zu nehmen.
Natürlich sind die root Programme höher priviligiert (Ich hoffe ich habs richtig geschrieben).
-
Jedoch wird es nervt�tent wenn man immer gefragt wird
"Programm frisst zu viel.
Wollen sie es beenden?".
Dass nervt.
Ich finde das der normale User auch die m�glichkeit haben sollte diesen Programmen zu erlauben so viel Speicher in anspruch zu nehmen.
Das das möglich sein soll, stand ja schon in meinem ersten Post ;)
Und wie gesagt. Es wird ja nicht oft vorkommen. Nur wenn ein Programm wirklich fast das ganze OS lahmlegt durch sein verhalten.
-
Da ist Ja noch die Frage ob dein Os noch genug speicher hat um solch ein fenster zu öffnen\Meldung auszugeben und zu fragen, bevor es das Programm beendet.
mit meinem Computer(1gz, win xp, 512 mb) hab ich das auch versucht einzustellen, dass er Programme automatisch abbricht, wenn sie zu viel speicher brauchen, das problem ist es kommt nie dazu, weil der freie speicher schon = 0 ist, bevor iwas passieren kann.
-
Ah jo man muss halt reagieren BEVOR es zu spät ist und nicht erst wenn speicher = 0^^
-
Hallo,
Es geht nicht darum direkt Alarm zu schlagen wenn ein Prozess mal 100% erzeugt.
Das hab auch ich nicht vorgeschlagen. Ich habe versucht einen Weg aufzuzeigen wie sich das OS verhalten könnte ohne das es selber mit dem User interagieren muss. Es soll "nur" dafür sorgen das der User immer mit seinem PC arbeiten kann.
Ich hab ne menge Programme die CPU und Speicher für ne ganze Weile voll beanspruchen und ich will bei keinem Programm gefragt werden ob es weitermachen darf. Ich will das ich den PC trotzdem benutzen kann wenn ich es möchte.
Wenn mein PC von einem Programm voll beansprucht wird und ich als Reaktion 50 Root-Shells starte dann friert der Rechner trotzdem ein weil die vielen Root-Shells die kleine Speicher-Not-Reserve voll auffressen und das OS kann da nichts dagegen tun. Wie sollte das OS auch erkennen das ich Blödsinn mache.
Der Bildschirm-Rechner von Windows bietet z.B. von selbst an seine aktuelle Rechnung abzubrechen wenn er zu lange braucht. Das ist sinnvoll aber mehr geht IMHO nicht.
Ich konnte z.B. Warcraft 3 nicht mehr minimieren, der Taskmanager ist nicht aufgetaucht etc
Das der Taskmanager nicht kommt liegt daran das Dein Spiel in einen anderen Graphik-Modus geschaltet hat, damit kommt der Taskmanager nicht immer zurecht.
In so Situationen fände ich sinnvoll wenn der Kernel Warcraft3 unterbricht ...
Wie soll der OS-Kernel so eine Situation erkennen?
Also ich möchte nicht bei einem Compiler-Lauf oder einer FPGA-Simulation vom OS gefragt werden ob alles rechtens ist, ich möchte nur das ich am PC auch was anderes machen kann wenn ich will.
Grüße
Erik
-
Ah jo man muss halt reagieren BEVOR es zu spät ist und nicht erst wenn speicher = 0^^
Da liegt ja das problem:
sagen wir mal es beendet das programm, wenn 70% des Speichers verwendet werden. Bei einem 4gb recher wär das schon ~1gb ungenutzter speicher, denn das OS wird schicher nicht plötzlich einen gb speicher brauchen.
-
Hallo,
sagen wir mal es beendet das programm, wenn 70% des Speichers verwendet werden.
Da sind meiner Meinung nach 2 Fehler drin. Erstens darf das OS nicht einfach eigenmächtig ein Programm beenden, es darf dem Programm aber den Zugang zu zusätzlichen Ressourcen verweigern (ein passender Error-Code als Rückgabe eines entsprechenden Sys-Calls währe da angebracht). Zweitens sind 30% Not-Reserve eindeutig zu viel, ich würde ca. 32MByte (für ein 64Bit-OS auf einem üppig ausgestattetem PC sicher auch 128MByte) vorschlagen.
Wenn ich mit ModelSim einen FPGA simuliere und das OS dem ganzen nach 2 Stunden mit 100% CPU-Last ein Ende bereitet nur weil die Simulation kurz vor Schluss noch mal zusätzlichen Speicher benötigt währe ich extrem sauer. Wenn das OS bei einer Speicheranforderung einfach einen Fehler zurückmeldet (also malloc() mit NULL zurückkommt) dann kann ModelSim passend reagieren (was es meines Wissens nach auch tut) und die letzten 2 Stunden Wartezeit waren wenigstens nicht ganz vergebens. Das beobachten der Programme und analysieren ihres Verhaltens fällt IMHO eher in den Aufgabenbereich von Antivirus-Programmen bzw. deren "Behavior-Analysis/Blocking-Tools".
Ein OS sollte dafür sorgen das jedes Programm einen fairen Zugang zu allen Ressourcen bekommt. Wenn ich 100 Programme starte sollte jedes davon 1/100 der CPU-Zeit bekommen und wenn 99 davon auf ein blockierendes Ereignis warten dann sollte das letzte auch die gesamte CPU bekommen können. Ob alle 100 Programme auch den benötigten Speicher bekommen ist eine andere Frage, hier gilt "wer zuerst kommt malt zuerst".
Im Detail ist das natürlich etwas komplexer, so sollte bei den 100 Programmen auch deren Priorität in die Verteilung der CPU-Zeit einfließen damit sich Hintergrund-Programme nicht zuviel genehmigen. Auch sollte der Scheduling-Algorithmus darauf achten das ein Task das sehr viele Threads startet nicht deshalb überproportional viel CPU-Zeit bekommt (wenn die anderen Tasks nur wenige oder gar nur einen Thread benutzen).
Grüße
Erik
-
Du könntest das ganze aber auch anders regeln.
Der Kernel speichert zu jedem Prozess ein paar Daten.
Wenn nun ein neuer Prozess gestartet wird, der für den Kernel unbekannt ist, wird der User gefragt, wie der Kernel in diesen kritischen Momenten zu handeln hat.
Wenn du zum Beispiel einen Kompiler hast, kannst du dem ja einfach freie Hand lassen, aber wenn nun eine Office-Anwendung läuft, soll das OS bei 90% des Speichers nochmal nachfragen oder es gleich abschießen.
Man muss den User ja nicht erst auffordern, wenn alles zu spät ist, sondern fragen wenn das System noch läuft und danach die ganze Regulierung dem OS überlassen.
-
Also dass das System überhaupt nicht mehr benutzbar ist, passiert doch eigentlich nur bei Spielen in ganz extremen Situationen, oder wenn man vermurkste Treiber/Hardware hat. Da kann das Betriebssystem halt nix machen.
-
du kanst das vermurkst ruhig verallgemeinern. auch vermurkste Software kann sowas produzieren. Wenn in einem java programm irgendwo so ne schön hässliche endlosschliefe drinn ist dann geht oft auch nicht mehr viel, bzw man braucht verdammt viel gedult das Programm über den Taskmannager oder die Entwicklungsumgebung wieder zu stoppen.
-
Naja, eben gerade das nicht.
Dieses Programm lastet laut Taskmanager alle 4 Kerne zu 100% aus, trotzdem kann ich diesen Post wie immer schreiben (und Eclipse benutzen, um das Programm beenden):
public class Cpu100 implements Runnable {
public static void main(String[] args)
{
int cpus = Runtime.getRuntime().availableProcessors();
for (int i = 0; i < cpus; i++) {
new Thread(new Cpu100()).start();
}
}
@Override
public void run() {
for(;;);
}
}
-
Naja, würdest du jetzt aber ein Programm schreiben, welches einen 10000000000 array aufmacht wäre das wohl tödlich für Windows.
-
Ja, außer dass Windows davon nicht stirbt.
Aber es geht auch nicht darum Methoden zu finden das System abzuschießen, sondern eine zuverlässige Heuristik zu finden, um anhand dieser zu reagieren, und eine gewisse Fairness gegenüber anderen Prozessen herzustellen oder das System benutzbar zu halten. Die Problematik liegt darin 1. die Heuristik zuverlässig zu gestalten und 2. diesen Fairness- oder Benutzbarkeitsbegriff zu definieren.
Mein Beitrag sollte zeigen, dass 100% CPU Auslastung keine gute Heuristik ist.
-
Mein Beitrag sollte zeigen, dass 100% CPU Auslastung keine gute Heuristik ist.
... was ich so übrigens auch nie behauptet habe ;)
-
Jop ^_^