Где хранятся глобальные переменные, такие как $ _GLOBAL, $ _POST и т. Д.?

Когда я присутствовал на собеседовании, интервьюер задал мне этот вопрос. В какой памяти они используют кучу, стек и т. Д. Я искал ее, но я не получил четкого ответа.

Solutions Collecting From Web of "Где хранятся глобальные переменные, такие как $ _GLOBAL, $ _POST и т. Д.?"

Значения $_POST внутри создаются внутри php_auto_globals_create_post() и доступны через PG(http_globals)[TRACK_VARS_POST] , что является лишь способом ссылки на http_globals .

Определение вышеупомянутых http_globals говорит нам, что это массив элементов zval * , по одному для каждого $_POST , $_GET , $_COOKIE и т. Д. (Массивы также хранятся внутри контейнера zval ).

Выделение zval выполняется через ALLOC_ZVAL() , который вызывает следующие функции:

  1. _emalloc()
  2. _malloc()

Функция malloc() выделяет память в куче, поэтому ответ является кучей .

Ну, так как вы отметили C , я начну с этого.

В среде выполнения C глобальные переменные хранятся в одном из двух мест; сегмент данных или сегмент BSS. То, как вы определяете, к какой конкретной переменной относится, является ли она инициализирована или нет.

Инициализированные глобальные (и статические) переменные входят в сегмент данных .

Неинициализированные глобальные (и статические) переменные входят в сегмент BSS .

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

  _______ | Text | |_______| | Data | <-- Initialized globals / statics |_______| | BSS | <-- Uninitialized globals / statics (basically a bunch of 0s) |_______| | | | Stack | |_______| | | | Heap | |_______| 

В отличие от переменных в стеке и кучи , которые создаются во время выполнения, глобальные переменные существуют как часть исполняемого файла образа вашей программы ( a.out , foobar.exe ).