| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > malloc и перемещение задачи |
| Автор: EvgeniyK77 7.1.2008, 00:36 |
| Привет! У меня программа (написана на C++ под QNX4) при запуске много раз делает malloc. Так как в куче места нет, то система, чтобы всё таки выделить память, начинает двигать задачу (вроде бы). Что приводет к диким тормозам. (Если же в начале программы сделать malloc(запас), а потом free, то задача отрабатывает в несколько раз быстрее). Я вижу только такие способы борьбы с этим явлением: - Как уже написал, сначала malloc(много), затем free(). Итого - в куче места до кучи и задачу двигать в ближайшее время не надо. - Попробовать работать через shared memory. - Вместо malloc-а написать свою функцию, которая будет выделять память с некоторым запасом (чтобы минимизировать обращение к системе), которая будет работать по какому то хитрому алгоритму. Но ни один мне, честно говоря, не нравится. Может, кто-нибудь знает красивое решение этой проблемы? |
| Автор: EvgeniyK77 7.1.2008, 02:43 | ||
Ну на диск то, к счастью, ничего не свопится (нет такой возможности у QNX 4). А со сложностью задачи довольно забавно получилось: сейчас точно не скажу, но похоже, что на выделение памяти тратиться времени больше, чем на всё остальное (чтение XML, рендеринг 2D, 3D и т.д.). И ещё что интересно: некоторые другие ОС (в частности, QNX 6) как-то иначе выделяют память, т.к. тормозов нет. (Я, собственно, поэтому и обратил внимание на этот вопрос, т.к. под QNX 4 программа тормозила, а под QNX 6 - нет.) А как с этим обстоят дела под Windows, Linux и т.д.? |
| Автор: bsa 7.1.2008, 12:10 |
| EvgeniyK77, Windows и Linux умеют свопится. Если честно, я не знаю, как можно "двигать задачу" в момент ее исполнения. Если только физическое размещение в памяти поменять (путем замены данных дескриптора, например). Если ты можешь немного переписать программу, то используй так называемые пулы. Это как бы твой собственный менеджер памяти - выделение памяти происходит однократно при запуске программы (ну или возможен случай, когда делается довыделение), а все локальные выделения памяти делаются в этой области твоими силами. Кстати, в библиотеке boost есть что-то такое. |