Multitasking abschalten

Hallo allerseits.
Ich habe ein Frage zum Thema Multitasking bei Betriebssystemen.

Meine Aufgabe ist es die Laufzeit eines Codes zu analysieren, um diese korrekt zu bestimmen, muss jedoch kurzzeitig das Multitasking des Betriebssystems abgeschaltet werden.
Konkreter:
Der PC bekommt über einen I/O Port (Parallel, Seriel oder USB, ist an sich egal) ein Signal, das heisst ein bestimmtes Bit wird auf 1 gesetzt. Solange dieses Bit auf 1 ist, muss mein Code ausgeführt werden die 100%ige Aufmerksamkeit des Prozessors kriegen, um so die Laufzeit genau bestimmen zu können.

Diese zu messende Codepassage ist in Assembler geschrieben, alles drumherum in C.

So nun bräuchte ich ein paar Denkanstöße, zum Beispiel in Form von Pseudocode wie das realisierbar wäre.

Kann man unter Windows das Multitasking kurz unterbingen?
Wie sieht das mit Linux oder anderen Betriebssystemen aus?

Gruß
 
Ich kenn mich zwar damit nicht aus aber ich zitiere mal aus der Wiki:

Hardwareseitig benötigt präemptives Multitasking im Gegensatz zur kooperativen Variante (vergl. TSR-Programm als Vorläufer) zwingend einen Zeitgeber in Verbindung mit einem geeigneten Prozessor, da das System softwareseitig sonst keine Möglichkeit hat, Prozessen die Kontrolle über den Prozessor zu entziehen. Der Zeitgeber sendet regelmäßig ein Signal (Interrupt) an die CPU, was sie zur Ausführung eines Schedulers veranlasst. Dieser unterbricht den gerade aktiven Prozess, übernimmt nötige Verwaltungsaufgaben und aktiviert dann wieder einen (anderen) Prozess.

Ich würde versuchen den Zeitgeber zu deaktiveren bzw unter eigener Kontrolle zu bringen. Interresant wäre evtl auch zu wissen auf welchen Prozessor das ganze laufen soll, vielleicht bietet der Hersteller diverse Diagnosetools an um dort einstellungen abzuschalten.
 
Hi,

du kannst auch Hardware-Interrupts im ganzen abschalten. Glaube die Intruktion dazu heisst "cli" bzw "sti" um die Interrupts wieder einzuschalten.

Grüße
serow
 
Die Kernel-Threads wird man kaum anhalten können, sonst würde ja das Subsystem auf dem dein Prozess läuft auch nicht mehr funktionieren.

Auch die übrigen Prozesse kriegen hier und da minimale Slices zum "überleben" und über thread suspension würde ich bei kritischen Systemprozessen gar nicht erst nachdenken, da deadlocked früher oder später auch alles.

Ich würde mich nach einem Echtzeitbetriebssystem umschauen. Gibt da auch welche Mit Linux-kernels.
 
Als "Zwischenlösung" könnte man dem Prozess/Thread höchste Priorität geben und an eine CPU binden.
SetThreadPriority function
Scheduling Priorities

SetProcessAffinityMask function
SetThreadAffinityMask function
How to run an app on one processor only « Professional blog site of Vinu Baby

Exakt wird es zwar nicht sein, die Frage ist allerdings, ob man diese Genauigkeit braucht. Wenn der Code später unter Windows laufen soll, wird man die gleichen Einschränkungen haben. Sollte es später unter einem RT OS laufen, wären Tests unter diesem OS aussagekräftiger ;)
 
@Bitmuncher: Interrupts abschalten ist einer von mehrere Wegen Mutual Exclusion zu erreichen. Spinlocks können genauso von Timer Interrupts unterbrochen werden, wie alle anderen Prozesse auch. Schreib ein Perl Script das hier rein und du hast ein Spinlock:

Code:
while(true) {}

Kann natürlich jeder Zeit durch einen anderen Prozess abgelöst werden.

Grüße
serow
 
Ein Spinlock ist im Kernel der exklusive Lock einer Ressource und somit nicht vergleichbar mit einer Endlosschleife. Ein Spinlock zeichnet sich dadurch aus, dass er die CPU für einen Prozess festlegt und bis der Spinlock aufgehoben ist, kann kein weiterer Prozess diese CPU nutzen. Dadurch können Spinlocks zu Deadlocks führen und normale Schleifen nicht. Diese können zumindest durch einen Interrupt unterbrochen werden, während Spinlocks sogar innerhalb von Interrupt-Handlern auftreten können.
 
Hallo,

danke schonmal für die Antworten.
Ich beschreibe mal die Aufgabenstellung genauer da das ganze doch ziemlich allg. formuliert war.

Im Rahmen einer Bachelorarbeit, soll AES in Assembler nachprogrammiert werden, einmal mit und einmal ohne den neuen AES-NI Befehlssatz( der beinhaltet ein paar neue Befehle die AES beschleunigen).
Dann sollen die beiden Versionen auf Geschwindigkeit geprüft werden, um so die Effizienz herauszufinden.

Das ganz soll so ablaufen dass ein C Programm geschrieben werden soll, das auf ein Signal auf einem I/O Port wartet, also USB Parallel oder Seriell, kann ich mir aussuchen. Das Signal sieht einfach so aus dass bei einem bestimmten Pin eine 1 angelegt wird.
Solange diese 1 anliegt. Soll AES laufen, und möglichst alles andere gestoppt werden, um die reine AES Laufzeit zu bestimmen, ohne dass der Scheduler dazwischenfunkt.

So, mein Betreuer will das so unterbrechungsfrei wie möglich.
Ansätze waren:
-Das ganze in MSDOS zu schreiben, wo es noch kein Multitasking gibt -> gehts nicht da, da die neuen ASM Befehle anscheinend nicht untersützt werden.

-Alles ausser den AES Thread auf einem anderen Prozessorkern laufen lassen. -> wäre der Betreuer nicht so begeistert von

-Dem AES Thread eine sehr hohe Priorität geben -> sind ihm immernoch zu viele Unterbrechnungen.

So, jetzt bräuchte ich ein paar Ideen von euch. OS kann ich mir aussuchen, aber es muss halt ein C Compiler und Assembler der den neuen Befehlssatz versteht, dabei sein.

Danke schonmal
 
Zurück
Oben