Какую структуру данных использует стек в Linux?

ps e | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u

выполнит задание, перечислив все текущие ДИСПЛЕИ. Также вы можете увидеть назначенные дисплеи для конкретного пользователя ($usr )с помощью:

ps e -u $usr | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u
0
03.12.2019, 05:39
1 ответ

Стек фактически является массивом --он содержит группу слов в непрерывной памяти. Существует важное ограничение --он может увеличиваться и уменьшаться только на одном конце (следовательно, FILO --First In Last Выход ), который также является LIFO.

Важное отличие от массива. :Стек процессора логически разделен на фреймы, и (в отличие от массивов ), каждый фрейм может отличаться по размеру от любого другого.

Каждый кадр содержит то, что необходимо сохранить при вызове функции, в том числе:

  • Адрес возврата, по которому происходит переход вызываемой функции для продолжения в вызывающей функции.
  • Пространство для хранения любого возвращаемого значения.
  • Копия каждого параметра, передаваемого вызываемой функции.
  • Копии регистров процессора, чтобы не мешала оптимизация регистров в отдельных функциях.

Если вы когда-нибудь задавались вопросом, как функция может рекурсивно использовать одни и те же имена для всех своих параметров и локальных переменных на каждом уровне, ответ заключается в том, что все они имеют адреса относительно их текущего кадра стека.

Структура кадра стека определяется по-разному для каждой архитектуры процессора, чтобы использовать наиболее естественный способ хранения данных. Стека «Linux» не существует --Intel, AMD и Sparc будут иметь собственное определение. Помните, что вы можете загрузить предварительно -скомпилированные библиотеки, которые ваш локальный компилятор должен знать, как вызывать из вашего собственного кода.

Стек сам по себе является универсальной структурой данных. Например, если вы анализируете исходный код такого языка, как C, SQL или XML, который допускает вложенные блочные конструкции, то естественно создавать стек блоков, внутри которых вы находитесь, по мере продвижения. Вы бы не хотели делать это, используя стек процессов :, это то, что вы анализируете, имеет блочную структуру, а не ваш собственный код, который должен рекурсивно выполняться.

Стек для каждого процесса — это просто часть его пользовательской памяти процесса. Как правило, адресное пространство пользователя составляет от -8 МБ до 0 и (, скажем, )60 МБ. Стек начинается с -16 и растет вниз (со все более отрицательным значением ). Глобальная и статическая память, назначенная компилятором, начинается с 0, и любое выделение кучи увеличивается выше фиксированной памяти. Код находится где-то отдельно (из соображений защиты ).Сопоставление отрицательного диапазона адресов в выгружаемой памяти не причинит вреда системе виртуального хранения.

2
28.01.2020, 02:38

Теги

Похожие вопросы