Ich wollte diesen Monstertext ansich allen ersparen. Vor allem mir und meiner Tastatur… Aber wenn du mich (indirekt) so dazu aufforderst…
Ich glaub dir ja, dass du weisst was ein PC kann. Du kannst bestimmt auch den folgenden Ablauf nachvollziehen. Und dann weisst du die Antwort eigentlich auch schon, warum es eben nicht geht oder mit ziemlichem Aufwand verbunden ist.
Aber was passiert nun in einem PC?
IPS möchte gerne etwas von einer Hardware wissen. Es stellt eine Anfrage an die Windows API. Die API ist aber nur eine Schnittstelle zur 3. Schicht (oder vierte? Ausbildung ist lange her…) des Windows Kernels. Die Anfrage muss also übersetzt werden. Was tun wir also? Wir reservieren uns schnell ein bissel Arbeisspeicher und lassen uns von Windows die dazugehörige Adresse zurückliefern. Damit es nicht zu Zugriffsverletzungen kommt merken wir uns die Länge des Speichers der uns zugeteilt wurde und lassen Windows diesen Speicherbereich durch das Prozessmanagement sperren. Wir haben nun Exclusivrechte auf unsere paar Byte. Jetzt fordern wir Prozesszeit in der Arithmetikeinheit der CPU an die unsere Anfrage ohne zu wissen worum es geht berechnet. Die „Formel“ wie wir das berechnet haben wollen haben wir ihr natürlich gesagt. Auch diese liegt im RAM und auch hierfür mussten wir uns Speicher alloziieren (nein, kein Tippfehler), so nennt man den oben beschriebenen Vorgang. Für das Ergebnis können wir aus ökonomischen Gründen den zuerst angeforderten Speicherplatz verwenden. Das spart Resourcen. Dennoch müssen wir die Länge neu berechnen und merken, denn sonst kommt Müll raus. Um nun selbst zu erfahren was die Antwort war brauchen wir uns nurnoch einen Zugriff auf die die zuerst gemerkte Speicheradresse mit der neuberechneten Länge zu machen. Das Resultat ist nun bereit für den Aufruf der Windows API. Jetzt dürfen wir natürlich nicht vergessen den eben verwendeten Speicher wieder freizugeben. Denn sonst haben wir uns ein sauberes „Speicherleck“ gebaut und der Rechner würde sich nach wenigen Minuten/Stunden/Tagen festfressen.
Das war nur der erste Schritt. Was kommt noch?
Ich will es mal hier abkürzen. Was haben wir bis jetzt erreicht? Wir haben eine Anfrage so formuliert, dass sie dem Windowskernel verständlich ist. Wir könnten sie im 2. Schritt also an den Kernel senden. Windows hat sie bislang noch nicht gespeichert und bearbeitet. Es wurde noch nicht ermitelt welche Adresse die Hardware hat, von der wir etwas wissen wollen. Es wurde noch nicht die Hardwarespezifische Bibliothek ermittelt in der der Algo zur Kommunikation mit der Hardware zu finden ist - Umgangssprachlich der Treiber. Diese muss augelesen werden. Ist sie noch nicht geladen, so benötigt sie eine Adresse und Platz im RAM. Der Algo muss geprüft werden obs überhaupt „Windowscode“ ist. Seit XP wird auch gleich versucht festzustellen obs vielleicht Schadcode ist. Zwischendrin fragt der Virenscannerpolizei was das grad war was da in den Speicher geladen wurde und ob das so seine Richtigkeit hat. Dann wird versucht über die internen Resourcen mit dem ALGO aus dem RAM auf die eigentliche Hardware zuzugreifen. Das heisst in diesem Fall, dass der USB-Bustreiber angesprochen wird, der eine Verbindung zum USB-Chip auf dem mainboard herstellt, die Abfrage rauswirft und die Antwort Puffert bis Windows sie wieder über den USB Treiber abfragt. Diese liefert dann einen binären Wert. Dann wird geschaut von wem die Anfrage kommt und wohin der Wert zurückgeschrieben werden muss.
Jede einzelne dieser Tätigkeiten verlangt unter Umständen mehrere Hundert Einzelschritte (RAM anfordern, Speicheradresse merken, Länge berechnen, Einlesen, Auslesen, Hardwareregister beschreiben und auslesen, Speicher wieder freigeben) denn die CPU versteht ja nur Einsen und Nullen, der Windowskernel aber nicht, IPS nicht und wir auch nicht - das will erstmal formuliert werden. Und auch die einzelnen Schichten des Win-Kernels kommunizieren auf diese Weise miteinander. Und das für die Abfrage eines(!) Ports deines Velleman Boards. Ein Rechner mit 1,4 MHz schafft 42000 rechenoperationen (theoretisch) in 30ms. Bestimmt ein gutes viertel geht dabei für diese interne Verwaltungsarbeit drauf. Allein wenn du die Maus bewegst laufen schon tausende gleichzeitig (quasiparallel) ab. „Nur ein Impuls erfassen“ ist eben doch recht aufwändig und kein „Pipifax“.
Warum kann es das eine Programm und ein anderes nicht?
Es gibt, speziell für solche Vorgänge, Routinen, die einen „eingebauten Turbo“ haben. Es laufen auf einem PC, auch wenn er sich langweilt gut und gerne über hundert (wahrscheinlich weit mehr) Prozesse ab. diese sind in ihrer Priorität unterschiedlich eingestuft. So hat die GUI zum Beispiel eine relativ hohe Priorität, damit du kein Mausruckeln siehst wenn der PC hart arbeitet.
Wenn man die Hauptaufgabe des Programms in einen Thread mit hoher priorität verlagert, so wird dieser schneller abgearbeitet als andere. Die anderen bekommen nach dieser Umverteilung der Rechenzeit nur noch was eben übrig bleibt. Es kann dir also passieren, dass du die Ergebnisse deiner Arbeit zwar vorliegen hast, aber sie nicht darstellen kannst weil durch die hohe Prio der eigentlichen Arbeit keine Zeit mehr zum zeichnen deines Bildschim bleibt. Schon mal versucht nebenbei zu arbeiten während du ein 2GB Zipfile packst. Kannst vergessen…
Warum sieht man das nicht im ProzessManager?
Marketing. Wie würdest du reagieren wenn dein PC beim nichtstun bis zu 25% ausgelastet ist? Ist er aber, sonst müsste man ihn nachts ja nicht ausschalten. Denn wo nichts arbeitet wird kein Strom verbraucht. Haste dich mal gefragt warum der vorgang, der die Uhrzeit in die Taskleiste (genaugenommen die TNA) schreibt oder der, der die Mausbewegung in Coursorbewegung umsetzt nicht aufgeführt ist? Es läuft wesendlich mehr als dort angezeigt wird. Wesendlich…
Ein Buchstabe war früher ein Byte groß. Ein Byte reicht um ein A von einem B zu unterscheiden. Heute hat ein Buchstabe auf dem Bildschirm Informationen zum Font, Style, Größe, Farbe und was weiss ich nicht alles. Ein Boolean (True/False) ist nicht wie man immer meint eine Eins oder eine Null. Es ist eine binäre Zahl mit 32 Stellen. Und rate mal wie groß sie bei einem 64 bittigen Betriebssystem für 64Bit Prozessoer ist. Warum diese Verschwändung von Resourcen? Weil bei jedem Takt so viele Daten durch den RAM und die CPU gejagt werden, dass es keine Rolle mehr spielt. Und weil so viel durchgejagt wird ist eben nicht in jedem 10ms Block unter Umständen grad Platz für einen aufwändigen Hardwarezugriff an extern. Die wird zwar in die Queue gestellt und abgearbeitet, aber eben wenn Zeit ist.
Warum spielt die Programmiersprache in der ein Programm geschrieben worden ist eine Rolle bei der Geschwindigkeit eines Programms?
Bei Programmiersprachen unterscheidet man zwischen Hardwarenahen- und sogenannten Hochsprachen. Egal welche man verwendet, sie muss in maschienensprache übersetzt werden. Diese Sprachen werden unterschiedlich direkt interprätiert. So kann es sein, dass die Maschienensprachenübersetzung eines Hoch-Befehls der Einen nur 5 Maschienenbefehle Umfasst während die der anderen 7 braucht und eine Dritte 12. Wodurch kommt das zustande?
Hast du dich mal gefragt was nötig wäre um unter DOS eine Linie auf deinen Monitor zu zeichen? Es ist ein ziemlicher Aufwand… Und nun schau dir deinen Bildschirm an. Wieviele Linien ergeben zusammen deinen Desktop? Wie verhalten sich die Pixel deines Hintergrundbildes wenn du ein Fenster drüber legst? Ein „Drüberlegen“ gibts aber eigentlich garnicht. Der Computer arbeitet wie ein Zeichentrickfilm. Er zeichnet zig Bilder die Sekunde auf deinen Monitor. Das alles will berechnet werden. Müsste man das heute noch alles selbst machen, so gäbe es auf der Welt vermutlich nur eine Handvoll hochbezahlter Programmierer, die überhaut in der Lage sind das zu programmieren was wir heute als ein Fenster kennen.
Die verschiedenen Programmiersprachen bieten Routinen mit denen man sich darum heute keine Gedanken mehr machen muss. Allerdings lassen sich diese Routinen nicht „mal eben“ in Maschienencode übersetzen. Einfache Routinen lassen sich einfacher übersetzen, komplexere eben nicht. Diese Komplexen Routinen sind so komplex weil sie für den Programmierer einen gewissen Komfort mitbringen. Diese Komfort ermöglicht es einem Programmierer schnell und effizient zu entwickeln. Ein krasses Beispiel: Niemand würde es ernsthaft in betracht ziehen eine grafisch Benutzeroberfläche oder auch nur überhaupt ein größeres Projekt in Assambler (sauschnell) zu schreiben.
IPS ist in Delphi geschrieben. Delphi ist äusserst komfortabel, aber der Maschienencode ist halt immer X Prozent größer und komplizierter als bei Programmen, die zum Beispiel in C++ geschrieben sind. Dadurch ist ein Programm, dass in Delphi geschrieben wurde immer etwas langsamer als das gleiche Programm dass in C++ geschrieben wurde.
Warum wurde IPS nicht in C++ geschrieben?
Diese frage hatten wir vor einiger Zeit schon mal im Forum. Ich weiss es nicht. Wenn du einen Nagel in die Wand schlagen willst um ein Bild aufzuhängen, nimmst du dann den größten Vorschlaghammer für das schnellste Ergebnis oder den mit dem du am besten umgehen kannst, der dir vielleicht für diese Aufgabe auch am geeignetesten erscheint, auch wenn du vielleicht einen zweiten oder dritten Schlag benötigst? Und C++ ist auch nicht die schnellste Programmiersprache. Es gibt wesendlich schnellere. Aber vermutlich wäre IPS dann bis heute nicht mehr als eine Projektstudie in Steiners Schublade.
Und ausserdem: Was glaubst du warum zeitkritische Abläufe immer eine eigene Hardware (als Puffer?) benötigen oder gleich auf ganz anderen Plattformen realisiert werden. Wozu glaubst du müssen deine Daten mit dem Zeitstempel versehen werden. Wenn es in echt so ginge wie es dir deine Software vorgaukelt müsste da nix sortiert werden.
Gruß,
Toni