Управление памятью с помощью malloc и free

Управление памятью с помощью malloc и free

07.02.2020 04:23:16 Просмотров 3 Источник

В настоящее время я изучаю, как память управляется malloc и свободна, и я не понимаю, почему, когда я хочу malloc 1 байт, malloc выделит 32 байта для блока? Для меня он должен выделить 16 байт для метаданных (размер предыдущего и следующего фрагментов) и 1 байт для данных...

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

/**                                                                                            
 * pmem - print mem                                                                            
 * @p: memory address to start printing from                                                   
 * @bytes: number of bytes to print                                                            
 *                                                                                             
 * Return: nothing                                                                             
 */
void pmem(void *p, unsigned int bytes)
{
    unsigned char *ptr;
    unsigned int i;

    ptr = (unsigned char *)p;
    for (i = 0; i < bytes; i++)
    {
        if (i != 0)
        {
            printf(" ");
        }
        printf("%02x", *(ptr + i));
    }
    printf("\n");
}

/**
 * main - moving the program break
 *
 * Return: EXIT_FAILURE if something failed. Otherwise EXIT_SUCCESS
 */
int main(void)
{
    void *p;
    size_t size_of_the_chunk;
    char prev_used;

    p = malloc(1);
    printf("%p\n", p);
    pmem((char *)p - 0x10, 0x10);
    size_of_the_chunk = *((size_t *)((char *)p - 8));
    prev_used = size_of_the_chunk & 1;
    size_of_the_chunk -= prev_used;
    printf("chunk size = %li bytes\n", size_of_the_chunk);
    return (EXIT_SUCCESS);
}

Вот и результат. :

0x13bf010

00 00 00 00 00 00 00 00 21 00 00 00 00 00 00 00

размер блока = 32 байта

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/60114413/memory-management-by-malloc-and-free#comment106320967_60114413
Как вы проверяете? Пожалуйста, создайте минимальный воспроизводимый пример , чтобы показать нам.
https://stackoverflow.com/questions/60114413/memory-management-by-malloc-and-free#comment106321494_60114413
ваша программа вызывает неопределенное поведение.
https://stackoverflow.com/questions/60114413/memory-management-by-malloc-and-free#comment106321577_60114413
Поскольку вы спрашиваете о деталях реализации, вам нужно быть очень конкретным о таких вещах, как ваша операционная система, ваша библиотека C, версии операционной системы и библиотеки C.

Ответы - Управление памятью с помощью malloc и free / Memory management by malloc and free

glglgl

07.02.2020 04:25:49

Короче говоря, библиотека C memory management может свободно выделять столько памяти, сколько сочтет нужным. Может быть, для простоты он выделяет только кратные 32 байта. Тогда, очевидно, 32 байта-это минимум.

Другие распределители могут использовать другие стратегии.

P__J__

07.02.2020 04:38:15

Я хочу, чтобы malloc 1 байт, malloc выделит 32 байта для куска ? Для меня он должен выделить 16 байт для метаданных (размер предыдущего блок и далее блока) и 1 байт для данных...

Тогда вам нужно написать свою собственную версию malloc.

Стандарт не говорит, как это распределение должно выглядеть, если есть какие-либо дополнительные данные, или сколько памяти будет выделено.

Есть много обстоятельств, которые должны быть приняты во внимание, а не только "метаданные". Наверняка автор реализации имел что-то в середине, когда решал, как реализовать 'malloc'

zwol

07.02.2020 04:44:48

mallocдолжен возвращать указатели, которые достаточно выровнены для хранения любого типа данных, даже типов данных, которые не могут поместиться в выделенное пространство. Это означает, что если _Alignof(max_align_t) == 32в вашей системе, malloc(1)должен возвращать только указатели, кратные 32, даже если вы просите меньше места, чем это. Простой способ для реализации сделать это-округлить каждое распределение до кратного 32 в своих внутренних бухгалтерских данных, которые, похоже, являются тем, что вы смотрите.

Тем не менее, стандарт C специально запрещает вам обращаться к памяти даже на один байт за пределами того объема пространства, который вы просили. Он также запрещает вам получать доступ mallocили ASan, она выйдет из строя.

https://stackoverflow.com/questions/60114413/memory-management-by-malloc-and-free/60114718#comment106322125_60114718
Хорошо, но почему указатель должен быть достаточно выровнен и почему мэллоку нужно думать о том, что пользователь будет помещать в эту память ? Я спрашиваю об этом, потому что мне нужно переосмыслить Мэллок, и я не улавливаю эту концепцию..
https://stackoverflow.com/questions/60114413/memory-management-by-malloc-and-free/60114718#comment106323868_60114718
Если вы не знакомы с концепцией выравнивания адресов, Вам нужно посмотреть, что это такое, прежде чем вы продолжите попытки реализовать malloc. Правило стандарта C разработано так, чтобы мэллоку не нужно было думать о том, что вызывающий объект будет помещать в память; он просто всегда создает адрес, который можно использовать для чего угодно. Люди спорят о том, имеет ли смысл настаивать на max_align_t; это может отнять много места для программ, которые делают много небольших выделений. Но правило таково, каково оно есть, по крайней мере сейчас.
https://stackoverflow.com/questions/60114413/memory-management-by-malloc-and-free/60114718#comment106324315_60114718
Связано ли это с тем, что процессор читает 32 байта за раз ?
https://stackoverflow.com/questions/60114413/memory-management-by-malloc-and-free/60114718#comment106325701_60114718
Это связано с этим, да. Я действительно должен попросить вас провести собственное исследование на эту тему - я не могу поместить полное объяснение выравнивания в поле для комментариев, и я уверен, что в интернете уже есть хорошие объяснения этого. Я бы поискал для вас, но сейчас у меня очень ненадежный Wi-Fi в кофейне.
Jean-Baptiste Yunès

07.02.2020 05:58:11

Для меня он должен выделить 16 байт для метаданных (размер предыдущего и следующего фрагментов)

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

и 1 байт для данных

По крайней мере, еще раз. Большинство распределителей предпочитают выделять кучу байтов (обычно 32 или 64).

Закрыть X