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

Танненбаум Е. Архітектура компютера [pdf]

.pdf
Скачиваний:
103
Добавлен:
02.05.2014
Размер:
5.59 Mб
Скачать

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

5

Стандартная

Имя

Имя для

 

информация

файла

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 мм сос

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В каких случаях могут понадобиться потоки? Рассмотрим сервер World Web. Такой сервер может хранить в основной памяти кэш часто используе

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

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

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

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

Вызов потока

Значение

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, созда поток. После выполнения этой процедуры в адресном пространстве появ один поток больше. Поток, который выполнил свою работу, вызываетpt Если потоку нужно подождать, пока другой поток не окончит свою работ зывает pthreadjoin. Если этот другой поток уже закончил свою рабо pthreadjoin немедленно завершается.

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

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

50

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

лы сообщений. Тип выбирается во время создания. Байтовые каналы раб

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

509

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В системах часто поддерживается параллельная обработка. Для это разделения времени в одном процессоре моделируется несколько пр

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

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. Разработайте более эффективный алгоритм. Подсказка: можно обновлять счетчик во вновь загружаемой странице, оставляя

все другие.

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

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

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

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

Сегмент 0

 

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

Сегмент 3

 

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

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

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

Чтени

 

 

 

 

выполнение

 

Вирту-

Странич-

Вирту-

Странич-

 

Вирту

альная

ный кадр

альная

ный кадр

 

альная

страница

 

страница

 

 

страни

0

9

0

На диске

Таблицы

0

1

3

1

0

страниц нет

1

2

На диске

2

15

в основной

2

3

12

3

8

памяти

3

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

Доступ

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

Смещение внут

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

1

1

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

1

10

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

3

2047

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

1

4

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

1

2

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

0

14

Соседние файлы в предмете Аппаратное обеспечение ЭВМ, средств телекоммуникаций и сетей