OberonCore

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

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




Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: Понедельник, 05 Декабрь, 2011 17:09 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Один мой бывший байтик, закончивший курс год назад, пытается запустить ББ на Хайку. И он такой, что, не ровён час, запустит :D

Тем временем сообщил о следующей проблеме:

Когда модули выгружаются, то их дескрипторы типов остаются в памяти. И не собираются сборщиком мусора.
Он говорит, что даже проверил многократной загрузкой-выгрузкой модуля -- это де заканчивается обломом.

Кто-нибудь сталкивался с этим? Какие будут мысли?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 05 Декабрь, 2011 18:02 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Модули фактически не выгружаются.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 05 Декабрь, 2011 18:02 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
А в чём проблема?

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 05 Декабрь, 2011 20:27 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Александр Ильин писал(а):
Выгружаются, насколько я помню, глобальные переменные и код, а дескрипторы типов должны оставаться в памяти. Только вот не помню, почему. Кто знает?
Потому что в куче могут быть экземпляры этих типов. Тов. Ермаков может чего подробнее разъяснит, он на ентом деле собаку съел.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 05 Декабрь, 2011 21:18 
Аватара пользователя

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

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

Цитата:
Тов. Ермаков может чего подробнее разъяснит, он на ентом деле собаку съел.
Пусть тогда разъясняет.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 05 Декабрь, 2011 21:43 

Зарегистрирован: Суббота, 28 Январь, 2006 00:10
Сообщения: 52
Откуда: г. Киров
Евгений Темиргалеев писал(а):
Александр Ильин писал(а):
Выгружаются, насколько я помню, глобальные переменные и код, а дескрипторы типов должны оставаться в памяти. Только вот не помню, почему. Кто знает?
Потому что в куче могут быть экземпляры этих типов. Тов. Ермаков может чего подробнее разъяснит, он на ентом деле собаку съел.

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

Так что меня сомнения берут, что модуль можно выгрузить при наличии экземпляров его типов. К тому же защититься от этого достаточно просто: надо считать количество созданий/освобождений экземпляров любого типа модуля (как динамически, так и на стеке).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 05 Декабрь, 2011 21:46 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Александр Ильин писал(а):
Выгружаются, насколько я помню, глобальные переменные и код, а дескрипторы типов должны оставаться в памяти.

Код остается в памяти, а глобальные переменные обнуляются.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 05 Декабрь, 2011 21:58 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Алексей Елин писал(а):
Если остаются экземпляры типов, то нелзя выгружать и глобальные переменные модуля, и тем более код. Иначе через экземпляр в любой момент можно вызвать выгруженный код а он может обратиться к выгруженной переменной, уже занятым другими данными.

Так что меня сомнения берут, что модуль можно выгрузить при наличии экземпляров его типов. К тому же защититься от этого достаточно просто: надо считать количество созданий/освобождений экземпляров любого типа модуля (как динамически, так и на стеке).
Глобальные переменные не "выгружаются" в смысле уничтожения, просто теряется на них ссылка, и они соберутся сборщиком мусора как обычно (если остались другие ссылки, то не соберутся).

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

Насколько я знаю, выгруженный код не может обратиться к выгруженной переменной, так как выгруженный блок памяти помечается как неисполняемый и, соответственно, ОС выбросит исключение при попытке передать туда управление.

Не думаю, что имеет смысл считать число экземпляров для всех типов, тем более что записи могут размещаться на стеке. Я думаю, что вполне реализуемо вот что: при сборке мусора можно ставить флажок во всех дескрипторах, для которых нашёлся хотя бы один экземпляр объекта. Если модуль выгружен, и в его дескрипторах не установился ни один флажок, весь блок дескрипторов можно выгрузить.


Последний раз редактировалось Александр Ильин Понедельник, 05 Декабрь, 2011 21:59, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 05 Декабрь, 2011 21:58 

Зарегистрирован: Суббота, 28 Январь, 2006 00:10
Сообщения: 52
Откуда: г. Киров
Trurl писал(а):
Код остается в памяти, а глобальные переменные обнуляются.

Т.е. как и (сборки) в .NET, модули не выгружаются никогда?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 05 Декабрь, 2011 22:04 

Зарегистрирован: Суббота, 28 Январь, 2006 00:10
Сообщения: 52
Откуда: г. Киров
Александр Ильин писал(а):
...Я думаю, что вполне реализуемо вот что: при сборке мусора можно ставить флажок во всех дескрипторах, для которых нашёлся хотя бы один экземпляр объекта. Если модуль выгружен, и в его дескрипторах не установился ни один флажок, весь блок дескрипторов можно выгрузить.

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 05 Декабрь, 2011 22:22 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Алексей Елин писал(а):
Но это по сути обычная сборка мусора, только ссылки на дескрипторы из типа должны быть типизированы а дескрипторы надо создавать динамически при загрузке модуля и хранить скрытые ссылки на них в этом самом модуле. И не надо никаких доп. флагов...

...при этом и сам модуль может быть собран когда на него не остается ни одной ссылки из дескрипторов или блоков локальных переменных.
Мне кажется, что в целом вы правы, только в последнем предложении сделали слишком сильное утверждение. Не модуль может быть собран, а дескриптор типа, принадлежащий уже выгруженному модулю. Сам модуль, конечно, нельзя выгружать только по признаку отсутствия переменных.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 05 Декабрь, 2011 22:31 

Зарегистрирован: Суббота, 28 Январь, 2006 00:10
Сообщения: 52
Откуда: г. Киров
Александр Ильин писал(а):
Мне кажется, что в целом вы правы, только в последнем предложении сделали слишком сильное утверждение. Не модуль может быть собран, а дескриптор типа, принадлежащий уже выгруженному модулю. Сам модуль, конечно, нельзя выгружать только по признаку отсутствия переменных.

Я неточно выразился. Я имел ввиду что модуль, как и дескрипторы, может быть собран когда на него нет ссылок ни из дескрипторов, ни из других локальных/глобальных переменных в других модулях, тем же самым сборщиком мусора. При загрузке создать динамически дескриптор модуля и прописывать ссылку на него из всех дескрипторов типов содержащихся в нем, а также в глобальном листе модулей.

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


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

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Александр Ильин писал(а):
Глобальные переменные не "выгружаются" в смысле уничтожения, просто теряется на них ссылка, и они соберутся сборщиком мусора как обычно (если остались другие ссылки, то не соберутся).

Какие могут быть ссылки на глобальные переменные?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 06 Декабрь, 2011 07:39 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Info21 писал(а):
Представим себе круглосуточный всемирный дистанционный олимпиадный (ну, пусть) сервер

Делать такой сервер через LoadModule/UnloadModule в любом случае не стоит.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 06 Декабрь, 2011 08:03 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Trurl писал(а):
Какие могут быть ссылки на глобальные переменные?
Не, такого быть не может. Я имел в виду копии глобальных указателей.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 06 Декабрь, 2011 11:18 
Аватара пользователя

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

Грузить независимый ББ для каждой задачки? Ну, или для серии задачек -- и убивать его после тысячи задачек?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 07 Декабрь, 2011 13:43 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Коллеги, работает сейчас оно так:
есть список дескрипторов модулей Kernel.modList, в нём находятся как загруженные, так и выгруженные модули. Т.е. он только "раздувается". Перезагрузили 100 раз модуль - будет для него 100 дескрипторов. Отличить дескрипторы выгруженных модулей можно по счётчику ссылок импорта от других модулей ref < 0.
Для выгружаемого модуля уничтожаются секции кода и глобальных переменных (code и data). Блок метаинформации остаётся, как есть.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 07 Декабрь, 2011 14:17 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Илья Ермаков писал(а):
Коллеги, работает сейчас оно так:
есть список дескрипторов модулей Kernel.modList, в нём находятся как загруженные, так и выгруженные модули. Т.е. он только "раздувается". Перезагрузили 100 раз модуль - будет для него 100 дескрипторов. Отличить дескрипторы выгруженных модулей можно по счётчику ссылок импорта от других модулей ref < 0.
Для выгружаемого модуля уничтожаются секции кода и глобальных переменных (code и data). Блок метаинформации остаётся, как есть.
Спасибо.

А делать-то что?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 07 Декабрь, 2011 15:36 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Илья Ермаков писал(а):
Для выгружаемого модуля уничтожаются секции кода и глобальных переменных (code и data).

Легко убедиться, что это не так.
1-й способ: посмотреть исходники Kernel.
2-й способ: экспериментальный
Код:
MODULE TestArr;
VAR a:ARRAY 10000000 OF INTEGER;
 PROCEDURE Do*;
 BEGIN
   
 END Do;
END TestArr.
Ctrl+click(?)TestArr.Do

Сколько раз у вас получится перезагрузить этот модуль?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 07 Декабрь, 2011 15:39 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Info21 писал(а):
Грузить независимый ББ для каждой задачки?

Наверное, так. Дети - они такие затейники.


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

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


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

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


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

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