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

Архитектура компьютера - Таненбаум Э

..pdf
Скачиваний:
493
Добавлен:
24.05.2014
Размер:
5.67 Mб
Скачать

Примеры операционных систем

5 0 3

Стандартная

Имя

Имя для

 

информация

файла

MS-DOS Защита

Данные

Элемент таблицы MFT для одного файла

Заголовок

таблицы MFT

Главная

файловая таблица (MFT)

Рис. 6.28. Главная файловая таблица в системе Windows NT

Поле стандартой информации содержит информацию об отметках времени, необходимых стандартах POSIX, о числе связей, о битах «только для чтения» и битах архивирования и т. д. Это поле имеет фиксированную длину и является обязательным. Имя файла может иметь любую длину до 255 символов Unicode. Чтобы такие файлы стали доступны для старых 16-битных программ, они могут снабжаться дополнительным именем MS-DOS, состоящим максимум из 8 символов, за которыми следует точка и расширение из 3 символов. Если действительное имя файла соответствует правилу наименования в MS-DOS (8+3), то второе имя для MS-DOS не используется.

Далее следует информация о защите. Во всех версиях, вплоть до NT 4.0, в поле защиты содержался дескриптор защиты. Начиная с NT 5.0, вся информация о защите помещается в один файл, а поле защиты просто указывает на соответствующую часть этого файла.

Для файлов небольшого размера сами данные этих файлов содержатся в элементе главной файловой таблицы, что упрощает их вызов, — для этого не требуется обращаться к диску. Данная идея получила название непосредственный файл (immediate file) [100]. Для файлов большого размера это поле содержит указатели на кластеры, в которых содержатся данные или (что более распространено) блоки последовательных кластеров, так что номер кластера и его длина могут представлять произвольное количество данных. Если элемент главной файловой таблицы недостаточно велик для хранения нужной информации, к нему можно привязать один или несколько дополнительных элементов.

Максимальный размер файла составляет 2м байтов. Поясним, что собой представляет файл на 2Ы байтов. Представим, что файл был написан в двоичной системе, а каждый 0 или 1 занимает 1 мм пространства. Длина листинга на 267 мм составила бы 15 световых лет. Этого хватило бы для того, чтобы выйти за пределы Солнечной системы, достичь Альфа Центавра и вернуться обратно.

Файловая система NTFS имеет много других интересных особенностей, в том числевозможностькомпрессииданных иотказоустойчивостьсприменением атомарныхтранзакций.Дополнительнуюинформациюобэтойсистемеможнонайтив [137].

5 0 4 Глава 6. Уровень операционной системы

Примеры управления процессами

Системы NT и UNIX позволяют разделить работу на несколько процессов, которые выполняются параллельно и взаимодействуют друг с другом, как в примере с производителем и потребителем, который мы обсуждали ранее. В этом разделе мы поговорим о том, как происходит управление процессами в обеих системах. Обе системы поддерживают параллелизм в пределах одного процесса с использованием потоков, и об этом мы тоже расскажем.

Управление процессами в системе UNIX

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

Часто порожденный процесс определенным образом дезориентирует дескрипторы файлов, а затем выполняет системный вызов exec, который замещает его программу и данные программой и данными из выполняемого файла, определенного в качестве параметра к вызову exec. Например, если пользователь печатает команду xyz, то интерпретатор команд (оболочка) выполняет операцию fork, создавая таким образом порожденный процесс. А этот процесс выполняет процедуру exec, чтобы запустить программу xyz.

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

Процессы могут выполнять процедуруfork сколь угодно часто, в результате чего получается целое дерево процессов. Посмотрите на рис. 6.29. Здесь процесс А выполнил процедуру fork дважды и породил два новых процесса, В и С. Затем процесс В тоже выполнил процедуру fork дважды, а процесс С выполнил ее один раз. Таким образом, получилось дерево из шести процессов.

Исходный процесс

Процессы, порожденные процессом А

Процессы, порожденные дочерними процессами процесса А

Рис. 6.29. Дерево процессов в системе UNIX

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

Примеры операционных систем

505

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

В системах System V и Solaris применяется другой метод взаимодействия процессов. Здесь используются так называемые очереди сообщений. Процесс может создать новую очередь сообщений или открыть уже существующую с помощью вызоваmsgget.Дляотправкисообщенийиспользуетсявызовmsgsnd,адляполучения — msgrecv. Сообщения, отправленные таким способом, отличаются отданных, помещаемых в канал. Во-первых, границы сообщений сохраняются, а в канал передается просто поток данных. Во-вторых, сообщения имеют приоритеты, поэтому срочные сообщения идут перед всеми остальными. В-третьих, сообщения типизированы, и вызов msgrecv может определять их тип, если это необходимо.

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

