Forum: PC Hard- und Software Windows CPU Kern isolieren und Programmcode laufen lassen


von Sim (Gast)


Lesenswert?

Hallo Leute,

ich habe von einem Bekannten erfahren (beruflich arbeitet er in der 
Thematik), dass diese auf einem Windows System einen Kern isolieren und 
darauf eine Simulation laufen zu lassen.

Die Isolation und Auslagerung der Applikation ist nötig, um ein 
Zwischenbrüllen von Windows bei Zeitkritischen Berechnungen zu 
verhindern -> soweit noch klar.

Dass man unter Windows Kern(e) isolieren kann kenne ich auch (run -> 
msconfig -> Start -> erweitere Optionen), wenn gleich mir bis dato 
unklar war, wieso eigentlich.

Die berechneten Ergebnisse werden dann von Windows abgeholt und 
dargestellt.

Gehandelt wird dieses Zusammenspiel von der Software "Beckhoff Twincat" 
- gefüttert wird alles über eine ProfiBus-Schnittstelle.


Auch wenn mir immer noch kein sinnvoller Einsatzzweck eingefallen ist, 
interessiert mich der Prozess sehr.

Gerne würde ich hier experimentieren wollen - einfach nur der Neugierde 
wegen.

Kennt jemand die Thematik und kann mir etwas mehr dazu sagen?
Leider findet sich Online kaum für mich verwertbare Literatur.

Ist es (mit vertretbarem Aufwand) möglich z. B. ein C-Programm auf die 
CPU zu laden und hier Berechnungen durchzuführen, während Windows auf 
den restlichen Kernen quasi parallel weiter arbeitet? Wie würde das ganz 
praktisch aussehen?

Bitte teilt eure Gedanken mit mir...

: Verschoben durch Moderator
von Stefan F. (Gast)


Lesenswert?

Um ein Programm auszuführen brauchst du weit mehr als einen CPU Kern. 
Alles wird vom Betriebssystem verwaltet, deswegen sehe ich keinen Sinn 
darin, hier irgendwie am Betriebssystem vorbei arbeiten zu wollen.

Wenn dein Programm möglichst wenig unterbrochen werden soll, dann setze 
die Priorität des Threads auf den höchstmöglichen Wert 
REALTIME_PRIORITY_CLASS. Aber wundere dich dann nicht, wenn 
Dateizugriffe in einer Endlos-Schleife hängen.

https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-setthreadpriority

von abc. (Gast)


Lesenswert?

Wenn es wirklich so zeitkritisch ist: Warum Windows und kein 
Echtzeitbetriebssystem (QNX o.ä.)?

von c-hater (Gast)


Lesenswert?

Sim schrieb:

> ich habe von einem Bekannten erfahren (beruflich arbeitet er in der
> Thematik), dass diese auf einem Windows System einen Kern isolieren und
> darauf eine Simulation laufen zu lassen.

Wozu das auch immer gut sein soll...

> Dass man unter Windows Kern(e) isolieren kann kenne ich auch (run ->
> msconfig -> Start -> erweitere Optionen), wenn gleich mir bis dato
> unklar war, wieso eigentlich.

Nunja, der einzige Vorteil gegenüber der kooperativeren Verfahrensweise 
über Prozess- und Threadprioritäten ist der (einigermaßen) garantierbare 
Durchsatz für die Berechnung. Ist aber auch dann noch weit jenseits von 
Echtzeit. Jedenfalls ohne weitere Maßnahmen. Insbesondere natürlich die 
ähnlich exclusive Bereitstellung des benötigten RAMs und zwar sowohl für 
den Code als auch für die Daten.

Nur wenn beides in die jeweiligen Caches des Core paßt, kann man darauf 
verzichten.

von Johannes S. (Gast)


Lesenswert?

Es gibt Hypervisor wie Acontis, da kann man CPUs teilen, hat dann aber 
zwei OS parallel laufen.
In einem Windows kann man AFAIK eine CPU in einem Prozess bevorzugen, 
aber anderen nicht verbieten diese auch zu benutzen, hat also keinen 
exklusiven Zugriff. Und Realtime Prio hat seine Tücken wie Stefan schon 
schrieb.

von Timo (Gast)


Lesenswert?

Lass dich von den relativ unqualifizierten Zwischenruf nicht irritieren.

Sim schrieb:
> Gehandelt wird dieses Zusammenspiel von der Software "Beckhoff Twincat"
> - gefüttert wird alles über eine ProfiBus-Schnittstelle.

Ja, das ist eine Standardlösung für Software sps/cnc. Das ganze ist 
relativ einfach. TwinCat kannst du die einfach runterladen. Bei Beckhoff 
gibt es auch die Doku wie das programmiert wird. Ist eigentlich relativ 
einfach damit echtzeit zu programmieren. Nachteil: Der Task wird in 
fixem Abstand (z. B. 1ms) aufgerufen. Dauerhaft laufend ist damit nicht 
so einfach.

von Johannes S. (Gast)


Lesenswert?

Twincat bringt seinen eigenen Hypervisor mit und lässt ein Realtime 
System parallel laufen. In dem System kommuniziert das über Beckhoffs 
ADS oder Ethernet mit dem Rest der Welt. Es gibt ein eigenes SDK und 
API, da kann nicht das Windows API benutzt werden.

von Timo (Gast)


Lesenswert?

Sim schrieb:
> Kennt jemand die Thematik und kann mir etwas mehr dazu sagen?
> Leider findet sich Online kaum für mich verwertbare Literatur.

https://infosys.beckhoff.com/index.php?content=../content/1031/tc3_c/110699019.html

von Sheeva P. (sheevaplug)


Lesenswert?

Stefan ⛄ F. schrieb:
> Um ein Programm auszuführen brauchst du weit mehr als einen CPU Kern.
> Alles wird vom Betriebssystem verwaltet, deswegen sehe ich keinen Sinn
> darin, hier irgendwie am Betriebssystem vorbei arbeiten zu wollen.

Naja, der Prozessor wird halt vom Systemkern nicht für "normale" 
Prozesse benutzt. Das kennt man unter Linux mit dem Kernelparameter 
"isolcpus"; nach dem Booten kann man mit taskset(1) bestimmte Prozesse 
an diese "freien" Kerne binden, so daß sie völlig ungestört arbeiten 
können (natürlich sind sie noch auf andere Ressourcen angewiesen, aber 
auch dafür gibt es ja andere Möglichkeiten). In bestimmten Setups kann 
zum Beispiel Redis für so etwas sehr dankbar sein. Und ich wüßte nicht, 
warum es nicht auch noch andere Anwendungsfälle geben sollte, in denen 
solche Techniken eine Daseinsberechtigung haben sollten.

von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

Stefan ⛄ F. schrieb:
> Wenn dein Programm möglichst wenig unterbrochen werden soll, dann setze
> die Priorität des Threads auf den höchstmöglichen Wert
> REALTIME_PRIORITY_CLASS.

Mann kann nicht nur die Priorität zuordnen, sondern auch sagen welsche 
CPU verwendet werden dürfen (quasi die wo vorher gesagt wurde das 
Windows diese nicht von selbst nutzen soll):

https://docs.microsoft.com/de-de/windows/win32/api/winbase/nf-winbase-setthreadaffinitymask

https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setprocessaffinitymask

von Timo W. (timo)


Lesenswert?

Irgend W. schrieb:
> Mann kann nicht nur die Priorität zuordnen, sondern auch sagen welsche
> CPU verwendet werden dürfen (quasi die wo vorher gesagt wurde das
> Windows diese nicht von selbst nutzen soll):

Sicher? _Weißt_ du das, oder ist das Spekulation? Weil soweit ich weiß 
ist genau das nicht möglich.

Wenn CPU Kerne unter Windows deaktiviert werden, kennt Windows die gar 
nicht mehr. So als ob die gar nicht existieren. Daher können die mit 
Windows Mitteln nicht mehr verwendet werden.

Kerne für den Sheduler zu sperren aber Weiter zu verwenden ist unter 
Windows (im Gegensatz zu Linux, da ist es trivial) nicht Möglich.

Sollte es doch möglich sein, freue ich mich über Hinweise darauf.

von Timo W. (timo)


Lesenswert?

Sim schrieb:

> Die berechneten Ergebnisse werden dann von Windows abgeholt und
> dargestellt.
Dafür sind so drastische echtzeit Maßnahmen normalerweise unnötig.

> Gehandelt wird dieses Zusammenspiel von der Software "Beckhoff Twincat"
> - gefüttert wird alles über eine ProfiBus-Schnittstelle.
Genau - Bei der zeitkritischen Kommunikation nach außen wird das 
Interessant.


> Auch wenn mir immer noch kein sinnvoller Einsatzzweck eingefallen ist,
> interessiert mich der Prozess sehr.
>
> Gerne würde ich hier experimentieren wollen - einfach nur der Neugierde
> wegen.
>
> Kennt jemand die Thematik und kann mir etwas mehr dazu sagen?
> Leider findet sich Online kaum für mich verwertbare Literatur.

Echtzeitprogrammierung ist ein interessantes Thema. Aber ohne 
Anwendungsfall finde ich den Einstieg schwierig. Such also Möglichst 
erst mal nach dem Einsatzzweck.


> Ist es (mit vertretbarem Aufwand) möglich z. B. ein C-Programm auf die
> CPU zu laden und hier Berechnungen durchzuführen, während Windows auf
> den restlichen Kernen quasi parallel weiter arbeitet? Wie würde das ganz
> praktisch aussehen?

Ja ist Möglich. Je nach Fähigkeiten und der Definition von "vertretbaren 
Aufwand". Ich könnte es. Aufwandsschätzung: 1-6Monate Vollzeit. Bei den 
Fragen die du stellst: Hänge noch eine Null hinten dran. Also eher Nein 
(mit vertretbarem Aufwand). Es sei denn es gibt irgendwo bereits 
fertigen Code dafür. Ich kenne da aber nichts.

Vorgehen in etwa:
- CPU Kern in Windows deaktivieren.
- Treiber programieren den den C Code lädt oder enthält.
- Einsprungadresse und Speichermapping herausfinden.
- Den CPU Kern initialisieren(Speichermapping)
- Den Code Ausführen (Einsprung wahrscheinlich per Interrupt)
Jetzt fängt der Spaß so richtig an:
Auf diesem Kern läuft kein Betriebssystem. Den muss man Bare Metal 
programmieren. Alles von Hand machen. Zum teil in Assembler.
Also:
- Den CPU Kern initialisieren. Kann man sich von Linux/BSD/Minix etc. 
abgucken.

Und schon läuft das C Programm...

Das nächste große Thema: Dieses Programm kann mit nichts interagieren. 
Keine Eingabe, keine Ausgabe, keine WIN API, nur Shared Memory. Also 
muss man sich eine Kommunikation per Shared Memory programmieren um mit 
einem Windows Treiber zu kommunizieren.


Daher: Vergiss diese Variante.

Ansonsten:
Weg 1: Mit RT PRIORITY kann man schon sehr viel Machen. Ist relativ 
normale Programmierung.

Weg 2: Beckhoff TwinCat. Insbesondere wenn man eh etwas in Richtung Soft 
SPS/Soft NC macht.
- Ist kostenlos
- Damit bekommt man relativ einfach seinen C/C++ Code auf einen eigenen 
Kern
- Die Kommunikation mit der nicht-echtzeit Welt ist relativ einfach.

Nachteil:
- Der Task wird in einem fixen Zeitraster(z.B. alle 1ms) aufgerufen und 
muss auch entsprechend schnell fertig werden.

von Johannes S. (Gast)


Lesenswert?

Timo W. schrieb:
> Vorgehen in etwa:

und genau das macht das von mir schon genannte Acontis Tool: es 
reserviert einen CPU Kern für ein weiteres OS für Realtime Aufgaben. Das 
ist aber auch da nicht dazu gedacht etwas schnell zu berechnen (das 
könnte eine GPU / FPGA Karte eventuell schneller), sondern um SPS 
Funktionalität zu bauen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.