Hallo Peter
welche Gründe kann es den geben preemption points zu
verwenden?
z.B. wenn dein PC in den Schlaf-Modus versetzt werden soll. Also Hauptspeicher auf die Platte sichern und dann abschalten.
Hier noch ein paar Beispiele:
http://www.stud.uni-siegen.de/markus.fick/pz/pz.html
Also vorstellbar wäre das, wenn die Tasks
abwechselnd die CPU nutzen und zwar eine genau fest definierte
Zeit lang, also 1s z.B… Dann gäbe es jede Sekunde einen
preemption point im code. Die Anwendung ist aber nicht so
optimal, denn wenn eine sehr hoch priorisierte Task kommt,
muss sie im worst case eine ganze Quantenzeit (1s) warten.
Es geht einfach darum, dass ein Task nur an bestimmten Stellen, also in bestimmten Zuständen gestoppt werden darf.
Und was wäre eine bessere Lösung, ich meine eine Lösung ohne
preemption points?
Preemtion points hat man im Prinzip auch, wenn ein Task eine Meldung abholt. Ist eine Meldung in der MessageQueue vorhanden, kann der Task weiterarbeiten, bis seine Zeitscheibe abgelaufen ist. Ist die Queue leer, wird er verdrängt.
Eine andere Methode sind „critcal sections“, hier wird der Task vor einer Verdrängung geschützt. Im einfachsten Fall werden einfach die Interrupts für diesen Bereich gesperrt. Dies wird vor allem bei Realtime-Vorgängen angewendet, sehr oft in Treibern. Hier geht es auch darum, dass gewisse AUfgaben abgeschlossen sein müssen, bevor ein nächster Aufruf des Treibers erfolgen darf. Dies kann aber nicht sichergestellt werden, wenn der Treiber immer vertagt werden kann.
z.B. muss ein Diskkontroller für einen Transfer komplett programmiert werden, danach ist er busy bis der Transfer abgeschlossen ist, was der Treiber natürlich bei einem Aufruf als erstes testet, bevor er den Kontroller neu programmiert.
MfG Peter(TOO)