Еще одна особенность System V и Solaris — наличие семафоров. Принципы их работы мы уже описывали, когда говорили о производителе и потребителе.

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

В каких случаях могут понадобиться потоки? Рассмотрим сервер World Wide Web. Такой сервер может хранить в основной памяти кэш часто используемых web-страниц. Если нужная страница находится в кэш-памяти, то она выдается немедленно. Если нет, то она вызывается с диска. К сожалению, на это требуется довольно длительное время (обычно 20 млс), и на это время процесс блокируется и не может обслуживать новые поступающие запросы, даже если эти web-страницы находятся в кэш-памяти.

5 06 Глава 6. Уровень операционной системы

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

Стандарт системы UNIX для потоков называется pthreads. Он определяется стандартом POSIX (P1003.1C) и содержит вызовы для управления потоками и их синхронизации. Управляется ли потоками ядро, или они полностью находятся в пользовательском пространстве, в стандарте не определено. Наиболее распространенные вызовы для работы с потоками приведены в табл. 6.13.

Таблица 6.13. Основные вызовы для потоков, определенные в стандарте POSIX

Вызов потока

Значение

pthread_create

Создает новый поток в адресном пространстве

 

вызывающейпроцедуры

pthread_exit

Завершает поток

pthreadjoin

Ждет завершения потока

pthread_mutex_init

Создает новый мьютекс

pthread_mutex_destroy

Удаляет мьютекс

pthread_mutex_lock

Блокирует мьютекс

pthread_mutex_unlock

Снимает блокировку с мьютекса

pthread_cond_init

Создает переменную условия

pthread_cond_destroy

Удаляет переменную условия

pthread_cond_wait

Ждет переменную условия

pthread_cond_signal

Снимает блокировку с одного из потоков, который ждет

 

переменнуюусловия

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

Потоки можно синхронизировать с помощью специальных объектов, которые называются мьютексами. Обычно мьютекс управляет каким-либо ресурсом (например, буфером, разделенным между двумя потоками). Для того чтобы в конкретный момент времени только один поток мог получать доступ к общему ресурсу, потоки дожны запирать мьютекс перед использованием ресурса и отпирать его после завершения работы с ним. Таким образом можно избежать состояния гонок, поскольку этому протоколу подчиняются все потоки. Мьютексы похожи на бинарные семафоры (то есть семафоры, которые могут принимать только два значения: 0 или 1). Эти объекты получили название «мьютексы» (mutexes), поскольку они используются для обеспечения взаимного исключения доступа к какому-либо из ресурсов (MUTual Exclusion по-английски значит «взаимное исключение»).

Примеры операционных систем

507

Мыотексы можно создавать и разрушать с помощью вызовов pthreadjnutexjnit и pthread_mutex_destroy соответственно. Мьютекс может находиться в одном из двух состояний: блокированном и неблокированном. Если потоку нужно установить блокировку на незапертый мьютекс, он использует pthread'_mutex_lock, а затем продолжает работу. Однако если поток пытается запереть мьютекс, который уже заперт, он блокируется. Когда поток, который в данный момент использует общий ресурс, завершит работу с этим ресурсом, он должен разблокировать соответствующиймьютексспомощьюpthread_mutex_unlock.

Мыотексы предназначены для кратковременной блокировки (например, для защиты общей переменной). Они не предназначены для длительной синхронизации (например, для ожидания, пока освободится накопитель на магнитной ленте). Для длительной синхронизации существуют переменные условия (condition variables). Эти переменные создаются и удаляются с помощью вызовов pthread_ cond_init и pthread_cond__destroy соответственно.

Если, например, поток обнаружил, что накопитель на магнитной ленте, который ему нужен, в данный момент занят, этот поток совершает pthread_cond_wait над переменной условия. Когда поток, который использует накопитель на магнитной ленте, завершает свою работу с этим устройством (а это может произойти через несколько часов), он посылает сигнал pthread_cond_signal, чтобы разблокировать ровно один поток, который ожидает эту переменную условия. Если ни один поток не ожидает эту переменную, сигнал пропадает. У переменных условия (condition variables) нет счетчика, как у семафоров. Отметим, что над потоками, мьютексами и переменными условия можно выполнять и некоторые другие операции.

Управление процессами в Windows NT

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

Новые процессы создаются с помощью функции API CreateProcess. Эта функция имеет 10 параметров, каждый из которых имеет множество опций. Ясно, что такая разработка гораздо сложнее соответствующей схемы в UNIX, где fork вообще не имеет параметров, a exec имеет всего три параметра: указатели на имя файла, который нужно выполнить, на массив параметров командной строки и на строки описания конфигурации. Ниже изложены 10 параметров функции CreateProcess:

