OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 18 Апрель, 2024 14:04

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




Начать новую тему Ответить на тему  [ Сообщений: 20 ] 
Автор Сообщение
СообщениеДобавлено: Пятница, 03 Июль, 2009 10:54 
Аватара пользователя

Зарегистрирован: Суббота, 10 Ноябрь, 2007 21:28
Сообщения: 584
Откуда: Хабаровск
Неожиданно обнаружил, что не понимаю важной вещи или во всяком случае мне так кажется.
Я о сборщике мусора. В документации сказано, что уничтожить переменную достаточно присвоив ей значение NIL. Это понятно, это здорово. Тоесть сборщик мусора уничтожает все структуры данных на которые никто не указывает. Но вот я создаю скажем связный список.
NEW (A);
A^.n:=1;
FOR i:=2 TO N DO
NEW(A^.next);
A:=A^.next;
A^.n:=i;
END;

А запомнить в дополнительном указателе начало списка я скажем забыл. Верно ли, что по окончании работы цикла от моего списка сборщик мусора мне оставит только последнюю запись на которую показывает А.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вроде бы не понимаю
СообщениеДобавлено: Пятница, 03 Июль, 2009 11:51 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Верно, но сборщик мусора обычно так быстро не работает, какое-то неопределённое время после завершения этого цикла какое-то количество объектов память всё ещё будут занимать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вроде бы не понимаю
СообщениеДобавлено: Пятница, 03 Июль, 2009 13:19 
Аватара пользователя

Зарегистрирован: Суббота, 10 Ноябрь, 2007 21:28
Сообщения: 584
Откуда: Хабаровск
Сергей Губанов писал(а):
Верно, но сборщик мусора обычно так быстро не работает, какое-то неопределённое время после завершения этого цикла какое-то количество объектов память всё ещё будут занимать.


Что не быстро это я как раз понимаю, я усомнился в самом факте. Видимо это был глюк.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вроде бы не понимаю
СообщениеДобавлено: Пятница, 03 Июль, 2009 16:28 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
vvp писал(а):
сборщик мусора мне оставит только последнюю запись на которую показывает А.
Причем тут сборщик мусора? Вы же сами себе ничего больше не оставляете.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вроде бы не понимаю
СообщениеДобавлено: Суббота, 04 Июль, 2009 02:04 
Аватара пользователя

Зарегистрирован: Суббота, 10 Ноябрь, 2007 21:28
Сообщения: 584
Откуда: Хабаровск
Info21 писал(а):
vvp писал(а):
сборщик мусора мне оставит только последнюю запись на которую показывает А.
Причем тут сборщик мусора? Вы же сами себе ничего больше не оставляете.

Это понятно, что не оставляю, но мне было интересно, как на это смотрит сборщик мусора. Я еще не отвык, что о очистке памяти надо обязательно воспользоваться чем-то вроде Dispose


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вроде бы не понимаю
СообщениеДобавлено: Суббота, 04 Июль, 2009 05:23 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
vvp писал(а):
Это понятно, что не оставляю, но мне было интересно, как на это смотрит сборщик мусора. Я еще не отвык, что о очистке памяти надо обязательно воспользоваться чем-то вроде Dispose
Тоисть это по разряду ломки :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вроде бы не понимаю
СообщениеДобавлено: Суббота, 04 Июль, 2009 14:34 
Аватара пользователя

Зарегистрирован: Суббота, 10 Ноябрь, 2007 21:28
Сообщения: 584
Откуда: Хабаровск
Info21 писал(а):
vvp писал(а):
Это понятно, что не оставляю, но мне было интересно, как на это смотрит сборщик мусора. Я еще не отвык, что о очистке памяти надо обязательно воспользоваться чем-то вроде Dispose
Тоисть это по разряду ломки :)

Ну да ну да. Реликтовые пережитки сознания


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вроде бы не понимаю
СообщениеДобавлено: Суббота, 04 Июль, 2009 18:15 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
vvp писал(а):
Ну да, ну да. Реликтовые пережитки сознания
Говоря откровенно, здесь произошло смешение достаточного и необходимого условий. Актуально всегда. Спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вроде бы не понимаю
СообщениеДобавлено: Пятница, 18 Сентябрь, 2009 13:59 

