GOOGLE ADS

вторник, 10 мая 2022 г.

Что и где стек и куча?

Книги по языкам программирования объясняют, что типы значений создаются в стеке, а ссылочные типы создаются в куче, но не объясняют, что это за две вещи. Я не читал четкого объяснения этого. Я понимаю, что такое стек. Но,

  • Где и какие они (физически в памяти реального компьютера)?

  • В какой степени они контролируются операционной системой или средой выполнения языка?

  • Каков их масштаб?

  • Чем определяется размер каждого из них?

  • Что делает человека быстрее?


  • Решение проблемы

    Стек — это память, выделенная в качестве рабочего пространства для потока выполнения. При вызове функции в верхней части стека резервируется блок для локальных переменных и некоторых учетных данных. Когда эта функция возвращается, блок становится неиспользуемым и может быть использован при следующем вызове функции. Стек всегда резервируется в порядке LIFO (последний пришел — первый вышел); последний зарезервированный блок всегда является следующим освобождаемым блоком. Это упрощает отслеживание стека; освобождение блока из стека — это не что иное, как корректировка одного указателя.

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

    Каждый поток получает стек, в то время как обычно для приложения существует только одна куча (хотя нередко бывает несколько куч для разных типов распределения).

    Чтобы ответить на ваши вопросы напрямую:


    В какой степени они контролируются операционной системой или средой выполнения языка?


    ОС выделяет стек для каждого потока системного уровня при создании потока. Обычно среда выполнения языка вызывает ОС для выделения кучи для приложения.


    Каков их масштаб?


    Стек привязан к потоку, поэтому, когда поток выходит, стек восстанавливается. Куча обычно выделяется средой выполнения при запуске приложения и освобождается, когда приложение (технически процесс) завершает работу.


    Чем определяется размер каждого из них?


    Размер стека задается при создании потока. Размер кучи задается при запуске приложения, но может увеличиваться по мере необходимости (распределитель запрашивает больше памяти у операционной системы).


    Что делает человека быстрее?


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

    Наглядная демонстрация:

    Источник изображения: vikashazrati.wordpress.com

    Комментариев нет:

    Отправить комментарий

    Laravel Datatable addColumn returns ID of one record only

    Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...