1 frag / 2 deaths
> Или не отказывает, а останавливает процесс, запрашивающий аллокацию, пока память не освободится кем-то ещё. Если не освободилась, то уже убивает.
Нет, не или.
У виндоуз есть глобальный лимит на все аллокации в системе — рам+своп, и все системные аллокации — VirtualAlloc, HeapAlloc, LocalAlloc и прочие — берут ресурс из этого лимита.
Когда твоя программа делает сисколл в ядро с просьбой дать больше памяти — система пытается назначить часть пока ещё "ничейного" ресурса в твою пользу. Есть ресурса хватает — система забивает его за твоим процессом и возвращает указатель в твоём локальном адресном пространстве. Если не хватает — то сисколл сообщает об ошибке, в стандартной для винды форме — функция возвращает нулл, а в GetLastError оказывается код с описанием.
Если ты в своей программе готов подождать, когда память освободит кто-то другой — твоя программа должна сделать это сама, например:
void* ::operator new(size_t num) { return my_velociped_allocator.alloc( num); } void* FMyVelocipedAllocator::impl_alloc_from_system( size_t num) { for ( int tries = 0; tries < 10; ++tries) { if ( void* ptr = VirtualAlloc( 0, num, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE )) { return ptr; } Sleep( 1000); } throw std::bad_alloc{}; }
А если ты имел в виду "хотелось бы, чтобы не отказывало, а останавливало" — так ты же сам же сказал, что это только продлит ненужные мучения.
Хотя вот интересная идея, что когда ресурс памяти заканчивается или подходит к концу — ОС показывает пользователю специальное диалоговое окошко, в котором сообщает — у тебя в системе кончилась рам, вот список программ в порядке объёма отжирания, вот помеченные красненьким — прямо сейчас приостановлены внутри "malloc" в ожидании освобождения ресурсов. Так что, дорогой пользователь — закройте самые ненужные приложения крестиком, либо освободите как-нибудь память в самих приложениях, либо выберите процесс из списка и нажмите "завершить", ну или либо — вот отдельная кнопочка "временно увеличить своп на пару гигабайт для текущей сессии" (недоступна, если места на диске больше нет). Причём кнопка "увеличить своп" — нажимается автоматически, если в течение эн секунд компьютер стоит без ввода — как раз на случай сценария, когда запустили компилятор/нейрообучатель/светосчитатель и ушли афк на 4 часа.
А, ну и ещё кнопка — "больше не давать памяти конкретно вот этой наглой рыжей морде", тогда аллоки начнут фейлить конкретно в этом процессе.
Имбирная Ведьмочка
> ОС показывает пользователю специальное диалоговое окошко, в котором сообщает — у тебя в системе кончилась рам, вот список программ в порядке объёма отжирания
ну эта часть в винде есть.
Имбирная Ведьмочка
> Нет, не или.
Я про то, что в Линуксе видел
Имбирная Ведьмочка
> конкретно вот этой наглой рыжей морде
А ты догадливый
1 frag / 2 deaths
> Я про то, что в Линуксе видел
А, так это васянское поделие, оно тупо грохает процессы как ему вздумается. У Линуса работает.
Имбирная Ведьмочка
А я Вася не может сделать как в Линуксе? Звучит-то логично
1 frag / 2 deaths
> А я Вася не может сделать как в Линуксе? Звучит-то логично
Не, Линукс — это и есть васянское поделие.
Имбирная Ведьмочка
Дык у Линукса логично работает. По крайней мере с теми настройками, что у меня были
Имбирная Ведьмочка
> у него есть свой кэш, из более "крепкой" памяти, чем нанд, порядка сотен мегабайт — и записи сначала идут туда
Чего за память такая? То, что ты описываешь очень похоже на способ wear leveling, только это совсем не кеш.
Ghost2
> Чего за память такая?
DRAM, например — выше написали.
Имбирная Ведьмочка
> DRAM, например — выше написали.
Там херь какую-то написали. Во первых не съезжай со слова «крепкая». Ты там сравнивал по крепости волатильную память с неволатильной? Потом, зачем нужна DRAM на диске, если ее в системе полно. Чтобы сделать его дешевле и надежнее? Ну может есть какая-то, чтобы кешировать TLP, но там и ончип SRAM памяти контроллера для этого должно хватать, какие сотни мегабайт.
А мне в связи с SSD вот какой вопрос интересен - есть ли какие-то механизмы, которые понимают "допись в блок"?
Практически у всех файлов есть последний кластер/блок, который используется не полностью. На хардах это практически никакого значения не имеет, блок записывается полностью (потому что по-другому диск просто не работает), и в случае дописи в файл так же полностью переписывается (в том же физическом месте или в другом, без разницы).
Но вот в случае с SSD частичная запись в блок и допись в частично записанный блок могли бы иметь значение, т.к. "незаписанная" часть блока могла бы оставаться в инициализированном состоянии, позволяющем дописать новое содержимое без перемаппинга на чистые физические блоки.
Dmitry_Milk
Блоки разбиваются на страницы, контроллер управляет чипом постранично.
Имбирная Ведьмочка
> А, так это васянское поделие, оно тупо грохает процессы как ему вздумается. У Линуса работает.
Мне иногда кажется, что андроид просто по криколу в случайные моменты грохает все фоновые процессы. Решил проверить потребление памяти и установил монитор RAM. Он показывает что даже когда кроме него больше ничего не запущено, то свободно всего 2 ГБ памяти из восьми. Точно не ту систему называют прожорливой.
Zefick
> свободно всего 2 ГБ памяти из восьми
сервисами засрал, и как ты определил что ничего больше не запущенно? :)
Ghost2
> Блоки разбиваются на страницы
Так страницы все равно не размером в 1 байт, а скорее всего не меньше пары килобайт. Дописал пару байт в файл и закрыл его - получи запись пары килобайт (в страницу на новом физическом месте, хотя дописать можно было и на старом физическом месте, если остаток страницы оставался в инициализированном состоянии).