2010-05-26 10 views
10

Ich muss einen Simulator mit C# bauen. Dieser Simulator sollte in der Lage sein, einen zweiten Thread mit einer konfigurierbaren CPU-Geschwindigkeit und einer begrenzten RAM-Größe, z. 144 MHz und 50 MB.
Natürlich weiß ich, dass ein Simulator niemals so genau sein kann wie die echte Hardware. Aber ich versuche fast eine ähnliche Leistung zu erzielen.
Im Moment denke ich darüber nach, einen Thread zu erstellen, den ich von Zeit zu Zeit anhalten werde. Abhängig von der gewünschten CPU-Geschwindigkeit sollte der Simulator die Ruhezeit dieses Threads anpassen und somit unterschiedliche CPU-Frequenzen simulieren. Um die erreichte Geschwindigkeit zu messen, nutze ich allerdings PerformanceCounters. Aber mit diesem Ansatz habe ich das Problem, dass ich nicht weiß, wie man die RAM-Größe begrenzen kann, die der Thread verwenden könnte.
Haben Sie Ideen, wie Sie einen solchen Simulator realisieren können?
So simulieren Sie unterschiedliche CPU-Frequenz und begrenzen Sie RAM

Vielen Dank im Voraus!

+0

+1 wie ich gerne die Antwort wissen möchte. Aber ich befürchte, Sie sind in zu tiefem Wasser –

+0

Betrachten Sie Arena-Zuweiser für die Begrenzung der Speicher auf eine bestimmte Summe. – WhirlWind

+3

Bitte beachten Sie, dass die Taktfrequenz nicht wirklich ein gutes Maß für die Leistung ist. Auf einem Kern meines auf 1 GHz herunter getakteten Core2Duo erhalte ich eine deutlich bessere Leistung als auf einem 2,5 GHz Pentium 4. Wenn Sie herausfinden möchten, wie Ihre Software auf einem bestimmten Gerät läuft, sollten Sie versuchen, einen Emulator des tatsächlichen zu bekommen Chip. – back2dos

Antwort

1

Wenn Sie mit Simulation eine Betriebssystemumgebung betrifft dann eine Antwort wäre eine virtuelle Maschinen-Umgebung zu verwenden, in denen Sie Speicher- und CPU-Parameter steuern können usw.

Das Einfädeln Pause \ Stopp Ihnen helfen kann zu simulieren CPU-Frequenz, aber das wird furchtbar ungenau sein. Wenn Sie den Thread pausieren, wird der Zeitplan geändert, dann ist es Sache des Betriebssystems, es zu einem "zufälligen" Zeitpunkt neu zu planen, dh einen Punkt, den Sie haben keine Kontrolle über.

Wie für den Speicher zu begrenzen, einen neuen Prozess starten, die Ihren Code hosten ist eine Option, und dann die Begrenzung der Erinnerung an diesen Prozess, zB:

http://www.codeproject.com/KB/threads/Setting_Max_Memory_Limit.aspx

Dies wird nicht wirklich Gesamt-OS simulieren Speicherbeschränkungen obwohl.

+0

Für alle VMs, die ich bisher gesehen habe, gibt es das Problem, dass ich die CPU-Geschwindigkeit nicht konfigurieren kann.Außerdem habe ich das Problem, dass ich die Speichergröße nur für die gesamte VM und nicht für einen bestimmten Prozess/Thread begrenzen kann. Der zweite Ansatz, einen neuen Prozess zu starten und zu steuern, ist eine gute Idee. – geiserbua

+1

Sie können normalerweise angeben, wie viel Prozent der CPU-Ressource der VM zugewiesen wird. Dies bietet eine "grobe" Möglichkeit, CPU-Ressourcen zu beschränken. Sie können dies zumindest auf Hyper-V tun. PS Wenn Sie die Antworten der Leute mögen - stimmen Sie über sie ab. :) –

3

Limit-Speicher ist einfach mit den virtuellen Maschinen wie Vmware. Sie können die CPU-Geschwindigkeit mit einigen Übertaktungswerkzeugen ändern. Zum Beispiel Viel Glück!

+1

+1. Virtualisierung ist wahrscheinlich die beste Idee. Es ist sinnvoll, dass eine VM auch eine CPU-Begrenzung implementiert (Zyklen/Millisekunden?), Wenn sie zum Beispiel einen virtuellen Server verwendet. Also würde ich nachsehen, ob es dafür eine Option gibt. – back2dos

+0

Das Problem mit VMs ist, dass es keine Möglichkeit gibt, die CPU-Geschwindigkeit zu ändern – geiserbua

0

Ein Thread zum Ausschlafen der Softwareausführung Ihrer Gast-Opcodes?

Ich denke, es funktioniert, aber ein wenig seltsam, wie Vorspulen, Pause, ff, Pause, etc ...

Wenn Sie nur einen Prozess beschleunigen hinunter wollen, versuchen Sie dies: die CPU verwenden Single Schritt Funktionen und "debuggen" den Prozess. Sie müssen einen benutzerdefinierten Handler für die CPU-Einzelschritt-Trap schreiben. Ihr Handler-Job ist nur eine große Schleife von NOPs.

Sie haben zwischen jeder Anweisung eine feine Verzögerung.