- •Оглавление
- •От редактора перевода
- •Введение
- •Использовать
- •Аргументировано обсуждать
- •IV. Применять знания
- •Модуль 1. Компьютерные системы
- •Обзор компьютерных систем
- •1.1.1. Компоненты компьютерных систем
- •Эволюция компьютерных систем
- •1.2.1. Краткая историческая справка
- •Закон Мура
- •1.2.2. Применение компьютерных систем
- •Представление данных в компьютерных системах
- •1.3.1. Биты и байты
- •1.3.2. Системы счисления
- •Модуль 2. Системы аппаратного обеспечения
- •2.1 Процессор и память
- •2.1.1 Процессор. Основы.
- •2.1.2 Типы памяти
- •2.1.3 Лабораторная работа: Эталонное тестирование (необязательная)
- •2.2 Внешние устройства
- •2.2.1 Присоединяемые внешние устройства
- •2.2.2 Шины
- •2.2.3 Входные/выходные устройства
- •2.3 Запоминающие устройства
- •2.3.1 Интерфейсы дисковых контроллеров
- •2.3.2 Накопитель (запоминающее устройство большой ёмкости)
- •2.4 Соединение компонентов аппаратного обеспечения
- •2.4.1 Как компоненты компьютера работают вместе
- •2.4.2 Лабораторная работа: Изучение компьютерных систем
- •2.4.3 Лабораторная работа: Конфигурация online
- •2.5 Повышение производительности компьютера
- •2.5.1 Закон Мура
- •2.5.2 “Узкие” места (Bottlenecks)
- •2.5.3 Производительность и время ожидания
- •Модуль 1 и Модуль 2 Обзорные материалы
- •Закон Мура
- •Модуль 3. Программное обеспечение операционных систем
- •Структура
- •3.1.1 Уровни программного обеспечения
- •3.1.2 Bios: Жизнь снизу
- •3.1.3 Управление процессами
- •3.1.4 Лабораторная работа: диспетчер задач (Task Manager)
- •3.2 Управление устройствами и конфигурация
- •3.2.1 Управление прерываниями
- •3.2.2 Характеристики аппаратного обеспечения
- •3.2.3 Конфигурация
- •3.2.4 Лабораторная работа: Управление устройствами
- •3.3. Распределение ресурсов
- •3.3.1 Виртуальная память
- •3.3.2 Совместное использование файлов и принтеров
- •3.4. Файловые системы
- •3.4.1 Организация файлов
- •3.4.2 Таблица размещения файлов (File Allocation Table) и файловая система nt
- •Модуль 4. Прикладное программное обеспечение
- •4.1 Основы программного обеспечения
- •4.2 Использование систем программного обеспечения
- •4.2.1 Лабораторная работа: Команды dos
- •4.2.2 Лабораторная работа: Макросы
- •4.2.3 Лабораторная работа: Встроенные объект-приложения
- •4.3 Пакетные файлы сценариев
- •4.3.1 Расширенные функции командной строки
- •4.3.2 Команды пакетного файла
- •4.3.3 Лабораторная работа: Создание пакетного файла
- •4.4 Базы данных
- •4.4.1 Лабораторная работа: Поиск в библиотеке Конгресса
- •4.5 Проектирование программного обеспечения
- •4.5.1 Введение в разработку крупномасштабных программных систем (Large-Scale Software).
- •4.5.2 Модель открытого кода
- •4.5.3 Средства для создания и управления программным обеспечением
- •Модуль 3 и Модуль 4 - Материалы для проверки
- •Базы данных
- •Виртуальная память
- •Модуль 5. Сетевые системы
- •5.1 Основы Интернета
- •5.1.1 Типы mime
- •5.1.2 Языки Интернет
- •5.2 Локальные и глобальные сети
- •5.3 Стратегии коммуникации
- •5.3.1 Структура клиент-сервер (Client-Server Framework)
- •5.3.2 Равноправное соединение
- •5.4 Технологии передачи данных
- •5.5 Архитектура Интернет
- •5.5.1 Роутеры и tcp/ip
- •5.5.2 Сервис доменных имен (Domain Name Service)
- •5.5.3 Способность к подключению
- •5.5.4 Провайдеры Интернет-сервиса (Internet Service Providers)
- •Модуль 6. Безопасность компьютера
- •6.1 Угрозы безопасности
- •6.1.1 Злоумышленники: кто, зачем и как?
- •6.1.2 Кража личности и нарушение конфиденциальности (Identity Theft and Privacy Violation)
- •6.1.3 Вредоносные программные средства
- •6.1.4 Отказ от обслуживания
- •6.2 Технологии безопасности
- •6.2.1 Шифрование
- •6.2.2 Применение шифрования
- •6.2.3 Идентификация
- •6.3 Предотвращение, определение и восстановление
- •6.3.1 Система сетевой защиты (Firewall)
- •6.3.2 Средства определения вторжения
- •6.3.3 Восстановление данных
- •6.3.4 Обзор типов безопасности
- •Модуль 5 и Модуль 6 Обзорный материал
- •Шифрование
- •Приложение а. Выполнение файла Visual Basic
- •Приложение в. Загрузка приложения WinZip
- •Рекомендации по чтению ssd2
3.3. Распределение ресурсов
В этом модуле мы рассмотрим операционную систему как механизм распределения ресурсов. Многие аспекты функционирования операционной системы могут быть объяснены через этот механизм. В ходе объяснения распределения работы, этот модуль охватывает большинство из компонентов компьютерной системы. Компьютерная система не только распределяет многие из внутренних ресурсов, например, время процессора, но и внешние ресурсы, такие как доступ к жесткому диска.
Последовательность чтения:
Parsons/Oja, Chapter 5-section D. Цель изучения: Сеть позволяет множеству пользователей совместно использовать драйверы, файлы и принтеры. Есть как преимущества в совместном использовании ресурсов, такие как возможность работы нескольких людей над одним проектом, так и недостатки, например трудность обеспечения адекватной защиты. 3.3.2 Распределение файлов и принтеров. Цели изучения: Используйте информацию, полученную ранее, чтобы лучше понять безопасность и функциональность совместного использования файлов и принтеров.
|
3.3.1 Виртуальная память
-
Управление памятью
-
Переадресация
-
Виртуальная память
Управление памятью
Управление памятью системы — важная часть работы ядра. У типичного персонального компьютера сегодня 1 Гб или более оперативной памяти (DRAM). Часть ее резервируется для операционной системы, но большая часть доступна для пользовательских программ. Например, пользователь запускает веб-навигатор, редактор и компьютерную игру. Каждой из этих программ нужно определенное количество памяти, но, ни одной из них не нужна вся память. Ядро распределяет некоторую память для каждой программы и отслеживает, какая программа что использует.
Современные операционные системы, такие как Linux и Windows обеспечивают виртуальную память для повышения гибкости программ. (Мы будем более подробно говорить о виртуальной памяти позже.) Чтобы понять, для чего нужна виртуальная память, рассмотрим, как работали старшие операционные системы подобные MS-DOS. В тех системах, все программы работали в одном реальном адресном пространстве, пока не было виртуального адресного пространства.
Программы, записанные в двоичном машинном коде, содержат команды и данные. Как команды, так и данные содержат адреса памяти. Когда вы записываете программу в машинном коде (или компилятор переводит ваш язык высокого уровня на машинный код), вы (или компилятор) должны определить адрес для каждой команды и каждой части данных. Например, вы начинаете с нуля и располагаете все ваши команды и данные последовательно. Предположим, что ваша программа занимает адреса памяти от 0 до 8,462. Сейчас, предположим, что кто-то еще записывает программы таким же образом, начиная с адреса 0. Очевидно, вы не можете запустить две программы, занимающие одни и те же адреса памяти в одно и то же время по этой схеме. Когда вы загружаете вторую программу, она перезапишется поверх первой.
Переадресация
Способ, который существовал до изобретения виртуальной памяти — запись программ особым способом. Любое место памяти, содержащее адрес, специально отмечается в двоичном файле (binary file). Когда пользователь запускает программу на выполнение, операционная система выделяет для нее память где-нибудь в доступном месте и загружает программу в эту область памяти. При этом можно "исправить" все специально отмеченные адресные ссылки, чтобы они указывали реальное расположение. Например, пусть оригинальная программа содержит таблицу информации, начинающуюся в адреса памяти 700. Другая часть программы, скажем, расположенная по адресу 210, содержит адрес таблицы (т.е., значение 700), специально отмеченный, как содержащий адрес. Операционная система загружает эту программу в памяти, начиная с адреса 30,000. При этом меняется значение, размещенное по адресу 30,210 с 700 на 30,700 и так далее. Этот процесс называется переадресацией.
Описанная схема позволяет компьютеру загружать множество программ в память одновременно, до тех пор, пока какая-то часть памяти доступна. Преимущества этого подхода в том, что он сравнительно легко выполняется и не требует никаких изменений в аппаратных средствах. Но есть также и серьезные недостатки. Во-первых, из-за переадресации, память, распределяемая для программ, должна быть непрерывна(contiguous). Предположим, пользователь выполняет 6 маленьких программ в одно время. После того, как некоторые из программ закончили работу, программы 1, 3, и 6 остались работать. Теперь пользователь хочет выполнить большое приложение, но, к сожалению, его сейчас некуда поместить. Если приложение нельзя загрузить на место, которое использовала программа 2 или программы 4 и 5 вместе, то оно не может разместиться в памяти, хотя общего числа несмежных(noncontiguous) свободных блоков памяти может быть даже больше чем надо.
Другой недостаток этого подхода в том, что размер работающей программы ограничен объемом физической памяти, установленной на машине минус то, что операционная система зарезервировала для себя. Но, большие программы обычно не используют всю свою память сразу. Программе с большим адресным пространством, возможно, только нужно обратиться к нескольким тысячам команд и нескольким тысячам байтов данных за один раз. Было бы эффективнее распределить только небольшую часть RAM за один раз для такой программы и сохранить остальную часть ее адресного пространства где-нибудь еще, например на диске. Именно это позволяет сделать виртуальная память.
Виртуальная память
В виртуальной системе памяти, каждая программа работает в собственном адресном пространстве. Поэтому, когда программа загружается в память, нет потребности в любой переадресации. Виртуальное адресное пространство может быть больше или меньше, чем физическая память процессора. Хотя для того, чтобы эта схема работала, виртуальной памяти требуется аппаратная поддержка. Во-первых, память делится на части под названием страницы (pages). Страница - самая маленькая часть памяти, которая может быть распределена под программу. На платформах Pentium, страница составляет 4 Кбайт. Во-вторых, процессор должен уметь превращать виртуальные адреса в реальные.
Процессоры, поддерживающие виртуальную память, такие как Pentium, могут работать в двух режимах. В реальном режиме (real mode) адреса соответствуют физическим адресам ячеек в оперативной памяти. Только ядро имеет право работать в реальном режиме. В виртуальном режиме (virtual mode) каждый адрес "переводится" на физический адрес ячейки памяти с помощью таблицы страниц (page table). Для каждой страницы в виртуальном адресном пространстве, таблица страниц дает реальный адрес размещения страницы в оперативной памяти.
Давайте посмотрим, как это происходит с гипотетической программой, описанной ранее. Эта программа будет работать в собственном виртуальном адресном пространстве, начиная с адреса нулевой ячейки. Когда процессор загружает программу в оперативную память, начиная с 30,000, он устанавливает вход таблицы страниц для страницы 0 значением 30,000. Когда команда загружает адрес виртуального расположения 210, схема трансляции адреса (address translation) процессора фактически вызывает загрузку данных с физического расположения 30,210. Значение, прочитанное ячейки памяти расположенной по этому адресу, будет 30,700 (помните, адрес ячейки 210 содержит адрес таблицы, тоесть - 700), виртуальный адрес таблицы. Если другая команда затем попробует обратиться к таблице, используя этот 700-й адрес, механизм трансляции адреса опять вмешается и превратит ссылку в адрес 30,700. Пользовательская программа работает только с виртуальными адресами; она не имеет представления о том, в какой части физической памяти она выполняется. Когда процессор находится в виртуальном режиме, трансляция адреса происходит все время. Каждая ссылка транслируется. Она происходит очень быстро, потому что перевод происходит прямо в микропроцессорном чипе.
При схеме виртуальной памяти, каждая программа имеет свою собственную таблицу страниц, поддерживаемую ядром. И, физическая память, распределенная под программы, не должна быть непрерывной. Таблица страниц нашей гипотетической программы может сказать, "Хорошо, нулевая страница начинается с реального адреса 30,000; первая страница начинается с 34,000; вторая страница начинается с 62,000 и так далее." Пользовательская программа не имеет представления, что она разбросана по физической памяти, потому что она живет в виртуальном мире и не может видеть реальные адреса.
С небольшим усилием, с помощью технических средств, мы можем пойти в этой схеме на один шаг далее и полностью отделить виртуальную память от оперативной памяти. Например, мы не хотим грузить всю программу в оперативную память сразу, мы загружаем только пару страниц. Для тех страниц, что мы не хотим загружать, мы помещаем специальный маркер в таблицу страниц, который сообщает "Эта страница не находится в оперативной памяти." Запускается пользовательская программа, и это вынуждает память обратиться к нулевой странице, которая прекрасно транслируется. Память ссылается на первую страницу, и процессор снова смотрит на таблицу страниц и находит соответственный физический адрес. Затем, программа ссылается на адрес памяти, который попадает на страницу семь, которую мы не загрузили в оперативную память. Схема трансляции адреса проверяет таблицу страниц, находит маркер "Не в оперативной памяти" и генерирует ошибку отсутствие страницы (page fault). Это тип прерывания. Процессор прерывает выполнение пользовательской программы и предоставляет управление ядру. Ядро смотрит на определенные регистры состояния, чтобы выяснить, откуда прибыли отсутствующие страницы и говорит, "О, этот процесс хочет доступа к его виртуальной странице семь. Я выделю некоторую оперативную память и загружу в нее седьмую страницу программы. Сейчас я исправлю таблицу страниц, и дам возможность программе продолжать выполнение". Затем управление возвращается пользовательской программе, и программа продолжается, так как будто бы ничего необычного не случилось.
С аппаратной поддержкой страниц пользовательские программы действительно живут в виртуальном мире. Они не только не знают, какие части оперативной памяти используют, они даже не знают, какие из страниц находятся в оперативной памяти сейчас и какие на диске! Каждый раз, когда процесс пробует сослаться на страницу на диске, страница перемещается в оперативную память. И, если процесс пока не коснулся страницы, она может быть перемещена обратно на диск. Предоставляя виртуальную память, мы обеспечили пользовательские программы чистой абстракцией памяти. Им не нужно беспокоиться о совместном использовании адресного пространства с операционной системой или другими приложениями. Им не нужно волноваться о том, сколько физической памяти имеет машина. Они имеют непрерывное виртуальное адресное пространство, и могу использовать его, так как им нравится, а ядро заботится о деталях реализации.
Недостаток использования жесткого диска для виртуальной памяти в том, что жесткий диск может быть занят настолько, что доступ к другим файлам откладывается. Для систем, которые предусматривают частые обращения к файлам и используют виртуальную память, можно поместить swap-файл – файл подкачки (файл, содержащий все виртуальные страницы памяти) на отдельном устройстве.