2016-06-16 9 views
2

Ich sah einige SO Fragen kommen mit einer Schlussfolgerung: Jeder Prozess hat seinen eigenen Kernel-Stack. Aber wie wäre es mit diesem Code?Jeder Prozess hat seinen eigenen Kernel-Stack, oder?

main() 
{ 
    while(1) 
     ; 
} 

Oder wie wäre es mit diesem?

main() 
{ 
} 

Ob dieses Programm auch einen entsprechenden Kernel-Stack hat?

Mehr: Für den ersten Code oben habe ich es wie folgt getestet. Drücken Sie Strg + C, um es zu stoppen, und sehen Sie, dass die Systemzeit weniger als 1ms beträgt (siehe unten).

Ich denke, was ich wissen möchte, ist, ob ein Ausführungsprogramm des Benutzer-Space-Programms Kernel-Space durchlaufen muss? Für meinen Beispielcode denke ich, dass der Prozess selbst beim Ausführen nicht den Kernel-Space durchläuft, ist das richtig?

$ time ./a.out 
^C 

real 0m24.953s 
user 0m24.942s 
sys  0m0.000s 

Antwort

1

Anwendungscode wird vom Kernel in den Speicher geladen (aus der ausführbaren Datei). Aber Kernel zerlegt nicht. So kann der Kernel nicht erkennen, ob Code kurz ist oder nicht, ob er Systemaufrufe verwendet oder nicht, und so weiter.

Aus diesem Grund muss der Kernel für jede Anwendung vollständigen Ausführungskontext erstellen. Also, Zuordnung Kernel Stack ist in jedem Fall erforderlich.

Beachten Sie auch, dass der Systemaufruf nicht der einzige Fall ist, wenn der Kernel Code im Kontext des Prozesses der Anwendung ausführt. Die Vorbelegung des Prozesses, die Ausnahmebehandlung, wird ebenfalls vom Kernel durchgeführt und erfordert einen Kernel-Stack.

+0

Kernel erstellt Prozessobjekt, das ** Ausführungsumgebung ** für Benutzerbereich bereitstellt. – Tsyvarev

+0

Ich kann dich nicht gut verstehen. Sie sagen: "Die Ausführung erfordert, dass das Prozessobjekt vollständig aufgebaut ist", also ist dies der Kernel? Selbst wenn dies bedeutet, dass ein entsprechender Kernel-Stack zugeordnet ist? –

+0

Wirklich danke! Gute Antwort. –