Достигается высокая степень попаданий за счет учета пространственной и временной локальности данных.

Временная локальность: если произошло обращение по некоторому адресу, то следующее обращение по тому же адресу с большей вероятностью произойдет в ближайшее время.

Пространственная локальность: если произошло обращение по некоторому адресу, то с высокой степенью вероятности в ближайшее время произойдет обращение к соседним адресам.

В начале работы системы, когда кэш-память пуста, почти каждый запрос к оперативной памяти сопровождается кэш-промахом и копированием данных в кэш. Затем, по мере накопления кэша, в полном соответствии со свойствами временной локальности возрастает вероятность обращения к данным, которые уже были использованы ранее и имеются в кэше.

Для использования свойства пространственной локальности данных в кэш-память считывается не один информационный элемент, к которому произошло обращение, а целый блок данных, расположенных в непосредственной близости к данным этого элемента.

В процессе работы содержимое кэш-памяти постоянно обновляется, данные из нее вытесняются. Алгоритм обновления данных в кэш-памяти существенно влияет на ее эффективность. Наличие в компьютере двух копий данных – в основной памяти и в кэше – порождает проблему их согласования. Если происходит запись в основную память по некоторому адресу, а содержимое этой ячейки находится в кэше, то в результате соответствующая запись в кэше становится недостоверной.

Возможны два решения проблемы: сквозная и обратная запись.

Сквозная запись. При каждом запросе к основной памяти, в том числе и при записи, просматривается кэш. Если данные в кэше отсутствуют, то запись выполняется только в основную память. Если же данные находятся в кэше, то запись выполняется одновременно в кэш и основную память. При вытеснении данных из кэша они просто теряются.

Обратная запись. Аналогично при возникновении запроса к памяти выполняется просмотр кэша. И если данных там нет, то запись выполняется только в основную память. В противном случае производится запись только в кэш-память, при этом в описателе данных кэша делается специальная отметка (признак модификации), которая указывает на то, что при вытеснении этих данных из кэша необходимо переписать их в основную память, чтобы обновить устаревшее содержимое основной памяти.

При выполнении запросов к оперативной памяти во многих вычислительных системах используется двухуровневое кэширование. Кэш первого уровня имеет меньший объем и более высокое быстродействие, чем кэш второго уровня. Кэш второго уровня играет роль основной памяти по отношению к кэшу первого уровня.

2.3.3. Отображение основной памяти на кэш

Принцип прозрачности требует, чтобы правило отображения основной памяти на кэш-память не зависело от работы программ и пользователей. Для кэширования используются две основные схемы отображения: случайное отображение и детерминированное отображение.

При случайном отображении элемент оперативной памяти вместе со своим адресом может быть размещен в произвольном месте кэш-памяти. При каждом запросе к памяти выполняется поиск в кэше по адресу искомого элемента методом полного перебора. Так как такой поиск требует времени, то с целью ускорения его реализуют аппаратно, что удорожает кэш-память.

В такой кэш-памяти вытеснение старых записей происходит лишь при ее полном заполнении. Обычно вытесняются записи, к которым меньше всего не было обращений.

Детерминированный (прямой) способ отображения предполагает, что любой элемент основной памяти всегда отображается в одно и то же место кэш-памяти. Между номерами строк кэш-памяти и адресами основной памяти устанавливается соотношение «один ко многим»: одному номеру строки соответствует несколько адресов оперативной памяти.

Очевидно, что поиск данных в таком кэше сокращается по времени, однако вытеснение данных из кэша может происходить, когда в ней достаточно свободного места, т. к. каждая строка кэша предназначена строго для определенных адресов основной памяти.

Во многих современных процессорах кэш-память строится на основе сочетания этих двух подходов, что позволяет совместить их достоинства.

При смешанном подходе произвольный адрес оперативной памяти отображается не на один адрес кэш-памяти и не на любой адрес, а на некоторую группу адресов. Все группы пронумерованы. Поиск в кэше осуществляется вначале по номеру группы (детерминированно), а затем в пределах группы путем просмотра адресов записей. Выгрузка из группы выполняется лишь при ее переполнении по критерию меньшего обращения.

Таким образом, в данном способе комбинируется прямое отображение на группу и случайное отображение в пределах группы.

2.4. Управление вводом-выводом

Основными компонентами подсистемы ввода-вывода являются драйверы, управляющие внешними устройствами, и файловая система.

