簡體   English   中英

將sbrk分成2

[英]splitting an sbrk into 2

要重新編碼malloc函數,我做一個sbrk(stack) ,其中:

void *malloc(size_t size)
{
  stack = 0;
  while (stack < size)
    stack += 4096;
}

我的malloc總是超出我的需要,然后我要取一些這個分配的大小size區域並返回它,如果我想在分配了內存后再執行另一個malloc,那么我就不必多次調用sbrk了。 我該怎么做,我嘗試返回brk(start_of_the_allocated_space)sbrk(size)來獲取我需要的空間的開始和結尾,但它存在段錯誤。

編輯:

struct s_block {
size_t size;
struct s_block *next;
struct s_block *prev;
void *start;
void *end;
}

這是我的結構。 然后我有一個創建塊的func

struct s_block   *create_block(size_t size, unsigned int stack)
{
struct s_block *block;
block = sbrk(sizeof(s_block));
block->start = sbrk(stack);
block->size = stack;
block->end = sbrk(0);
block->next = set_free_space(size, block);
block->size -= size;
block->next->prev = block;
block->prev = NULL;
return (block->next);
}

struct s_block *set_free_space(size_t size, struct s_block *block)
{ 
struct s_block new_block;
new_block = sbrk(sizeof(s_block));
new_block->start = block->start;
new_block->next = NULL;
new_block->size = size;
new_block->end = ???; // this is where I want to split the first sbrk
// I tried new_block->end = new_block->start + size; but it doesn't work either
block->start = new_block->end + 1; // and i set the new start of the big block at the end of the one i use
return (new_block);
}

如果我理解您的問題,似乎您想做一個大的sbrk() ,然后在每次分配malloc時拆分一個新片段。

由於sbrk會對程序造成負擔,所以這個主意很好,但是似乎您誤解了有關malloc的知識。

Malloc在其最簡單的實現中分配一定數量的空間,如下所示:

struct metadata
{
   size_t size;
   int free;
   struct metadata *next;
   void *data; 
}

data是指向已分配區域第二部分的指針,其中包含實際空間。 接下來是指向已分配區域末尾的指針。

當您malloc一定的空間時,您將創建此結構並返回數據指針。 然后,要釋放,只需將“ free”值設置為1即可返回。

這將生成一個包含所有數據以及sbrk'd區域中所有數據的鏈接列表。

有關不同的malloc實現的更多信息,請參見此答案該答案使用mmap但也可以使用sbrk

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM