Multiprozessorsystem - CPU Kern reservieren?

Gast #1154263
Lesenswert?

Hallo,

System ist ein Windows XP Pro mit Intel DualCore Prozessor.
Habe ein Programm geschrieben mit dem ich versuche relativ zyklisch 
Daten einzulesen/auszugeben.
Um überhaupt einigermaßen einen stabiles Timing zu realisiern habe ich 
mir für die Ausführung meines Programms einen CPU Kern blockiert, bzw. 
läuft men Programm halt in diesem Kern.

Das Programm macht nicht wirklich viel, Daten lesen und schreiben, und 
es hält stabil den Zyklus von 1ms ein.

Frage:
XP ist kein Echtzeitbetriebssystem, welche Probleme kann ich in dieser 
Konstellation noch haben. Sprich gibt es Prozesse die mein Timing 
durcheinander bringen könnnen?

Ausser meinen Programm läuft sonst nichts auf dem Rechner, kein Office, 
kein gar nichts :-) Trotzdem habe ich da ein wenig Angst?

Wie seht Ihr das?

Langzeitversuche habe ich noch nicht gemacht, aber erste Messungen 
ergaben Abweichungen von der 1ms um +/-5%.

Mache ich das ganze ohne CPU Kern Reservierung, bin ich Welten von der 
1ms und einem stabilen Zyklus entfernt.

Gruss
Heiko
Gast #1154307
Lesenswert?

Wie ich das sehe ? WinXP wurde gar nicht erst als Realtime OS 
konzipiert. Allenfalls kann man SoftRealTime erreichen mit 
WinXP-Embedded. Das kann man zumindest zuschneiden sodass es passt. Und 
dann gibt es noch Zusatzmodule, die im Kernelmodus laufen. So kann man 
die Realtimeanwendung in einen Treiber packen.
Eine bessere Frage ist, ob man das denn auch braucht. Man kann sich viel 
arbeit und aerger sparen, wenn man die Realtimegeschichten auf einen 
externen kleinen, oder groesseren Prozessor auslagert, und den PC zu 
dessen Steuerung und Visualisierung verwendet.
Gast #1154348
Lesenswert?

@Heiko,

ich würde dir empfehlen auf ein OS wie z.B. Linux mit Realtime Patches 
zu wechseln. Was nützt es dir wen die aktuelle Lösung zu 99% 
funktioniert und du wegen dem 1% deine Kunden verlierst.

Gruss,
Bernd
Gast #1154391
Lesenswert?

>Ausser meinen Programm läuft sonst nichts auf dem Rechner, kein Office,
>kein gar nichts :-) Trotzdem habe ich da ein wenig Angst?

Aber noch andere Treibermodule. Du musst sicherstellen, dass auf dem 
einen Kern keine anderen Module mehr laufen.
Gast #1155294
Lesenswert?

> Wie seht Ihr das?

Das ist reine Glückssache. Wie schon gesagt wurde ist Windows XP kein 
Echtzeit-Betriebssystem, deswegen hat sich jede Frage nach irgendwelchen 
Zeit-Garantien schon im Kern erledigt.

Windows XP kann per Definition keine Zeit-Garantien liefern, nicht mal 
schwache Garantien der Art "ein Thread mit höchster Priorität wird vom 
Scheduler höchstens 100ms am Stück unterbrochen".

Ob dein Programm funktioniert, kann dir also niemand garantieren, es 
wird immer Glückssache bleiben.

Die saubere Lösung wäre ganz klar die zeitkritischen Komponenten auf 
eine externe Hardware auszulagern. Das ist normalerweise nicht so schwer 
und man erspart sich damit viel Ärger.
#1155393
Lesenswert?

Echtzeitsysteme die auf/neben Windows laufen und die Anforderungen 
erfüllen wären z.B. IntervalZero RTX und tenAsys INtime RTOS (beide auch 
für harte Echtzeit Sachen geeignet)

IMO die bessere Lösung bei x86-Systemem wäre VxWorks, QNX, WindowsCE und 
u.U. eCos oder, wie schon vorgeschlagen, ein dediziertes, nicht 
x86-basiertes System, für die Echtzeitaufgaben und den Rest mit einem 
normalen PC erledigen.
Gast #1155479
Lesenswert?

@chris

danke für die Info, ....aber warum sollte das nicht funktionieren wenn 
ich zwei Kerne nutze? .....Ich finde einfach keine definitiven 
Informationen darüber?

Wenn ich momentan meine Lösung über Bord werfe brauche ich "harte" 
Argumente, könnt Ihr mir da welche geben? Mir fehlen einfach fundierte 
Informationen dazu. Jeder sagt es geht nicht, aber es läuft ja.

Nochmal zu meiner Situation.
- XP Pro mit DualCore
- nur Windows installiert (standard)
- Mein Programm reserviert sich meinen Kern exklusiv

--> meine Timinganforderungen von 1ms werde bei allen Versuchen 
eingehalten. Ohne die Reservierung der CPU natürlich nicht (um längen 
nicht).

So, und jetzt sagt mir einer welche Argumente ich da vorbringen kann?