1.Указатель на имя выполняемого файла.

2.Сама командная строка.

3.Указатель на дескриптор защиты для данного процесса.

4.Указатель на дескриптор защиты для внутреннего потока.

5.Бит, который сообщает, наследует ли новый процесс идентификаторы (handles) исходного процесса.

6.Различные флаги (например, ошибка, приоритет, отладка, консоль).

7.Указатель на строки описания конфигурации.

5 0 8 Глава 6. Уровень операционной системы

8.Указатель на имя текущего каталога нового процесса.

9.Указатель на структуру, которая описывает исходное окно экрана.

10.Указатель на структуру, которая возвращает 18 значений вызывающей процедуре.

ВNT нет никакой иерархии типа порождающий—порожденный. Все процессы создаются равными. Но поскольку одним из 18 параметров, возвращаемых исходному процессу, является идентификатор (handle) для нового процесса (а это дает возможность контролировать новый процесс), здесь существует внутренняя иерархия с точки зрения того, что определенные процессы содержат идентификаторы других процессов. Эти идентификаторы нельзя просто непосредственно передавать другим процессам, но процесс может сделать определенный идентификатор доступным для другого процесса, а затем передать ему этот идентификатор, так что внутренняя иерархия процессов не может сохраняться долго.

Каждый процесс в NT создается с одним потоком, но позднее этот процесс может создать еще несколько потоков. Создание потока проще, чем создание процесса, поскольку CreateThread имеет всего 6 параметров вместо 10: дескриптор защиты, размер стека, начальный адрес, определяемый пользователем параметр, начальное состояние потока (готов к работе или блокирован) и идентификатор потока.

Создание потоков производится ядром (то есть потоки реализуются не в пользовательском пространстве, как в некоторых других системах).

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

Создавать потоки в NT довольно расточительно, поскольку для создания потока требуется войти в ядро, а затем выйти из него. Чтобы избежать этого, в NT предусмотрены нити (fibers), которые похожи на потоки, но распределяются в пользовательском пространстве программой, которая их создает. Каждый поток может иметь несколько нитей, точно так же как процесс может иметь несколько потоков, только в данном случае, когда нить блокируется, она встает в очередь заблокированных нитей и выбирает другую нить для работы в своем потоке. Ядро не знает об этом переходе, поскольку поток все равно продолжает работать, даже если сначала действовала одна нить, а затем другая. Ядро управляет процессами и потоками, но не управляет нитями. Нити могут пригодиться, например, в том случае, когда программы, которые управляют своими собственными потоками, переносятся в NT.

Процессы могут взаимодействовать друг с другом разными способами: через каналы, именованные каналы, почтовые ящики, сокеты (sockets), удаленные вызовы процедур и общие файлы. Каналы бывают двух видов: байтовые каналы и каналы сообщений. Тип выбирается во время создания. Байтовые каналы работают так же, как в системе UNIX. Каналы сообщений сохраняют границы сообщений, поэтому четыре записи по 128 байтов будут прочитаны как четыре сообщения по 128 байтов (а не как одно сообщение на 512 байтов, как в случае с байтовыми каналами). Кроме того, существуют именованные каналы, которые тоже бывают двух видов. Именованные каналы могут использоваться в сети, а обычные каналы — нет.

Примеры операционных систем

509

Почтовые ящики есть только в NT (в системе UNIX их нет). Они во многом похожи на каналы, хотя не во всем. Во-первых, они односторонние, а каналы — двусторонние. Их можно использовать в сети, но они не гарантируют доставку. Наконец,онипозволяютотправлятьсообщениенесколькимполучателям,анетолько одному.

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

Удаленные вызовы процедур позволяют процессу А приказать процессу В совершить вызов процедуры в адресном пространстве В от имени А и возвратить результат процессу А. Здесь существуют различные ограничения на параметры. Например, не имеет никакого смысла передача указателя другому процессу.

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

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

Семафор создается с помощью функции API CreateSemaphore, которая может установить его на определенное значение и определить его максимальное значение. Семафоры являются объектами ядра, поэтому они имеют дескрипторы защиты и идентификаторы (handles). Идентификатор для семафора может дублироваться с помощью DuplicateHandle и передаваться другому процессу, поэтому на одном семафоре можно синхронизировать несколько процессов. Присутствуют функции up и down, хотя они имеют особые названия: ReleaseSemaphore (up)

иWaitForSingleObject(down).МожноопределитьдляфункцииWaitForSingleObject

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

Мьютексы тоже являются объектами ядра, но они проще семафоров, поскольку у них нет счетчиков. Они, по сути, представляют собой объекты с функциями API для блокирования (WaitForSingleObject) и разблокирования (ReleaseMutex).

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

