feat: implemented internl_fragmentation and peak utilization
This commit is contained in:
parent
f8284f05a9
commit
79c410f343
|
@ -15,10 +15,10 @@ static sf_block *epi;
|
||||||
static sf_size_t in_qklst = 0x00000001;
|
static sf_size_t in_qklst = 0x00000001;
|
||||||
static sf_size_t prv_alloc = 0x00000002;
|
static sf_size_t prv_alloc = 0x00000002;
|
||||||
static sf_size_t alloc = 0x00000004;
|
static sf_size_t alloc = 0x00000004;
|
||||||
// static sf_size_t total_payload = 0;
|
static int total_payload = 0;
|
||||||
// static sf_size_t max_payload = 0;
|
static int max_payload = 0;
|
||||||
// static sf_size_t total_block_size = 0;
|
static double total_block_size = 0;
|
||||||
static sf_size_t total_pages = 0;
|
static double total_pages = 0;
|
||||||
|
|
||||||
int sf_initialize();
|
int sf_initialize();
|
||||||
void set_header(sf_block *block, sf_header value);
|
void set_header(sf_block *block, sf_header value);
|
||||||
|
@ -46,10 +46,10 @@ sf_block *get_next_block(sf_block *block);
|
||||||
void remove_list(sf_block *block);
|
void remove_list(sf_block *block);
|
||||||
sf_size_t get_pow(sf_size_t pow);
|
sf_size_t get_pow(sf_size_t pow);
|
||||||
void xor_with_magic(sf_header *header);
|
void xor_with_magic(sf_header *header);
|
||||||
|
void add_payload(int size);
|
||||||
|
|
||||||
void *sf_malloc(sf_size_t size)
|
void *sf_malloc(sf_size_t size)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (size == 0)
|
if (size == 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@ -66,6 +66,8 @@ void *sf_malloc(sf_size_t size)
|
||||||
sf_quick_lists[index].length -= 1;
|
sf_quick_lists[index].length -= 1;
|
||||||
sf_quick_lists[index].first = block->body.links.next;
|
sf_quick_lists[index].first = block->body.links.next;
|
||||||
set_entire_header(block, size, get_block_size(block->header), 1, get_prv_alloc(block->header), 0, 0);
|
set_entire_header(block, size, get_block_size(block->header), 1, get_prv_alloc(block->header), 0, 0);
|
||||||
|
total_block_size += get_block_size(block->header);
|
||||||
|
add_payload(size);
|
||||||
return block->body.payload;
|
return block->body.payload;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,6 +84,8 @@ void *sf_malloc(sf_size_t size)
|
||||||
if (get_block_size(ptr->header) >= min_size)
|
if (get_block_size(ptr->header) >= min_size)
|
||||||
{
|
{
|
||||||
set_entire_header(ptr, size, get_block_size(ptr->header), 1, get_prv_alloc(ptr->header), 0, 0);
|
set_entire_header(ptr, size, get_block_size(ptr->header), 1, get_prv_alloc(ptr->header), 0, 0);
|
||||||
|
total_block_size += get_block_size(ptr->header);
|
||||||
|
add_payload(size);
|
||||||
return ptr->body.payload;
|
return ptr->body.payload;
|
||||||
}
|
}
|
||||||
ptr = ptr->body.links.next;
|
ptr = ptr->body.links.next;
|
||||||
|
@ -99,6 +103,8 @@ void *sf_malloc(sf_size_t size)
|
||||||
set_entire_header(ptr, size, min_size, 1, get_prv_alloc(ptr->header), 0, 0);
|
set_entire_header(ptr, size, min_size, 1, get_prv_alloc(ptr->header), 0, 0);
|
||||||
set_entire_header(block, 0, block_size, 0, get_prv_alloc(block->header), 0, 0);
|
set_entire_header(block, 0, block_size, 0, get_prv_alloc(block->header), 0, 0);
|
||||||
put_block(block);
|
put_block(block);
|
||||||
|
total_block_size += get_block_size(ptr->header);
|
||||||
|
add_payload(size);
|
||||||
return ptr->body.payload;
|
return ptr->body.payload;
|
||||||
}
|
}
|
||||||
ptr = ptr->body.links.next;
|
ptr = ptr->body.links.next;
|
||||||
|
@ -142,6 +148,8 @@ void sf_free(void *pp)
|
||||||
sf_block *block = (sf_block *)(((intptr_t)pp) - 2 * sizeof(sf_header));
|
sf_block *block = (sf_block *)(((intptr_t)pp) - 2 * sizeof(sf_header));
|
||||||
valid_pointer(block);
|
valid_pointer(block);
|
||||||
|
|
||||||
|
total_block_size -= get_block_size(block->header);
|
||||||
|
add_payload(-1 * get_payload_size(block->header));
|
||||||
sf_size_t index = (get_block_size(block->header) - 32) / 16;
|
sf_size_t index = (get_block_size(block->header) - 32) / 16;
|
||||||
if (index < 10)
|
if (index < 10)
|
||||||
{
|
{
|
||||||
|
@ -184,9 +192,13 @@ void *sf_realloc(void *pp, sf_size_t rsize)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
total_block_size -= get_block_size(block->header);
|
||||||
|
add_payload(-1 * get_payload_size(block->header));
|
||||||
if (size - new_size < min)
|
if (size - new_size < min)
|
||||||
{
|
{
|
||||||
set_entire_header(block, rsize, size, 1, get_prv_alloc(block->header), 0, 0);
|
set_entire_header(block, rsize, size, 1, get_prv_alloc(block->header), 0, 0);
|
||||||
|
total_block_size += get_block_size(block->header);
|
||||||
|
add_payload(rsize);
|
||||||
return block->body.payload;
|
return block->body.payload;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -195,6 +207,8 @@ void *sf_realloc(void *pp, sf_size_t rsize)
|
||||||
set_entire_header(block, rsize, new_size, 1, get_prv_alloc(block->header), 0, 0);
|
set_entire_header(block, rsize, new_size, 1, get_prv_alloc(block->header), 0, 0);
|
||||||
set_entire_header(ptr, 0, get_block_size(ptr->header), 0, get_prv_alloc(ptr->header), 0, 0);
|
set_entire_header(ptr, 0, get_block_size(ptr->header), 0, get_prv_alloc(ptr->header), 0, 0);
|
||||||
release_block(ptr);
|
release_block(ptr);
|
||||||
|
total_block_size += get_block_size(block->header);
|
||||||
|
add_payload(rsize);
|
||||||
return block->body.payload;
|
return block->body.payload;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -202,14 +216,23 @@ void *sf_realloc(void *pp, sf_size_t rsize)
|
||||||
|
|
||||||
double sf_internal_fragmentation()
|
double sf_internal_fragmentation()
|
||||||
{
|
{
|
||||||
// TO BE IMPLEMENTED
|
if (total_payload == 0)
|
||||||
abort();
|
return 0.0;
|
||||||
|
return total_payload / total_block_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
double sf_peak_utilization()
|
double sf_peak_utilization()
|
||||||
{
|
{
|
||||||
// TO BE IMPLEMENTED
|
if (max_payload == 0)
|
||||||
abort();
|
return 0;
|
||||||
|
return max_payload / total_pages;
|
||||||
|
}
|
||||||
|
|
||||||
|
void add_payload(int size)
|
||||||
|
{
|
||||||
|
total_payload += size;
|
||||||
|
if (total_payload > max_payload)
|
||||||
|
max_payload = (double)total_payload;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sf_initialize()
|
int sf_initialize()
|
||||||
|
|
Loading…
Reference in New Issue
Block a user