2.4.1. Контроллеры и драйверы

Каждое устройство ввода-вывода вычислительной системы – диск, принтер, монитор и т. п. – снабжено специализированным блоком управления, называемым контроллером. Контроллер взаимодействует с драйвером – системным программным модулем, предназначенным для управления данным устройством (рис. 2.5).

Рис. 2.5. Взаимодействие устройства ввода-вывода с операционной системой

Устройство, находящееся под управлением контроллера, может некоторое время выполнять свои операции автономно, не требуя внимания со стороны центрального процессора и операционной системы.

Даже самый примитивный контроллер, выполняющий простые функции, обычно тратит довольно много времени на самостоятельную работу после получения очередной команды от процессора.

Драйвер взаимодействует, с одной стороны, с модулями ядра операционной системы (модулями подсистемы ввода-вывода, модулями системных вызовов, модулями подсистемы управления процессами и памятью и т. д.), а с другой стороны – с контроллером внешних устройств. Поэтому существует два типа интерфейсов: интерфейс «драйвер – ядро» и интерфейс «драйвер – устройство».

Интерфейс «драйвер – ядро» должен быть стандартным в любом случае, а интерфейс «драйвер – устройство» имеет смысл стандартизовать, когда подсистема ввода-вывода не разрешает драйверу непосредственно взаимодействовать с аппаратурой контроллера, а выполняет эти операции самостоятельно. Драйвер в этом случае становится независимым от аппаратной платформы.

Для того, чтобы операционная система не испытывала недостатка в драйверах, необходимо наличие четкого, удобного и открытого интерфейса между драйверами и другими компонентами операционной системы. Это важно для того, чтобы драйверы писали не только разработчики ОС, но и производители внешних устройств.

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

При этом нижние слои подсистемы ввода-вывода должны включать индивидуальные драйверы, написанные для конкретных физических устройств, а верхние слои должны обобщать процедуры управления этими устройствами, представляя общий интерфейс если не для всех устройств, то, по крайней мере, для групп устройств, обладающих некоторыми общими характеристиками, например, для принтеров определенного производителя или для всех матричных принтеров и т. п.

Первоначально под драйвером понимался программный модуль, который:

·  входит в состав ядра операционной системы, работая в привилегированном режиме;

·  непосредственно управляет внешним устройством, взаимодействуя с его контроллером с помощью команд ввода-вывода компьютера;

·  обрабатывает прерывания от контроллера устройства;

·  предоставляет прикладному программисту удобный логический интерфейс работы с устройством, экранируя от него низкоуровневые детали управления устройством и организации его данных;

·  взаимодействует с ядром операционной системы с помощью строго оговоренного интерфейса, описывающего формат передаваемых данных, структуру буферов, способы включения драйвера в состав ОС, способы вызова драйвера, набор общих процедур подсистемы ввода-вывода, которыми драйвер может пользоваться, и т. п.

По мере развития операционных систем наряду с традиционными драйверами в операционной системе появились так называемые высокоуровневые драйверы, которые располагаются в общей модели подсистемы ввода-вывода над традиционными драйверами.

Традиционные драйверы, которые стали называться аппаратными драйверами, низкоуровневыми драйверами или драйверами устройств, освобождаются от высокоуровневых функций и занимаются только низкоуровневыми операциями.

Высокоуровневые драйверы оформляются по тем же правилам, что и аппаратные драйверы. Единственным отличием является то, что высокоуровневые драйверы, как правило, не вызываются по прерываниям, т. к. взаимодействуют с управляемым устройством через посредничество аппаратных драйверов.

Разделение на аппаратные и высокоуровневые драйверы можно продемонстрировать на примере подсистемы сетевых устройств. Аппаратными драйверами у них являются драйверы сетевых адаптеров, которые выполняют функции низкоуровневых канальных протоколов (Ethernet, Frame Relay, ATM и др.). Эти драйверы выполняют простые функции – организуют передачу кадров данных между компьютерами одной физической сети.

Над ними располагается слой модулей (драйверов), которые реализуют функции более интеллектуальных сетевых протоколов (IP, IPX), которые могут обеспечить межсетевое взаимодействие. Над слоем драйверов сетевых протоколов располагается слой драйверов транспортных протоколов (TCP, UDP, SPX и др.). Еще выше располагается слой драйверов прикладного уровня, которые предоставляют пользователям сети конечные услуги по доступу к ресурсам сети.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12