Auf dem System wird auch in Zukunft nichts mehr installiert werden. Es 
wird immer nur mein Programm laufen.
Ganz wichtig. Netzwerk ist noch angeschlossen, meine Daten werde über 
das Netzwerk entsorgt.

h
Gast #1155534
Lesenswert?

> --> meine Timinganforderungen von 1ms werde bei allen Versuchen
> eingehalten.

Weiter oben schriebst du

> Langzeitversuche habe ich noch nicht gemacht, aber erste Messungen
> ergaben Abweichungen von der 1ms um +/-5%.

5% sind ja nicht sooo schlecht, aber eben doch 50µs. Wenn das
Betriebssystem dein auf einem eigenen Core laufende Programm völlig in
Ruhe lassen würde, wäre der Jitter nur durch Verzögerungen in der
Hardware (bei der Busarbitrierung u.ä.) bedingt und läge damit nicht
50µs, sondern mehrere Größenordnungen darunter.

Offensichtlich beeinflusst also das Betriebssystem den "Rundlauf" deines
Programms, zwar weniger als auf einem nichtreservierten Core, aber immer
noch sehr deutlich.

Wenn man wüsste, in welcher Form das genau geschieht, könnte man
versuchen, für den Jitter eine obere Schranke zu ermitteln. Windows ist
aber eine Blackbox, und es gibt, was solche Aspekte betrifft, kaum
öffentlich zugängliche Dokumentation. Deswegen musst du davon ausgehen,
dass der Jitter sporadisch auch auf 10%, 20% oder mehr anwachsen kann.

Könnte man die maximal 5% wirklich garantieren, hätte man einen Weg
gefunden, unter Windows ohne teure Zusatzsoftware harte Echtzeit zu
machen. Schön wär's :)
#1155563
Lesenswert?

heiko wrote:
> @chris
>
> danke für die Info, ....aber warum sollte das nicht funktionieren wenn
> ich zwei Kerne nutze? .....Ich finde einfach keine definitiven
> Informationen darüber?
>
> Wenn ich momentan meine Lösung über Bord werfe brauche ich "harte"
> Argumente, könnt Ihr mir da welche geben? Mir fehlen einfach fundierte
> Informationen dazu. Jeder sagt es geht nicht, aber es läuft ja.
>
> Nochmal zu meiner Situation.
> - XP Pro mit DualCore
> - nur Windows installiert (standard)
> - Mein Programm reserviert sich meinen Kern exklusiv
>
> --> meine Timinganforderungen von 1ms werde bei allen Versuchen
> eingehalten. Ohne die Reservierung der CPU natürlich nicht (um längen
> nicht).
>
> So, und jetzt sagt mir einer welche Argumente ich da vorbringen kann?

http://research.microsoft.com/en-us/um/people/mbj/papers/tr-98-29.html
bzw.
http://www.grahamwideman.com/gw/tech/dataacq/wintiming.htm
(die Links sind teilweise sehr veraltet u.U. über archive.org 
erreichbar)
#1155675
Lesenswert?

heiko wrote:

> Wenn ich momentan meine Lösung über Bord werfe brauche ich "harte"
> Argumente, könnt Ihr mir da welche geben? Mir fehlen einfach fundierte
> Informationen dazu. Jeder sagt es geht nicht, aber es läuft ja.

Es gibt ein Totschlagargument: Windows ist nicht echtzeitfähig. Es geht 
zwar in gewissen Grenzen gut, aber man kann es nicht garantieren.

> - Mein Programm reserviert sich meinen Kern exklusiv

Soso, wie das? Etwa mit SetProcessorAffinityMask()?

> --> meine Timinganforderungen von 1ms werde bei allen Versuchen
> eingehalten. Ohne die Reservierung der CPU natürlich nicht (um längen
> nicht).

Und das würdest du garantieren wollen? Mit deiner Unterschrift dafür 
haften? Ich weiß ja nicht, wofür es ist, aber wenn was 
sicherheitsrelevantes dran hängt oder viel wirtschaftlicher Schaden 
entstehen kann, wenn die Forderungen nicht eingehalten werden....na dann 
gute Nacht.
#1156021
Lesenswert?

Vermutlich gar nicht. Ich bin zwar jetzt nicht der Oberprogrammierer, 
aber soweit ich weiß, kann man das aus dem User Space aus nicht. Wäre ja 
auch noch schöner. Man denke nur dran, was passiert, wenn man nur einen 
Kern hat. Dann steht der ganze Rechner. Man kann lediglich sagen, dass 
der Prozess nur auf einem bestimmten (logischen oder realen) Prozessor 
laufen soll.
Gast #1157340
Lesenswert?

Du willst Daten einlesen und ins Netzwerk verschicken.
Wozu zur Hoelle braucht man dafuer Windows?
Das Totschlagargument hier sind die Lizenzkosten pro System, die dann 
noch nicht mal das garantieren, was Du willst.

Gast3
Gast #1157578
Lesenswert?

Man kann sich auch ein Loch ins Knie bohren und Radieschen reinsäen...

