Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт апр 19, 2024 05:37

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 31 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Реализация простейшего алгоритма сборки мусора на Форте
СообщениеДобавлено: Вс окт 12, 2008 01:37 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Автор: Хищник
первая публикация 12.10.2008 на данном форуме

Реализация простейшего алгоритма сборки мусора на Форте

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

Одним из кардинальных методов борьбы с утечками является использование автоматических процедур удаления неиспользуемых областей памяти. В этом случае программа только выделяет память, но не уничтожает ее, оставляя эту операцию т.н. сборщику мусора (garbage collector). Сборщик мусора хранит информацию об областях памяти, которые затребовала себе программа, и при необходимости помечает их как неиспользуемые. При этом после нескольких операций выделения и уничтожения в памяти могут возникать неиспользуемые участки (или, другими словами, память становится фрагментированной). Однако вместо попыток «вписать» новый блок памяти в подходящий свободный участок сборщик мусора может использовать другой интересный алгоритм. Дело в том, что программы, интенсивно создающие и уничтожающие объекты в памяти, существенно замедлят управление памятью из-за необходимости постоянно дефрагментировать память или искать подходящий свободный блок (что тоже способствует фрагментации). Вместо этого сборщик выделяет память с постоянным нарастанием адресов, только помечая удаленные блоки. Рано или поздно память, доступная сборщику, будет исчерпана, однако в ней окажется много блоков, помеченных как свободные. В этом случае выполняется сборка мусора – физическое перемещение блоков памяти, которые последовательно занимают место в общем блоке, выделенном для сборщика мусора. Операция сборки мусора обычно занимает заметное время, так что программа, использующая такой алгоритм управления памятью, работает достаточно быстро, но с периодическими «замираниями».
Поскольку при дефрагментации области памяти физически перемещаются, программа не может просто запомнить адрес, где находятся нужные данные (они могут оказаться перемещены в процессе сборки мусора). Поэтому к таким областям следует обращаться только через менеджер памяти, передавая ему идентификатор нужного блока.

