Понятие ресурса. Основные виды ресурсов. Классификация




Определение коцепции процесса преследует цель выработать механизм распределения и управления ресурсами. Понятие ресурса, наряду с понятием вычислительного процесса, является одним из основных при рассмотрении ОС. Всякий потребляемый объект, независимо от форм его существования, обладающий некоторой практической ценностью, является ресурсом. Ресурсом также называют повторно используемый, относительно стабильный и часто недостающий объект, который запрашивается, используется и освобождается процессами в период их активности. Выделяют два свойства ресурса: полезность и исчерпаемость. Ресурсы можно разделить на делимые и неделимые. Причем делимые, в свою очередь, делятся на используемые одновременно (в один и тот же момент времени) и используемые параллельно (когда в течение некоторого интервала времени процессы используют ресурс попеременно). Другая классификация предполагает разделение ресурсов делятся на

*Физические (реально существуют, реально распределяются между пользователями) и виртуальные (рассматривается некоторая модель физического ресурса);

*Жёсткие и эластичные (последние допускают виртуализацию, расширение);

*Активные (способные выполнять действия по отношению к другим ресурсам) и пассивные;

*Главные (например, ЦП) и второстепенные (печатные устройства);

*Дорогие и дешёвые. Цена за использование ресурсов – почти всегда функция времени;

*Простые (занят/сводобен) и составные (занят/частично занят/свободен);

*Воспроизводимые (CD-RW) и потребляемые (CD-R);

*Параллельные и последовательные

*Твёрдые (hardware) и "мягкие" (software).

 

