Я реализую функцию, которая освобождает место памяти, которое было ему предоставлено, путем вызова deallocate_cache(void *ptr)
.Использование операторов сравнения с указателями для проверки, находится ли он в пределах диапазона адресов?
Моя память конструирует для поставленной задачи являются следующие:
22 typedef struct slab {
23 void *addr;
24 int bm[((SLAB_SIZE/8)/(8*sizeof(int)))+1]; // bitmap
25 struct slab *next;
26 } slab;
39 typedef struct {
40 int alloc_unit;
41 slab S;
42 } cache;
45 typedef struct { // structure for the entire memory
46 cache C[9];
47 region *R;
48 } memory;
Таким образом, у меня есть memory M
, который содержит кэш-память c[0]
, c[1]
..., c[8]
, который, в свою очередь, содержат slabs
. Когда один slab
заполняется через выделение, я выделяю еще один элемент связанного списка через поле slab *next
.
Для правильной работы deallocate_cache(void *ptr)
я должен выяснить, действительно ли ptr
находится в диапазоне от кешей, и если да, в каком он есть. Это то, что у меня есть до сих пор:
1. // Check if ptr is in the range of (slab_addr, slab_size) for each slab in each cache
2. int ci = 0, counter, coefficient, done, freeable;
3. slab *look_ahead;
4. for(; ci < 9; ci++){
5. void *max_addr = &M.C[ci].S + SLAB_SIZE; // The upper bound of the address range of the first slab
6. counter = 1;
7. look_ahead = &M.C[ci].S;
8. while(look_ahead->next != NULL){
9. if(ptr > look_ahead->addr && ptr > max_addr){ // Check ptr is greater than S.addr. If yes, it's a good bet it's in this cache.
10. look_ahead = look_ahead->next;
11. max_addr += SLAB_SIZE; // Now the upper bound of the address range of the following slab
12. counter++; // slab counter, 1-based counting
13. }
14. else {
15. done = 1;
16. break;
17. }
18. }
19. if(done == 1) break;
20.
21. }
К сожалению, и, скорее, это не работает должным образом. Можно ли использовать указатели, подобные этому, для сравнения адресов или проверить, находится ли указатель в заданном диапазоне адресов? Или мне нужно просто сравнить каждый отдельный адрес в максимальном диапазоне, который, как я знаю, я выделил? Буду признателен за любую оказанную помощь.
Я ничего не понимаю. Если вы используете слэб - это связанный список, зачем вам нужен 9 разных кешей? Вы пытаетесь минимизировать количество элементов в каждой плите? Если да, то почему 9 кеш? Я не ожидаю, что «max_addr + = SLAB_SIZE» будет работать правильно. Связанный список не должен быть продолжен в памяти (поэтому вы даете ему указатель). Следуя тому, что вы делаете, вы, вероятно, захотите сделать: «max_addr = look_ahead-> next + SLAB_SIZE». Мне все это кажется странным, но, по крайней мере, это то, что вы делали ранее. –
Мои извинения, возможно, я мог бы быть более ясным. Кэши служат для различных «слябов»: c [0] содержит только плиты, которые содержат 8-байтовые распределения (до 8192 на 'slab', 8192 равны' SLAB_SIZE/MC [0] .alloc_unit'), c [ 1] содержит плиты, содержащие 16-байтовые распределения и т. Д. Я рассмотрю ваше предложение, спасибо. – user991710
Немного связано: http://stackoverflow.com/questions/4023320/how-to-implement-memmove-in-standard-c-without-an-intermediate-copy – ninjalj