Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> malloc и перемещение задачи 
:(
    Опции темы
EvgeniyK77
Дата 7.1.2008, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет!

У меня программа (написана на C++ под QNX4) при запуске много раз делает malloc. Так как в куче места нет, то система, чтобы всё таки выделить память, начинает двигать задачу  (вроде бы). Что приводет к диким тормозам. (Если же в начале программы сделать malloc(запас), а потом free, то задача отрабатывает в несколько раз быстрее).

Я вижу только такие способы борьбы с этим явлением:

- Как уже написал, сначала malloc(много), затем free(). Итого - в куче места до кучи и задачу двигать в ближайшее время не надо.

- Попробовать работать через shared memory.

- Вместо malloc-а написать свою функцию, которая будет выделять память с некоторым запасом (чтобы минимизировать обращение к системе), которая будет работать по какому то хитрому алгоритму.

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


PM MAIL   Вверх
marcusmae
Дата 7.1.2008, 01:25 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



EvgeniyK77, привет.

Система находит подходящий по требованию Вашей программы непрерывный кусок памяти, резервирует и даёт в пользование. Методом нахождения этого куска является езда по середине  шоссе с двухсторонним движением : системе плевать, если, зарезервировав какой-то кусок, она сделала бесполезными (например, ввиду малой длины) свободные куски слева и справа от занятого. То есть память фрагментируется. В этом смысле Вы правильно говорите, что лучше сразу выделить с некоторым запасом. Но в разумных пределах.

Цитата(EvgeniyK77 @  7.1.2008,  00:36 Найти цитируемый пост)
Так как в куче места нет, то система, чтобы всё таки выделить память, начинает двигать задачу  (вроде бы).

Если нет места, система начинает свапить (swap - менять местами). Это значит, что часть  содержимого оперативной памяти сбрасывается на жёсткий диск. И это действительно может происходить часами.

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


Это сообщение отредактировал(а) marcusmae - 7.1.2008, 01:27


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
EvgeniyK77
Дата 7.1.2008, 02:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Если нет места, система начинает свапить (swap - менять местами). Это значит, что часть  содержимого оперативной памяти сбрасывается на жёсткий диск. И это действительно может происходить часами.


Ну на диск то, к счастью, ничего не свопится (нет такой возможности у QNX 4).

А со сложностью задачи довольно забавно получилось: сейчас точно не скажу, но похоже, что на выделение памяти тратиться времени больше, чем на всё остальное (чтение XML, рендеринг 2D, 3D и т.д.).

И ещё что интересно: некоторые другие ОС (в частности, QNX 6) как-то иначе выделяют память, т.к. тормозов нет. (Я, собственно, поэтому и обратил внимание на этот вопрос, т.к. под QNX 4 программа тормозила, а под QNX 6 - нет.) А как с этим обстоят дела под Windows, Linux и т.д.?


PM MAIL   Вверх
bsa
Дата 7.1.2008, 12:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



EvgeniyK77, Windows и Linux умеют свопится.
Если честно, я не знаю, как можно "двигать задачу" в момент ее исполнения. Если только физическое размещение в памяти поменять (путем замены данных дескриптора, например).

Если ты можешь немного переписать программу, то используй так называемые пулы. Это как бы твой собственный менеджер памяти - выделение памяти происходит однократно при запуске программы (ну или возможен случай, когда делается довыделение), а все локальные выделения памяти делаются в этой области твоими силами. Кстати, в библиотеке boost есть что-то такое.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

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


 




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


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

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