истину глаголишь. осталось только решить один вопрос- хранить в списке только свободные участки (при этом сами элементы списка будут лежать в этих свободных участках). или еще и хранить занятые участки? при таком раскладе надо тратить 4 байта на заголовок каждой рабочей зоны.Сообщение от spectrum
встречный вариант с двусвязным списком, хранящим свободные областиСообщение от spectrum
list_descriptor
head dw blk1
tail dw blk3 ;?
lock db 0
...
blk1 dw 0 ;previous==NULL - first one
dw blk2
...
blk2 dw blk1
dw blk3
....
blk3 dw blk2
dw 0 ;next==NULL - last one
вот и все. и хранить флаги начала/конца списка абсолютно не нужно.
пример списка применительно к менеджеру памяти. пустая куча:
head dw heap
tail dw heap
...
heap dw 0
dw 0
dw heap_len
выделили 200 байт. структура будет следующая:
head dw blk1
tail dw blk1
...
heap
;heap+200
blk1 dw 0
dw 0
dw heap_len-200
ну и в таком духе. естесно, есть проблемы. в частности- необходимость просмотра всего списка с применением простейшей арифметики для поиска подходящего блока. а также отсутствие полного контроля на валидность освобождаемых указателей.
если использовать стандартные библиотеки для работы со связными списками, то в описывающей список структуре можно предусмотреть защелку для синхронизации (см. lock в пред. исходе)Сообщение от spectrum





Ответить с цитированием
Размещение рекламы на форуме способствует его дальнейшему развитию 
