OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 19 Октябрь, 2017 02:50

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
СообщениеДобавлено: Понедельник, 19 Июнь, 2017 20:31 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 8821
Откуда: Россия, Орёл
Сегодня Евгений Эдуардович выложил сборку ББ OberonCore с некоторыми обновлениями:
viewtopic.php?p=101136#p101136

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

Собственно, с этим же столкнулись коллеги, у которых есть аналогичная многозадачность, режим сопрограмм:
viewtopic.php?f=31&t=5219

Как это решено у нас - и как вошло в сборку OberonCore:
- введён специальный абстрактный базовый тип SpecialArea
Код:
      SpecialArea* = POINTER TO ABSTRACT RECORD
         opts*: SET
      END;


Любой тип, в области данных которого хранятся адреса, должен быть расширен от SpecialArea.
Это, например, страница списков, где сохраняются стеки.
Типа: Page = POINTER TO RECORD (Kernel.Special) next: Page; data: ARRAY 512 OF BYTE END.
При наличии в opts флага Kernel.conservMark сборщик будет выполнять консервативную маркировку тела записи.

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

Для такого режима маркировки свой тип данных также расширяется от Page - и добавляется следующий заголовок:
Код:
Page = POINTER TO RECORD (Kernel.Special)
  prev, next: Page;
  dataLen: INTEGER;
  map: ARRAY 32 OF SET;
  data: ARRAY 4096 OF BYTE
END;

Все понимают, что соотношение между размером map-а и размером data должно быть:
LEN(map) = LEN(data) DIV 4 DIV 32.

Далее вы выставляете правильный dataLen, а в opts выставляете флаг Kernel.markByMap.

Правила картографии:
- когда записываете в данные data какой-нибудь RECORD с указателями, то, как и в ОЗУ, сначала записываете тег Kernel.Type.
- в битовой карте бит для слова с тегом НЕ ПОМЕЧАЕТСЯ, он 0.
- далее записываете RECORD, кратно 4 байт, все слова в карте помечаете как 1.
(таким образом, когда идёт один RECORD за другим, в битовой карте начало каждого RECORD-а однозначно определяется по фронту 0->1).

Доп. фишка: ваши странички могут быть связаны в список по prev и next - и тогда RECORD вообще может записываться разрывно (часть на одной странице, часть - на следующей или нескольких следующих), маркировка его будет выполняться корректно.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2017, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB