Что такое "трэш стэк"? - PullRequest
5 голосов
/ 13 февраля 2010

Что такое "трэш стэк"? Или "трэш стэк"? (Поскольку я не знаю определения, я не уверен, является ли он исчисляемым или неисчисляемым термином.)

Ответы [ 6 ]

4 голосов
/ 16 февраля 2010

Перебрасывание стека похоже на перебрасывание кучи, но в стеке.

Вот, теперь это объяснено.

О, ты хочешь больше деталей?

Если вы эмулируете процессор, основанный на стеке, на процессоре, который не работает, вы перебираете стек.

Если ваш код на C malloc и free содержит все остальные строки кода, значит, вы теряете кучу.

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

Для уничтожения кучи malloc () и free () являются вашими # 1 и # 2 наиболее часто используемыми функциями.

Теперь некоторые процессоры (Rockwell делают некоторые) фактически оптимизированы для работы на аппаратном языке, основанном на стеке.

  • Внутренний ОЗУ, который кэширует верхние N килобайт стека внутри ЦП
  • Несколько регистров
  • стек всех инструкций относительно

Как ни странно, виртуальная машина Java представляет собой модель на основе стека.

Запуск действительно тупой реализации FORTH на оборудовании x86 приведет к перегрузке стека. Подобные вещи вы можете написать после прочтения спецификации Forth, поэтому вы генерируете машинный код x86 для четвертых инструкций и НЕ оптимизируете его. Четвертое, ребята, я прошу прощения, я знаю, что ваши выводы намного лучше.

Postscript также основан на стеке, что делает ранние постскрипт-принтеры интересными: у них было ограниченное количество оперативной памяти и медленные процессоры: и использовался язык, разбивающий стеки. Я уверен, что много усилий было вложено в такие вещи, как оригинальный Apple Laserwriter, чтобы он работал лучше. Он имел процессор Motorola 68000, работающий на (10ish) мегагерцах и 1 МБ оперативной памяти IIRC.

Опять стеки трэшер.

Это помогло?

2 голосов
/ 13 февраля 2010

Я видел этот термин, используемый в контексте Forth, где отсутствие доступа к фрейму стека иногда требует чрезмерного использования стековых манипуляций («разбивание стека»), чтобы добраться до определенных слов на вершине стека.

Кроме того, Этот глоссарий определяет его как "Частое расширение стека (переполнение) и сжатие (недополнение)". Ясно, что определение нуждается в дополнительном объяснении. Возможно, кто-то более знакомый с Cray X1 может объяснить.

1 голос
/ 14 февраля 2010

Я уверен, что этот термин полностью разговорный и не имеет точного значения. У вас есть конкретная цитата или ссылка на то, где вы ее видели?

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

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

1 голос
/ 13 февраля 2010

Я слышал термин «стучание стека» в контексте защиты стека, но я думаю, что это чаще называется «стэкинг стека». Разрушение стека означает любой вид уязвимостей в стеке (например, переполнение буфера ). Вот почему защита стека GCC называется SSP ( Stack-Smashing Protector ).

1 голос
/ 13 февраля 2010

Я никогда не встречал этот термин, и ведущие хиты Google и Википедии не описывают его.

Однако, это похоже на диск трэш , который является тяжелым неэффективным использованием диска. Это напрямую не относится к стеку, который не соответствует ничему механическому. Возможно, это связано с ошибкой страницы, которая может привести к механически неэффективным отношениям. Или переполнение стека, исправленное дорогостоящим исправлением / исправлением для ядра.

Некоторый контекст для термина поможет.

0 голосов
/ 14 февраля 2010

Однажды я услышал «разрушение стека» (без первого h) в смысле «разрушения стека», например, когда функция получает / помещает из / в стек больше байтов, чем следовало бы, что приводит к путанице в стеке и делает невозможной впоследствии правильную работу другой функции.

Это может произойти, когда вы вызываете внешнюю функцию с неправильным соглашением о вызовах (например, когда функция в dll является stdcall, но вы объявляете ее как cdecl), или когда вы вызываете функцию с переменными параметрами, такую ​​как printf или scanf, передавая неправильный формат строка, поэтому она выдает больше / меньше байтов, чем могла бы.

...