Пример управления памятью со сборкой мусора приведен ниже. В программе создается большая область памяти (переменная LIMIT содержит максимальный размер, который можно запросить у системы, из него вычитается величина c#RESERVED, которая оставляется программе для обычного выделения по ALLOT). Полученная область рассматривается как куча (heap), и ей управляет таблица на c#HEAP-ENTRIES записей. Для каждой записи хранится начальный адрес и размер этого блока памяти. Отдельно хранится таблица занятости, где 0 соответствует свободной памяти. Обычно, если память используется для различных целей, это значение не просто не равно нулю, а равно количеству ссылок на эти данные из разных мест. Тогда программный модуль, которому больше не нужна эта память, не обнуляет поле занятости, а только уменьшает его на 1. Если при этом получается 0, память не требуется ни одной части программы, и может быть физически освобождена.
Сборка мусора выполняется словом :gc. Слово проходит по всем элементам массива ссылок на память, и переупорядочивает области памяти так, чтобы они размещались строго последовательно, занимая места блоков, отмеченных как свободные.
Выделение памяти выполняется словом DYNAMIC, которое ожидает на стеке требуемый размер памяти, возвращая идентификатор области, которая выделена программе. Выделенная память помечается как свободная словом DESTROY, ожидающим на стеке идентификатор. Зная идентификатор, можно также определить начальный адрес этой области памяти словом –HEAPLISTADR.

Код:
\ ========================== Start ==========================
\ Quark Forth

FORTH DEFINITIONS
DECIMAL

1024 CONSTANT c#HEAP-ENTRIES     \ # of dynamically allocated objects
2048 1024 * CONSTANT c#RESERVED      \ guaranteed in reserve

1 VALUE AUTO-COLLECT?            \ allow garbage auto collection

QUAN HEAP-SIZE
: RECALCULATE-HEAP-SIZE
  LIMIT @ c#RESERVED - HERE -
  DUP 0 < IF " Can't allocate heap memory" PRINT  ELSE
  TO HEAP-SIZE THEN
;

CREATE HEAPLIST[] c#HEAP-ENTRIES 8 * ALLOT
CREATE HEAPUSAGE[] c#HEAP-ENTRIES 4 * ALLOT

\ HEAPLIST:
\ +0 - start address of memory area
\ +4 - size of memory area;

\ HEAP USAGE:
\ 0 means don't used

RECALCULATE-HEAP-SIZE
CREATE HEAP[] HEAP-SIZE ALLOT

: -HEAPUSAGE // INDEX --> ADR )
  4 * HEAPUSAGE[] +
;

: -HEAPLISTADR // INDEX --> ADR )
  8 * HEAPLIST[] +
;

: -HEAPLISTSIZE // INDEX --> ADR )
  8 * HEAPLIST[] + 4 +
;

: CLEAR-HEAP
  c#HEAP-ENTRIES 0 DO
    0 I -HEAPUSAGE !
    0 I -HEAPLISTADR !
    0 I -HEAPLISTSIZE !
  LOOP
;
CLEAR-HEAP

: ?free // N --> T | F )
  DUP -HEAPUSAGE @ 0 = SWAP -HEAPLISTSIZE @ 0 = AND
;

: ?used // N --> T | F )
  -HEAPUSAGE @ 0 = NOT
;

: ?garbaged // N --> T | F )
  DUP -HEAPUSAGE @ 0 = SWAP -HEAPLISTSIZE @ 0 = NOT AND
;

: :?collect // N --> ) \ collect one entry if garbaged
  DUP ?garbaged \ don't used & garbaged
  IF
    \ move memory content
      DUP >R
      R@ -HEAPLISTADR @ R@ -HEAPLISTSIZE @ + \ from where
      R@ -HEAPLISTADR @                      \ to
      HEAP-SIZE R@ -HEAPLISTADR @ - R@ -HEAPLISTSIZE @ - \ all remains
      CMOVE
    \ correct addrs of objects if needed
      R>
      c#HEAP-ENTRIES 0 DO
        I -HEAPLISTADR @ OVER -HEAPLISTADR @ > \ adr greater (need to be corrected)?
        IF
          I -HEAPLISTADR @ OVER -HEAPLISTSIZE @ - I -HEAPLISTADR @ !
        THEN
      LOOP
    \ drop size of collected entry to 0
      0 SWAP -HEAPLISTSIZE !
    THEN
;

: :gc // --> ) \ force garbage collection
  c#HEAP-ENTRIES 0 DO
    I ?garbaged \ don't used & garbaged
    IF
    \ move memory content
      I -HEAPLISTADR @ I -HEAPLISTSIZE @ + \ from where
      I -HEAPLISTADR @                     \ to
      HEAP-SIZE I -HEAPLISTADR @ - I -HEAPLISTSIZE @ - \ all remains
      CMOVE
    \ correct addrs of objects if needed
      c#HEAP-ENTRIES 0 DO
        I -HEAPLISTADR @ J -HEAPLISTADR @ > \ adr greater (need to be corrected)?
        I ?used AND
        IF
          I -HEAPLISTADR @ J -HEAPLISTSIZE @ - I -HEAPLISTADR !
        THEN
      LOOP
    \ drop size of collected entry to 0
      0 I -HEAPLISTSIZE !
      0 I -HEAPLISTADR !
    THEN
  LOOP
;

: ?garbaged# // --> #_garbaged_entries )
  0
  c#HEAP-ENTRIES 0 DO
    I ?garbaged \ don't used & garbaged
    IF 1+ THEN
  LOOP
;

: FIND-HEAPENTRY // --> INDEX | -1 )
  0
  BEGIN
   1+ DUP 1- ?free OVER c#HEAP-ENTRIES = OR
  UNTIL
  DUP c#HEAP-ENTRIES = IF DROP -1 ELSE 1- THEN
;

: :freememoryadr // --> ADR )
  HEAP[]
  c#HEAP-ENTRIES 0 DO
    I -HEAPLISTADR @ I -HEAPLISTSIZE @ + 2DUP >
    IF DROP ELSE NIP THEN
  LOOP
;

: DYNAMIC // SIZE --> INDEX )
  FIND-HEAPENTRY
  DUP -1 = AUTO-COLLECT? AND \ no free
  IF
    DROP :gc FIND-HEAPENTRY
  THEN
  DUP -1 = IF DROP CR " No more room for dynamic allocation " PRINT THEN

\ ===== otherwise set up new entry =====
  OVER HEAP-SIZE :freememoryadr - >
  DUP
  IF
    AUTO-COLLECT? IF DROP :gc OVER HEAP-SIZE :freememoryadr - > THEN
  THEN
  IF
    DROP CR " Not enough memory " PRINT
    AUTO-COLLECT? IF " (even after garbage collection) " PRINT THEN
//    ABORT
  THEN
  DUP -HEAPUSAGE 1 SWAP !
  DUP -HEAPLISTADR :freememoryadr SWAP !
  SWAP OVER  -HEAPLISTSIZE !

;

: DESTROY // INDEX --> )
  DUP c#HEAP-ENTRIES > IF DROP CR " Invalid heap entry " PRINT THEN
  -HEAPUSAGE 0 SWAP !
;

: ARRAY // SIZE --> )
CREATE DYNAMIC , DOES> @ -HEAPLISTADR @ ;

: G
  20 0 DO
    0 I 5 + GOTOXY I . 25 0 DO 0x20 EMIT LOOP
    5 I 5 + GOTOXY I -HEAPLISTADR @ .
    15 I 5 + GOTOXY I -HEAPLISTSIZE @ .
    25 I 5 + GOTOXY I -HEAPUSAGE @ .
  LOOP
;

78 20 * ARRAY VG[]

: VG // --> ) \ visualize heap memory usage

  78 20 * 0 DO 32 VG[] I + C! LOOP

  c#HEAP-ENTRIES 0 DO
    I -HEAPUSAGE @ IF
      I -HEAPLISTADR @ I -HEAPLISTSIZE @ + HEAP[] - \ end block
      HEAP-SIZE 78 / 20 / /
      I -HEAPLISTADR @ HEAP[] -  \ first block
      HEAP-SIZE 78 / 20 / /
      2DUP = IF DROP VG[] + 176 SWAP C!
      ELSE
        DO
          I VG[] + 178 SWAP C!
        LOOP
      THEN
    THEN
  LOOP

  20 0 DO
    0 I 4 + GOTOXY 186 EMIT 79 I 4 + GOTOXY 186 EMIT
    78 0 DO
      I 1+ J 4 + GOTOXY VG[] J 78 * + I + C@
      EMIT
    LOOP
  LOOP
  0 3 GOTOXY 201 EMIT 78 0 DO 205 EMIT LOOP 187 EMIT
  0 24 GOTOXY 200 EMIT 78 0 DO 205 EMIT LOOP
;


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс окт 12, 2008 08:16 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
offtop
всё-таки, что мешало сделать в кварке ." и S"
параллельно с "
для совместимости?
offtop end


годится ли этот алгоритм для других фортов?

_________________
понимаю некоторую бестолковость некоторых вопросов


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс окт 12, 2008 10:27 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
вопрос писал(а):
всё-таки, что мешало сделать в кварке ." и S"

Устарели.
вопрос писал(а):
годится ли этот алгоритм для других фортов?

Это перенесено из ДОСовского. Визуализация с GOTOXY для работы не требуется, а в остальной части требуются широко распространенные слова. Собственно, что мешает проверить?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс окт 12, 2008 12:07 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Цитата:
Устарели.
Но в стандарте присутствует
Цитата:
6.1.0190 ." "dot-quote" CORE
Interpretation: Interpretation semantics for this word are undefined.
Compilation: ( "ccc<quote>" -- )
Parse ccc delimited by " (double-quote). Append the run-time semantics
given below to the current definition.
Run-time: ( -- )
Display ccc.

Цитата:
6.1.2165 S" "s-quote" CORE
Interpretation: Interpretation semantics for this word are undefined.
58

ANSI X3.215-1994
Compilation: ( "ccc<quote>" -- )
Parse ccc delimited by " (double-quote). Append the run-time semantics
given below to the current definition.
Run-time: ( -- c-addr u )
Return c-addr and u describing a string consisting of the characters
ccc. A program shall not alter the returned string.
See: 3.4.1 Parsing, 6.2.0855 C", 11.6.1.2165 S".

_________________
понимаю некоторую бестолковость некоторых вопросов


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс окт 12, 2008 12:30 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
вопрос писал(а):
Но в стандарте присутствует

вопрос писал(а):
ANSI X3.215-1994

Данная филькина грамота идет лесом. ГОСТ-Р есть?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс окт 12, 2008 14:12 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
у меня нет, но почему же
филькина грамота ?

_________________
понимаю некоторую бестолковость некоторых вопросов


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс окт 12, 2008 14:28 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
вопрос писал(а):
у меня нет, но почему же
филькина грамота ?

Я как-то живу в Российской Федерации, где официальным документом является ГОСТ-Р. Какую юридическую силу тут может иметь стандарт другого государства? Нет ГОСТ-Р, начинаем опускаться дальше, к отраслевым стандартам, руководящим документам, да и хотя бы СтП (который есть на кварк). Но чтобы руководствоваться зарубежным стандартом 15-летней давности, да который еще не может дать каких-то блестящих success stories... это, собственно, к чему все? Что будет, если потратить время и силы на дорабатывание современной форт-системы до этого старья? Будут рады все три с половиной европейских фортера-одиночки?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс окт 12, 2008 16:35 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
:))
Это не сборщик мусора.
Это просто аллокатор.
Причём неэффективный. Слово :freememoryadr зачем-то пробегает все c#HEAP-ENTRIES, а оно вызывается как минимум один раз на аллокацию.
Кстати вместо
Код:
I -HEAPLISTADR @ I -HEAPLISTSIZE @ + 2DUP >
должно быть
Код:
I -HEAPLISTADR @ I -HEAPLISTSIZE @ + 2DUP U>

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

