Що ви робите, коли mallocповертається 0 або викиди нових кидків? Просто зупиніть або спробуйте пережити стан OOM / зберегти роботу користувача?
Що ви робите, коли mallocповертається 0 або викиди нових кидків? Просто зупиніть або спробуйте пережити стан OOM / зберегти роботу користувача?
Відповіді:
Я уникав би OOM, як уникнути аварії.
Уникайте робити величезну частину роботи (і виділяти величезну частину пам'яті) відразу. Зберігайте дані на диску, довіряйте кеш диска ОС і максимально використовуйте IO, відображений на пам'яті, і працюйте лише з невеликою частиною даних одночасно. Якщо великі обсяги даних потребують он-лайн (подаються з низькою затримкою), то зберігайте їх у пам'яті на кількох машинах, як це роблять усі великі пошукові компанії. Або придбати SSD.
Більшість людей, які відповідають на це питання, напевно, ніколи не працювали над вбудованими системами, де повернення malloc 0 є реальною можливістю. У системі, над якою я зараз працюю, є всього 4,25 Кбайт оперативної пам’яті (це 4352 байти). Я виділяю 64 байти для стека, а в даний час маю 1600 байт. Лише вчора я налагоджував звичайну процедуру прогулянки купою, щоб я міг слідкувати за розподілом та звільненням пам’яті. Куповий прохід використовує невеликий (30 байт) статично виділений буфер для виведення на послідовний порт. Він буде вимкнено для версії версії.
Оскільки це споживчий продукт, то краще не вичерпати пам'ять, коли продукт буде випущений. Я впевнений, що буде під час розвитку. У будь-якому випадку, про все, що я можу зробити, це пролунати звуковий сигнал динаміка пару разів і примусити перезавантажити.
Якщо чесно, то в усіх проектах, які я робив (майте на увазі, я ще ніде не працюю), я ніколи не вважав, що це може статися, і, таким чином, я вважаю, що мої програми загинуть дуже швидко.
Крім того, обробка OOM вимагає попередньо виділити ресурси для відображення повідомлення про помилку або зберегти все, що може бути незручно.
Я відчуваю, що в ці дні пам’ять коштує менше, ніж арахіс, це не те, що має траплятися часто. На зорі захищеної пам’яті та раніше, можливо, це було турботою, але зараз? Єдині помилки OOM, які я коли-небудь бачив, були з помилкового коду.
Перевірка кодів повернення malloc взагалі є безглуздим.
Сучасні операційні системи переповнюють пам'ять: вони дають процесам більше пам’яті, ніж є насправді. Пам'ять, яку надається вашому процесу, є віртуальною, і все відображено на одній нульовій сторінці.
Це не поки ви не запишете в пам'ять, що фізична, унікальна сторінка виділяється для ваших процесів. Якщо цього розподілу не вдасться, ядро припинить процес (можливо, ваш!) У спробі знайти пам'ять. На той момент більше нічого не можна робити.
Якщо ви не розробляєте для вбудованих систем, систем у режимі реального часу або систем, які є настільки критичними, що збої можуть коштувати життя або мільярди доларів ... Тоді, мабуть, не варто цього турбуватися з-за умов пам'яті.
У більшості випадків мало що можна зробити, коли у вас все одно немає пам’яті, оскільки немає пам'яті для створення нових об’єктів або виконання будь-яких завдань, які можуть щось робити. Ви повинні зважити вартість роботи програми з OOM порівняно з вигодою, яку ви отримаєте від цього.
Я завжди перевіряв би на помилку. Якщо щось повертає стан помилки, тоді це має вирішувати ваша програма. Навіть якщо це повідомлення, яке говорить: "З пам’яті, треба йти!", Це краще, ніж "Порушення доступу", "Ядро скинуто" чи будь-що інше. Один - це помилка, з якою ви працюєте, інший - помилка. І користувач сприйме це як таке.
У конкретному випадку ви можете спробувати відмовити операцію, звільнивши виділені ресурси до досягнення збою, повідомивши про помилку та продовжуючи виконання (можливо, коли ви намагаєтеся вийти з програми, ви можете надати можливість негайно вийти). Таким чином, користувач може вирішити, що робити, або спробувати звільнити деяку пам'ять, обертаючись, закриваючи файли і т. Д. Звичайно, як виправити ситуацію, сильно залежить від вашої програми - програми, яка не повинна бути інтерактивним, ймовірно, потрібно просто зареєструвати помилку і або вийти, або продовжити.