Третий механизм синхронизации основан на критических секциях, которые сходны с мьютексами, за исключением локальности по отношению к адресному пространству исходного потока. Поскольку критические секции не являются объектами ядра, у них нет идентификаторов (handles) идескрипторов защиты и их нельзя передавать другим процессам. Блокировка и разблокировка осуществляются с помощью EnterCriticalSection и LeaveCriticalSection соответственно. Так как эти функции API выполняются целиком в пользовательском пространстве, они работают гораздо быстрее, чем мьютексы.

5 1 0 Глава 6. Уровень операционной системы

Последний механизм связан с использованием объектов ядра, которые называются событиями. Если потоку нужно дождаться какого-то события, он вызывает WaitForSingleObject. Можно разблокировать один ожидающий поток с помощью SetEvent или все ожидающие потоки с помощью PulseEvent. Существует несколько видов событий, которые имеют несколько опций.

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

Краткое содержание главы

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

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

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

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

UNIX иNTявляются сложными операционными системами. Обе системы поддерживают страничную организацию памяти и отображаемые в память файлы.

Вопросы и задания

511

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

Вопросы и задания

1. Почему операционная система интепретирует только некоторые команды третьего уровня, тогда как микропрограмма интерпретирует все команды этого уровня (уровня архитектуры команд)?

2.Машина содержит 32-битное виртуальное адресное пространство с побайтовой адресацией. Размер страницы составляет 8 Кбайт. Сколько существует страниц виртуального адресного пространства?

3.Виртуальная память содержит 8 виртуальных страниц и 4 физических страничных кадра. Размер страницы составляет 1024 слова. Ниже приведена таблица страниц:

Виртуальная страница

Страничный кадр

0

3

1

1

2

Нет в основной памяти

3

Нет в основной памяти

4

2

5

Нет в основной памяти

6

О

7

Нет в основной памяти

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

2.Каковы физические адреса для 0, 3728, 1023, 1024,1025, 7800 и 4096?

4.Компьютер имеет 16 страниц виртуального адресного пространства и только 4 страничных кадра. Изначально память пуста. Программа обращается

квиртуальным страницам в следующем порядке:

0,7,2,7,5,8,9,2,4

а. Какие из обращений вызовут ошибку с алгоритмом LRU? б. Какие из обращений вызовут ошибку с алгоритмом FIFO?

5.В разделе «Политика замещения страниц» был предложен алогоритм замещения страниц FIFO. Разработайте более эффективный алгоритм. Подсказка: можно обновлять счетчик во вновь загружаемой странице, оставляя все другие.

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

5 1 2 Глава 6. Уровень операционной системы

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

7.Не все компьютеры содержат специальный бит, который автоматически устанавливается, когда производится запись в страницу. Однако нужно ка- ким-то образом следить, какие страницы были изменены, чтобы не пришлось записыватьвсе страницы обратно надиск после ихиспользования. Если предположить, что каждая страница имеет специальные биты для разрешения чтения, записи и выполнения, то как операционная система может следить, какие страницы изменялись, а какие — нет?

8.Сегментированная память содержит страничные сегменты. Каждый виртуальный адрес содержит 2-битный номер сегмента, 2-битный номер страницы и 11-битное смещение внутри страницы. Основная память содержит 32 Кбайт, которые разделены на страницы по 2 Кбайт. Каждый сегмент разрешается либо только читать, либо читать и выполнять, либо читать и записывать, либо читать, записывать и выполнять. Таблицы страниц с указанием на защиту приведены ниже:

Сегмент 0

 

Сегмент 1 Сегмент 2

Сегмент 3

 

 

Только для чтения

Чтение/выполнение

Чтение/запись/

Чтение/запись

 

 

 

 

выполнение

 

 

Вирту-

Странич-

Вирту-

Странич-

 

Вирту-

Странич-

альная

ный кадр

альная

ный кадр

 

альная

ный кадр

страница

 

страница

 

 

странице

 

 

 

 

 

 

1

 

0

9

0

На диске

Таблицы

0

14

1

3

1

0

страниц нет

1

1

2

На диске

2

15

в основной

2

6

3

12

3

8

памяти

3

На диске

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

Доступ

Сегмент Страница

Смещение внутри страницы

1. Вызов данных

1

1

2.

Вызов данных

1

10

3.

Вызов данных

3

2047

4.

Сохранение данных

1

4

5.

Сохранение данных

1

2

6.

Сохранени данных

0

14

7.

Переход

3

100

8.

Вызов данных

2

50

9.

Вызов данных

0

5

10.

Переход

0

60