group-telegram.com/gdb_dbg/653
Last Update:
Тут недавно один юный компиляторщик у видел у нас в рантайме название BIBOB и очень смеялся необычно звучащему для него слову: "что это за названия у вас в рантайме такие смешные?"
Но для рантаймщика то это звучит вполне естественно, это один из самых базовых терминов. Наверное и вы, читатели, если когда-нибудь занимались управлением памятью в виртуальных машинах, узнали здесь небольшую модификацию классической техники BIBOP (BIg Bag Of Pages), которая представляет из себя довольно простую штуку.
В рантайме по любому объекту в памяти нужно уметь быстро понимать его свойства, при том, как instance-специфичные (самое простое: помечен он сейчас GC-ом или нет? Хэшировали уже объект или нет?), так и class-специфичные (это массив или нет? у класса есть нетривиальный финализатор или нет? Размер объекта какой?). И если для instance-специфичной информации в объекте обычно зарезервировано несколько байт в заголовке (за битики в этом заголовке идет настоящая битва, всем надо), то class-специфичная информация обычно хранится отдельно. Для доступа к ней в объект записывают адрес на соответствующую рантайм структуру, в хотспоте, например, это Klass*
.
Но это же получается целое поле под этот адрес для метаинфы в каждом объекте хранить! Объектов миллионы, дороговато получается, дороговато. В общем случае в современных языках этого не избежать, но в некоторых частных случаях может захотеться иметь альтернативный способ получения этой метаинформации об объектах. И тут срабатывает классический трюк: давайте кодировать информацию в адресах объектов. Я сейчас не про то, чтобы записывать что-то в старшие биты адреса и потом маркировать (так тоже делают, конечно, но это скорее instance- или даже pointer-специфичная инфа), а про то, чтобы использовать сам адрес для быстрого поиска нужной вам информации: давайте аллоцировать все объекты с одинаковыми свойствами (например, массивы) рядом, в заранее известных регионах памяти. Тогда вы за пару сдвигов сможете понять по адресу объекта, в каком он регионе и соответственно получить всю необходимую метаинфу.
Если чуть обобщить, то вы просто делаете хэш-таблицу из адресов в объектов в метаинфу, что освобождает вас от необходимости хранить адрес на метаинфу в каждом объекте (но накладывает ограничение на аллокации и перемещения объектов, трейдоф понятен). Вот такая техника и называется BIBOP (BIg Bag Of Pages). Pages там, понятно, из-за того, что обычно хранится информация не конкретно об объекте, а о страничке, в которой он (и похожие на него объекты) аллоцирован.
У нас в рантайме используется похожая техника, но не для конкретных объектов, а для наших собственных блоков памяти (поэтому вместо Pages, у нас Blocks, и аббревиатура превращается в BIBOB).
Забавно, что техника BIBOP один из первых раз описана была в 1977 году, вот здесь, для реализации MacLisp на PDP-10. Хотя даже там автор уже подтрунивает на самим термином и говорит, что так уже называют схему, когда новые страницы под данные выделяют с верхних адресов к нижним, а код, наоборот, загружают в нижние адреса. И вот дырка в середине, которую с двух сторон съедают во время исполнения, называется "BIg Bag of Pages" (автор использует словосочетание "whimsically named"), поэтому и схему с аллокацией объектов вместе и кодированием метаинфы в адресах автор тоже решил назвать BIBOP.
—
В общем, это настолько древняя (почти 50 лет!) и понятная технология, что слово BIBOP не звучит для рантаймщика, как что-то странное, совершенно.
Но я же недавно посмотрел Сowboy Bebop! А дальше уже просто не смог удержаться: пошел и подписал к комменту над нашим бибопом одну строчку в качестве шалости. See you, space cowboys.
#дух_машины
BY Алло, это отладочная?

Share with your friend now:
group-telegram.com/gdb_dbg/653