2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2, 3, 4  След.
 
 Что такое аппаратный стек
Сообщение30.05.2018, 03:59 


06/04/18

323
Изложу свои догадки, пусть кто-нибудь меня поправит. Как я понимаю, аппаратным стеком может служить абсолютно любая часть оперативной памяти. Физически он никак не выделен, существует столько, сколько выполняется программа. ОС выделяет по одному стеку на каждую выполняемую программу. Все верно?

Две цитаты:
Цитата:
Дэвид Катлер и его команда выбрали один мегабайт в качестве размера стека по умолчанию. Ничего общего с .NET или С#, это было прибито, когда они создали Windows NT. Один мегабайт - это то, что он выбирает, когда заголовок EXE программы или вызов winapi CreateThread() не задают размер стека явно. Что является нормальным способом, почти любой программист оставляет его ОС для выбора размера.
Цитата:
Третья большая причина переполнения стека — одноразовое выделение огромного количества памяти крупными локальными переменными. Многие авторы рекомендуют выделять память, превышающую несколько килобайт, в «куче», а не на стеке. Пример на Си:
Используется синтаксис C++
int foo() {
     double x[1000000];
}
Массив занимает 8 мегабайт памяти; если в стеке нет такого количества памяти, случится переполнение.
Я понимаю, как вычисляется 8 мегабайт: элементов массива задано миллион штук, каждый из них типа double и занимает 8 байт. Но я не понимаю, почему ограничение в 1 Мб не срабатывает. Достаточно зайти на http://www.cpp.sh/, и в тот же пример вместо миллиона подставить единицу с 18 нулями. Правда 19 — это уже действительно перебор, и компилятор ругается на ошибку, но 18 проходит без проблем. Какой же тогда выделяется размер стека?

 Профиль  
                  
 
 Re: Что такое аппаратный стек
Сообщение30.05.2018, 06:28 
Аватара пользователя


31/10/08
1244
Qlin в сообщении #1316167 писал(а):
Физически он никак не выделен

Так вы и так уже его первым словом выдели. Аппаратный стек это стек у которого есть специальные регистры. Можно ещё дополнить есть специальные машинные команды.
Qlin в сообщении #1316167 писал(а):
Как я понимаю, аппаратным стеком может служить абсолютно любая часть оперативной памяти.

Это зависит от архитектуры вычислителя. Память стека и память данных может быть разделена.
Qlin в сообщении #1316167 писал(а):
ОС выделяет по одному стеку на каждую выполняемую программу.

Нет. Как минимум каждый процесс имеет свой стек.
Qlin в сообщении #1316167 писал(а):
Но я не понимаю, почему ограничение в 1 Мб не срабатывает.

Это не ограничение, а значение по умолчанию. Причём для некоторого API, который не назвали.

Qlin в сообщении #1316167 писал(а):
Какой же тогда выделяется размер стека?

Тот который нужен в приделах доступного. И в данном случае ограничения связаны с ELF/PE файлами и настройками линкера компилятора и заданных по умолчанию - которые мы не знаем. Если посмотреть исходный код GCC или Clang то можно найти эти константы и как их можно изменить.

 Профиль  
                  
 
 Re: Что такое аппаратный стек
Сообщение30.05.2018, 07:41 
Аватара пользователя


31/10/08
1244
Современные программы очень сложные и понять где и что и почему не возможно. Тут рулит интерактивный подход ты смело пробуешь и если что-то не так получаешь сообщение об ошибке или не получаешь.

В данном случае много параметров от которых зависит размер стека
Главный поток или побочный. Если главный то размер стека прописан в заголовке исполняемого файла. У MZ-EXE в ос MSDOS стек не может привышать 64 кб. Правда это не удобно и компилятор сам его перемещает в зависимости от компилятора и его настроек размер стека можно увеличить или уменьшить. У elf оно не может привышать 18 мб. Если поправить elf.cpp и перекомпилить ядро ос то это ограничение можно обойти. Только вот линкер собирает файл из секций кода, данных, стека. И главной тут является секция кода. Если линкеру сказано что база кода 1 mb то и стек больше вы не выделете. Линкер настраивается *.ld или *.def файлах в зависимости от компилятора. А его в свою очередь создаёт мейкфайл и ваша среда разработки.

