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

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

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

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

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

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

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

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

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

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


⇐ Предыдущая страница| |Следующая страница ⇒