Pull to refresh
5
0
Send message

Верно. Это тема следующей статьи. Оглавление таки приделаю :-D

Вам во вторую часть :-)

Пожалуй не помешало бы оглавление в начале )

Пока не подвезли список свободных блоков аллокатор ищет блок перебирая все, что крайне неэффективно. В следующей статье будет рассмотрено приделывание списка свободных блоков

Не уверен что лучше и не уверен что будет лучше :-)

Но будет работать и для удоволетворения зависимости libcxxrt должно быть достаточно.

Можно будет сравнить когда аллокатор будет закончен

Вам не следует спешить. Аллокатор начинается с подобных алгоритмов. Перед красно черным деревом вы изучаете бинарное. Это пример просто.

Аллокатор это все что распределяет память :-)

Аллокаторы везде используются где есть распределение памяти. std::cout то же в себе что то распределяет, так что даше Hello world на С++ содержит их. Я лишь говорю что я пишу конкретно про осдев, но принцип да, можно везде применять. Безусловно. Как сортировку например. Можно в игре массив сортировать, можно и ОС. Алгоритм это алгоритм

Для реализации стандартной библиотеки соответствующий стиль кода. Вообще Главный плюс в том, что научитесь понимать алгоритмы в STL со временем. Сначала будет бить по глазам, а потом ревью пойдет как по маслу :-D

Что бы привыкнуть, лучше всего таким стилем писать имо

Это код теста что бы запустить у себя и проверить. Далее будет юнит тест. Тоже будет проходиться в системе. using namespace std уйдет в итоговой демке которая будет грузится в эмуляторе только. Но до этого еще далеко.

Зависимости cstring и cerrno будут предоставлены, если нужно я расскажу в отдельной статье как

Я разрабатывал стандартрую библиотеку для ОС и использовал соответствующий стиль. Он такой, что бы не было пересечений, вроде как это так объясняется. Примеры пересечений выдумывать не стану )

Через статью будет явный список допилен сюда свободных блоков. В OSDEV что бы был хешмеп его нужно ручками приделать с свой рантайм сначала. Нам пока рано в данный момент :-)

Каким образом? Она пытается слить последовательно идущие блоки друг с другом.

Один вызов пытается сделать что то такое:

[free block] [free block] [free block] @[allocated block]@[free block] --

--> [free block * 3] @[allocated block]@[free block]

Другое дело что список односвязный и если свободен предыдущий блок, а не следующий, то она этого не поймет так как двигается по списку вперед. Из вывода теста аллокатора видно что это порождает фрагментацию в конце:

_MemoryBlock: service block address 0x55efd7b4beb8 size 8 size with overhead 16 state allocated
_MemoryBlock: block address 0x55efd7b4bec8 size 15832 size with overhead 15840 state free
_MemoryBlock: block address 0x55efd7b4fca8 size 504 size with overhead 512 state free
_MemoryBlock: service block address 0x55efd7b4fea8 size 8 size with overhead 16 state allocated

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

Если вы про заголовок, то да. Это свойство блока памяти только. См тут: https://www.clear.rice.edu/comp321/html/laboratories/lab08/ или в этой книге на русском:

https://vk.com/wall-54530371_498 10.9.12

Считается что не будет совпадений с идентификаторами в коде пользователей либы.

Велкам.

По идее санитизеры должны само приделаться в случае если библиотека оверрайдит malloc/free.

https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html#index-fsanitize_003dleak

По запросам трудящихся могу посмотреть, но после юнит теста и дальше по плану еще кое какие вещи есть :-)

Information

Rating
Does not participate
Registered
Activity

Specialization

Mobile Application Developer, Embedded Software Engineer
Lead
C++
Java