Frage

Ich entwickle ein Betriebssystem und anstatt den Kernel-Programmierung, ich bin der Gestaltung des Kernels. Dieses Betriebssystem wird auf der x86-Architektur gezielt und mein Ziel ist es für moderne Computer. Die geschätzte Anzahl der benötigten RAM ist 256 MB oder mehr.

Was ist eine gute Größe, um den Stapel für jeden Thread auf dem System laufen zu lassen? Soll ich versuchen, das System so zu gestalten, dass der Stapel automatisch verlängert werden, wenn die maximale Länge erreicht ist?

Ich denke, wenn ich es richtig, dass eine Seite im RAM erinnern 4k oder 4096 Bytes ist und dass scheint einfach nicht wie ein mir sehr viel. Ich kann auf jeden Fall mal sehen, vor allem, wenn viele Rekursion, dass ich möchte auf einmal mehr als 1000 integars im RAM haben. Nun wäre die wirkliche Lösung zu haben sein das Programm dies tun, indem malloc verwenden und eine eigene Speicherressource verwalten, aber wirklich würde Ich mag den Benutzer Meinung dazu wissen.

Ist 4k groß genug für einen Stapel mit modernen Computerprogrammen? Sollte der Stapel größer sein als das? Sollte der Stapel sein Auto-Erweiterung alle Arten von Größen aufzunehmen? Ich habe Interesse an diesem sowohl aus praktischem Entwickler Standpunkt und Standpunkt der Sicherheit aus.

Ist 4k zu groß für einen Stapel? normale Programmausführung in Anbetracht, vor allem aus der Sicht von Klassen in C ++, merke ich, dass ein gute Quellcode um die Daten zu malloc/new neigt es braucht, wenn Klassen erstellt werden, um die Daten zu minimieren geworfen um in einem Funktionsaufruf.

Was habe ich nicht einmal bekam in ist die Größe des Cache-Speichers des Prozessors. Idealerweise denke ich, der Stapel würde im Cache residiert die Dinge zu beschleunigen, und ich bin nicht sicher, ob ich dies erreichen muß, oder wenn der Prozessor es für mich behandeln kann. Ich hatte geplant, nur auf regelmäßigen langweiligen alten RAM für Testzwecke verwendet wird. Ich kann mich nicht entscheiden. Welche Möglichkeiten gibt es?

War es hilfreich?

Lösung

Stackgröße hängt davon ab, was Ihre Themen sind zu tun. Mein Rat:

  • die Stapelgröße eines Parameters bei Thread-Erstellungszeit machen (verschiedene Threads verschiedene Dinge tun, und daher werden unterschiedliche Stapelgrößen benötigen)
  • einen vernünftigen Standard für diejenigen, die nicht wollen, mit Angabe eine Stapelgröße gestört werden (4K Appelle an dem Kontroll-Freak in mir, wie es den Stapel-verschwenderische verursachen, äh, das Signal ziemlich schnell bekommen)
  • überlegen, wie Sie erkennt und mit Stapelüberlauf behandeln. Der Nachweis kann schwierig sein. Sie können Wache Seiten setzen - leer - an den Enden des Stapels, und dass in der Regel arbeiten. Aber Sie auf das Verhalten des Bad Faden verlassen sich nicht über diesen Wassergraben zu springen und beginnen verschmutzen, was jenseits liegt. Im Allgemeinen das wird nicht passieren ... aber dann, das ist, was der wirklich harte Bugs zäh macht. Ein luftdichter Mechanismus beinhaltet Compiler Hacking Stapelprüfung zu erzeugen. Was mit einem Stapelüberlauf zu tun, müssen Sie einen eigenen Stapel woanders, auf das der betreffenden Faden (oder sein Schutzengel, wer auch immer Sie sich entscheiden, das ist - das O Designer ich war, nachdem alle) laufen
  • würde ich empfehlen, die Ende des Stapels mit einem unverwechselbaren Muster Markierung, so dass, wenn Ihre Fäden über die Ende laufen (und sie tun immer), können Sie zumindest in post-mortem gehen und sehen, dass etwas in der Tat ablaufen seinen Stack. Eine Seite von 0xDEADBEEF oder etwas wie das ist praktisch.

übrigens mal 86 Seitengrößen sind in der Regel 4k, aber sie müssen nicht sein. Sie können mit einem 64k Größe gehen oder sogar noch größer. Der üblicher Grund für größere Seiten TLB-Fehler zu vermeiden. Noch einmal, ich würde es einen Kernel-Konfiguration vornehmen oder Parameter-Zeit ausgeführt werden.

Andere Tipps

Suche nach KERNEL_STACK_SIZE in Linux-Kernel-Quellcode und Sie werden feststellen, dass es sehr viel Architektur hängt - PAGE_SIZE oder 2 * PAGE_SIZE usw. (unten ist nur einige Ergebnisse - viele Zwischenausgang gelöscht werden).

./arch/cris/include/asm/processor.h:
#define KERNEL_STACK_SIZE PAGE_SIZE

