![]() |
|
Модераторы: xvr |
![]()
|
|
| georain |
|
||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Linux HSLab 2.6.25-gentoo-r7
x86_64 AMD Athlon 64 4Gb RAM При выделении максимально доступной памяти в последних блоках при заполнении программа падает. В дебаге не сообщается о seg.fail, а просто процесс заканчивается, память освобождается, а управление не возвращается. Вот простой код:
Вот вывод:
В дебаге вывод меньше:
:(((( Падает здесь:
Это сообщение отредактировал(а) georain - 13.11.2008, 16:53 |
||||||||
|
|||||||||
| GrayCardinal |
|
|||
|
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
georain,
Наверно своп отключен или маленький Добавлено через 2 минуты и 42 секунды А вообще линь при нехватке памяти имеет право погасить любую прогу Добавлено через 4 минуты и 55 секунд И я не догнал, с какого боку там "struct" ? struct Al{ |
|||
|
||||
| georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
||||
|
||||
| georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Я кажется понял, ядро память выделяет, выделяет, отдаёт всё что есть, а потом она ему самому становится нужна, и оно грохает прогу. Если так, то почему именно эту, и как интересно съедать именно столько, чтобы не падало?
|
|||
|
||||
| destrd |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 1.10.2008 Репутация: нет Всего: 4 |
всё правильно, убивает процесс который сожрал всю память. Вы о других то подумали? --------------------
Some people, when confronted with a problem, think, "I known, I'll use regular expressions." Now they have two problems. -- Jamie Zawinski in comp.lang.emacs |
|||
|
||||
| georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Ну хорошо, а как тогда написать программу которая бы корректно работала? Пусть мне надо памяти очень много, но если больше не дают, обойдусь чем есть.
Точнее так: взять у системы максимально много памяти, но не упасть. Это сообщение отредактировал(а) georain - 13.11.2008, 14:47 |
|||
|
||||
| destrd |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 1.10.2008 Репутация: нет Всего: 4 |
Потому что она всё сожрала Добавлено через 7 минут и 55 секунд
Ну попробуйте
Ну и убрать nothrow при выделении памяти. Добавлено через 11 минут и 11 секунд Хотя врядли это поможет, ядро всё равно может кильнуть --------------------
Some people, when confronted with a problem, think, "I known, I'll use regular expressions." Now they have two problems. -- Jamie Zawinski in comp.lang.emacs |
||||
|
|||||
| vTictor |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 13.2.2008 Репутация: нет Всего: нет |
Мне не нравится ++i, получается arr[0] не участвует в цикле? Следовательно выход за рамки массива. ЗЫ Ядро линух, в 32-х разрядной машине, не даёт выделиь память для одного процесса больше 3.8Гиг(или около того). Это жестко записано в ядре. Может ядро надо пересобрать? (Я не в курсе как у тебя, проверь) |
|||
|
||||
| georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Тоже самое будет, проверка на ноль с nothrow аналогична перехвату исключения. Память выделяется, но не может быть использована. Добавлено @ 15:00 У меня полная 64-х разрядность.
Это не правильно. arr[0] участвует. Но даже если бы не участвовал, с чего выход за границу будет? Добавлено Кстати, винда так делает? Или что она делает? А UNIXы стандартно? Это сообщение отредактировал(а) georain - 13.11.2008, 15:10 |
|||
|
||||
| vinick |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 4 Всего: 22 |
У тебя всего 4 гига RAM, ты захватил 3,2 гига физической памяти,когда начал писать в массив arr, и при попытке захватить больше твой процесс убивает oom-killer. Как побороть? Отключить oom-kiler и тогда я не представляю как будет вести себя система или следить за количеством захваченой памяти и не выходить за рамки приличия или подключить своп терабайта на 2-3.
|
|||
|
||||
| georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
vinick, я спрашиваю как это сделать средствами языка. Это же ведь не нормально, когда приложение падает! Оно не выполняет никаких запрещённых действий и тут нет логических ошибок!
Мне это вообще не понятно, зачем он её тогда выделяет, мог бы просто перестать выделять. Столько мороки в стандартах и в коде по поводу исключения bad allocate, а реально оказывается оно на фиг не нужно, всё равно всё умрёт. Короче моему возмущению нет придела |
|||
|
||||
| vinick |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 4 Всего: 22 |
Средствами языка это не решить. Никак. Ты сожрал всю память и хочешь чтобы тебе послали исключение или сигнал? а ведь им тоже для этого ресурсы нужны.
Он не может не выделять. так как тебе положено 2^64-1 байт виртуального адресного пространства на процесс.
Не путай выделение памяти и отображение виртуальной памяти на физические адреса. bad allocate, это для первого, а у тебя проблема во втором. Ненормально когда приложение жрет столько памяти Это сообщение отредактировал(а) vinick - 13.11.2008, 16:03 |
||||
|
|||||
| vTictor |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 13.2.2008 Репутация: нет Всего: нет |
Ещё замечание:
выделаеш память так arr = new(nothrow) uint8[b];, а освобождаешь так delete arr;. Нужно delete [] arr; Ты в цикле выделяешь память для масива arr, на каждой итерации ему присваевается новое значение указателя, а старое теряется. Когда ты его заполняешь, то заполняешь не всю выделеную память. если надо увеличивать один и тот же блок, юзай realloc. Да и вообще, зачем такие извращения? Это сообщение отредактировал(а) vTictor - 13.11.2008, 16:17 |
|||
|
||||
| vinick |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 4 Всего: 22 |
||||
|
||||
| vTictor |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 13.2.2008 Репутация: нет Всего: нет |
vinick, точно. Я не заметил :(
|
|||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |