Skip to content

Latest commit

 

History

History

second-chance-arbitrary

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Second chance

Это алгоритм из класса политик, применяемых для управления страницами виртуальной памяти.

Кеш задан очередью FIFO, где у каждого элемента помимо кешируемого значения есть признак используемости. При добавлении нового элемента, он добавляется в начало очереди, возможно вызывая вытеснение элемента с конца очереди. Признак используемости у вновь добавленного элемента не выставлен.

При вытеснении элемента у него проверяется признак используемости и если он выставлен, то элемент не удаляется совсем, а помещается в начало очереди (возможно также вызывая новое вытеснение), при этом признак используемости этого элемента сбрасывается.

Возврат вытесненного, но "спасённого" признаком используемости элемента в очередь происходит до помещения туда нового элемента, чья вставка вызвала вытеснение. Таким образом, вновь вставленный в кеш элемент всегда будет в начале очереди, а все изменения, связанные с вытеснением и возможным возвратом в очередь будут происходить до его вставки (но с очередью, чей эффективный размер на единицу меньше размера кеша).

Возможно, что в очередь все элементы имеют признак используемости - тогда добавление нового элемента и вытеснение одного из старых элементов:

  • сбросит все признаки используемости
  • удалит из кеша элемент из конца очереди

При поиске элемента, если он найден, то он не меняет своей позиции в очереди, но у него выставляется признак используемости.

Допущение в реализации

В реализации кеша допустимо предполагать, что все хранимые там объекты имеют в иерархии наследования предка, задаваемого шаблонным параметром KeyProvider, который, в свою очередь, имеет оператор равенства с ключом (задаваемым шаблонным параметром Key).

Модификация pool аллокатора с поддержкой выделения фрагментов произвольного размера

Требуется модифицировать pool аллокатор так, чтобы его методы allocate/deallocate принимали произвольный размер в байтах.

При этом требуется поддерживать определённый уровень фрагментированности пула: если новая аллокация размера X невозможна (нет нужного свободного фрагмента), но пул заполнен менее, чем на N - 2 * X, где N - это полный размер пула, то требуется провести процедуру дефрагментации и успешно выделить запрошенную память.