./arch/ia64/include/asm/ptrace.h:
# define KERNEL_STACK_SIZE_ORDER        3
# define KERNEL_STACK_SIZE_ORDER        2
# define KERNEL_STACK_SIZE_ORDER        1
# define KERNEL_STACK_SIZE_ORDER        0
#define IA64_STK_OFFSET         ((1 << KERNEL_STACK_SIZE_ORDER)*PAGE_SIZE)
#define KERNEL_STACK_SIZE       IA64_STK_OFFSET

./arch/ia64/include/asm/mca.h:
    u64 mca_stack[KERNEL_STACK_SIZE/8];
    u64 init_stack[KERNEL_STACK_SIZE/8];

./arch/ia64/include/asm/thread_info.h:
#define THREAD_SIZE         KERNEL_STACK_SIZE

./arch/ia64/include/asm/mca_asm.h:
#define MCA_PT_REGS_OFFSET      ALIGN16(KERNEL_STACK_SIZE-IA64_PT_REGS_SIZE)

./arch/parisc/include/asm/processor.h:
#define KERNEL_STACK_SIZE   (4*PAGE_SIZE)

./arch/xtensa/include/asm/ptrace.h:
#define KERNEL_STACK_SIZE (2 * PAGE_SIZE)

./arch/microblaze/include/asm/processor.h:
# define KERNEL_STACK_SIZE  0x2000

Ich werde meine zwei Cent, um den Ball ins Rollen werfen:

  • Ich bin mir nicht sicher, was eine „typische“ Stack-Größe sein würde. Ich würde vielleicht 8 KB pro Thread erraten, und wenn ein Thread diesen Betrag übersteigt, nur eine Ausnahme werfen. Doch nach dieser , Windows verfügt über eine Standard reservierte Stapelgröße von 1 MB pro Thema, aber es ist nicht alles auf einmal begangen (Seiten begangen werden, wie sie benötigt werden). Darüber hinaus können Sie eine andere Stackgröße für einen bestimmten EXE zur Compile-Zeit mit einer Compiler-Direktive anfordern. Nicht sicher, was Linux tut, aber ich habe Verweise auf 4 KB Stapel gesehen (obwohl ich denke, das geändert werden kann, wenn man den Kernel kompilieren und ich bin nicht sicher, was die Standard-Stack-Größe ist ...)

  • Dies steht mit dem ersten Punkt. Sie wollen wahrscheinlich eine feste Grenze, wie viel Stapel jeder Thread zu bekommen. So wollen Sie wahrscheinlich nicht automatisch seine mehr Stapelspeicher ein Thread überschreitet aktuelle Stapelspeicher jedes Mal vergeben, weil ein Buggy-Programm, das in einer Endlosschleife hängen bleibt wird die gesamten verfügbaren Speicher essen.

Wenn Sie virtuellen Speicher verwenden, Sie wollen, dass der Stapel Erweiterbare machen. Erzwingen statische Zuweisung von Stack-Größe, wie in der Benutzerebene Threading wie Qthreads und Windows Fibers gemeinsam ist, ist ein Chaos. Schwer zu bedienen, leicht zum Absturz bringen. Alle modernen Betriebssysteme die Stapel dynamisch wachsen, ich denke, in der Regel durch eine schreibgeschützte Schutzseite oder zwei unter dem aktuellen Stapelzeiger hat. Schreibt es dann das Betriebssystem mitteilen, dass der Stapel unter seinem zugewiesenen Platz tritt, und Sie weisen Sie einen neuen Schutzseite unterhalb und um die Seite zu machen, die beschreibbar getroffen wurde. Solange keine einzige Funktion mehr zuteilt als eine Seite von Daten, das funktioniert gut. Oder Sie können zwei oder vier Schutz Seiten verwenden, um größeren Stapelrahmen zu ermöglichen.

Wenn Sie einen Weg wollen Stackgröße zu steuern und Ihr Ziel ist eine wirklich kontrollierte und effiziente Umgebung, aber über die Programmierung im gleichen Stil wie Linux usw. nicht kümmern, für ein Single-Shot-Ausführungsmodell, wo eine Aufgabe ist, gestartet jedesmal, wenn ein relevantes Ereignis erkannt wird, wird vollständig ausgeführt, und speichert dann alle persistenten Daten in seiner Datenstruktur Aufgabe. Auf diese Weise können alle Threads einen einzelnen Stapel teilen. Verwendet in vielen schlanken Echtzeit-Betriebssystemen für Autokontrolle und ähnliches.

Warum macht die Stack-Größe nicht konfigurierbar Element, entweder mit dem Programm gespeichert oder festgelegt, wenn ein Prozess eines anderen Prozess erzeugt?

Es gibt eine beliebige Anzahl von Möglichkeiten, wie Sie diese konfigurierbar machen.

Es gibt eine Richtlinie, die „0, 1 oder n“ heißt es, das heißt, Sie Null, eine oder eine beliebige Anzahl zulassen sollte (begrenzt durch andere Einschränkungen wie Speicher) eines Objekts - dies gilt für Größen von Objekten als auch

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top