OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 24 Апрель, 2024 06:11

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




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
СообщениеДобавлено: Воскресенье, 08 Июль, 2007 14:48 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Я, конечно, дико извиняюсь...
Вот есть код:
Код:
MODULE WladTest;
IMPORT
    StdLog,
    WinApi,
    Kernel,
    Services;
(**************************************************************************)
CONST
   MAX_COUNT = 10000000;      (* <<< 1 <<< *)
   (*MAX_COUNT = 100000000;*) (* <<< 2 <<< *)
(**************************************************************************)
TYPE
    Class =  POINTER TO RECORD
               i : INTEGER;
               d : REAL;
               c : Class;
            END;
(**************************************************************************)
PROCEDURE Test*;
    VAR
        i : INTEGER;
        ticks : LONGINT;
        c, c1 : Class;
BEGIN
    (*Kernel.Collect;*)
    c := NIL;
    StdLog.Ln;  StdLog.String("starting loop...");  StdLog.Ln;
    ticks := Services.Ticks();
    FOR i := 1 TO MAX_COUNT DO
        NEW(c1);  c1.i := 100;  c1.d := 1000.0;  c1.c := c;
        c := c1;
    END;   
    StdLog.String("...finished. time spent(ticks): ");  StdLog.Int( Services.Ticks() - ticks );  StdLog.Ln;
END Test;

END #WladTest.Test
#Kernel.Collect

С таким значением количества итераций у меня на машине он выполняется (при раскомментированном Kernel.Collect;) где-то в пределах 953 – 1098 миллисекунд. При увеличении верхней границы цикла на порядок машина задумывается, начинает тарахтеть винтом... и с чем я совершенно согласен! Не согласен я с тем, что мне приходится перегружать снимать весь ББ с выполнения. К пресловутому Ctrl-Break ББ холоден... :о) :о(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 08 Июль, 2007 16:31 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Ну да, цикл большую часть времени "просиживает" в ядре, в NewRec.
А поток-"прерыватор" перед генерацией исключения в основном потоке приостанавливает его и проверяет, что он находится не в ядре. В противном случае он его возобновляет - и пытается поймать снова. Т.е. делает "пробуксовку" до тех пор, пока не поймает не в ядре. А если за секунду пробуксовок не поймает, то ничего не делает.

В .NET применен альтернативный пробуксовке трюк - подмена адреса возврата. Тогда поток сам "прыгает в объятия" на выходе из ядерных процедур...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 08 Июль, 2007 19:03 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Так что, "навалиться всем телом" на сочетание Ctrl-Break? В смысле - жать, пока, глядишь - повезёт, "прерыватор" не "поймает" основной поток вне ядра? :о)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 10 Июль, 2007 15:24 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
А тут и Ctrl+Break мало чем поможет. Допустим он сработал и снял выполнение этой команды. Но Блэкбокс к этому времени уже захватил себе от виндоса памяти больше чем установлено физически (имеется в виду оперативной), т.е. "залетел на жёсткий диск". Поскольку Блэкбокс ни за что на свете никогда не возвращает память обратно в виндовс, то один раз "залетев на жёсткий диск" он от туда никогда больше не выберется. Его сборщик мусора при каждом очередном проходе по всей памяти каждый раз будет "залетать на диск". То есть нормально работать Блэкбокс больше не будет - его по любому надо снимать с выполнения.

Выхода два:

1) Тщательно следить за количеством установленной в компьютере оперативной памяти и НИКОГДА не пытаться захватить больше чем есть (чтобы не "залететь на диск"). Это можно сделать по "бразильской системе": в виндусе установить размер файла подкачки равным нулю.

2) Переписать сборщик мусора на компактифицирующий - перемещающий объекты в памяти и, таки, возвращающий неиспользуемую память обратно в виндовс.

Я об этом писал ещё несколько лет назад в "Королевстве..." когда только познакомился с Блэкбоксом.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 10 Июль, 2007 15:35 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4695
Откуда: Россия, Орёл
Сергей Губанов писал(а):
1) Тщательно следить за количеством установленной в компьютере оперативной памяти и НИКОГДА не пытаться захватить больше чем есть (чтобы не "залететь на диск"). Это можно сделать по "бразильской системе": в виндусе установить размер файла подкачки равным нулю.

А в случае нехватки памяти оперативно ее добавлять. :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 10 Июль, 2007 15:37 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4695
Откуда: Россия, Орёл
Борис Рюмшин писал(а):
Сергей Губанов писал(а):
1) Тщательно следить за количеством установленной в компьютере оперативной памяти и НИКОГДА не пытаться захватить больше чем есть (чтобы не "залететь на диск"). Это можно сделать по "бразильской системе": в виндусе установить размер файла подкачки равным нулю.

А в случае нехватки памяти оперативно ее добавлять. :)

Кстати, не первый раз уже слышу от операционщиков (в частности от Таненбаума): А на фиг нам своп? Сейчас физической памяти много....
Сразу намного упрощается менеджер памяти в системе.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 10 Июль, 2007 16:19 

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

Ну да, она же так и называется: "оперативная" ;).

Цитата:
Кстати, не первый раз уже слышу от операционщиков (в частности от Таненбаума): А на фиг нам своп? Сейчас физической памяти много....

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 10 Июль, 2007 16:24 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Сергей Губанов писал(а):
Переписать сборщик мусора на компактифицирующий - перемещающий объекты в памяти и, таки, возвращающий неиспользуемую память обратно в виндовс.

Тут свои проблемы возникают.
Копирующему сборщику мусора надо в два раза больше памяти.
Он не может быть консервативным даже частично. А значит надо переделывать компилятор, возможны проблемы с вызовом внешних библиотек и т. п.


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

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


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

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


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

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