А если это побочный поток то стек выделяется либо при помощи API либо ваша библиотека сама выделяет память - тогда ограничений нет хоть 4гб под стэк. Правда большинство используют API. В ОС семейства nt creatthead выделяет 1 mb на поток. И опять таки это значение можно поправить насколько помю только в меньшую сторону.

 Профиль  
                  
 
 Re: Что такое аппаратный стек
Сообщение30.05.2018, 10:58 


05/09/12
2587
Qlin в сообщении #1316167 писал(а):
и в тот же пример вместо миллиона подставить единицу с 18 нулями.

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

 Профиль  
                  
 
 Re: Что такое аппаратный стек
Сообщение30.05.2018, 12:02 


03/10/06
826
Если уж "аппаратный стек", то таковой должен быть связан с аппаратурой или "железом", если аппаратный стек реально существует. В последних же сообщениях разговор пошёл про программный стек.

 Профиль  
                  
 
 Re: Что такое аппаратный стек
Сообщение30.05.2018, 12:44 


27/08/16
9426
Где вы встретили этот термин?
В некоторых древних примитивных процессорах стек, например, адресов возвратов из подпрограмм находился в отдельных аппаратных регистрах, отличных от памяти данных. Соответственно, предельная глубина вложенности подпрограмм была жестко ограничена небольшой величиной.

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

 Профиль  
                  
 
 Re: Что такое аппаратный стек
Сообщение30.05.2018, 13:10 
Заслуженный участник


20/08/14
11057
Россия, Москва
Qlin в сообщении #1316167 писал(а):
Достаточно зайти на http://www.cpp.sh/
, и в тот же пример вместо миллиона подставить единицу с 18 нулями. Правда 19 — это уже действительно перебор, и компилятор ругается на ошибку, но 18 проходит без проблем. Какой же тогда выделяется размер стека?
Конкретно в данном случае вмешивается ОС с механизмом подкачки виртуальных страниц, т.е. память-то выделяется (в x64 ОС), но не физическая, а виртуальная, и физически существуют лишь те страницы памяти, в которые была реальная запись, остальные существуют лишь как описание в таблице страниц, реальная память ни в физической памяти ни в файле подкачки им не выделена. Попытайтесь инициализировать весь этот массив не нулями - и увидите разрастание файла подкачки до предела и вылет программы.

Ну и про сам термин аппаратный стек. Как выше только что сказали, у него может быть два значения: а) отдельная память в процессоре (очень ограниченного объёма, физически ограниченная по размеру), не память данных и не регистры, а нечто типа встроенного кэша; б) регистры в процессоре, которые указывают куда-то в память данных, т.е. в этом случае стек является частью памяти данных (и часто с отдельными специальными командами для упрощения работы с ним). Во втором случае часто стек нужен для сохранения адресов возвратов из процедур и функций, а хранение данных в нём - дополнительная удобная функция, использующаяся не во всех процессорах, не во всех ОС и даже не во всех программах.

 Профиль  
                  
 
 Re: Что такое аппаратный стек
Сообщение30.05.2018, 13:30 
Заслуженный участник
Аватара пользователя


01/08/06
3049
Уфа
Qlin в сообщении #1316167 писал(а):
Я понимаю, как вычисляется 8 мегабайт: элементов массива задано миллион штук, каждый из них типа double и занимает 8 байт. Но я не понимаю, почему ограничение в 1 Мб не срабатывает. Достаточно зайти на http://www.cpp.sh/
, и в тот же пример вместо миллиона подставить единицу с 18 нулями.
Ну тут уже всё написали. Добавлю только, что в реальной программе, собранной для Win32, с размером стека по умолчанию, переполнение непременно произойдёт (если только компилятор+линкер не выкинут неиспользуемую переменную x).

 Профиль  
                  
 
 Re: Что такое аппаратный стек
