Vsevolod
мусором посчитали твою память?
Snusmumriken
Ага. Типа, её как грязи, значит можно жрать.
Anonymous
В интернет эксплорере старом даже сегфолты были. Мне кажется это известный мем
Anonymous
Виндовый эксплорер, кстати, живёт все время работы виндовс, от загрузки до ребута
Anonymous
И если написать программу на cpp/cli то там гц опциональный
Snusmumriken
Я прост не ребутаю комп месяцами, поэтому легко отслеживаю такие штуки )))
Vsevolod
ну, почитай тогда и про memory fragmentation на досуге
Snusmumriken
Спасибо, в курсе. Но есть такая штука как дефрагментация, в том числе оперативной памяти в рантайме.
И да, оно не бесконечно растёт, просто оверхед получается примерно в 3-5 раз больше чем нужно. Но не полтора гигабайта : )
Куски памяти освобождаются и на их место встают более мелкие кусочки, которые потом тоже удаляются.
Anonymous
Дотнетовский гц дефрагментирует вроде бы, сам
Vsevolod
если памяти много, то аллокаторы не заморачиваются этим
Anonymous
Аллокатор, который системный? Или который в clr?
Vsevolod
да и в 64-битных системах с виртуальной памятью вся эта дефрагментация - мышиная возня
Snusmumriken
Восхитительная манера снижения нагрузки на цпу ценой памяти.
Только вот в чём проблема, цпу у меня много и не особо жалко, я не против того чтобы дефрагментировали и только за : )
Snusmumriken
А потом я открываю visual studio, и пол сотни процессов начинают судорожно пересобираться, чтобы упаковать её в память (своп отключён).
Anonymous
Вообще, как я недавно начал думать, с дизайне современных процессоров еще больше дебилизма, чем в дизайне современных ОС
Vsevolod
ты не понимаешь
Anonymous
Не зря же годард делает свой милл
Vsevolod
аллокатор говорит ОС не munmap/sbrk, а madvice(WILL_NOT_NEED), на что ОС не снимает маппинг, но при этом имеет право на итерации gc выкинуть эти страницы из резидентных, не закидывая их в своп
Vsevolod
поэтому RSS программы не уменьшается, а оперативку она не жрет
Anonymous
Это замечательно
Vsevolod
это позволяет потом аллокатору эти маппинги реюзать без mmap
Anonymous
Да уж, хорошо сделано
Snusmumriken
Ага. Только что делать с зажравшимися прогами, которые не хотят чистить кеш и дефрагментироваться.
Хром и visual studio обладают манерой считать что они - единственные приложения на ПК, и что ПК однозадачен, и создан чтобы катать их.
Какой тогда был смысл переходить с DOS? : )
Anonymous
Vsevolod
еще раз: ты не знаешь, сколько кто реально есть оперативки
Vsevolod
имеют значение резидентные страницы, либо swap backed страницы
Snusmumriken
Знаю. В точности до байта.
Vsevolod
бгг, ну что ж, не буду тогда тебя переубеждать
Snusmumriken
Вот с этого момента, данная страница памяти зарезервированная гугл-хромом перестаёт "реально потреблять" память, но резервирует.
Vsevolod
за винду не скажу. в линуксе все происходит ровно так, как я описал
Vsevolod
когда ты говоришь mmap, то никакой аллокации не происходит
Vsevolod
по крайней мере, аллоцируется далеко не все
Vsevolod
аллокация происходит при page fault
Danil
Есть технология blockchain написанная на Lua
Vsevolod
аналогично, если ты говоришь madvice(WILL_NOT_NEED) на маппинг, то ОС может делать с этим маппингом что угодно и когда угодно
Vsevolod
никаких резервов и прочей ереси там нет
Snusmumriken
На самом деле, ты сыплешь на меня кучей непонятных слов, за исключением "аллокации/реаллокации", поэтому я бы посоветовал тебе объяснять как пятилетнему ребёнку.
Но уже поздно.
Vsevolod
ну смотри, есть вызов mmap: он выделяет *адресное пространство*
Vsevolod
типа, хочу я 100500 байт
Vsevolod
тебе ОС говорит: вот тебе кусок виртуальной памяти с адреса 0xdeadbabe длиной 100500 байт
Vsevolod
но виртуальная память не обязательно отображается в физическую
Vsevolod
пока ты в этот кусок ничего не понасрал, то это адресное пространство может вообще не отображаться в оперативку
Vsevolod
но тогда, когда ты 100500 байт туда насрал, то это адресное пространство обязано где-то быть (в оперативке или свопе)
Snusmumriken
Потому что страницы и прочие трансляции, типа ОС резервирует кусок побольше, во-первых на округление страниц, а во-вторых, на случай если ты ещё захочешь памяти, чтобы не фрагментировать мелкие куски. НАВЕРНОЕ (то, как бы поступил я).
Vsevolod
это использованная память
Vsevolod
а когда ты какие-то куски внутри этого блока в 100500 байт отдал обратно системе, сказав через madvice, что тебе эти куски не нужны, то ОС может снять с них memory/swap backend и его заюзать под другие нужды (в других memory mappings)
Vsevolod
это называется page recycle
Vsevolod
а у исходной программы будет все тот же блок на 100500 байт, но с дырами внутри
Snusmumriken
Пойду дефрагментирую
Vsevolod
поэтому дефрагментация вообще не нужна, если у тебя бесконечный address space
Vsevolod
а он в случае x86_64 именно такой
Vsevolod
ну и дальше ты работаешь с дырявыми блоками, все хорошо
Snusmumriken
Покажи мне бесконечное адресное пространство, расположенное на физической памяти : )
Vsevolod
2^48 бесконечный для любых существующих на практике задач
Snusmumriken
Уточнил.
Vsevolod
а сейчас он 2^56
Vsevolod
что делает большой FUUUU для luajit
Vsevolod
но там, вроде, 4-й уровень страниц вводится как-то хитро, что luajit это обходит
Snusmumriken
Ты это, того. Меня не это интересует. Мне интересно то, что это "бесконечное адресное пространство" замечательно работает в том случае, если на одном ПК запущен ровно один тяжёлый процесс.
Vsevolod
да при чем тут это?
Vsevolod
у каждого процесса свои 2^48
Vsevolod
ну и плюс ведро, да
Vsevolod
которое цепляется к каждому процессу в каком-то верхнем или нижнем адресе
Vsevolod
у чрома 2^48, у блокнота 2^48, даже у неба и Аллаха по 2^48
Vsevolod
дефрагментация ненужных страниц делается средствами OS, потому что у ядра есть доступ в mmu
Vsevolod
и вместо копирования оно делает remap
Vsevolod
впрочем, иногда тоже копирует из соображений непрерывности
Vsevolod
а все префетчи и прочие ассемблерные фокусы все равно работают только до page boundary
Snusmumriken
Хм. 2^48 это примерно 1024 * (2 ^ 38) = 1024 * 1024 * (2^28) =
= 1024 * 1024 * 1024 * 1024 * (2^8) байт.
То есть, примерно, адресное пространство на 2^8 петабайт. Восхитительно.
Vsevolod
для КАЖДОГО процесса
Vsevolod
именно так работает виртуальная память, да
Snusmumriken
Это очень, очень здорово. Настолько здорово, что где ты найдёшь столько физической памяти?
Vsevolod
я же написал выше, как это взаимодействует с физической памятью
Snusmumriken
Каждый процесс думает что ему персонально выделено 2^8 петабайт.
Один процесс и занял свои 2^8 петабайт, закакал всё своими кешами.
Другой процесс думает что ему выделено ровно столько же, и пытается закакать.
Vsevolod
ну это уже не зависит от петабайт виртуальной памяти
Snusmumriken
Только вот беда: физической памяти - 256 мегабайт и ниипёт )))
Vsevolod
мой спич лишь к тому, что очень сложно понять, сколько процесс засрал кешами, а сколько он уже успел отдать в recycle
Vsevolod
OS может этот процесс делать оччень лениво
Snusmumriken
Понятное дело что идут отказы в выделении и всё такое, часть процессов на отказах начинают чистить кеши, собирать мусор и всё такое.
Только вот ещё одна проблема: они все начинают делать ОДНОВРЕМЕННО. Комп вешается на несколько минуточек.
Vsevolod
лол