4. Возможность развития. Современные ОС организуются таким образом, что допускают эффективную разработку, тестирование и внедрение новых системных функций, не прерывая процесса нормального функционирования вычислительной системы. Большинство операционных систем постоянно развиваются (нагляден пример Windows). Происходит это в силу следующих причин. 1. Обновление и возникновение новых видов аппаратного обеспечения. 2. Новые сервисы. Например, может потребоваться добавить новые инструменты для контроля или оценки производительности, новые средства ввода-вывода данных (речевой ввод). Другой пример – поддержка новых приложений, использующих окна на экране дисплея. 3. Исправления. В каждой ОС есть ошибки. Время от времени они обнаруживаются и исправляются. Отсюда постоянные появления новых версий и редакций ОС. Современные операционные системы содержат сотни и тысячи модулей (например, W2000 содержит 29 млн строк исходного кода на языке С). Функции ОС обычно группируются либо в соответствии с типами локальных ресурсов, которыми управляет ОС, либо в соответствии со специфическими задачами, применимыми ко всем ресурсам. Совокупности модулей, выполняющих такие группы функций, образуют подсистемы операционной системы. Наиболее важными подсистемами управления ресурсами являются подсистемы управления процессами, памятью, файлами и внешними устройствами, а подсистемами, общими для всех ресурсов, являются подсистемы пользовательского интерфейса, защиты данных и администрирования. У правление процессами. Подсистема управления процессами непосредственно влияет на функционирование вычислительной системы. Для каждой выполняемой программы ОС организует один или более процессов. Каждый такой процесс представляется в ОС информационной структурой (таблицей, дескриптором, контекстом процессора), содержащей данные о потребностях процесса в ресурсах, а также о фактически выделенных ему ресурсах (область оперативной памяти, количество процессорного времени, файлы, устройства ввода-вывода и др.). Кроме того, в этой информационной структуре хранятся данные, характеризующие историю пребывания процесса в системе: текущее состояние (активное или заблокированное), приоритет, состояние регистров, программного счетчика и др. В современных мультипрограммных ОС может существовать одновременно несколько процессов, порожденных по инициативе пользователей и их приложений, а также инициированных ОС для выполнения своих функций (системные процессы). Поскольку процессы могут одновременно претендовать на одни и те же ресурсы, подсистема управления процессами планирует очередность выполнения процессов, обеспечивает их необходимыми ресурсами, обеспечивает взаимодействие и синхронизацию процессов. Управление памятью. Подсистема управления памятью производит распределение физической памяти между всеми существующими в системе процессами, загрузку и удаление программных кодов и данных процессов в отведенные им области памяти, настройку адресно-зависимых частей кодов процесса на физические адреса выделенной области, а также защиту областей памяти каждого процесса. Важная функция управления памятью – защита памяти. Управление файлами. Функции управления файлами сосредоточены в файловой системе ОС. Операционная система виртуализирует отдельный набор данных, хранящихся на внешнем накопителе, в виде файла – простой неструктурированной последовательности байтов, имеющих символьное имя. Для удобства работы с данными файлы группируются в каталоги, которые, в свою очередь, образуют группы – каталоги более высокого уровня. Файловая система преобразует символьные имена файлов, с которыми работает пользователь или программист, в физические адреса данных на дисках, организует совместный доступ к файлам, защищает их от несанкционированного доступа. Управление внешними устройствами. Функции управления внешними устройствами возлагаются на подсистему управления внешними устройствами, называемую также подсистемой ввода-вывода. Она является интерфейсом между ядром компьютера и всеми подключенными к нему устройствами. Спектр этих устройств очень обширен (принтеры, сканеры, мониторы, модемы, манипуляторы, сетевые адаптеры, АЦП разного рода и др. Программа, управляющая конкретной моделью внешнего устройства и учитывающая все его особенности, называется драйвером. Наличие большого количества подходящих драйверов во многом определяет успех ОС на рынке. Созданием драйверов занимаются как разработчики ОС, так и компании, выпускающие внешние устройства. ОС должна поддерживать четко определенный интерфейс между драйверами и остальными частями ОС.   Упомянутый раньше принцип модульности положительно проявляется при генерации ОС. Он существенно упрощает настройку ОС на требуемую конфигурацию вычислительной системы. В наши дни при использовании персональных компьютеров с принципом генерируемости ОС можно столкнуться разве что только при работе с Linux. В этой UNIX-система имеется возможность не только использовать какое-либо готовое ядро ОС, но и самому сгенерировать (скомпилировать) такое ядро, которое будет оптимальным для данного конкретного персонального компьютера и решаемых на нем задач. Кроме генерации ядра в Linux имеется возможность указать и набор подгружаемых драйверов и служб, то есть часть функций может реализовываться модулями, непосредственно входящими в ядро системы, а часть - модулями, имеющими статус подгружаемых, транзитных. В остальных современных распространенных ОС для персональных компьютеров конфигурирование ОС под соответствующий состав оборудования осуществляется на этапе инсталляции, а потом состав драйверов и изменение некоторых параметров ОС может быть осуществлено посредством редактирования конфигурационного файла. Принцип функциональной избыточности Принцип функциональной избыточности: Этот принцип учитывает возможность проведения одной и той же работы различными средствами. В состав ОС может входить несколько типов мониторов (модулей супервизора, управляющих тем или другим видом ресурса), различные средства организации коммуникаций между вычислительными процессами. Наличие нескольких типов мониторов, нескольких систем управления файлами позволяет пользователям быстро и наиболее адекватно адаптировать ОС к определенной конфигурации вычислительной системы, обеспечивать максимально эффективную загрузку технических средств при решении конкретного класса задач, получать максимальную производительность при решении заданного класса задач. Принцип виртуализации Принцип виртуализации: построение виртуальных ресурсов, их распределение и использование в настоящее время применяется практически в любой ОС. Этот принцип позволяет представить структуру системы в виде определенного набора планировщиков процессов и распределителей ресурсов (мониторов) и использовать единую централизованную схему распреде-ления ресурсов. Наиболее естественным и законченным проявлением концепции виртуальности является понятие виртуальной машины. Виртуальная машина, предоставляемая пользователю, воспроизводит архитектуру реальной машины, но архитектурные элементы в таком представлении выступают с новыми или улучшенными характеристиками, как правило, упрощающими работу с системой. Характеристики могут быть произвольными, но чаще всего пользователи желают иметь собственную «идеальную» по архитектурным характерис-тикам машину в следующем составе: - единообразная по логике работы виртуальная память практически неограниченного объема. - произвольное количество виртуальных процессоров, способных работать параллельно и взаимодействовать во время работы. - произвольное количество внешних виртуальных устройств, способных работать с памятью виртуальной машины параллельно или последовательно, асинхронно или синхронно по отношению к работе того или иного виртуального процессора, инициирующего работу этих устройств. Одним из аспектов виртуализации является организация возможности выполнения в данной ОС приложений, которые разра-батывались для других ОС. Другими словами, речь идет об организации нескольких операционных сред.     В данной схеме выделены следующие слои. 1. Средства аппаратной поддержки ОС. Значительная часть функций ОС может выполняться аппаратными средствами [10]. Чисто программные ОС сейчас не существуют. Как правило, в современных системах всегда есть средства аппаратной поддержки ОС, которые прямо участвуют в организации вычислительных процессов. К ним относятся: система прерываний, средства поддержки привилегированного режима, средства поддержки виртуальной памяти, системный таймер, средства переключения контекстов процессов (информация о состоянии процесса в момент его приостановки), средства защиты памяти и др. 2. Машинно-зависимые модули ОС. Этот слой образует модули, в которых отражается специфика аппаратной платформы компьютера. Назначение этого слоя – "экранирование" вышележащих слоев ОС от особенностей аппаратуры (например, Windows 2000 – это слой HAL (Hardware Abstraction Layer), уровень аппаратных абстракций). 3. Базовые механизмы ядра. Этот слой модулей выполняет наиболее примитивные операции ядра: программное переключение контекстов процессов, диспетчерскую прерываний, перемещение страниц между основной памятью и диском и т.п. Модули этого слоя не принимают решений о распределении ресурсов, а только обрабатывают решения, принятые модулями вышележащих уровней. Поэтому их часто называют исполнительными механизмами для модулей верхних слоев ОС. 4. Менеджеры ресурсов. Модули этого слоя выполняют стратегические задачи по управлению ресурсами вычислительной системы. Это менеджеры (диспетчеры) процессов ввода-вывода, оперативной памяти и файловой системы. Каждый менеджер ведет учет свободных и используемых ресурсов и планирует их распределение в соответствии запросами приложений. 5. Интерфейс системных вызовов. Это верхний слой ядра ОС, взаимодействующий с приложениями и системными утилитами, он образует прикладной программный интерфейс ОС. Функции API, обслуживающие системные вызовы, предоставляют доступ к ресурсам системы в удобной компактной форме, без указания деталей их физического расположения. Повышение устойчивости ОС обеспечивается переходом ядра в привилегированный режим. При этом происходит некоторое замедление выполнение системных вызовов. Системный вызов привилегированного ядра инициирует переключение процессора из пользовательского режима в привилегированный, а при возврате к приложению – обратное переключение. За счет этого возникает дополнительная задержка в обработке системного вызова (рис. 1.5). Однако такое решение стало классическим и используется во многих ОС (UNIX, VAX, VMS, IBM OS/390, OS/2 и др.). Многослойная классическая многоуровневая архитектура ОС не лишена своих проблем. Дело в том, что значительные изменения одного из уровней могут иметь трудно предвидимое влияние на смежные уровни. Кроме того, многочисленные взаимодействия между соседними уровнями усложняют обеспечение безопасности. Поэтому, как альтернатива классическому варианту архитектуры ОС, часто используется микроядерная архитектура ОС. Суть этой архитектуры состоит в следующем. В привилегированном режиме остается работать только очень небольшая часть ОС, называемая микроядром. Микроядро защищено от остальных частей ОС и приложений. В его состав входят машинно-зависимые модули, а также модули, выполняющие базовые механизмы обычного ядра. Все остальные более высокоуровневые функции ядра оформляются как модули, работающие в пользовательском режиме. Так, менеджеры ресурсов, являющиеся неотъемлемой частью обычного ядра, становятся "периферийными" модулями, работающими в пользовательском режиме. Таким образом, в архитектуре с микроядром традиционное расположение уровней по вертикали заменяется горизонтальным. Это можно представить, как показано на рис. 1.6. Внешние по отношению к микроядру компоненты ОС реализуются как обслуживающие процессы. Между собой они взаимодействуют как равноправные партнеры с помощью обмена сообщениями, которые передаются через микроядро.   Критические секции, средства коммуникации процессов Важным понятием синхронизации процессов является понятие "критическая секция" программы. Критическая секция - это часть программы, в которой осуществляется доступ к разделяемым данным. Чтобы исключить эффект гонок по отношению к некоторому ресурсу, необходимо обеспечить, чтобы в каждый момент в критической секции, связанной с этим ресурсом, находился максимум один процесс. Этот прием называют взаимным исключением. Простейший способ обеспечить взаимное исключение - позволить процессу, находящемуся в критической секции, запрещать все прерывания. Однако этот способ непригоден, так как опасно доверять управление системой пользовательскому процессу; он может надолго занять процессор, а при крахе процесса в критической области крах потерпит вся система, потому что прерывания никогда не будут разрешены. Другим способом является использование блокирующих переменных. С каждым разделяемым ресурсом связывается двоичная переменная, которая принимает значение 1, если ресурс свободен (то есть ни один процесс не находится в данный момент в критической секции, связанной сданным процессом), и значение 0, если ресурс занят. На рисунке 2 показан фрагмент алгоритма процесса, использующего для реализации взаимного исключения доступа к разделяемому ресурсу D блокирующую переменную F(D). Перед входом в критическую секцию процесс проверяет, свободен ли ресурс D. Если он занят, то проверка циклически повторяется, если свободен, то значение переменной F(D) устанавливается в 0, и процесс входит в критическую секцию. После того, как процесс выполнит все действия с разделяемым ресурсом D, значение переменной F(D) снова устанавливается равным 1 Если все процессы написаны с использованием вышеописанных соглашений, то взаимное исключение гарантируется. Следует заметить, что операция проверки и установки блокирующей переменной должна быть неделимой. Поясним это. Пусть в результате проверки переменной процесс определил, что ресурс свободен, но сразу после этого, не успев установить переменную в 0, был прерван. За время его приостановки другой процесс занял ресурс, вошел в свою критическую секцию, но также был прерван, не завершив работы с разделяемым ресурсом. Когда управление было возвращено первому процессу, он, считая ресурс свободным, установил признак занятости и начал выполнять свою критическую секцию. Таким образом был нарушен принцип взаимного исключения, что потенциально может привести к нежелаемым последствиям. Во избежание таких ситуаций в системе команд машины желательно иметь единую команду "проверка-установка", или же реализовывать системными средствами соответствующие программные примитивы, которые бы запрещали прерывания на протяжении всей операции проверки и установки. Реализация критических секций с использованием блокирующих переменных имеет существенный недостаток: в течение времени, когда один процесс находится в критической секции, другой процесс, которому требуется тот же ресурс, будет выполнять рутинные действия по опросу блокирующей переменной, бесполезно тратя процессорное время. Для устранения таких ситуаций может быть использован так называемый аппарат событий. С помощью этого средства могут решаться не только проблемы взаимного исключения, но и более общие задачи синхронизации процессов. В разных операционных системах аппарат событий реализуется по своему, но в любом случае используются системные функции аналогичного назначения, которые условно назовем WAIT(x) и POST(x), где х - идентификатор некоторого события. На рисунке 3 показан фрагмент алгоритма процесса, использующего эти функции. Если ресурс занят, то процесс не выполняет циклический опрос, а вызывает системную функцию WAIT(D), здесь D обозначает событие, заключающееся в освобождении ресурса D. Функция WAIT(D) переводит активный процесс в состояние ОЖИДАНИЕ и делает отметку в его дескрипторе о том, что процесс ожидает события D. Процесс, который в это время использует ресурс D, после выхода из критической секции выполняет системную функцию POST(D), в результате чего операционная система просматривает очередь ожидающих процессов и переводит процесс, ожидающий события D, в состояние ГОТОВНОСТЬ.   21. Объекты синхронизации POSIX (мьютексы, условные переменные) В стандарте POSIX 1003.4a (pthread) определены средства синхронизации потоков. Для обеспечения доступа к объектам синхронизации используется дескриптор, возвращаемый системой при создании этого объекта. С каждым объектом синхронизации связан дополнительный объект – набор атрибутов. Для потока такой объект содержит информацию о наследовании атрибутов, планировании, политике и приоритете планирования, размере стека и сторожевом размере стека [сторожевая резервная область стека, наличие которой помогает предотвратить или выявить переполнение стека]. Конкретная реализация стандарта pthread – DECthreads – исполнительная библиотека поддержки многопоточного выполнения для OSF/1 от компании DEC. Потоки POSIX могут использовать дополнительную операцию pthread_join, которая блокирует вызывающий поток до тех пор, пока указанный поток не завершил работу. Предусмотрено два объекта синхронизации: мьютекс, условная переменная. Мьютекс – двоичный семафор, обеспечивает взаимное исключение. Перед тем, как обратиться к ресурсу, защищенному мьютексом, поток блокирует его, а закончив работу – снимает блокировку. Если мьютекс уже заблокирован, поток либо ждет, либо продолжает некоторые другие действия, в зависимости от того, как была вызвана функция попытки блокирования. Мьютекс создается вызовом pthread_mutex_init(), в котором можно задать атрибуты, включая следующие типы мьютекса: 1) быстрый (по умолчанию) ­ – блокируется потоком только один раз; если поток попытается заблокировать его еще раз без предварительного разблокирования, возникнет взаимоблокировка потока с самим собой: он будет заблокирован до тех пор, пока сам не разблокирует мьютекс, чего он сделать не сможет. 2) рекурсивный – может быть заблокирован потоком более одного раза. Полезен в тех случаях, когда требуется рекурсивный вызов своей же программы. 3) нерекурсивный – подобно быстрому мьютексу может быть заблокирован только один раз, после чего при попытке блокирования будет возвращаться ошибка. Если другой поток попытается разблокировать данный мьютекс, он тоже получит ошибку. Это средство для отладки программ, впоследствии рекурсивный мьютекс заменяется быстрым. Условная переменная используется совместно с мьютексом и позволяет потоку дождаться перехода общих данных в заданное состояние, определяемое логическим выражением – предикатом. Условные переменные используются для крупномасштабных задач, где поток может ожидать выполнения определенного условия в течение относительно длительного времени. Мьютексы, наоборот, используется для мелкоструктурной синхронизации и блокируются на короткие промежутки. Совместное использование мьютекса и условной переменной: поток блокирует мьютекс, связанный с общими данными и проверяет, находятся ли данные в нужном состоянии. Если нет, он останавливается и ждет возле условной переменной, а мьютекс освобождает. Это важно, т.к. другой поток должен иметь доступ к общим данным для приведения их в нужное состояние. Необходимо, чтобы этот другой поток пробудил ожидающий с помощью сигнализирующего вызова условной переменной. Если около нее ждет несколько потоков, освобождается только один. При этом пробудившийся потоком первым делом снова блокирует мьютекс.   26. Взаимоблокировки. Условия возникновения. Страусовый алгоритм Проблема взаимоблокировок Взаимные блокировки называют также дедлоками (deadlocks), клинчами (clinch) или тупиками. Рассмотрим пример тупика. Пусть двум процессам, выполняющимся в режиме мультипрограммирования, для выполнения их работы нужно два ресурса, например, принтер и диск. И пусть после того, как процесс А занял принтер (установил блокирующую переменную), он был прерван. Управление получил процесс В, который сначала занял диск, но при выполнении следующей команды был заблокирован, так как принтер оказался уже занятым процессом А. Управление снова получил процесс А, который в соответствии со своей программой сделал попытку занять диск и был заблокирован: диск уже распределен процессу В. В таком положении процессы А и В могут находиться сколь угодно долго. В зависимости от соотношения скоростей процессов, они могут либо совершенно независимо использовать разделяемые ресурсы (г), либо образовывать очереди к разделяемым ресурсам (в), либо взаимно блокировать друг друга (б). Тупиковые ситуации надо отличать от простых очередей, хотя и те и другие возникают при совместном использовании ресурсов и внешне выглядят похоже: процесс приостанавливается и ждет освобождения ресурса. Однако очередь - это нормальное явление, неотъемлемый признак высокого коэффициента использования ресурсов при случайном поступлении запросов. Она возникает тогда, когда ресурс недоступен в данный момент, но через некоторое время он освобождается, и процесс продолжает свое выполнение. Тупик же, что видно из его названия, является в некотором роде неразрешимой ситуацией. Проблема тупиков включает в себя следующие задачи: • предотвращение тупиков, • распознавание тупиков, • восстановление системы после тупиков. Данная проблема в общем случае решения не имеет. Коффман и другие исследователи доказали, что для возникновения ситуации взаимоблокировки должны выполняться одновременно четыре условия: 1. Условие взаимного исключения. Каждый ресурс в данный момент или отдан ровно одному процессу, или доступен. 2. Условие удержания и ожидания. Процессы, в данный момент удерживающие полученные ранее ресурсы, могут запрашивать новые ресурсы. 3. Условие отсутствия принудительной выгрузки ресурса. У процесса нельзя принудительным образом забрать ранее полученные ресурсы. Процесс, владеющий ими, должен сам освободить ресурсы. 4. Условие циклического ожидания. Должна существовать круговая последовательность из двух и более процессов, каждый из которых ждет доступа к ресурсу, удерживаемому следующим членом последовательности. Тупики могут быть предотвращены на стадии написания программ, то есть программы должны быть написаны таким образом, чтобы тупик не мог возникнуть ни при каком соотношении взаимных скоростей процессов. Так, если бы в предыдущем примере процесс А и процесс В запрашивали ресурсы в одинаковой последовательности, то тупик был бы в принципе невозможен. Второй подход к предотвращению тупиков называется динамическим и заключается в использовании определенных правил при назначении ресурсов процессам, например, ресурсы могут выделяться в определенной последовательности, общей для всех процессов. В некоторых случаях, когда тупиковая ситуация образована многими процессами, использующими много ресурсов, распознавание тупика является нетривиальной задачей. Существуют формальные, программно-реализованные методы распознавания тупиков, основанные на ведении таблиц распределения ресурсов и таблиц запросов к занятым ресурсам. Анализ этих таблиц позволяет обнаружить взаимные блокировки. Если же тупиковая ситуация возникла, то не обязательно снимать с выполнения все заблокированные процессы. Можно снять только часть из них, при этом освобождаются ресурсы, ожидаемые остальными процессами, можно вернуть некоторые процессы в область свопинга, можно совершить "откат" некоторых процессов до так называемой контрольной точки, в которой запоминается вся информация, необходимая для восстановления выполнения программы с данного места. Контрольные точки расставляются в программе в местах, после которых возможно возникновение тупика. Из всего вышесказанного ясно, что использовать семафоры нужно очень осторожно, так как одна незначительная ошибка может привести к останову системы.   Технологии управления памятью распределение фиксированными разделами Самым простым способом управления оперативной памятью является разделение ее на несколько разделов фиксированной величины. Это может быть выполнено вручную оператором во время старта системы или во время ее генерации. Очередная задача, поступившая на выполнение, помещается либо в общую очередь (рисунок 2,а), либо в очередь к некоторому разделу (рисунок 2,б). Подсистема управления памятью в этом случае выполняет следующие задачи: *сравнивая размер программы, поступившей на выполнение, и свободных разделов, выбирает подходящий раздел, *осуществляет загрузку программы и настройку адресов. При очевидном преимуществе - простоте реализации - данный метод имеет существенный недостаток - жесткость. Так как в каждом разделе может выполняться только одна программа, то уровень мультипрограммирования заранее ограничен числом разделов не зависимо от того, какой размер имеют программы. Даже если программа имеет небольшой объем, она будет занимать весь раздел, что приводит к неэффективному использованию памяти. С другой стороны, даже если объем оперативной памяти машины позволяет выполнить некоторую программу, разбиение памяти на разделы не позволяет сделать этого. Распределение разделами переменной величины В этом случае память машины не делится заранее на разделы. Сначала вся память свободна. Каждой вновь поступающей задаче выделяется необходимая ей память. Если достаточный объем памяти отсутствует, то задача не принимается на выполнение и стоит в очереди. После завершения задачи память освобождается, и на это место может быть загружена другая задача. Таким образом, в произвольный момент времени оперативная память представляет собой случайную последовательность занятых и свободных участков (разделов) произвольного размера. На рисунке 3 показано состояние памяти в различные моменты времени при использовании динамического распределения. Так в момент t0 в памяти находится только ОС, а к моменту t1 память разделена между 5 задачами, причем задача П4, завершаясь, покидает память. На освободившееся после задачи П4 место загружается задача П6, поступившая в момент t3. Задачами операционной системы при реализации данного метода управления памятью является: *ведение таблиц свободных и занятых областей, в которых указываются начальные адреса и размеры участков памяти, *при поступлении новой задачи - анализ запроса, просмотр таблицы свободных областей и выбор раздела, размер которого достаточен для размещения поступившей задачи, *загрузка задачи в выделенный ей раздел и корректировка таблиц свободных и занятых областей, *после завершения задачи корректировка таблиц свободных и занятых областей.     Рассмотрим механизм преобразования виртуального адреса в физический при страничной организации памяти (рисунок 5). Виртуальный адрес при страничном распределении может быть представлен в виде пары (р, s), где р - номер виртуальной страницы процесса (нумерация страниц начинается с 0), a s - смещение в пределах виртуальной страницы. Учитывая, что размер страницы равен 2 в степени к, смещение s может быть получено простым отделением k младших разрядов в двоичной записи виртуального адреса. Оставшиеся старшие разряды представляют собой двоичную запись номера страницы р. Рис. 5 При каждом обращении к оперативной памяти аппаратными средствами выполняются следующие действия: 1. на основании начального адреса таблицы страниц (содержимое регистра адреса таблицы страниц), номера виртуальной страницы (старшие разряды виртуального адреса) и длины записи в таблице страниц (системная константа) определяется адрес нужной записи в таблице, 2. из этой записи извлекается номер физической страницы, 3. к номеру физической страницы присоединяется смещение (младшие разряды виртуального адреса). Использование в пункте (3) того факта, что размер страницы равен степени 2, позволяет применить операцию конкатенации (присоединения) вместо более длительной операции сложения, что уменьшает время получения физического адреса, а значит повышает производительность компьютера. На производительность системы со страничной организацией памяти влияют временные затраты, связанные с обработкой страничных прерываний и преобразованием виртуального адреса в физический. При часто возникающих страничных прерываниях система может тратить большую часть времени впустую, на свопинг страниц. Чтобы уменьшить частоту страничных прерываний, следовало бы увеличивать размер страницы. Кроме того, увеличение размера страницы уменьшает размер таблицы страниц, а значит уменьшает затраты памяти. С другой стороны, если страница велика, значит велика и фиктивная область в последней виртуальной странице каждой программы. В среднем на каждой программе теряется половина объема страницы, что в сумме при большой странице может составить существенную величину. Время преобразования виртуального адреса в физический в значительной степени определяется временем доступа к таблице страниц. В связи с этим таблицу страниц стремятся размещать в "быстрых" запоминающих устройствах. Это может быть, например, набор специальных регистров или память, использующая для уменьшения времени доступа ассоциативный поиск и кэширование данных. Страничное распределение памяти может быть реализовано в упрощенном варианте, без выгрузки страниц на диск. В этом случае все виртуальные страницы всех процессов постоянно находятся в оперативной памяти. Такой вариант страничной организации хотя и не предоставляет пользователю виртуальной памяти, но почти исключает фрагментацию за счет того, что программа может загружаться в несмежные области, а также того, что при загрузке виртуальных страниц никогда не образуется остатков.     36 Управление памятью в защищенном режиме процессора Pentium Сегменты, дескрипторы сегментов, дескрипторные таблицы Сегмент – это блок адресов.   Segment – отрезок памяти. В системе может быть много сегментов – по необходимости. Каждый сегмент имеет описатель – дескриптор. Это сложная 8-байтная структура данных. Здесь собирается вся информация об обращении к памяти в пределах данного сегмента. Если некоторый участок памяти не описан, т.е. не оформлен в виде сегмента, память недоступна системе. При обращении к таким адресам формируется исключение. Формат дескриптора сегмента:   Разбросанный характер объясняется совместимостью с 80286, где сегментный дескриптор имел 0 в старшем слове (48-63). Базовый адрес – 32-х разрядный адрес начала сегмента в пространстве 0…4Gb. Бит G – granularity, гранулярность. Определяет размер элементов сегмента, в байтах или страницах по 4 К. Сегмент с байтной гранулярностью имеет максимальный размер 1 Мб, со страничной – 4 Gb. Размер сегмента или предел. Это поле имеет 20 бит, соответственно, может определять 220 = 1 Мб элементов, которыми могут быть байты или страницы по 4 К. Размер сегмента = предел+1, т.е. сегмента с нулевым размером не бывает. Предел (limit) есть максимальное смещение в сегменте; если смещение превысит предел, адрес окажется «за пределами» сегмента, поэтому возникает FGP при попытке обращения к памяти. Байт 5 дескриптора (считая с 0) содержит права доступа – access rights, AR. Р – бит присутствия в оперативной памяти. При выборе сегмента с Р=0 возникает особый случай неприсутствия сегмента. ОС должна загрузить сегмент в ОЗУ и осуществить рестарт команды. DPL – 00 – наибольшие привилегии, 11 – наименьшее. S – системный объект: S=0 – системный объект, S=1 – несистемный. TYPE – 3 бита, допустимые операции над сегментом. 000 – только считывание; 001 – считывание и запись; 010 – (стек) только считывание – не применяется; 011 – (стек) считывание и запись; 100 – (код) только выполнение (даже без считывания); 101 – (код) выполнение и считывание; 110 – (код) подчиненный сегмент, только выполнение; 111 – (код) подчиненный сегмент, выполнение и считывание. Бит А – доступа или обращения. Процессор автоматически устанавливает А в 1, при обращении к тому сегменту, который определяется этим дескриптором. ОС может использовать этот бит для отслеживания не часто используемых сегментов. Бит D – Default Size – размер по умолчанию. D=0 – операнды в сегменте считаются 16-битными. D=1 - операнды в сегменте считаются 32-битными. Так легко организовать сегменты 16-битного и 32-битного кода, а процессору ничего не стоит переключаться между ними. Для сегментов данных и стека аналогично. Для стека 16 бит используется SP, а размер ограничен 64 Кб. X – зарезервировано, must be 0. U – user – для использования программистами; процессором игнорируется. Возможное применение – пометка для «сборки мусора».   44 Способы организации файлов Учитываются следующие критерии: быстрота доступа, легкость обновления, экономность хранения, простота обслуживания, надежность. Существуют 5 фундаментальных способов организации файлов: 1) смешанный; 2) последовательный; 3) индексно-пользовательский; 4) индексированный; 5) файл прямого доступа (хэшированный). В любом случае предполагается, что файл содержит записи – наборы связанных элементов данных (полей), которые могут быть обработаны как единое целое. Смешанный файл.. Состоит из записей, поступающих в хронологическом порядке; каждое поле должно описывать само себя, включая имя поля, значение, длину (если она может быть переменной). Доступ к записи может быть осуществлен только путем полного перебора всех имеющихся записей. Последовательный файл. Наиболее распространенный тип; все записи имеют фиксированный формат (количество, порядок и длины полей), так что хранятся только значения полей. Индексно-последовательный. Каждая запись снабжается специальным ключевым полем, которое идентифицирует запись уникальным образом, так что ключи различных записей обязательно различны. Записи отсортированы по порядку ключей. С каждым файлом связан индексный файл, представляющий собой записи двух полей: [ключ; позиция в файле с основными данными]. Это ускоряет поиск: для доступа к записи с указанным ключом сначала ищется запись с таким ключом


Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-08-20 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: