
Иллюстрированный разбор одной пользовательской реализации malloc()
Sivchenko_translate 13 минут назад Иллюстрированный разбор одной пользовательской реализации malloc() 21 мин 300 Программирование * C * Алгоритмы * Занимательные задачки Перевод Автор оригинала: Sebastien Michelland...
18 Temmuz'da Wellington'da en yüksek sıcaklık 14°C olacak mı?
В сфере искусственного интеллекта произошло заметное событие. Sivchenko_translate 13 минут назад Иллюстрированный разбор одной пользовательской реализации malloc() 21 мин 300 Программирование * C * Алгоритмы * Занимательные задачки Перевод Автор оригинала: Sebastien Michelland Программисты, работающие с языком C, несомненно, узнают стандартную функцию malloc(). Это главный аллокатор памяти в языке, который тесно связан со всем известными ошибками сегментирования. Функция malloc() – именно то средство, при помощи которого программы приобретают память во время выполнения.
Зачастую она также превращается в основной инструмент создания объектов и управления ими. Учитывая такой центральный статус malloc(), удивлён, что большинство программистов обращаются с ней как с чёрным ящиком. Этот пост призван немного исправить ситуацию, и в нём рассказано, что именно происходит под капотом.
Технические детали
Также рассмотрим одну из возможных реализаций этой функции. Как правило, на практике память выделяется так: функция malloc() вызывается с параметром, в котором указывается запрошенное количество байт. Функция malloc() возвращает указатель, через который память можно использовать, а когда она больше не будет нужна — возвратить в систему, вызвав free() :/* Выделить память для структуры типа */ struct article *my_article = malloc(sizeof *my_article); if(my_article !
использовать *my_article ... */ free(my_article); }Этот простой фрагмент кода поднимает не менее трёх важных вопросов:Откуда именно берётся память? Как именно можно выделять переменные любого типа, даже не сообщая malloc(), какой тип нам нужен?
Как именно malloc() отслеживает адрес и размер любого выделяемого нами объекта? Позволим себе небольшую авантюру и попытаемся ответить на все эти вопросы. TL;DR для самых нетерпеливых: речь пойдёт о наилучшем совпадении разделённых фрагментов с использованием 16 классов, код однопоточный, совершенно стандартный.
Отраслевые последствия
Куча берётся из системыПервый вопрос «Откуда именно берётся память? » подводит нас к разговору о системе, и вот вам короткий ответ, которого вы, возможно, уже дожидаетесь: «её предоставляет операционная система». Вполне хороший ответ, но как нам перейти от такой абстрактной концепции к конкретному указателю, в который мы сможем записывать данные?
Картина в классическом пользовательском пространствеВ классических операционных системах каждый процесс из пользовательского пространства обитает в собственном адресном пространстве, где загружены его код, все библиотеки и данные. Наличие отдельного адресного пространства для каждого процесса — это ключевой аспект проектирования операционных систем, я уже не помню, сколько раз об этом рассказывал. Если коротко — процессы не пишут данные в память других процессов и не читают данные оттуда (в настоящее время это делается в основном по соображениям безопасности).
Эта работа организуется на аппаратном уровне при помощи блоков управления памятью.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.