Зарегистрирован: Вторник, 11 Август, 2009 11:44
Сообщения: 516
Откуда: Бердск
А я тоже не очень понимаю :(
Видимо, у меня в голове произошло неправильное смешение понятий GC, и reference counting

Как мне казалось до сих пор:
1) уже при значении i=2, при выполнении A:=A^.next; первый (полученный по NEW (A);) алоцированный объект получает нулевой счетчик ссылок, и кэшируется как-то куда-то в некую "свободную область". И вроде бы - сразу же, не отходя от кассы...
2) при значении i=3, при выполнении NEW(A^.next); этот же, уже "освобожденный", кусочек памяти может совершенно спокойно попасть уже в эту алокацию. И это даже было бы самым логичным: в "свободной области" точно есть кусочек именно нужного размера, может и не один такой, а только помещать новый в самое начало списка "свободных", обычно удобнее.
3) из всего, этого мне совершенно непонятно, что означает фраза:
Сергей Губанов писал(а):
... сборщик мусора обычно так быстро не работает, какое-то неопределённое время после завершения этого цикла какое-то количество объектов память всё ещё будут занимать.


Направьте на путь истинный, пожалуйста.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вроде бы не понимаю
СообщениеДобавлено: Пятница, 18 Сентябрь, 2009 14:20 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Galkov писал(а):
Направьте на путь истинный, пожалуйста.
GC в ББ так не работает. То, что вы описали - это методика повторного использования (кэширования) объектов, которую иногда бывает целесообразно применять, но делается это обычно явным образом, осознанно, и только для некоторых заранее известных типов объектов. GC же в общем случае не знает, какого размера объект потребуется вашему алгоритму в следующий момент (такого же типа/размера, как A, или другого), равно как и не знает он со 100% достоверностью, что вы не сохранили куда-нибудь ссылочку на тот или иной объект до лучших времён: счётчика ссылок здесь нет. Память под все NEW объекты выделяется заново из имеющегося свободного пространства. Только когда и если свободного места не осталось, производится поиск и удаление ненужных объектов (т.е. тех, на которые нет прямых или косвенных ссылок из глобальных переменных или стека).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вроде бы не понимаю
СообщениеДобавлено: Пятница, 18 Сентябрь, 2009 15:06 

Зарегистрирован: Вторник, 11 Август, 2009 11:44
Сообщения: 516
Откуда: Бердск
Александр Ильин писал(а):
Только когда и если свободного места не осталось, производится поиск и удаление ненужных объектов (т.е. тех, на которые нет прямых или косвенных ссылок из глобальных переменных или стека).

Хм... А как производится :?:
В процессе исполнения всегда существует некий пополняемый/удаляемый "стек адресов", в которых находятся ссылки на хип :?:
Если существует, кто им управляет ???
Это прямые ссылки... А косвенные ???

Интересно также понимание преимуществ (или недостатков) именно такой стратегии.
Которое одним вопросом и не сформулируешь....
А без понимания - огромный дискомфорт имеет место быть :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вроде бы не понимаю
СообщениеДобавлено: Пятница, 18 Сентябрь, 2009 15:18 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Я так понимаю, что надо поискать инфу по теме Сборка мусора?
Тогда можно посмотреть в Кнуте - первый том. Или у Элджера - там даже с программами на С++ есть.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вроде бы не понимаю
СообщениеДобавлено: Пятница, 18 Сентябрь, 2009 15:29 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Счётчик ссылок в общем случае неприменим, т.к. не работает в случае с циклическими ссылками (два объекта держат друга друга - никому больше не нужны, но друг друга держат :) ).

По поводу алгоритма ищем на слова "Mark & Sweep". Алгоритм классический ещё со времён появления Лиспа. Сначала проходим от корней (от глобальных указателей и указателей стека), помечая все пройденные. Затем проходим по списку выделенных блоков памяти, ища те, которые не помечены на предыдущей фазе - они, значит, недоступны, их удаляем.

В Явах/Шарпах навороченные модификации (с поколениями, алгоритм "поезд" и т.п. По поводу поколений есть в книге Рихтера про .NET). Оно себя не оправдывает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вроде бы не понимаю
СообщениеДобавлено: Пятница, 18 Сентябрь, 2009 15:39 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Galkov писал(а):
Хм... А как производится :?:
В процессе исполнения всегда существует некий пополняемый/удаляемый "стек адресов", в которых находятся ссылки на хип :?:
Если существует, кто им управляет ???
Это прямые ссылки... А косвенные ???

Маркировка производится временной установкой младшего бита у указателя. Адреса глобальных переменных известны, список загруженных модулей есть в модуле Kernel (modList: Module). Для каждого составного типа известно, по каким смещениям в нём находятся указатели, так что косвенные ссылки обойти тоже не проблема.

