|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
|
Общие аспекты работы с памятью01.06.2019, 19:37. Показов 4079. Ответов 27
Метки нет (Все метки)
Сильно не ругайтесь если не тот раздел,не знал куда написать.
Стал я изучать работу с памятью и появилось у меня много вопросов 1. при выделении памяти для нового процесса выделяется (в x86 системах) 4 гига памяти? 2 в 32 степени байта? 2. что такое мэппинг памяти? 3. при выделении памяти для процесса для каждого создается свои стек и куча? 4. я правильно понимаю принцип работы стека? Есть два адресса - начальный адресс стека и адресс вершины стека при добавлении переменной или чего-то другого в стек сначала высчитвается размер переменной(к примеру для int 4 байта) и т.к. стек растет от старшего до младшего бита(тоесть растет вниз) то выходит что процессор отнимает от текущего адресса вершины стека эти 4 байта и потом в стек добавляет эту переменную типа int? 4.1 если я правильно понял как работает стек тогда возник второй вопрос : память для стека заранее выделяется как-то? Если да то что будет если у нас в стеке к примеру помещается 12 байт памяти,а мы в стек пихаем еще сверху? 4.2 Если память для стека не выделяется заранее то каждый раз при добавлении элемента в стек программа управляющая памятью должна искать новый физ адресс для стека если в текущем дальше нету свободной памяти?
0
|
|
| 01.06.2019, 19:37 | |
|
Ответы с готовыми решениями:
27
Какие нужно знать аспекты C++ для работы с Unreal Engine 4? Разработка мобильного приложения (общие аспекты) Аспекты работы HDD |
|
|
|
| 01.06.2019, 19:57 | |
|
По поводу первых трёх пунктов поиском поищи, что такое "виртуальная память". Причём сразу предупреждаю, что объяснение в три абзаца, как это принято на википедии, будет достаточно только для того, чтобы сдать зачёт, но будет недостаточно для того, чтобы понимать всю суть происходящего. Лучше об этом читать в книге. От себя могу порекомендовать Таненбаум "Современные операционные системы", раздел "3.3 Виртуальная память". Но, возможно, есть книги, где материал изложен более понятным языком. Без понимания того, что такое "виртуальная память" ты вряд ли сможешь по-настоящему понять ответы на первые три вопроса. Хотя если тебе нужно сдать зачёт, то достаточно уметь сказать умные слова, из которых как бы вытекает, что ты в теме. Этого добра тебе на форуме могут подкинуть в неограниченном количестве
Четвёртый вопрос - очень сумбурный. Понятие "стек" на разных уровнях означает как бы немного разные вещи. С уровня операционной системы - это одно, с уровня компилятора - другое, с уровня языка программирования - третье. Это разные виды абстракции. Сложно понять, что имеется в виду конкретно в твоём случае. Попробуй для начала почитать этот пост [C++] Взятие адреса конструктора. Физическое время существование объекта.
0
|
|
|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
||
| 01.06.2019, 20:06 [ТС] | ||
|
Evg, давно кстати хотел ее прочитать всю ,много кто советовал ,вижу время настало)
Добавлено через 40 секунд
0
|
||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 01.06.2019, 20:12 | ||
|
Поток - это то, что выполняет код в процессе, т.е. регистры и стек. Для каждого процесса создаётся минимум один поток. Стек создаётся для потока Куча - это просто объект, менеджер памяти, который служит для динамического выделения памяти. Она не имеет никакого отношения ни к процессам, ни к потокам. Можно использовать несколько разных менеджеров из разных библиотек, можно написать свой, можно не использовать вообще.
0
|
||
|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
|
| 01.06.2019, 20:21 [ТС] | |
|
oleg-m1973, тогда возникает ещё два вопроса
1. Насколько я понимаю создаётся не обычный поток, а какой-то специальный, если нет то какая разница тогда между обычными потоками которые поддерживает процессор(к примеру процессор может поддерживать 4 потока одновременно) 2. Тоесть для каждого исполнения кода выделяется минимум 1 стек и минимум 1 куча? И как выглядит куча в физической памяти, её адрес меняется с созданием переменных? Если к примеру для начала для кучи выделили 8 байт, но я создам 3 переменных типа ин-т в динамической памяти тогда то что исполняет код должно будет найти место для этой 3 переменной и значит переместить всю кучу на другой адресс (это при условии если места дальше в текущем адресс нет), я правильно понимаю?
0
|
|
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|||
| 01.06.2019, 20:48 | |||
|
Добавлено через 7 минут Добавлено через 9 минут Насчёт кучи немного соврал - для процесса всегда создаётся куча - всё-таки надо выделять память под стек потоков, и что-нибудь ещё
0
|
|||
|
|
|||
| 01.06.2019, 21:16 | |||
|
И опять-таки, пока ты не понимаешь, что такое виртуальное адресное пространство и как оно связано с физической памятью, большинство из сказанного скорее всего окажется пустым звуком или близко к этому
0
|
|||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
| 01.06.2019, 21:21 | |
|
0
|
|
|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
|
| 01.06.2019, 21:21 [ТС] | |
|
Evg, нет, почему же, я понимаю что такое виртуальная память, я понимаю что это та же "замаскированная" физическая память, я понимаю что она создана для безопасности, просто мне непонятны аспекты некоторые связанные с ней
0
|
|
|
|
|||
| 01.06.2019, 21:27 | |||
|
С точки зрения операционной системы, и куча, и стек, и код программы, и данные программы - все это куски памяти, принципиально друг от друга не отличающиеся. Операционная система просто создаёт виртуальное адресное пространство и загружает в него код программы и её данные из исполняемого файла. Часть адресного пространства условно считается стеком. Условно, потому что операционной системе абсолютно по барабану, что находится по этим адресам. Она просто помечает эти адреса как законные. Ну и ещё выполняет, наверное, единственное дополнительное действие - это установка начального значения регистра, являющегося указателем стека. Что такое "куча", операционная система по большому счёту не знает вообще. Все операции над кучей осуществляются внутри виртуального адресного пространства процесса силами самогО процесса и выражаются в обращения к операционной системе "дай память". Операционная система память даёт и ей опять же по барабану, что в этой памяти размещено: куча, бублик, пряник или какая-то ещё абстракция
Добавлено через 4 минуты Если не хочешь с этим разбираться, тогда опять же для простоты считай, что у тебя на машине исполняется одна-единственная задача (процесс) и больше ничего. Высшими силами ей выделена максимально возможное количество памяти. Т.е. 2^32 байт для 32-битного режима. Процесс сам с собой договорился, что какие-то диапазоны адресов этой памяти будут называться "стек", а какие-то диапазоны - "кучей"
0
|
|||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||||
| 01.06.2019, 21:29 | ||||
|
Добавлено через 1 минуту
0
|
||||
|
|
||||
| 01.06.2019, 21:43 | ||||
|
Не по теме:
Добавлено через 7 минут Перетащил из лички, чтобы не запутаться окончательно
Выделение памяти в стеке работает проще. Запрос "выделите память размером 4 байта" выражается в то, что из регистра, в котором хранится адрес вершины стека, вычитается 4 байта И ещё раз подчеркну. "Виртуальная память" не имеет никого отношения к стекам и кучам. Виртуальная память - это абстракция на уровне операционной системы. Для простоты любой процесс работает в предположении, что ему доступны адреса от 0 до 2^32 и в этих адресах живёт только этот процесс и никто другой. Другие процессы живут в других вселенных. Далее каждый процесс сам с собой договаривается, что всё адресное пространство он поделит на части. Одну часть будет называть "кучей", одну часть "стеком"
1
|
||||
|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
|
| 01.06.2019, 22:11 [ТС] | |
|
Evg, ага, я думал что куча и стек выделяются как в виртуальной памяти так и в физической, просто под разными адресами,
0
|
|
| 01.06.2019, 22:31 | |||
|
1.Куча - область памяти. 2.Куча может расти. 3.Куча расположена между двумя сегментами: кодом (там ещё константы) и стеком. Причём стек и куча растут на встречу друг-другу. И что произойдёт, когда стек и куча встретятся? Просто ошибка? Или есть способы как-то хитро увеличить размер кучи? Добавлено через 7 минут
0
|
|||
|
|
|||
| 01.06.2019, 23:34 | |||
|
Предположим, что начало кучи на адресе 0x1000 и она растёт вверх. А начало стека на адресе 0xffffffff и он растёт вниз. Например, с точки зрения ОС можно было бы логично какую-нибудь страницу посередине сделать невалидной. Например, страница по адресу 0x10000000 будет считаться невалдидной. Если куча до неё дорастёт, то запрос к ОС "дай память" вернёт NULL. Если до этой страницы дорастёт стек, то обращение по такому адресу сломает процесс (т.к. эту страницу мы считаем невалидной). Это очень топорно и, в общем-то высосано из пальца, но, например, это могло быть именно так. Здесь пояснена лишь общая суть, а не то, как устроено в реальности Ты можешь вообще ничего в куче не выделять. Можешь в программе написать переменную "char a[1024*1024];" и записать в указатель стека хвостовой (или вообще серединный) адрес. И точно так же всё будет работать Т.е. стек - это некое программное соглашение и не более того. Если его настроить куда-то в другое место, не нарушая соглашений, то всё по прежнему будет работать Аналогичным образом если malloc вдруг начнёт возвращать адреса, соответствующие ещё не занятому стеку, то точно так же всё будет нормально работать. Разумеется, при условии, что настоящий стек до этих адресов не дорастёт Другими словами, с точки зрения операционной системы стеку и куча - не более чем страницы памяти в виртуальном пространстве процесса. Хотя там могут быть какие-то тонкости, упирающиеся в программные соглашения между разными программными компонентами. Например, в случае возникновения прерывания происходит передача управления ядру ОС, а оно предполагает, что в момент прерывания у процесса были некоторые настройки стека, которые требуется сохранить, а потом восстановить. Если мы вели свой собственный стек с нарушением программных соглашений, то ядро может сохранить не то или не туда и т.п. и после прерывания не будет восстановлено изначальное состояние
2
|
|||
|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
|
| 02.06.2019, 02:06 [ТС] | |
|
Evg, мне интересно как они располагаются относительно друг к другу, сегодня прочитал что в физической памяти они могут быть расположены вообще в разных местах, как они могут расти один к одному в этом случае?или просто если к примеру на програму выделяется 2гб и размер кучи + стека будет >2гб то тогда просто ошибка вылетит?
Добавлено через 2 часа 5 минут Заданный выше вопрос отпал, просто не заметил выше ответ, судя из вышесказанного я не могу понять какая разница между кучей тогда и стеком? (кроме того что стек это lifo и память растёт от старшего бита к младшему и что переменные записанные в кучу видны не только в процедуре, а и во всем процессоре(этот момент тоже мне не ясен почему так) ) И вот вопрос который именно меня интересовал но я не знал толком как работает виртуальная память, но теперь я понял уже что это более менее и собственно вопрос : Представим что у нас есть физическая память в которой находится стек, насколько я понимаю для него же должна выделяться память заранее, как ОС определяет сколько памяти стеку выделить, так же и для кучи, и что будет если представим будет такая ситуация что ОС нужно будет выделить потоку(процессу) 2 гб памяти, но в памяти ОС останется только к примеру 10 мест по 200мб,ято в этом случае? Я спрашивал можно ли именно "разорвать" стек или кучу?
0
|
|
|
|
||||||
| 02.06.2019, 10:03 | ||||||
|
Стек - НЕ является аппаратной фичей и НЕ является какой-то сущностью, реализуемой операционной системой. Это всего лишь кусок памяти со сплошной виртуальной адресацией. В нём есть две программные сущности "stack pointer" и "frame pointer", которые процесс ведёт своими силами, без помощи операционной системы и железа, как если бы это был обычный абстрактный стек, реализованный при помощи массива int'ов. Принципиальной разницы нет никакой. Stack pointer - указывает на вершину стека. Элементами стека у нас являются куски памяти (frame'ы), используемые процедурами. Frame pointer - это указатель на начало или конец такого куска, относительно которого организуется доступ до отдельных переменных внутри frame'а. И опять-таки всё это - исключительно на уровне программных соглашений. Так работают компиляторы. Тебе никто не мешает написать программу на ассемблере, в котором стек будет представлять собой помойку, организованную по твоим правилам. Здесь нет никакой обязаловки, за исключением того, что нужно будет соблюдать программные соглашения на стыке между твоей программой и ядром операционной системы. Либо написать свою собственную операционную систему, которая будет жить по твоим правилам. Аппаратуре вообще пофигу (строго говоря, это не так, но в первом приближении считай, что так) Для кучи на момент запуска программы не выделяется память вообще. Эту память заказывает сам процесс по мере необходимости. Т.е. в процессе работы процесс периодически обращается к операционной системе с запросом "дай память" И опять-таки всё это - чисто вопрос договорённостей. За многие годы выработались именно такие программные соглашения, потому что именно такой подход показался наиболее эффективным. Тебе никто не мешает разработать собственную систему, в которой память для кучи выделяется на этапе запуска программы и имеет фиксированный размер, а стек будет выделяться запросами "дай память". Аппаратуре побоку - всё это будет нормально работать, хоть и будет менее эффективно
1
|
||||||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 02.06.2019, 11:09 | ||
|
Добавлено через 8 минут Размер стека задаётся при создании потока, в CreateThread. Для первого потока в процессе - либо в CreateThread, STACK_SIZE_PARAM_IS_A_RESERVATION, либо в параметрах компилятора.
0
|
||
|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
|
| 02.06.2019, 11:55 [ТС] | |
|
Evg, от чего зависти тогда размер выделенной физической памяти под стек? И я спрашиваю именно о физической памяти, как она работает, если для кучи памяти вообще не выделяется то тогда по мере создания динамических объектов она начнёт выделяться, как это будет происходит? Кусок за куском(последовательно), или сразу целый блок памяти, иил что?
0
|
|
|
|
||
| 02.06.2019, 14:06 | ||
|
0
|
||
| 02.06.2019, 14:06 | |
|
Помогаю со студенческими работами здесь
20
функции работы с памятью Общие принципы работы с набором данных Трудоустройство и условия работы. Общие моменты Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|