Здравствуйте. Изучаю виртуальную память и страничную организацию, а конкретно в данный момент фрагментацию. Наткнулся на совершенно непонятный текс у Таненбаума. Вот раздел целеком: Мне совсем ничего не ясно, откуда взялась цифра 80Мб и почему такая разница (80 и 10)? Что тут вообще происходит. Причем текст перед этим выделенным абзацем вполне ясен. Помогите пожалуйста разобраться.
В рассматриваемом случае элементы матрицы хранятся последовательно по стобцам (т.е. сначала идут эл-ты столбца 1, затем 2 и т.д.). Поэтому если последовательно обрабатыывать элементы не столбца, а строки, то обращение к каждому элементу будет означать обращение к новой странице. Поскольку элементов в строке 10000, т.е. нужно будет обратиться к 10000 страницам, поэтому если размер страницы 8К, то получаем 80Мб, если 1К, то 10Мб PS: вообще-то в данном сл.размер страницы притянут за уши, т.к. при обработке больших матриц нужно просто соблюдать принцип "локализации данных", т.е. обрабатывать их в той последовательности в которой они хранятся в памяти (в данном сл.нужно обрабатывать не строки а столбцы).
DeathAndDevastating Еще растолкую на всякий случай. Т.е. речь шла не о том сколько памяти требуется, а сколько должно присутствовать в реальной памяти при обработке одной строки. Достаточно было теперь вторую строку обрабатывать в обратном порядке, чтобы оптимизировать подкачку. В конце концов было доказано или принято, что большие страницы - это лучше.
А откуда взялась цифра 80Мб? Ведь 10 000 * 10 000 * 8байт = 800 000 000 байт. Потом выше написано, что неполной страницей может быть только последняя страница. Матрица представляется в памяти линейно (т.е. для 2x2 так: 0,0; 0,1; 1,0; 1,1) и вся матрица принадлежит одной программе -какая разница как обрабатывать матрицу? Почему каждая область отделена от другой на 79 992 байт (9999 элемнтов)? Ничего не могу понять вообще..( Скорее всего я тупой. leo если каждому столбцу из 10000 элемнотов соответсвует страница 8k, то как же столбец уместился в эту страницу, если 10 000 элементов по одному байту занимают 10 000 байт = 9,765625 Кб? -а в примере говорится о том что элемент равен слову из 8 байт, т.е. еще больше.
DeathAndDevastating Просто у Таненбаума неправильная матрица. Элементы его матрицы располагаются в памяти вот так (для 3х3): 0,0; 1,0; 2,0; 0,1; 1,1; 2,1; 0,2; 1,2; 2,2. Представь матрицу в виде вектора. Допустим, если у нас есть матрица 16384х16384, то её можно представить как вектор из 268 435 456 элементов. Пусть программа работает только с одной строкой Таненбаумовской матрицы. Тогда в памяти должны находиться страницы с каждым шестнадцатитысячным трёхсот восьмидесяти четвёртым элементом. При размере элемента в 8 байт и размере страницы 8кб в память будут загружены следующие элементы вектора: 00000..01023 16384..17407 32768..33791 И т.д., хотя реально использоваться будут только нулевой, шестадцатитысячный трёхс.., тридцатидвухтысячный семьс.., и т.д. Т.е. 1023/1024 памяти расходуется впустую. При размере страницы в 1кб будут загружены следующие элементы вектора: 00000..00127 16384..16411 32768..32895 Теперь впустую расходуется лишь 127/128 памяти.
Sol_Ksacap Большое спасибо за помощь!!! Я все понял) Еще раз огромное спасибо!) leo valterg Большое спасбо Вам за помощь!! П.С. Просто я с самого начала не о том начал думать.. и ушел в другое направление. (надо тренировать мозг)