Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как происходит выделение динамической памяти? 
:(
    Опции темы
Чучмек
Дата 20.6.2008, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 14
Всего: 41



Спасибо что потрудились прочитать...
Кто знает как происходит выделение динамической памяти?

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

Упрщенно суть выделениея и освобождения памяти можно показать следующим кодом

Код

var m:array[0..1023] of pointer; // 1023 - только для примера, в действительности
                                                   // массив может  быть вообще динамическим
i,n:integer;
 
begin

for i:=0 to 1023 do
getmem(m[i],512);     // В реальном случае выделяются различные объемы для 
                                   // разных элементов массива

  //Здесь идет загрузка   обработка и сохранение информации
  // после чего происходит освобождение неиспользуемой памяти  по 
  //одной прогрмме извесному принципу. Для наглядности это запишем так:
  
for i:=0 to 255 do
 begin
 n:=random(1024);   // на самом деле освобождается более неиспользуемая память, а 
 if m[n]<>nil then     // не случайно выбранная
    begin
    freemem(m[n]);
    m[n]:=nil;
    end;
 end;
  // После чего программа выполняется дальше и возникает необходимость
  // загрузки новой информации, под которую происходит выделение динамической памяти 
  //по новой. ( getmem(m[ind]; size))   и т.д. и т.п.


Теперь к сути вопроса
Имеет ли смысл освобождать выделенную под указатели память?
Действительно ли она будет освобождатся, и будет ли она доступна для последующего использования?
Насколько я понимаю, память высвобождается сплошным куском от некоторой точки (от уже выделенной памяти) при этом высвобожденная моей программой память будет анологична "дыркам в заборе", а выделение памяти по новой будет происходить с "края забора" И таким образом высвобожденная память вновь использоватся небудет.
Кто знает, подскажите пожалуйста.
Спасибо 
 



--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Alkash
Дата 21.6.2008, 06:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


Профиль
Группа: Участник
Сообщений: 516
Регистрация: 5.7.2004
Где: /

Репутация: нет
Всего: нет



[url=http://softwarer.ru/memory.html]Вот статейка...[/url ]Изучай)


--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
Чучмек
Дата 21.6.2008, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 14
Всего: 41



Цитата

[url=http://softwarer.ru/memory.html]Вот статейка...[/url ]Изучай) 



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


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Beltar
Дата 21.6.2008, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



Если мне не изменяет память (которая в голове), память (которая в микросхемах) может при необходимости перераспределяться ОС.
Вопрос такой, а насколько велики структуры данных записанные в обрабатываемых файлах? И не потоковая ли обработка, так что можно выделить с запасом например метр и в него все грузить.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Чучмек
Дата 21.6.2008, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 14
Всего: 41



Цитата

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


В том все и дело, что объмы  загружаемой информации велики (до десятков мегабайт на один элемент массива), и освобождение динамической памяти необходимо для разгрузки системы.
Загруженные  в указатели массива структуры могут обрабатыватся как поочереди так и паралельно. По окончании обработки одного элемента определяется один или несколько элементов для последующей обработки(определяются в виде индексов массива).
Плсле чего происходит проверка if m[ind]=nil then [Выделить под m[ind] память и загрузить с диска  ]; далее начинается обработка m[ind] а элемет обрабатываемый до этого, если необходимость в нем отпала, сохраняется на диск до востребования, а выделенная под него память освобождается.
В общем виде программу можно представить в виде нескольких потоков (их число меняется в ходе выполнения программы) последовательно переходящих от обработки одного элемента к другому. Причем каждый поток обрабатывает в текущий момент только один "свой" элемент.
 


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0442 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.