Неверно. Учите теорию. Это называется compaction (уплотнение?). Сборка мусора это процесс определения блоков памяти которые не используется в программе (мусора).

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс окт 12, 2008 16:54 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Вообще это программа пятилетней давности, написанная в процессе диалога с функциональщиками. Практического применения у нее ноль.
ygrek писал(а):
Неверно. Учите теорию. Это называется compaction (уплотнение?). Сборка мусора это процесс определения блоков памяти которые не используется в программе (мусора).

- Ствол автомат изготовлен из стали!
- Неверно, читайте инструкцию , там написано: "из того же материала".


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс окт 12, 2008 19:28 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Хищник писал(а):
- Ствол автомат изготовлен из стали!
- Неверно, читайте инструкцию , там написано: "из того же материала".

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

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс окт 12, 2008 19:58 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
поддерживаю ygrek-а!
Речь не о [url=http://ru.wikipedia.org/wiki/Сборка_мусора]сборке мусора[/url] а о реализации простейшего менеджера памяти.
Поэтому статью стоило бы переименовать...

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс окт 12, 2008 19:58 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
ygrek писал(а):
Очень мило.
Но есть общепринятая терминология.
И стоит использовать её адекватно дабы не выглядеть глупо.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс окт 12, 2008 20:07 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Хищник писал(а):
Пока вместо общепринятой терминологии я вижу общие слова.

под сборкой мусора понимается автоматический анализ программы на наличие "забытых" или "потерянных" блоков памяти. Пошло все от Лиспа, поэтому надо смотреть не в Хаскель, если искать терминологию.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс окт 12, 2008 20:09 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
mOleg писал(а):
поддерживаю ygrek-а!
Речь не о сборке мусора а о реализации простейшего менеджера памяти.
Поэтому статью стоило бы переименовать...

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс окт 12, 2008 20:10 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Хищник писал(а):
то не хватает только автоматического отслеживания достижимости объектов.

да, но прикол в том, что именно в этом и заключается идея сборки мусора :)

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 31 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


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

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


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

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB