![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| EvgeniyK77 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 19.8.2006 Репутация: нет Всего: нет |
Привет!
У меня программа (написана на C++ под QNX4) при запуске много раз делает malloc. Так как в куче места нет, то система, чтобы всё таки выделить память, начинает двигать задачу (вроде бы). Что приводет к диким тормозам. (Если же в начале программы сделать malloc(запас), а потом free, то задача отрабатывает в несколько раз быстрее). Я вижу только такие способы борьбы с этим явлением: - Как уже написал, сначала malloc(много), затем free(). Итого - в куче места до кучи и задачу двигать в ближайшее время не надо. - Попробовать работать через shared memory. - Вместо malloc-а написать свою функцию, которая будет выделять память с некоторым запасом (чтобы минимизировать обращение к системе), которая будет работать по какому то хитрому алгоритму. Но ни один мне, честно говоря, не нравится. Может, кто-нибудь знает красивое решение этой проблемы? |
|||
|
||||
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 5 Всего: 39 |
EvgeniyK77, привет.
Система находит подходящий по требованию Вашей программы непрерывный кусок памяти, резервирует и даёт в пользование. Методом нахождения этого куска является езда по середине шоссе с двухсторонним движением : системе плевать, если, зарезервировав какой-то кусок, она сделала бесполезными (например, ввиду малой длины) свободные куски слева и справа от занятого. То есть память фрагментируется. В этом смысле Вы правильно говорите, что лучше сразу выделить с некоторым запасом. Но в разумных пределах.
Если нет места, система начинает свапить (swap - менять местами). Это значит, что часть содержимого оперативной памяти сбрасывается на жёсткий диск. И это действительно может происходить часами. Ещё проблема может быть в соотношении крутизны Вашего оборудования тем мощностям, которые желает потребить программа. Может, задача серьёзная, а компьютер слабый..? Это сообщение отредактировал(а) marcusmae - 7.1.2008, 01:27 -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
| EvgeniyK77 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 19.8.2006 Репутация: нет Всего: нет |
Ну на диск то, к счастью, ничего не свопится (нет такой возможности у QNX 4). А со сложностью задачи довольно забавно получилось: сейчас точно не скажу, но похоже, что на выделение памяти тратиться времени больше, чем на всё остальное (чтение XML, рендеринг 2D, 3D и т.д.). И ещё что интересно: некоторые другие ОС (в частности, QNX 6) как-то иначе выделяют память, т.к. тормозов нет. (Я, собственно, поэтому и обратил внимание на этот вопрос, т.к. под QNX 4 программа тормозила, а под QNX 6 - нет.) А как с этим обстоят дела под Windows, Linux и т.д.? |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
EvgeniyK77, Windows и Linux умеют свопится.
Если честно, я не знаю, как можно "двигать задачу" в момент ее исполнения. Если только физическое размещение в памяти поменять (путем замены данных дескриптора, например). Если ты можешь немного переписать программу, то используй так называемые пулы. Это как бы твой собственный менеджер памяти - выделение памяти происходит однократно при запуске программы (ну или возможен случай, когда делается довыделение), а все локальные выделения памяти делаются в этой области твоими силами. Кстати, в библиотеке boost есть что-то такое. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |