Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > malloc и перемещение задачи


Автор: EvgeniyK77 7.1.2008, 00:36
Привет!

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

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

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

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

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

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


Автор: marcusmae 7.1.2008, 01:25
EvgeniyK77, привет.

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

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

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

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

Автор: EvgeniyK77 7.1.2008, 02:43
Цитата

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


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

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

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


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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)