Что такое пустая часть в технологических разделах. [Операционная система] - PullRequest

1 Ответ

1 голос
/ 03 февраля 2020

Эта область обычно используется секцией stack, потому что stack может увеличиваться / уменьшаться в зависимости от глубины текущего call stack. поскольку ваша ссылка указывает, что

Стек процесса содержит временные данные, такие как параметры метода / функции, адрес возврата и локальные переменные.

Как глубина стека вызовов увеличивается?

Чтобы действительно понять это, вам нужно знать, как assembler обрабатывает вызовы функций. но я постараюсь дать простое объяснение. Поэтому, когда ваш код вызывает function, связанные с ним данные переводятся в stack, а stack увеличивается вниз и , когда execution из function завершается, его локальные данные больше не являются необходимо, чтобы stack уменьшилось.

Но когда ваш код содержит вложенные function вызовы, то есть function A вызовы function B и function B вызовы function C. в этом случае стек продолжает расти.

И если ваш код содержит слишком много вложенных function calls, стек вашего процесса может расширяться, так что больше нет пустой области. когда это происходит (вероятно, когда вы реализуете recursive function без правильного базового случая), мы получаем нашу любимую ошибку переполнения стека .

В следующем разделе приведено визуальное объяснение этого процесса

Допустим, вы запускаете программу, и в псевдокоде это выглядит примерно так:

fun first(arguments){
   second();
}

fun second(arguments){
   third();
}

fun third(arguments){
   print("hello");
}

fun main(){
   first(arguments);  // line 1
   third(arguments);  // line 2
}

Когда ваш Программа запускается, ее блок memory будет выглядеть следующим образом.

enter image description here

Поскольку при запуске вашей программы она вызывает main method, stack будет содержать все локальные variable, связанные с основной функцией.

Когда основная функция вызывает first function, stack будет расти вниз, как локальные variable и другие элементы, связанные с first function, будут подтолкнуть к stack. так это выглядит следующим образом.

enter image description here

, поскольку first function внутренне вызывает second и second function внутренне вызывает third стек будет расширяться до вместить все данные, связанные с second и third functions.

Обратите внимание, что стек будет расти только для вложенных вызовов function. для Например, когда первая строка в main function выполнена и execution переместится на строку 2, stack уменьшится в размере.

...