Dafür reicht doch ein schnuckliges FreeDOS oder RTLinux. Beide sind 
vermutlich selbst auf einer alten 400MHz-Gurke näher an der Echtzeit als 
ein Windows auf Dualcore mit vierfacher Taktfrequenz.
#1157595
Lesenswert?

Ich glaub, Heiko liest hier eh nicht mehr mit. Er scheint recht 
beratungsresistent zu sein, und wir haben ja sein Konzept ad absurdum 
geführt. Naja. Dafür brauchts nicht mal ein Linux, ein kleiner µC mit 
LAN reicht da sicher auch aus. So wie er es jetzt hat, kann man 
jedenfalls für nix garantieren. Schön, wenn´s in den Versuchen gerade 
mal klappt, aber das kann sich jederzeit ändern, auch ohne extra 
Software. Und einen Kerjn exclusiv reservieren geht ja eh nich. Das was 
er sicher gemacht hat, heißt nur, dass deine Anwendung nicht auf 2 Kerne 
aufgeteilt wird. Trotzdem können noch andere Threads den Kern nutzen. 
Und der Scheduler von XP hat eh nur 10ms Raster im Normalfall.
#1157679
Lesenswert?

Heiko wrote:
> sorry war am Wochenende nicht online!

Jaja, der Fasching....

> Also Kern 2 wird reserviert mit
> SetProcessorAffinityMask()und dann Prio auf Realtime.

Aha, hab ich´s doch gewusst. Dann hast du ihn aber immer noch nicht 
exclusiv für deine Anwendung. Sonst würde ja Windows stehen bleiben, 
wenn du das auf einem Single-Core machst...
Gast #1157696
Lesenswert?

>Also Kern 2 wird reserviert mit
>SetProcessorAffinityMask()und dann Prio auf Realtime.
Wenn du dir alles genau durchgelesen hättest, wüsstest du schon, was zu 
tun wäre. Du musst lediglich dafür sorgen, dass alle anderen Module auf 
dem entsprechenden Kern nicht mehr zur Ausführung kommen. Manuell kannst 
du dies (nach jedem Start) für die meisten Programme über den 
Taskmanager erledigen. Es gibt aber auch Automatisationstools von WinNT, 
die auch unter XP laufen. Die schreiben die Affinitätsmask dauerhaft in 
eine Konfigdatei, so dass diese sofort nach jedem weiteren Start und für 
alle Submodule gültig ist. Damit kannst du exklusiv einen Kern (fast) 
nur für ein Programm reservieren. (In der Praxis spielt dir der Bus 
natürlich auch noch ein kleines Schnippchen.)
Gast #1157716
Lesenswert?

Also soweit ich mich erinnere, lassen sich die Systemtasks nicht 
vorschreiben, auf welchem Kern sie ausgeführt werden. Windows ist nun 
mal kein Echtzeitbetriebssystem! Alle Versuche, das zu erreichen, werden 
zwangsläufig scheitern. Aber mal was ganz anderes: Ist das Programm nur 
für dich oder sollen das auch andere einsetzen? Du kannst nicht davon 
ausgehen, dass alle Anwender einen Mehrkernprozessor haben.....
Gast #1157743
Lesenswert?

@Peter:
>Alle Versuche, das zu erreichen, werden zwangsläufig scheitern
Die Aussage bezog sich auf das "handelsübliche" Windows 
XP/Vista/irgendwas.  Auch bei diesen kommerziellen Erweiterungen bin ich 
skeptisch. Ich kann mir gut vorstellen, dass funktionierende, 
professionelle "Erweiterungen" den Preis der eigentlichen Windows-Lizenz 
bei weitem übersteigen....

Gruß,
Rayk
Gast #1157755
Lesenswert?

Ha, Moment!

soweit ich mich erinnere, läuft bei Beckhoff nicht der Windows-Teil in 
Echtzeit! Dort wird die Realtime-Erweiterung für die proprietäre 
Software-SPS und Bewegungssteuerung genutzt. Bitte verbessere mich, wenn 
ich mich getäuscht haben sollte. Hier aber geht es aber offensichtlich 
darum, ein Windows-Programm zu verwenden, dass sich quasi-echtzeitfähig 
verhalten soll.
#1157825
Lesenswert?

Klar kann man Windows echtzeitfähig machen, ist alles eine Frage des 
Aufwandes. Die Professionellen Tools kosten richtig Geld und tauschen 
dazu große Teile des Kernels aus. Für weiche Echtzeit muss man nicht 
ganz so viel hinblättern, aber tiefgreifende Eingriffe in den Kernel 
sind es trotzdem. So einfach aus dem User Space heraus gehts nur mit 
Glück, dass es halbwegs stabile Zeiten macht.
Gast #1158084
Lesenswert?

> Klar kann man Windows echtzeitfähig machen, ist alles eine Frage des
> Aufwandes. Die Professionellen Tools kosten richtig Geld und tauschen
> dazu große Teile des Kernels aus.

Alternativ sind sie ein eigenes Betriebssystem, unter dem Windows dann 
in einer Virtualisierung als eigener Task mit geringer Priorität läuft. 
Ziemlicher Aufwand, nur um krampfhaft an Windows festhalten und damit 
etwas machen zu können, für das es nicht gedacht ist.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren