Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ 32 битные компиляторы _ "Шаровая" оперативка

Автор: Bokul 27.12.2006 6:04

Заинтересовал? smile.gif Вот они - чудо компиляторы...

Запускаем код и радуемся результатам:


type
ar=array[1..65456] of byte;
ar2=array[1..327600] of byte;
var p:^ar;
p2:^ar2;
begin
writeln('Free memory before allocation: ',GetHeapStatus.TotalFree);
new(p);
writeln('Free memory after allocation: ',GetHeapStatus.TotalFree);
dispose(p);
writeln('Free memory after dispose: ',GetHeapStatus.TotalFree);
new(p2);
writeln('Again allocation: ',GetHeapStatus.TotalFree);
dispose(p2);
writeln('Again dispose: ',GetHeapStatus.TotalFree);
readln;
end.


Системный блок раскручивать необязательно - все изменения проходят на программном уровне.
P.S. Не знаю как энергия, но память из ниоткуда можно получить.. Fpc is the best smile.gif
P.P.S.
Причина, наверно, кроется вот в чем:
Прикрепленное изображение
Т.е. тип cardinal, возвращаемый методом TotalFree, не имеет постоянного размера, и меняется в зависимости от присваиваемого значение. Имхо.
Так вот, вопрос: как в Fpc измерять разницу свободной памяти до и после размещения в ней данных, без всяких таких казусов?

Автор: volvo 29.12.2006 11:06

Bokul, доки внимательно читал? smile.gif

Цитата(prog.pdf)
8.4.3 Debugging the heap
Free Pascal provides a unit that allows you to trace allocation and deallocation of heap memory:
heaptrc.
If you specify the -gh switch on the command-line, or if you include heaptrc as the first unit in
your uses clause, the memory manager will trace what is allocated and deallocated, and on exit of
your program, a summary will be sent to standard output.
ну, и близлежащие параграфы...

Автор: Bokul 29.12.2006 19:45

Ясно, GetHeapStatus для этих целей не годится - надо юзать модуль heaptrc sad.gif

Вот в таком формате heaptrc выдает свой заголовок (а потом еще 200 метров отчета):

Цитата

Heap dump by heaptrc unit
1010000 memory blocks allocated : 12840000/16880000 - что значат выделенные числа?
10000 memory blocks freed : 840000/880000 - что значат выделенные числа?
1000000 unfreed memory blocks : 12000000
True heap size : 80216064 (80 used in System startup)
True free heap : 215984
Should be : 8215984

Цитата
It displays the total memory used, and then dumps a list of blocks that were allocated but not freed

На что надо смотреть? На unfreed memory blocks?

Автор: volvo 29.12.2006 20:19

Цитата
На что надо смотреть? На unfreed memory blocks?
В принципе - да, именно это показывает тебе, есть ли у тебя утечки... Так вот, если утечек нет - то нет ничего кроме заголовка...

Насчет цифр -
Цитата
12840000/16880000
Первая - это количество байт, запрошенных компилятором, вторая - число выделенных байт (с учетом гранулярности - ибо память выделяется блоками по 8 байт, и запросив 1 байт ты получишь 8)

Автор: Bokul 29.12.2006 21:58

Ага, спасибо! smile.gif

Цитата
(с учетом гранулярности - ибо память выделяется блоками по 8 байт, и запросив 1 байт ты получишь 8

Или 16..
Цитата
Each time the block is allocated, its size is normalized to have granularity of 16 bytes


Так что на самом деле дает GetHeapStatus.TotalFree? Для чего возвращаемый результат может иметь разный размер и как узнать весь объем доступной памяти?

Автор: volvo 29.12.2006 22:32

Цитата
как узнать весь объем доступной памяти
Ха... Что значит "весь объем"?

Цитата(prog.pdf)
8.7 Memavail and Maxavail
The old Turbo Pascal functions MemAvail and MaxAvail functions are no longer available in Free Pascal as of version 2.0. The reason for this incompatibility is below:
On modern operating systems the idea of "Available Free Memory" is not valid for an application.
The reasons are:
1. One processor cycle after an application asked the OS how much memory is free, another application may have allocated everything.
2. It is not clear what "free memory" means: does it include swap memory, does it include disk cache memory (the disk cache can grow and shrink on modern OS’es), does it include memory allocated to other applications but which can be swapped out, etc.

Итак, что будем считать всей памятью? wink.gif

Автор: Bokul 29.12.2006 22:45

Цитата
2. It is not clear what "free memory" means: does it include swap memory, does it include disk cache memory (the disk cache can grow and shrink on modern OS’es), does it include memory allocated to other applications but which can be swapped out, etc.

Ага, при тестировании той проги при количестве полигонов больше миллиона комп начинал жутко тормозить, а индикатор обращения к винту не утихал - размер кеша доходил до 2 гиг.
Цитата
Итак, что будем считать всей памятью?

Задам вопрос по-другому: как проверит при запуске программы доступно ли для ее работы, например, гигабайт памяти?

Автор: volvo 29.12.2006 22:55

А это тебе никто не скажет... У тебя swap-файл какой разрешен? Сколько физической памяти стоит? Сколько ее свободно в момент запуска программы? Даже если свободно больше физической памяти, чем ты указал, то кто сказал, что через секунду после запуска твоей программы не запустится, скажем, антивирус, или какой-нибудь сервис с более высоким приоритетом, и не сожрет львиную долю памяти?