Пост создан для публикации одной единственной картинки (кликабельна). На мой взгляд, она как нельзя лучше передаёт атмосферу того как устроена память в компьютере. Я изобразил её на 3-4 курсе института на A4 при объяснении положения дел товарищу. Так она мне тогда понравилась, что дал себе обещание нарисовать её в электронном виде.
Исходник в формате VSD (Microsoft Visio) лежит у меня в DropBox. Если имеются уточнения, поправки, комментарии — прошу под кат.
Отношение между ВАП и ВП:
Образ загружается в виртуальную память системы (ВП) единожды и проецируется в те виртуальные адресные пространства (ВАП), в которых он востребован. Образ EXE или DLL идентифицируется уникальным путём к файлу. Соответственно, если к одному и тому же файлу ведут несколько путей, можно произвести множественную загрузку одного и того же модуля. В системе имеется набор DLL, которые подгружаются во все программы, такие как kernel32.dll и прочие…
Отношение между ВП и ФП:
Физическая память (ФП) состоит из страниц. Любой модуль EXE или DLL занимает некоторое число таких страниц. При загрузке системой модулей для них ищутся свободные страницы, в которые загружается образ файла. Модули проецируются в виртуальную память и загружаются в физическую по мере необходимости средствами ОС. Также проецирование можно использовать для пользовательских файлов (также называется маппинг файлов — mapping).
Отношение между ФП и железом:
Операционная система может по своему усмотрению перемещать страницы физической памяти в файл подкачки и обратно. При обращении исполняемого кода к странице, находящейся в файле подкачки, производится выгрузка страницы в ОЗУ. Если к странице долгое время не осуществлялся доступ и возникла потребность в памяти, ОС может перемещение страницы в файл подкачки.
|
0 / 0 / 0 Регистрация: 16.02.2021 Сообщений: 3 |
|
16.02.2021, 01:27. Показов 1782. Ответов 7 Здравствуйте, суть такова: планирую установить 2 операционные системы Windows на один компьютер с целью сделать одну игровой а вторую офисной. Но останавливает тот факт что я не знаю как будет распределятья нагрузка ЦП и оперативной памяти между системами. Т.е. Раньше при одной системе винды CPU в спокойном состоянии работает на 1-3%, в тот момент RAM загружен на 43-51%. И вот сама суть вопроса, на грузка на составляющие будет больше при установленных системах? (ВАЖНО просто установленных, а не запущенных одновременно). И будет ли общий диск или у каждой системы будет свой диск и информация с двух систем не будет объединяться? Путем задаю ещё один вопрос: Всем кто поможет да и просто откликнится долгих лет и жизни и огромное спасибо, вы лучшие!!!
0 |
9977 / 5448 / 1238 Регистрация: 12.03.2015 Сообщений: 25,328 |
|
16.02.2021, 01:31 |
|
Сообщение было отмечено VladMM как решение РешениеСообщение от VladMM Здравствуйте, суть такова: планирую установить 2 операционные системы Windows на один компьютер с целью сделать одну игровой а вторую офисной. С учётом того, что я прочитал ниже, скажу так:
не делай так. Никакого смысла в этом мероприятии нет, только места на носителе будет меньше.
1 |
0 / 0 / 0 Регистрация: 16.02.2021 Сообщений: 3 |
|
16.02.2021, 01:34 [ТС] |
|
Просто в осном память забивается фоновыми процессами и службами которые постоянно отслеживать и отключать порой надоедает, вот и хочется компухтеру по полочкам все расставить по типу вот тебе одна система тут игрушки и незачем процессам от офисных программ и прочей пакости лезть и мешать
0 |
9977 / 5448 / 1238 Регистрация: 12.03.2015 Сообщений: 25,328 |
|
16.02.2021, 01:44 |
|
Сообщение от VladMM вот тебе одна система тут игрушки Чо за игрушки там у тебя на этом калькуляторе из прошлого? Сапёр и косынка?
1 |
0 / 0 / 0 Регистрация: 16.02.2021 Сообщений: 3 |
|
16.02.2021, 01:53 [ТС] |
|
Сказать честно хоть и калькулятор, но с небольшим секретом и порой даже игрухи 2018 года потянет на мыльном графоне)))) Благо видюха спасает не сильно но спасает! Спасибо на толкнул на мысль одну! Поэтому тебе респект! Добавлено через 4 минуты Сообщение от Verevkin Винду настроить надо грамотно, и тогда ничего лишнего болтаться в памяти не будет. Хотелось бы ещё и об этом пробробностец немного, так как источников море, но все слагается к программам «которые не помогут даже кошке хвост поднять»
0 |
6524 / 4100 / 1606 Регистрация: 09.05.2015 Сообщений: 9,562 |
|
16.02.2021, 02:06 |
|
Железо нормальное купи и не будет ничего никуда забиваться. У меня вот подобных проблем почему-то не возникает…
0 |
9977 / 5448 / 1238 Регистрация: 12.03.2015 Сообщений: 25,328 |
|
16.02.2021, 02:45 |
|
Сообщение от VladMM Хотелось бы ещё и об этом пробробностец немного, так как источников море, но все слагается к программам «которые не помогут даже кошке хвост поднять» Универсальных решений и кнопок «сделать
хорошо» не бывает. Всё зависит от ситуации, требований, параметров железа и места, откуда у тебя руки растут. Ошибайся и приобретёшь опыт.
0 |
42 / 39 / 6 Регистрация: 16.06.2020 Сообщений: 198 |
|
16.02.2021, 07:43 |
|
Сообщение от VladMM Но останавливает тот факт что я не знаю как будет распределятья нагрузка ЦП и оперативной памяти между системами И ЦП и оперативная память будет работать только на загруженную систему, вторая (не загруженная ОС) никак влиять на загруженную не будет. Сообщение от VladMM И вот сама суть вопроса, на грузка на составляющие будет больше при установленных системах? Каждая система будет независима, и влияния друг на друга оказывать не будет, не зависимо от того общий у них загрузчик или свой на каждую ОС Сообщение от VladMM И будет ли общий диск или у каждой системы будет свой диск и информация с двух систем не будет объединяться? Вы должны будете установить вторую ОС или на другой раздел этого диска или на другой физический диск и информация этих дисков объединятся не будет, кроме тех разделов, которые вы захотите сами объеденить.
0 |
raxper Эксперт 30234 / 6612 / 1498 Регистрация: 28.12.2010 Сообщений: 21,154 Блог |
16.02.2021, 07:43 |
8 |
Новые блоги и статьи
Все статьи Все блоги / |
||||
Чем асинхронная логика (схемотехника) лучше тактируемой, как я думаю, что помимо энергоэффективности — ещё и безопасность.
Hrethgir 14.05.2025 Помимо огромного плюса в энергоэффективности, асинхронная логика — тотальный контроль над каждым совершённым тактом, а значит — безусловная безопасность, где безконтрольно не совершится ни одного. . . |
Многопоточные приложения на C++
bytestream 14.05.2025 C++ всегда был языком, тесно работающим с железом, и потому особеннно эффективным для многопоточного программирования. Стандарт C++11 произвёл революцию, добавив в язык нативную поддержку потоков,. . . |
Stack, Queue и Hashtable в C#
UnmanagedCoder 14.05.2025 Каждый опытный разработчик наверняка сталкивался с ситуацией, когда невинный на первый взгляд List<T> превращался в узкое горлышко всего приложения. Причина проста: универсальность – это прекрасно,. . . |
Как использовать OAuth2 со Spring Security в Java
Javaican 14.05.2025 Протокол OAuth2 часто путают с механизмами аутентификации, хотя по сути это протокол авторизации. Представьте, что вместо передачи ключей от всего дома вашему другу, который пришёл полить цветы, вы. . . |
Анализ текста на Python с NLTK и Spacy
AI_Generated 14.05.2025 NLTK, старожил в мире обработки естественного языка на Python, содержит богатейшую коллекцию алгоритмов и готовых моделей. Эта библиотека отлично подходит для образовательных целей и. . . |
Реализация DI в PHP
Jason-Webb 13.05.2025 Когда я начинал писать свой первый крупный PHP-проект, моя архитектура напоминала запутаный клубок спагетти. Классы создавали другие классы внутри себя, зависимости жостко прописывались в коде, а о. . . |
Обработка изображений в реальном времени на C# с OpenCV
stackOverflow 13.05.2025 Объединение библиотеки компьютерного зрения OpenCV с современным языком программирования C# создаёт симбиоз, который открывает доступ к впечатляющему набору возможностей. Ключевое преимущество этого. . . |
POCO, ACE, Loki и другие продвинутые C++ библиотеки
NullReferenced 13.05.2025 В C++ разработки существует такое обилие библиотек, что порой кажется, будто ты заблудился в дремучем лесу. И среди этого многообразия POCO (Portable Components) – как маяк для тех, кто ищет. . . |
Паттерны проектирования GoF на C#
UnmanagedCoder 13.05.2025 Вы наверняка сталкивались с ситуациями, когда код разрастается до неприличных размеров, а его поддержка становится настоящим испытанием. Именно в такие моменты на помощь приходят паттерны Gang of. . . |
Создаем CLI приложение на Python с Prompt Toolkit
py-thonny 13.05.2025 Современные командные интерфейсы давно перестали быть черно-белыми текстовыми программами, которые многие помнят по старым операционным системам. CLI сегодня – это мощные, интуитивные и даже. . . |
Наверх
Applies ToWindows 11 Windows 10
Storage Spaces helps protect your data from drive failures and extend storage over time as you add drives to your PC. You can use Storage Spaces to group two or more drives together in a storage pool and then use capacity from that pool to create virtual drives called storage spaces. These storage spaces typically store two copies of your data so if one of your drives fails, you still have an intact copy of your data. If you run low on capacity, just add more drives to the storage pool.
You need at least two extra drives (in addition to the drive where Windows is installed). These drives can be internal or external hard drives, or solid state drives. You can use a variety of types of drives with Storage Spaces, including USB, SATA, and SAS drives.
-
Add or connect the drives that you want to group together with Storage Spaces.
-
Go to the taskbar, type Storage Spaces in the search box, and select Storage Spaces from the list of search results.
-
Select Create a new pool and storage space.
-
Select the drives you want to add to the new storage space, and then select Create pool.
-
Give the drive a name and letter, and then choose a layout. Two-way mirror, Three-way mirror, and Parity can help protect the files in the storage space from drive failure.
-
Enter the maximum size the storage space can reach, and then select Create storage space.
-
Simple spaces are designed for increased performance, but don’t protect your files from drive failure. They’re best for temporary data (such as video rendering files), image editor scratch files, and intermediary compiler object files. Simple spaces require at least two drives to be useful.
-
Mirror spaces are designed for increased performance and protect your files from drive failure by keeping multiple copies. Two-way mirror spaces make two copies of your files and can tolerate one drive failure, while three-way mirror spaces can tolerate two drive failures. Mirror spaces are good for storing a broad range of data, from a general-purpose file share to a VHD library. When a mirror space is formatted with the Resilient File System (ReFS), Windows will automatically maintain your data integrity, which makes your files even more resilient to drive failure. Two-way mirror spaces require at least two drives, and three-way mirror spaces require at least five.
-
Parity spaces are designed for storage efficiency and protect your files from drive failure by keeping multiple copies. Parity spaces are best for archival data and streaming media, like music and videos. This storage layout requires at least three drives to protect you from a single drive failure and at least seven drives to protect you from two drive failures.
After you upgrade to Windows, we recommend that you upgrade your existing pools. With an upgraded pool, you can optimize drive usage and remove drives from pools without affecting the pool’s protection from drive failure.
Note: Upgraded pools aren’t compatible with previous versions of Windows.
When you add new drives to an existing pool, it’s a good idea to optimize drive usage. This will move some of your data to the newly added drive to make the best use of the pool’s capacity. It’ll happen by default when you add a new drive to an upgraded pool in Windows you’ll see a check box for Optimize to spread existing data across all drives selected when you add the drive. However, if you cleared that check box or added drives before upgrading a pool, you’ll need to manually optimize drive usage. To do so, type Storage Spaces in the search box on the taskbar, select Storage Spaces from the list of search results, and then select Optimize drive usage.
If you created a pool in Windows or upgraded an existing pool, you’ll be able to remove a drive from it. The data stored on that drive will be moved to other drives in the pool, and you’ll be free to use the drive for something else.
-
Go to the taskbar, type Storage Spaces in the search box, and select Storage Spaces from the list of search results.
-
Select Change settings > Physical drives to see all the drives in your pool.
-
Find the drive you want to remove and select Prepare for removal > Prepare for removal. Leave your PC plugged in until the drive is ready to be removed. This could take several hours, depending on how much data you have stored there.
-
(Optional) To speed up drive preparation, prevent your PC from going to sleep. Select Start > Settings > System > Power & battery > Screen and sleep. Next to When plugged in, put my device to sleep after select Never.
-
When the drive is listed as Ready to remove, select Remove > Remove drive. Now, you can disconnect the drive from your PC.
Note: If you run into problems when you try to prepare the drive for removal, it might be because you don’t have enough free space in the pool to store all the data from the drive you want to remove. Try adding a new drive to the pool that’s as large as the drive you plan to remove and then try again.
Need more help?
Want more options?
Explore subscription benefits, browse training courses, learn how to secure your device, and more.
Начнем с традиционных «отмазок». Описываемые функции, особенности работы ОС и используемые алгоритмы документированы крайне скудно, либо не документированы вообще. Информация, добытая из разных источников, оказалась частично противоречивой. Я постарался сложить ее кусочки воедино, но гарантировать, что нигде и ни в чем не ошибся, не могу. Попытки теми или иными путями выйти на людей, хорошо знакомых с внутренним устройством упоминаемых здесь модулей ОС, оказались безуспешными — слишком много лет прошло. И в некоторых случаях не оставалось ничего иного, как заниматься реконструкцией, вроде того как по нескольким найденным костям устанавливают облик какого-нибудь динозавра. Поэтому если вдруг вы обнаружите ошибку или неточность, я буду благодарен за высказанные замечания. А теперь переходим к нашим «баранам».
Хотя Windows 98 и Windows Me можно с уверенностью назвать устаревшими системами, они все еще установлены на достаточно большом числе компьютеров. Причины этого могут быть самыми различными — от недостаточной мощности компьютеров, не «тянущих» современные ОС, до наличия программ и оборудования, не работающих под Windows 2000 и ХР.
И если на старых машинах с памятью может возникать только одна проблема — её недостаток, то на новых ситуация оказывается более сложной.
Например, крутится в компании на старой машине некая учетная или бухгалтерская программа, написанная много лет назад и все еще вполне устраивающая тех, кто ее использует. Но вот беда, старый компьютер сломался, на новом компьютере с ХР программа не работает. Или стоит у человека старый сканер, который нужен от случая к случаю и вполне устраивает своего владельца. Но для WinXP драйверов этого сканера не существует, а выбрасывать его и покупать новый — жалко. Да и незачем — ведь работает!
В таких случаях самым очевидным решением является установка на новый компьютер Windows 98 или Windows Me либо в конфигурациях с двойной загрузкой, либо как единственной системы.
Но если в компьютере достаточно много оперативной памяти, то эти ОС могут вообще не установиться, либо то и дело зависать во время работы. Недаром в форумах и конференциях так много утверждений о том, что Windows 98 не способна использовать больше 512 Мб памяти.
Попробуем разобраться, в чем тут дело. Сразу отбросим в сторону ситуации, когда для нового «железа» отсутствуют драйверы для Windows 98 (здесь и далее если речь идет о Win98 и явно не оговорено иное, подразумеваются три операционные системы: Win98, Win98SE и WinMe), не отключена гиперпоточность в пентиумах 4 и т. п. Речь пойдет только об одном — особенностях работы Windows 98 при большом объеме установленной оперативной памяти.
Как правило, если памяти не больше 512 Мб, то никаких проблем не возникает. При особо неудачной конфигурации железа и использовании программ, занимающих мало памяти, но обрабатывающих много данных, система может изредка зависать и при меньшем объеме ОЗУ, но происходит это довольно редко и обычно списывается на «глюки» системы.
Но если памяти больше 512 Мб, то проблемы начинают вылезать гораздо чаще, вплоть до постоянных зависаний, а то и невозможности установки системы или загрузки, если память была добавлена после установки. Может случиться и так, что компьютер начнет циклически перезагружаться.
Извлечение «лишних» модулей памяти обычно оказывается радикально действующим лекарством, и все проблемы как рукой снимает. Но назвать это решение удовлетворительным можно далеко не всегда — не каждый согласится разбирать компьютер и вытаскивать память перед загрузкой Win98 и снова вставлять перед загрузкой WinXP.
Что же сделает в такой ситуации разумный пользователь? Правильно, он пойдет на сайт базы знаний Microsoft. И если у него есть некоторые навыки поиска, он довольно быстро отыщет статьи, в которых описывается эта проблема или родственные ей: 184447, 253912, 304943, 311871.
Не исключено, что после их прочтения голова может пойти кругом. Поэтому давайте разбираться, что же в них написано и как это следует понимать.
После внимательного анализа следует сразу же отбросить статью 311871. По стилю изложения и полноте информации она сильно отличается от прочих, и можно с уверенностью предположить, что ее написал один из моих коллег-MVP, безусловно, неплохо знающий Windows 98, но недостаточно знакомый с ее внутренним устройством.
Утверждение о том, что эта система не рассчитана на использование 1 Гб ОЗУ, неверно. Она рассчитывалась на использование до 2 Гб, но реальная граница из-за решений, унаследованных от предыдущих версий, как правило, меньше.
Мне довелось наблюдать (заочно, через обсуждение в конференции) самый первый случай ненормальной работы Windows 98 с большим объемом памяти. В феврале 1998 года один из бета-тестеров попытался поставить Windows 98 (кажется, RC0, то есть кандидат в финальные версии, уже не бета-версия, но еще и не финальная) на сервер с одним гигабайтом памяти. В ходе установки появился синий экран с сообщением о недостатке памяти для инициализации Windows. Установка смогла продолжиться только после уменьшения объема памяти до 928 Мб.
Никому из разработчиков и в голову не пришло сказать, что на гигабайт система не рассчитана. Наоборот, ответ был примерно такой: «система рассчитана на использование до 2 Гб памяти, поэтому налицо какая-то ошибка, но сейчас разбираться с этим мы не будем, поскольку до выпуска осталось мало времени, да и никто из обычных пользователей с этой проблемой не столкнется». Если вспомнить типовые конфигурации компьютеров того времени, это утверждение было, безусловно, справедливым. Достаточно сказать, что гигабайт памяти в злополучном сервере набирался модулями по 16 Мб.
В других статьях базы знаний говорится о необходимости ограничивать дисковый кэш до 512 Мб, а также объем оперативной памяти до 1 Гб, 768 Мб или даже до 512 Мб — в разных статьях по-разному.
В статье 253912 можно найти краткое упоминание о выделении под кэш адресов в четвертом гигабайте, в ней же говорится и о возможности ограничить размер кэша. Но в статье 304943 сказано, что в некоторых случаях ограничение кэша не помогает и необходимо ограничивать объем используемой памяти.
Итак, база знаний подтверждает, что при работе с большими объемами памяти Windows может не загружаться или работать нестабильно. Но в чем же может быть дело, если разработчики уверенно говорили о двух гигабайтах?
В общем, дело ясное, что дело темное. Никто толком ничего не знает, а если и знает — то не говорит, и «урезание», либо физическое уменьшение оперативной памяти часто подается как единственная работающая мера. Попробуем разобраться в проблеме досконально.
Начнем с описания того, как Windows использует память.
32-разрядное адресное пространство в процессорах 80386 и старше делится на страницы памяти размером 4 Кб каждая. Управление каждой из этих страниц осуществляется независимо от других. Таких адресных пространств может быть много, но реальное (физическое) адресное пространство доступно только ядру системы и драйверам, лишь они могут непосредственно обратиться к физической памяти. Другие компоненты системы и все прикладные программы работают в виртуальных адресных пространствах, с виртуальными адресами.
Понятие «виртуальная память» несколько неоднозначно. Достаточно часто его используют как противопоставление понятию «физическая память», но в общем случае виртуализацию следует понимать как форму абстрагирования от реального устройства. Очевидно, что программа может выполняться только из физической памяти, а не тогда, когда ее код выгружен в файл подкачки. Но сама программа в общем случае не может определить, находятся ли ее куски в физической памяти или выгружены на диск. Она не может определить и то, в каком именно месте реальной физической памяти находятся ее код и данные — операционная система транслирует адреса ОП, к которым программа обращается в своем виртуальном адресном пространстве, в те адреса, которые программа реально занимает в физической памяти. А если участок виртуальной памяти, к которой обратилась программа, выгружен на диск, ОС приостанавливает работу программы и подгружает нужную страницу в физическую память, после чего программа продолжает работу как будто страница всегда была в памяти.
Чтобы обеспечивать такую трансляцию, операционная система ведет специальную таблицу страниц, в которой указывается текущее соответствие виртуальной страницы и участка физической памяти или участка файла подкачки, в котором действительно хранятся данные.
Таких таблиц несколько — для каждой программы ведется отдельная таблица. Разные программы могут использовать одни и те же виртуальные адреса, но для каждой программы будет установлено свое соответствие между виртуальными и реальными страницами, так что реально обращение будет происходить к разным участкам физической памяти.
И раз уж речь зашла о распределении памяти, стоит отметить, что память выделяется программе только по ее запросам. Операционная система может отказать программе в выделении памяти, но не может выделить программе больше памяти, чем запрошено. Поэтому раздающиеся иногда вопросы «Почему ОС не отдает всю память моей любимой программе, ведь свободной памяти еще море» — бессмысленны. «Перекормить» программу памятью, то есть заставить использовать больше ее, чем хочет сама программа, не удастся.
Итак, мы уже разобрались, что надо отличать физическое адресное пространство от виртуального. Один из компонентов ядра операционной системы — диспетчер памяти — организует, помимо прочего, трансляцию виртуальных адресов, используемых программами и другими компонентами ядра, в реальные адреса физической памяти.
В Windows 98 память распределяется следующим образом (см. рис. ниже). В левой части показано собственно распределение адресного пространства программ и системы, а в правой — пример распределения физической памяти.
Все виртуальное адресное пространство программ делится на четыре области. Первая область занимает диапазон адресов от нуля до 4 Мб и недоступна для адресации программами для Windows. С программами для ДОС и драйверами устройств дело обстоит несколько иначе, но рассмотрение этих особенностей уведет нас в сторону от темы, поэтому не будем останавливаться на деталях.
Область от 4 Мб до 2 Гб является рабочим пространством программ. С точки зрения программ эта область заполнена оперативной памятью в том количестве, которое потребуется программе (но, конечно, не более 2 Гб), причем, как уже говорилось, у каждой программы это своя собственная память, не имеющая ничего общего с памятью, выделенной другим программам.
Третий гигабайт используется как виртуальное адресное пространство, общее для всех программ и для системы. В эту область Windows загружает свое графическое ядро, а также динамические библиотеки. Фактически, конечно, эти модули находятся в реально имеющейся физической памяти в области гораздо меньших адресов, но нужен механизм, дающий программам возможность обращаться к системным модулям. Виртуализация памяти и является таким механизмом.
Четвертый гигабайт (адреса c0000000-ffffffff) также является общим для всех программ и для системы, он используется в нескольких целях. Во-первых, в него система загружает свое ядро, драйверы и другие модули, работающие на уровне ядра (если такие модули имеются в системе). Этот участок виртуализован подобно третьему гигабайту.
Во-вторых, в этом адресном пространстве выделяется область памяти, используемая дисковым кэшем (VCACHE), также виртуализованная.
В-третьих, в этом же гигабайте находятся адреса памяти (реальные, а не виртуальные) тех устройств ввода-вывода, которые предоставляют возможность прямого доступа к своей памяти.
В-четвертых, здесь же выделяется адресное пространство для виртуальных машин ДОС.
Рассмотрим использование четвертого гигабайта более подробно.
Выделение адресного пространства под ядро системы происходит так же, как и для общих модулей и дополнительных пояснений не требует, поэтому сразу перейдем к рассказу о кэше диска.
Когда больше десяти лет назад Microsoft начала разрабатывать дисковый кэш с динамически изменяемым размером (модуль VCACHE впервые появился в Windows 3.11 для рабочих групп, вышедшей в 1993 году), гигабайтные размеры памяти казались чем-то из области фантастики. Напомню тем, кто не знает, что в первой IBM PC, выпущенной в 1980 году, стояло 64 Кб ОЗУ, а в 1993 году нормой были компьютеры с четырьмя мегабайтами. Экстраполируя на наше время, получим, что в 2006 году можно было ожидать наличия в массовых компьютерах 256 Мб ОЗУ. К тому же никто не думал, что эта ОС и ее прямые потомки проживут так долго.
Так что у программистов не было причин заботиться об экономии адресного пространства, и они щедрой рукой отвели четвертый гигабайт, в том числе и под адресное пространство дискового кэша. Оказалось, что менее накладно выделить под кэш изменяемого размера линейное виртуальное адресное пространство и затем средствами диспетчера памяти отображать его на реально используемую физическую память, нежели вести постоянный учет выделенной памяти в самом модуле кэша.
Поэтому на этапе загрузки системы часть адресного пространства в четвертом гигабайте резервируется под использование дисковым кэшем. Размер этой части зависит от версии операционной системы, от некоторых характеристик оборудования и от количества ОП, установленной в компьютере. Обычно он почти равен объему ОЗУ, но ограничен верхним пределом в 800 Мб.
Еще одно использование четвертого гигабайта — обеспечение доступа к памяти устройств. Если вы застали времена ДОС, то знаете, что нередко для повышения скорости работы программы напрямую писали свои данные в память устройств, например, видеоадаптера (EGA или VGA).
С переходом в 32-разрядный режим работы процессора ничего в этом отношении не изменилось. По-прежнему прямая запись осталась наиболее быстрым способом обращения к устройству, только адреса памяти устройств были вынесены из первого мегабайта в конец адресуемой области, в тот же самый четвертый гигабайт. Да еще между программой и устройством обычно имеется прослойка в виде драйвера.
В этом же четвертом гигабайте выделяется адресное пространство и для виртуальных машин ДОС, в которых выполняются запущенные вами программы для ДОС. При этом возникает необходимость в двойной переадресации: когда программа обращается к адресу в первом мегабайте, вместо него подставляется соответствующий адрес виртуальной машины (в четвертом гигабайте), а поскольку этот адрес виртуальный, то происходит вторая переадресация — на адрес физической памяти, в котором находится нужная страница виртуальной машины. Такова плата за поддержку старых программ. Впрочем, на деле накладные расходы оказываются невелики.
Но вернемся к общим проблемам четвертого гигабайта.
В отличие от Windows XP и других ОС семейства NT, Windows 98 имеет одно-единственное адресное пространство для двух старших гигабайт. Оно оказывается общим и для виртуальной памяти, и для адресов устройств, и его должно хватить для всех способов использования, иначе работа системы будет нарушена.
Влиять на использование адресов памяти устройствами ОС, как правило, не может — эти адреса в большинстве случаев зафиксированы самим оборудованием.
Теперь рассмотрим, как происходит распределение памяти при загрузке Windows. Самый первый этап — загрузка ДОС. Затем из нее запускается ядро Windows — VMM.VXD. Этот файл содержит много модулей, и один из них — диспетчер виртуальных машин (именно он управляет распределением памяти) по своей структуре является обычной программой для ДОС. Но только по структуре и только для того, чтобы его можно было запустить из ДОС. После своего запуска он переводит процессор в защищенный режим и использует ДОС преимущественно как драйвер различных устройств, в первую очередь диска и видеоадаптера.
Затем диспетчер виртуальных машин начинает загружать в память другие модули (драйверы), находящиеся в файле VMM.VXD, драйверы, на которые есть ссылки в реестре или в файле system.ini, а также затребованные ранее загруженными программами для ДОС (в качестве примера можно привести программу кэширования дисков smartdrv, которая при загрузке Windows передает ей требование загрузить модуль smartdrv.vxd, хранящийся в теле файла smartdrv.exe).
Но тут возникает порочный круг. Чтобы загрузить драйвер в память, ему эту память надо выделить, а при выделении памяти — сделать соответствующие пометки в таблице страниц. А чтобы выделить место для таблицы страниц, нужно предварительно выполнить распределение памяти. Поэтому диспетчер виртуальных машин выполняет распределение в два приема: вначале выделяется небольшая гарантированно имеющаяся область памяти, в которую загружаются тела драйверов. В ней также строится таблица страниц. На втором этапе, собственно инициализации, анализируются требования драйверов к памяти и им выделяются виртуальные адреса в четвертом гигабайте.
Если при загрузке Windows включить создание протокола загрузки, то в нем (файл bootlog.txt) эти стадии отчетливо видны. Сначала идут пары сообщений Loading и LoadSuccess для каждого драйвера, затем выполняется инициализация диспетчера виртуальных машин и драйверов: SYSCRITINIT и SYSCRITINTSUCCESS.
Основным «пожирателем» адресного пространства оказывается, конечно, VCACHE. Как уже говорилось, он требует для себя адресное пространство размером примерно равным объему ОЗУ, но не более 800 Мб. В результате суммарные запросы этого и других модулей могут превысить отводимый для них гигабайт. WinMe в этом отношении более эффективна и более рационально распределяет адресное пространство, поэтому при возможности предпочтительнее использовать именно ее.
Но если все-таки не удается выделить виртуальную память, необходимую собственно системе и всем драйверам, то, как правило, Windows 98 выводит сообщение о недостатке памяти, а Windows Me начинает перезагрузку (хотя бывает и наоборот). Но поскольку адресного пространства не хватит и в следующий раз, перезагрузка получается циклической. При этом записи об инициализации в протоколе отсутствуют, он обрывается на этапе загрузки драйверов.
Если дефицит адресного пространства невелик, то не исключено, что система сможет загрузиться в безопасном режиме, когда количество драйверов и требуемое для них адресное пространство уменьшаются. Но надеяться на это не стоит.
Иногда получается так, что адресного пространства хватает для инициализации, но запаса его практически не остается. В этом случае система загрузится нормально, но попытка запустить какую-либо программу для ДОС приведет к появлению сообщения об ошибке. Если неиспользованное адресное пространство остается, но его не слишком много, то некоторые программы для ДОС могут запускаться, а требующие большего объема памяти — нет.
Что же можно сделать, если адресного пространства не хватает и система не грузится, или программы для ДОС не запускаются? Увы, способов решить проблему всего два. Если у вас установлена Windows 98, то можно перейти на Windows Me. Второй, более универсальный, но менее продуктивный способ заключается в ограничении количества используемой памяти (подробные указания приведены в конце статьи).
Вероятно, у вас появился вопрос: если все дело в том, что кэшу диска не хватает виртуального адресного пространства, то почему бы не ограничить его размер, как описано в базе знаний Microsoft? Увы, это не поможет. Дело в том, что распределение памяти выполняет диспетчер виртуальных машин и «заглядывает» при этом только в свой раздел файла system.ini, [386Enh]. А ограничение размера кэша задается в другом разделе и влияет лишь на работу самого кэша, в частности, на использование выделенного ему адресного пространства.
Но ограничение размера дискового кэша все-таки наверняка окажется нужной операцией. Почему? Об этом сейчас и пойдет речь.
Итак, система загружается, программы для ДОС запускаются, но работать все равно нельзя — через некоторое время система либо зависает, либо показывает синий экран сообщения об ошибке. Чего же ей еще не хватает?
Изобразим приблизительную схему адресного пространства в четвертом гигабайте (примерно так, так она формируется в Windows 98 на компьютере автора, некоторые подробности опущены для упрощения), Причем схем у нас будет две: одна — для физического пространства, другая — для виртуального.
Замечание. Во избежание возможных недоразумений следует отметить, что загрузка только ядра Windows без графического интерфейса не имеет ничего общего с загрузкой при установленном параметре BootGUI=0. В последнем случае собственно Windows не загружается вообще, грузится только входящая в ее состав MS-DOS. Хотя в документации встречается также название «ядро реального режима Windows».
Обратите внимание на то, что часть диапазона адресов, занятого видеоадаптером AGP, оказалась использованной дважды (если видеоадаптер использует шину PCI-E, картина меняется несущественно, поэтому ограничимся лишь наиболее распространенным случаем).
Но если эта область адресов используется видеоадаптером, то почему же система отвела его под виртуальную память кэша?
Ответ очень прост: современные драйверы дисплея, как правило, состоят из двух частей — ядра, выполненного в виде драйвера виртуального устройства (vxd), и основной части, выполненной в виде динамически загружаемых библиотек. Когда грузится ядро системы, загружается лишь ядро и видеоадаптера. Оно обычно обеспечивает реализацию только базовых функций видеоадаптера, приблизительно на уровне адаптера VGA, поэтому вполне обходится соответствующей областью адресов в первом мегабайте или, в добавление к нему, небольшим участком памяти, занимаемым адаптером в верхних адресах четвертого гигабайта. При выполнении инициализации памяти диспетчер виртуальных машин выделяет ядру видеоадаптера запрошенную им область, но не может получить информацию о том, что позже, при загрузке графической подсистемы и всех файлов драйвера, этому драйверу понадобятся еще какие-то участки адресного пространства. Так что диспетчер отводит незанятые участки под адресное пространство VCACHE.
Затем запускается графическое ядро Windows, а с ним — и полный драйвер видеоадаптера. Этот драйвер инициализирует всю функциональность видеоадаптера, и в используемой адаптером зоне адресов начинает существовать физическое устройство. И если эта же зона отведена и дисковому кэшу, то при попытке VCACHE обратиться к ней возникнет конфликт между драйвером устройства и кэшем. Нормальная работа системы нарушается.
Важно, что конфликт возникает не от того что кэшу выделена эта область адресов, а от того что он начинает с ней работать. Это дает возможность достаточно просто избежать конфликтов: надо всего лишь ограничить максимальный размер кэша.
Как правило, устройства AGP используют для своих нужд адреса, начиная с е0000000, то есть 3,5 Гб. Дисковому кэшу при этом можно использовать полгигабайта. Именно этим обусловлена рекомендация ограничить размер кэша значением 524288 Кб (512 Мб). Как правило, такое ограничение оказывается действенным. Но не всегда под видеоадаптеры отводится именно эта область адресов, кроме того, подобным же образом могут вести себя и другие устройства, например, ТВ-тюнеры. Поэтому может потребоваться и более жесткое ограничение кэша.
Теперь перейдем к практическим рекомендациям — как поставить Windows 98 на компьютер более чем с 512 Мб ОЗУ.
- Первое, что нужно сделать — раз и навсегда забыть об ЕММ386 и других диспетчерах памяти — с ними хоть сколько-нибудь стабильная работа и даже просто загрузка не гарантируются.
Желательно также не записывать в config.sys явный вызов himem.sys, пусть Windows загружает его автоматически. Хотя каких-либо объяснений этому совету я не нашел и сам не могу понять, почему так обстоят дела, но в некоторых случаях он оказывался действенным.
- Если вы устанавливаете WinMe, запаситесь загрузочной дискетой или иным загрузочным носителем. Причем на нем должен быть какой-либо текстовый редактор, поскольку может понадобиться редактирование файла system.ini. Для установки Win98 дискета не нужна, поскольку всегда можно загрузить одну ДОС (Command prompt only) и запустить из нее edit.
- Начинаем установку. Возможны три варианта действий.
- Вы оставляете в компьютере меньше 512 или 512 Мб, устанавливаете систему, затем выполняете ее подстройку и лишь после этого устанавливаете всю память, после чего снова выполняете подстройку.
- Вы заранее делаете подстройку, более суровую, чем необходимо, а после установки ослабляете ограничения до тех пор, пока система еще будет работать.
- Вы начинаете установку системы и подстраиваете параметры по мере надобности.
Лично мне больше по душе пункт 3.3.
Что нужно сделать для установки по пункту 3.1, предельно ясно: вытащить из компьютера почти всю память. Если объем модуля памяти 1 Гб и более, то этот способ, естественно, неприменим.
Чтобы следовать пункту 3.2, надо перед началом установки создать файл system.ini с одной короткой записью. На том диске, на который вы хотите установить Windows, создайте каталог, в который будет производиться установка (обычно это Windows). В нем создайте файл с именем system.ini, содержащий две строки:
[386Enh]
MaxPhysPage=10000После этого можно начинать установку. Эти строки заставят диспетчер виртуальных машин с самого начала использовать только 256 Мб ОЗУ. Если для ваших целей этого количества памяти достаточно, то можно так и работать с этой настройкой, не тратя время на подгонку ее под имеющуюся конфигурацию.
Для установки по пункту 3.3 предварительно делать ничего не надо, если вы устанавливаете Windows 98, но обязательно нужна загрузочная дискета (или другой носитель) если устанавливается WinMe.
Начните установку как обычно. Если Windows выведет сообщение о дефиците памяти для инициализации или начнет все время перегружаться, то в Windows 98 держите во время загрузки нажатой клавишу Ctrl, а после появления меню выберите пункт Command prompt only. В Windows Me придется загрузиться с дискеты или другого носителя.
Затем откройте для редактирования файл system.ini, найдите раздел [386Enh] и добавьте в него строку MaxPhysPage=значение. Для Windows 98 можно начать со значения 40000, для WinMe — 60000. Сохраните файл и перезагрузите компьютер, чтобы попытаться продолжить установку. Если попытка не удалась, снова редактируйте файл и уменьшите первую цифру значения на единицу. Повторяйте эту процедуру, пока установка не сможет нормально завершиться.
- После завершения установки имеет смысл подобрать максимальный размер физической памяти. Для этого снова повторяйте процедуру, описанную в пункте 3в, но на этот раз увеличивая значение, пока система не перестанет загружаться.
После этого вернитесь к предыдущему рабочему значению и увеличьте значение не так сильно. Удобно использовать уменьшение шага в два раза. Например, если система загружается при значении параметра 40000 и не загружается при 50000, то стоит попробовать среднее значение 48000 (это значение — шестнадцатеричное и указывает количество страниц физической памяти, которое может использовать система). Если система запустится, то затем попробовать 4c000, а если нет — то 44000 и так далее. Впрочем, слишком далеко заходить не стоит, единичка в четвертом разряде означает 16 Мб, поэтому три ноля в младших разрядах трогать смысла нет — выигрыш все равно будет мизерным.
- Если вам нужно запускать программы для ДОС, то может потребоваться дополнительное ограничение размера памяти. Запустите те программы для ДОС, которыми вы пользуетесь, или игры для ДОС, в которые играете, и проверьте их работу. Если программа не запускается или «вылетает» в процессе работы, уменьшите значение параметра на 1-2 единицы в четвертом разряде. Скорее всего, этого будет достаточно.
- Настройка кэша диска.
Эта настройка не требует подбора, но ее желательно выполнять после установки всех драйверов. Щелкните на значке Мой компьютер, выберите из появившегося меню команду Свойства и откройте вкладку Устройства. Выделите значок Компьютер и нажмите кнопку Свойства. В открывшемся окне выберите переключатель Память. В появившемся списке распределения адресов найдите первую запись из четвертого гигабайта (диапазон c0000000-ffffffff). Возьмите шестнадцатеричное число, с которого она начинается, вычтите из него c0000000, переведите получившуюся разность в десятичный вид и разделите на 1024 (все указанные вычисления легко выполнить с помощью стандартного калькулятора Windows, переведя его в инженерный вид). Получившееся число — максимально допустимая величина кэша диска (она указывается в килобайтах). Откройте файл system.ini, найдите раздел [VCache] и добавьте в него строку MaxFileCache=ххх, где вместо ххх должно быть вычисленное вами значение.
Если вы позже добавите в компьютер другое устройство, то может потребоваться повторение этих вычислений и более сильное ограничение размера кэша.
Теперь у вас не должно быть проблем, вызванных большим количеством памяти.
Но на тот случай, если Windows 98 — единственная ОС на вашем компьютере, дам один совет. Не старайтесь увеличивать количество памяти сверх того, на котором может работать Windows. В ряде случаев наблюдается обратный эффект: после добавления очередного модуля может потребоваться установить новый, более низкий предел используемого ОЗУ.
Есть примеры, когда на машинах, работавших с 1 Гб ОЗУ, установка второго гигабайта заставляла ограничивать объем используемой памяти примерно до 900 Мб, то есть объем используемой памяти не только не возрастал, но даже уменьшался. На моем компьютере при установленных 2 Гб WinMe требовала лишь незначительного ограничения памяти, а после добавления третьего гигабайта физической памяти объем, используемый Windows, пришлось ограничить полутора гигабайтами. То есть увеличение фактического объема ОЗУ уменьшило объем, который может использовать система.
Так что прежде чем вкладывать деньги в память, постарайтесь предварительно проверить, как именно ваши компьютер и ОС отреагируют на ее расширение. На практике верхними границами чаще всего оказываются гигабайт с небольшим для Windows 98 и чуть менее 2 Гб — для WinMe.
В заключение выражаю благодарности компании «Элмер» за комплектующие, предоставленные для изучения описываемой в статье проблемы, и Михаилу Валериановичу Жилину за критику и советы, которые помогли сделать эту статью лучше.
Аннотация: В лекции рассматриваются: откачка и подкачка (swapping); стратегии динамического распределения памяти; фрагментация; принципы страничной организации; таблица страниц; использование ассоциативной памяти; двухуровневые, иерархические, хешированные и инвертированные таблицы страниц; разделяемые страницы.
Презентацию к данной лекции Вы можете скачать здесь.
Введение
Страничная организация памяти (paging) – наиболее распространенная стратегия управления памятью, используемая практически во всех операционных системах. В данной лекции рассматриваются общие проблемы управления памятью, принципы страничной организации и ее различные формы.
Откачка и подкачка
Пользовательский процесс может находиться в различных состояниях во время обработки системой. В частности, процесс может быть некоторое время неактивным, если, например, он исполняется в режиме разделения времени, и пользователь за терминалом обдумывает следующую команду или редактирует исходный код своей программы. В подобных случаях процесс может быть откачан операционной системой на диск, в связи с тем, что занимаемая им память оказывается необходимой в данный момент для другого, активного, процесса.
Откачка и подкачка (swapping) – это действия операционной системы по откачке (записи) образа неактивного процесса на диск или подкачке (считыванию) активного процесса в основную память. Необходимость выполнения подобных действий вызвана нехваткой основной памяти.
Файл откачки (backing store) — область дисковой памяти, используемая операционной системой для хранения образов откачанных процессов. Файл откачки организуется максимально эффективно: обеспечивается прямой доступ ко всем образам процессов в памяти (например, через таблицу по номеру процесса).
Популярная разновидность стратегии откачки и подкачки – roll out / roll in: откачка и подкачка на базе приоритетов; более приоритетные процессы исполняются, менее приоритетные – откачиваются на диск.
Наибольшие временные затраты на откачку – это затраты на передачу данных: полный образ процесса может занимать большую область памяти. Общее время откачки пропорционально размеру откачиваемых данных.
В распространенных ОС – UNIX, Linux, Windows и др. – реализованы различные стратегии откачки и подкачки.
Схема откачки и подкачки изображена на
рис.
16.1.
Рис.
16.1.
Схема откачки и подкачки.
Смежное распределение памяти
Наиболее простая и распространенная стратегия распределения памяти – смежное распределение памяти –
распределение памяти для пользовательских процессов в одной смежной области памяти. Основная память разбивается на
две смежных части (partitions), которые «растут» навстречу друг другу: резидентная часть ОС и вектор прерываний –
по меньшим адресам. Для пользовательских процессов память распределяется в
одном и том же смежном участке памяти. Для каждого процесса регистр перемещения указывает на начало выделенной ему
области памяти, регистр границы содержит длину диапазона логических адресов. Каждый логический адрес должен быть меньше
содержимого регистра границы. Физический адрес вычисляется аппаратно как сумма логического адреса и значения регистра
перемещения. Схема адресации с аппаратной поддержкой регистров перемещения и границы изображена на
рис.
16.2.
Общая задача распределения памяти и стратегии ее решения
В общем случае, в операционных системах может использоваться смежное распределение памяти в нескольких смежных областях. Свободная область – это смежный блок свободной памяти. Свободные области могут быть произвольно разбросаны по памяти. При загрузке процесса ему предоставляется память из любой свободной смежной области, которая достаточно велика для его размещения. При этом операционная система хранит список свободных областей памяти и список занятых областей памяти. Все эти области могут быть произвольно расположены в памяти и иметь различную длину.
Возникает общая задача распределения памяти: Имеется список свободных областей памяти и список занятых областей разного размера. Разработать и реализовать оптимальный (по некоторому критерию) алгоритм выделения свободного смежного участка памяти длины n (слов или байтов).
Для решения данной задачи применяются следующие стратегии: метод первого подходящего (first-fit), метод наиболее подходящего (best-fit) и метод наименее подходящего (worst-fit).Рассмотрим каждую из них подробнее.
Метод первого подходящего:Выбирается первый по списку свободный участок подходящего размера (не меньшего, чем n ). На первый взгляд, данная стратегия оптимальна, но далее мы увидим, что это не всегда так.
Метод наиболее подходящего:Выбирается из списка наиболее подходящий свободный участок (минимального размера, не меньшего, чем n ). В отличие от предыдущего метода, требует просмотра всего списка, если список не упорядочен по размеру областей. Применение метода приводит к образованию оставшейся части самого маленького размера.
Метод наименее подходящего: Выбирается из списка подходящая область наибольшего размера. Почему наибольшего? Чтобы избежать фрагментации (проблема фрагментации подробно рассмотрена далее в данной лекции).
Применение первой и второй стратегий лучше со следующих точек зрения: скорость выполнения и минимальность объема использованной памяти. Однако их применение может создать фрагментацию.
Фрагментация
Фрагментация – это дробление памяти на мелкие не смежные свободные области маленького размера. Фрагментация возникает после выполнения системой большого числа запросов на память, таких, что размеры подходящих свободных участков памяти оказываются немного больше, чем требуемые. Например, если имеется 100 смежных свободных областей памяти по 1000 слов, то после выполнения 100 запросов на память по 999 слов каждый в списке свободной памяти останутся 1000 областей по одному слову.
Фрагментация бывает внутренняя и внешняя. При внешней фрагментации имеется достаточно большая область свободной памяти, но она не является непрерывной. Внутренняя фрагментация может возникнуть вследствие применения системой специфической стратегии выделения памяти, при которой фактически в ответ на запрос память выделяется несколько большего размера, чем требуется, — например, с точностью до страницы (листа ), размер которого – степень двойки. Страничная организация памяти подробно рассматривается далее в данной лекции.
Внешняя фрагментация может быть уменьшена или ликвидирована путем применения компактировки (compaction) – сдвига или перемешивания памяти с целью объединения всех не смежных свободных областей в один непрерывный блок. Компактировка может выполняться либо простым сдвигом всех свободных областей памяти, либо путем перестановки занятых областей, с выбором на каждом шаге подходящей свободной области методом наиболее подходящего. Компактировка возможна, только если связывание адресов и перемещение (см. лекцию 15) происходит динамически. Компактировка выполняется во время исполнения программы.
При компактировке памяти и анализе свободных областей может быть выявлена проблема зависшей задачи: какая-либо задача может «застрять» в памяти, так как выполняет ввод-вывод в свою область памяти (по этой причине откачать ее невозможно). Решение данной проблемы: ввод-вывод должен выполняться только в специальные буфера, выделяемой для этой цели операционной системой.