Сообщение30.05.2018, 13:53 
Заслуженный участник


20/08/14
11057
Россия, Москва
Да, ещё пример аппаратного стека: 8 регистров FPU. Хоть к нему во многом и применима регистровая адресация, но это именно стек, именно аппаратный, ограниченного размера, отдельно от памяти данных, со специальными командами обращений.

 Профиль  
                  
 
 Re: Что такое аппаратный стек
Сообщение30.05.2018, 14:56 


06/04/18

323
realeugene в сообщении #1316213 писал(а):
Где вы встретили этот термин?
Я разбираюсь, что такое локальные переменные. Много, где встретил:
https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B5%D0%BA
https://www.intuit.ru/studies/courses/2193/67/lecture/1970?page=4

 Профиль  
                  
 
 Re: Что такое аппаратный стек
Сообщение30.05.2018, 15:25 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Qlin в сообщении #1316241 писал(а):
Я разбираюсь, что такое локальные переменные. Много, где встретил

В общем, это (незначительная) терминологическая ошибка, правильно в этом контексте говорить про "стек возвратов".

Почему это не любой вообще стек: потому что стек в общем смысле - это структура данных с доступом типа LIFO, и её программист может организовать сам для своих нужд в любой момент и в любых количествах. Например, для грамматического разбора стандартных входных языков широко применяется именно стек (языки сами для этого хорошо приспособлены).

 Профиль  
                  
 
 Re: Что такое аппаратный стек
Сообщение30.05.2018, 16:14 


27/08/16
9426
Munin в сообщении #1316246 писал(а):
правильно в этом контексте говорить про "стек возвратов".

Нет, у x86 на этом же стеке хранятся и локальные переменные с аргументами вызываемых функций. Так что, не стек возвратов. Выделенный стек возвратов, на котором хранятся только адреса возвратов, действительно, присутствует в некоторых архитектурах. Параметры функций, при этом, складываются на другом стеке или в глобальных переменных (припоминаю семейство калькуляторов Б3-34 и ещё DSP с таким отдельным стеком возвратов, если уже ничего не путаю: давно было дело).

-- 30.05.2018, 16:24 --

Qlin в сообщении #1316241 писал(а):
Я разбираюсь, что такое локальные переменные. Много, где встретил:
В общем считайте, что "аппаратный стек" - это стек, для реализации которого предусмотрена какая-то специализированная аппаратная поддержка. Хотя бы один выделенный регистр. Такая конкретика всё же используется редко, обычно говорят "данные на стеке", и всем сразу ясно, что это за стек.

 Профиль  
                  
 
 Re: Что такое аппаратный стек
Сообщение30.05.2018, 16:58 
Заслуженный участник
Аватара пользователя


30/01/06
72407
realeugene в сообщении #1316267 писал(а):
Нет, у x86 на этом же стеке хранятся и локальные переменные с аргументами вызываемых функций.

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

"Стек возвратов, контекстов, параметров и локальных переменных" звучит громоздко.

 Профиль  
                  
 
 Re: Что такое аппаратный стек
Сообщение30.05.2018, 17:09 


27/08/16
9426
Munin в сообщении #1316273 писал(а):
Несмотря на то, что это так, этот стек продолжает оставаться стеком возвратов. В любом случае, термин "аппаратный стек" подходит к нему хуже.
Не могу припомнить, чтобы так его кто-нибудь называл. Термин "аппаратный стек" в этом значении, по крайней мере, встречается по ссылкам ТС. Для x86 скорее скажут просто "стек".

 Профиль  
                  
 
 Re: Что такое аппаратный стек
Сообщение30.05.2018, 17:24 
Заслуженный участник
Аватара пользователя


30/01/06
72407
realeugene в сообщении #1316278 писал(а):
Для x86 скорее скажут просто "стек".

Да, в этом контексте чаще всего именно так. Ещё "сегмент стека" (поскольку размер самого стека величина переменная).

Но надо понимать, что это жаргонизм, и в общем случае термин стек шире.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 56 ]  На страницу 1, 2, 3, 4  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group