Исходники GC - см. Kernel.Collect и используемые им процедуры. Процедура выделения памяти под объект - Kernel.NewRec (вызывается, когда в исходнике встречается NEW(ptr)).

Galkov писал(а):
Интересно также понимание преимуществ (или недостатков) именно такой стратегии.
Которое одним вопросом и не сформулируешь....
А без понимания - огромный дискомфорт имеет место быть :)

http://en.wikipedia.org/wiki/Garbage_co ... er_science)#Naive_mark-and-sweep


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вроде бы не понимаю
СообщениеДобавлено: Пятница, 18 Сентябрь, 2009 15:42 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Цитата:
Маркировка производится временной установкой младшего бита у указателя.


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вроде бы не понимаю
СообщениеДобавлено: Пятница, 18 Сентябрь, 2009 16:14 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Galkov писал(а):
Хм... А как производится :?:
...
А без понимания - огромный дискомфорт имеет место быть :)

В реализации возможны вариации, а суть в следующем:

язык устроен так, что компилятор при компиляции имеет полную информацию -- и потому может как-то ее зафиксировать для использования во время исполнения -- о структуре ссылок, которая будет иметь место при выполнении:

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

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

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

Указанный тут порядок (сначал...потом...) -- смысловой.
Реально возможны варианты (типа сбор в список свободных и разотмечание занятых за один сплошной проход по памяти -- "sweep").
Как возможны варианты реализации разметки.

Но детали не важны.
А важно (суть) то, что у компилятора есть вся необходимая информация благодаря строгой типизации, распространенной на указатели.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вроде бы не понимаю
СообщениеДобавлено: Понедельник, 21 Сентябрь, 2009 15:27 

Зарегистрирован: Вторник, 11 Август, 2009 11:44
Сообщения: 516
Откуда: Бердск
Если не заниматься оверквотингом, то общее БОЛЬШОЕ СПАСИБО, коллеги :!:
Прежде всего, за указку на буквари - внимательно ознакомился (на что и потребовалось некое время)

Илья Ермаков писал(а):
По поводу поколений есть в книге Рихтера про .NET
Возможно, это не тот Рихтер, который у меня сегодня есть (Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows).
Не нашел пока у себя такого.
Илья, если можно, уточните ссылку, пожалуйста

Контрольный вопрос на правильность, возникшего у меня понимания: удаление динамических объектов происходит сегодня "не в очень детерминированные" моменты времени. И хуже всего - затраты на сборку мусора "пропорциональны объему" используемой мною памяти.
Грубо говоря, если я один раз алоцировал много тысяч мелких объектов, то моя дальнейшая работа с динамической алокацией - крайне не эффективна.
Так :?:
Или, вышеупомянутая "пропорциональность" - устарела давно :?:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вроде бы не понимаю
СообщениеДобавлено: Понедельник, 21 Сентябрь, 2009 16:25 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Упомянутая книга:

Дж. Рихтер Программирование на платформе Microsoft .NET Framework. "Русская редакция" - 2003.

Вспомнил, есть ещё одна:

Richard Jones, Rafael Lins. Garbage Collection. Algorithms for Authomatic Memory Management. "John Willey & Sons" - 1996.

Можно обращаться в личку.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вроде бы не понимаю
СообщениеДобавлено: Понедельник, 21 Сентябрь, 2009 16:39 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Кстати, если заинтересуетесь рантаймоописаниями Рихтера, то полезно вживую всё это посмотреть на ядре ББ. По документации - http://oberoncore.ru/wiki/blackbox/kernel


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 22 Сентябрь, 2009 10:34 

Зарегистрирован: Вторник, 11 Август, 2009 11:44
Сообщения: 516
Откуда: Бердск
Заинтересуетесь :wink:
Спасибо, Илья - прочитал (Рихтера). Реинкорнация объектов - это шедевр, просто нет слов.
Одни мысли, и все не цензурные.

Напоминает технологию стэлз: как можно заставить летать даже чемодан, с помощью супер-современных технологий.
Заставить-то можно. И даже можно всех убедить, что его никто не видит.
До встречи с ламповой С-70 (читай - до ранее упомянутых задач очереди динамических объектов).

В силу профессии, я с очень большим уважением отношусь к РТ-задачам. И интересуют меня на данном этапе - больше Знания, чем практическая реализация.
Вот, к примеру, оказывается, что reference counting с маркировкой не только мне в голову приходит.....


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

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


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

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


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

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