Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Учебники / Р.Марек. Ассемблер на примерах. СПб. 2005

.pdf
Скачиваний:
591
Добавлен:
13.06.2014
Размер:
6.05 Mб
Скачать

Ассемблер на примерах. Базовый курс

Листинг 7.4. Программа преобразования строки в число

ASCIIToNum

esi = указатель на строку, заканчивающуюся символом с

кодом 0x0

есх = основание системы счисления

Возвращает:

еах = число

ASCIIToNum: push esi xor еах,еах xor ebx,ebx

cmp byte [esi] , ' - ' jnz .next

inc esi

.next: lodsb or al,al

j z .done

call convert_char

imul ebx,ecx add ebx,eax jmp short .next

.done:

xchg ebx,eax pop esi

cmp byte [esi] , ' - ' jz .negate

ret

.negate: neg eax ret

;сохраняем указатель в стеке

;ЕАХ = О

;ЕВХ = О: накопитель для числа

;число отрицательное?

;если нет, не пропускаем следующий ;символ

;пропускаем символ '- '

;читаем цифру в AL ;конец строки?

/преобразовать в число и сохранить

;его в AL

;умножить ЕВХ на ЕСХ, сохранить в ЕВХ

;сложить ;и повторить

/поместить накопленное число в ЕАХ /восстановить исходное значение ESI /результат должен быть отрицательным? /да, выполним отрицание /нет, положительным — все готово

/выполняем отрицание /все!!!

110

Глава 8 Операционная система

Эволюция операционных систем

Распределение процессорного

времени. Процессы

Управление памятью

Файловые системы

Загрузка системы

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

8.1. Эволюция операционных систем

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

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

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

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

112

Глава 8. Операционная система

Мультипрограммирование поставило операционные системы перед новым вызовом: как распределить ресурсы компьютера, то есть процессор, память, периферийные устройства, между отдельными программами? В этой главе мы рассмотрим ответы на этот вопрос.

8.2. Распределение процессорного времени. Процессы

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

Процессы

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

Всех потомков или «детей» процесса (то есть те процессы, которые он поро­ дил) называют «дочерними» процессами. «Родословное дерево» называется иерархией процессов.

init — • xdm

W Xfree86

 

 

 

 

предок <—-• потомок

 

xdm

window

sshagent

 

 

maker

 

 

предок

^—-•• потомок

— • xterm

Рис. 8.1. Иерархия процессов

Загрузившись, ядро операционной системы запускает первый процесс. В опе­ рационных системах UNIX (Linux) он называется init. Этот процесс станет «прародителем» всех остальных процессов, протекаюгцих в системе. В опера­ ционной системе DOS «прародителем» является командный интерпретатор COMMAND.COM.

Дочерний процесс может унаследовать некоторые свойства или данные от своего родительского процесса. Процесс можно «убить» (kill), то есть за­ вершить. Если убит родительский процесс, то его дочерние процессы либо «усыновляются» другим процессом (обычно init), либо тоже завершаются.

113

Ассемблер на примерах. Базовый курс

Планирование процессов

На самом деле процессы выполняются не параллельно, как если бы они были запущены на независимых компьютерах. Если у компьютера только один про­ цессор, то процессы будут выполняться в так называемом псевдопараллельном режиме. Это означает, что каждый процесс разбивается на множество этапов. И этапы разных процессов по очереди получают кванты процессорного вре­ мени — промежутки времени, в течение которого они монопольно занимают процессор.

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

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

Состояния процессов

Ядро операционной системы внимательно «наблюдает» за каждым процессом. Вся необходимая информация о процессе хранится в структуре, которая на­ зывается блоком управления процессом (РСВ, process control block).

В операционной системе UNIX процесс может находиться в одном из пяти различных состояний:

Рождение — пассивное состояние, когда самого процесса еще нет, но уже готова структура для появления процесса.

Готовность — пассивное состояние: процесс готов к выполнению, но процессорного времени ему пока не выделено.

Выполнение — активное состояние, во время которого процесс обладает всеми необходимыми ему ресурсами. В этом состоянии процесс непо­ средственно выполняется процессором.

Ожидание — пассивное состояние, во время которого процесс заблокиро­ ван, потому что не может быть выполнен: он ожидает какого-то события, например, ввода данных или освобождения нужного ему устройства.

Смерть процесса — самого процесса уже нет, но может случиться, что его «место», то есть структура, осталось в списке процессов (процессы-зомби).

114

Глава 8. Операционная система

Смерть Выполнение —> (завершение)

А 1

 

1

Т

т

Готовность

4—

Ожидание

А

Рождение

(создание)

Рис. 8.2. Жизненный цикл процесса

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

Ядро операционной системы хранит следующую информацию о процессе:

Размещение в памяти.

Ресурсы процесса (открытые файлы, устройства и т.п.).

Контекст процесса.

Состояние процесса.

Имя процесса.

Идентификационный номер процесса (PID, Process ID).

Идентификационный номер родительского процесса.

Права доступа.

Текущий рабочий каталог.

Приоритет.

Стратегия планирования процессов

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

Простейшая стратегия планирования процессов называется кольцевой (Round Robin). Все процессы ставятся в очередь. Планировщик выбирает первый про­ цесс и передает его диспетчеру. Через определенное время ядро прерывает первый процесс, перемещает его в конец очереди и выбирает следующий процесс.

Другая стратегия распределения процессорного времени основана на при­ оритетах. Каждому процессу в очереди назначен некоторый приоритет, и в соответствии с ним планировщик распределяет процессорное время — ста­ тически или динамически. Статическое назначение приоритетов означает,

115

Ассемблер на примерах. Базовый курс

-> Очередь

Активный

\ I

( процесс

J

I

I

 

[

Диспетчер j

 

Р1ЛС, 8.3. Кольцевая стратегия Round Robin

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

8.3. Управление памятью

Операционная система отслеживает свободную оперативную память, peaлизует стратегию выделения оперативной памяти и освобождения ее для последующего использования. Оперативная память делится между ядром и всеми выполняемыми процессами.

Простое распределение памяти

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

Операционная система

 

процесс 1

адресное пространство

первого процесса

 

Процесс 2

адресное пространство

второго процесса

 

нераспределенное

пространство

Рис. 8.4. Фиксированное распределение памяти между процессами

116

Глава 8. Операционная система

Каждый блок памяти может быть занят только одним процессом и будет за­ нят, даже если процесс еще не начал выполняться. Ядро обеспечивает защиту блоков памяти, занятых различными процессами.

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

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

Свопинг (swapping) — организация подкачки

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

Когда системе нужны данные, находящиеся в файле (разделе) подкачки, си­ стема подгружает их в оперативную память, выгрузив предварительно в файл подкачки другие данные.

Виртуальная память и страничный обмен

Закон Мерфи гласит: программа растет до тех пор, пока не заполнит всю доступную память.

Решением проблемы стало «притвориться», что в распоряжении операцион­ ной системы больше оперативной памяти, чем на самом деле. Этот механизм называется виртуальной памятью и чаще всего реализуется через систему страничного обмена.

Каждому процессу выделено виртуальное адресное пространство, то есть диапазон адресов, ограниченный только архитектурой процессора, а не объ­ емом физически установленной оперативной памяти. Виртуальное адресное пространство делится на страницы одинакового размера, обычно 4 Кб. Фи­ зическая оперативная память делится на так называемые фреймы, размер каждого фрейма равен размеру страницы.

117

Ассемблер на примерах. Базовый курс

Виртуальный адрес

смещение

Рис. 8.5. Преобразование виртуального адреса в физический

Перед каждым обращением к памяти процессор запрашивает так называемый блок управления памятью (MMU, Memory Management Unit), чтобы он пре­ образовал виртуальный адрес в физический.

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

Запись таблицы страниц

 

Флаги

Физический

Р

Другие флаги

Бит

буфера

адрес

 

присутствия

 

 

 

Рис. 8.6. Запись таблицы страниц

Наиболее важный бит — бит присутствия страницы. Если он установлен, то эта страница сохранена во фрейме, номер которого (адрес) определен в физическом адресе. Другие биты в таблице определяют права доступа или разрешения для страницы (read/write/execute) или используются для буфера. Таблица страниц индексирована номером виртуальной страницы.

Рассмотрим пример трансляции (преобразования) виртуального адреса в физический (рис. 8.7).

118

Глава 8. Операционная система

Рис. 8.7. Принцип преобразования виртуального адреса в физический

По виртуальному адресу MMU вычисляется номер виртуальной страницы, на которой он находится. Разность между адресом начала страницы и требуемым адресом называется смещением.

По номеру страницы ищется строка в таблице страниц. Бит присутствия в этой строке указывает, находится ли виртуальная страница в физической памяти компьютера (бит Р установлен в 1) или в файле (разделе) подкачки на диске.

Если страница присутствует в физической памяти, то к физическому адресу (номеру фрейма) добавляется смещение, и нужный физический адрес готов. Если страница выгружена из оперативной памяти (бит Р установлен в 0), то процессор (или его MMU) вызывает прерывание «Страница не найдена» (Page Not Found), которое должно быть обработано операционной системой.

В ответ на прерывание «Страница не найдена» операционная система должна загрузить требуемую страницу в физическую оперативную память. Если заня­ ты не все фреймы, то ОС загружает страницу из файла подкачки в свободный фрейм, исправляет таблицу страниц и заканчивает обработку прерывания.

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

119