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

Современные операционные системы (90

..pdf
Скачиваний:
2
Добавлен:
15.11.2022
Размер:
445.26 Кб
Скачать

length — длина участка файла для отображения;

prot — режимы доступа (чтение, запись, исполнение кода);

flags — режим отображения, в том числе режим COW;

fd — файловый дескриптор открытого файла, который будет отображён;

offset — смещение отображаемого участка относительно начала файла.

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

Отменить отображение файла в память можно функцией munmap. Все отображения в адресное пространство процесса автоматически отменяются при завершении процесса.

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

9.2. Отображение файлов в память в Windows NT

Для создания отображения файла в память в Windows NT используются функции CreateFileMapping и MapViewOfFile.

Функция CreateFileMapping имеет следующие аргументы:

hFile — задаёт открытый файл;

flProtect — режим доступа (чтение, запись, исполнение команд, COW);

dwMaximumSizeHigh и dwMaximumSizeLow — максимальный размер области отображения.

Функция CreateFileMapping возвращает ссылку на объект, который может быть затем передан в функцию MapViewOfFile для создания отображения файла в адресное пространство процесса.

Функция MapViewOfFile принимает следующие аргументы:

hFileMappingObject — объект отображения, полученный с помощью функции CreateFileMapping;

31

dwDesiredAccess — режим доступа (чтение, запись, исполнение команд, COW);

dwFileOffsetHigh и dwFileOffsetLow — смещение отображаемого участка относительно начала файла;

dwNumberOfBytesToMap — длина участка файла.

Функция MapViewOfFile возвращает адрес созданного отображения файла или NULL, если отображение создать не удалось.

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

Объект отображения удаляется функцией CloseHandle.

ОС Windows NT не гарантирует соответствия отображённых данных и содержимого файла при чтении или записи этого файла с помощью системных функций ReadFile и WriteFile.

Контрольные вопросы

1)для какого режима доступа к данным наиболее удобно использовать режим отображения файла в память?

2)как отображение файлов может сэкономить память?

3)как отображение файлов может ускорить запуск программ?

10.Синхронизация и взаимодействие процессов

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

Семафор — объект операционной системы, который может находиться в двух состояниях: открытом (свободном) и закрытом (заблокированном). ОС реализует по крайней мере две операции с семафорами: атомарное ожидание с блокированием и освобождение. Атомарное ожидание с блокированием позволяет дождаться

32

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

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

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

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

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

Канал данных — механизм обмена данными в виде неструктурированной последовательности байтов. В некоторых ОС (UNIX, Linux и др.) существуют именованные каналы данных (named pipe), которые представляются в виде специального файла. Данные, записываемые в канал одним процессом, считываются другим процессом.

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

33

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

Эффект гонок (race condition) — вариация поведения программы в зависимости от моментов изменения состояния нитей и других случайных факторов. Планировщик задач выбирает момент изменения состояния нити и следующую нить для исполнения, исходя из множества факторов. Предсказать эти моменты весьма трудно. Если две нити изменяют одну и ту же переменную без синхронизации, то заранее сказать, какое значение останется в переменной, невозможно. Особенно эффект гонок проявляется при изменении сложных структур данных: часть данных может оказаться записанной одной нитью, остальные — другой. Эффект гонок устраняется правильным использованием синхронизации процессов и нитей или использованием специальных алгоритмов и структур данных.

При неправильном использовании синхронизации возможно возникновение тупика (deadlock) — ситуации, при которой дальнейшее исполнение группы процессов невозможно. Например, процесс P1 блокирует семафор S1, процесс P2 блокирует семафор S2.

Затем процесс P1 пытается заблокировать семафор S2 с ожиданием освобождения, а процесс P2 пытается заблокировать семафор S1 и тоже ждёт. Оба процесса переходят в состояние ожидания и

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

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

Чтобы тупики не возникали, процессы должны блокировать семафоры в одном и том же порядке S1; S2; : : : Sn. Тогда процесс, за-

блокировавший семафор Si и ожидающий освобождения семафора Sj (j > i), сможет дождаться, поскольку другой процесс, занявший Sj, не будет пытаться заблокировать семафор Si и через некоторое время освободит семафор Sj.

34

10.1. Блокировка файлов в UNIX и Linux

Блокировка файлов в UNIX и Linux соответствует стандарту POSIX. По умолчанию открытые файлы не блокируются. Для блокирования или разблокирования части открытого файла используется функция fcntl с параметрами F_SETLK или F_SETLKW (блокирование с ожиданием).

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

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

Для совместимости со старыми версиями UNIX существуют также функции блокировки flock и lockf.

10.2. Блокировка файлов в Windows NT

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

функции CreateFile: FILE_SHARE_READ и FILE_SHARE_WRITE. Файл, открытый в разделяемом режиме, может быть впослед-

ствии заблокирован целиком или частично в эксклюзивном режиме с помощью функции LockFileEx. Блокировка снимается с помощью функции UnlockFileEx или при закрытии файла.

Контрольные вопросы

1)в каком случае необходимо использовать синхронизацию процессов?

2)какая проблема может возникнуть при отсутствии синхронизации?

3)какая проблема может возникнуть при неправильной синхронизации?

11.Файл подкачки

Файл подкачки (swap space) — особое место во внешней памяти, которое используется для расширения оперативной памяти. Файл подкачки может располагаться как в обычном файле файловой системы, так и на отдельном диске или разделе диска.

35

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

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

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

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

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

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

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

36

все ОС стараются поддерживать некоторый минимальный объём памяти, который можно мгновенно освободить.

11.1. Файл подкачки в Linux

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

Файл подкачки необходимо сначала разметить (записать в него определённую структуру данных), что делается системной программой mkswap:

mkswap /dev/sda2

Файл подкачки необходимо подключить системной программой swapon:

swapon /dev/sda2

Его можно также отключить системной программой swapoff: swapoff /dev/sda2

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

Посмотреть список подключённых файлов подкачки, их размер и количество данных в них можно с помощью системной программы swapon с опцией -s:

swapon -s

 

 

 

Filename

Type

Size

Used

Priority

/dev/sda2

partition 3145724 487252 0

Размер и количество данных указывается в килобайтах.

11.2. Файл подкачки в Windows NT

В ОС Windows NT файл подкачки располагается в виде скрытого файла pagefile.sys в корневом каталоге. Его размер увеличивается и уменьшается операционной системой динамически. Если в компьютере есть несколько жёстких дисков, то можно выбрать, на каких дисках будут располагаться файлы подкачки (их может быть несколько, но не более одного на каждом диске). Для настройки щёлкните правой кнопкой мыши Мой компьютер и выберите Свойства; перейдите на вкладку Дополнительно; в разделе Производительность нажмите кнопку Параметры; перей-

37

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

Контрольные вопросы

1)что делает ОС при нехватке оперативной памяти?

2)что происходит при обращении процесса к откачанной области памяти?

3)можно ли использовать откачку на диск в системах реального времени?

12.Подсистема ввода-вывода

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

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

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

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

38

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

сразными драйверами устройств одного класса.

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

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

Произвольный доступ — считывание и запись данных возможны с произвольной позиции (иногда только с границы блока), возможно повторное считывание и перезапись данных без специальных действий со стороны прикладных программ. На устройствах с произвольным доступом возможно размещение файловых систем. К устройствам с произвольным доступом возможен последовательный доступ, обратное неверно. Примеры устройств с произвольным доступом: накопитель на жёстком (гибком) диске, CDROM, флэш-память.

Во многих других ОС обращение программ к внешним устройствам требует использования специального API (программного интерфейса).

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

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

39

12.1. Ввод-вывод в UNIX и Linux

В системе UNIX (а также Linux) устройства с последовательным доступом представляются в виде специальных псевдофайлов — символьных устройств (character device), а устройства с произвольным доступом — в виде блочных устройств (block device). Обращения к таким файлам передаются в драйвер соответствующего устройства, который обрабатывает их и возвращает в программу результат. Содержимое блочных устройств кэшируется, на них могут располагаться файловые системы. Отображение дерева каталогов с блочного устройства в какой-либо каталог другой ФС называется монтированием (mount).

Примеры для ОС Linux:

/dev/tty1 последовательное устройство, представляющее собой клавиатуру с экраном для последовательного вводавывода. Символы, вводимые с клавиатуры, попадают сначала в буфер, а затем в программу, читающую из этого файла. И наоборот, символы, записываемые программой в этот файл, отображаются на экране в режиме телетайпа; распознаются управляющие символы, такие как перевод строки и возврат каретки.

/dev/ttyS0 последовательное устройство, первый последовательный порт на компьютере. К этому порту может быть подключён, например, модем. Символы, записываемые в этот файл, попадают сначала в буфер, а затем передаются через последовательный порт. Символы, принимаемые из последовательного порта, попадают в буфер и затем считываются программой.

/dev/sda

устройство с произвольным доступом, представляю-

 

щее первый жёсткий диск. Как правило, это устрой-

 

ство используется только для чтения и записи первого

 

блока диска для просмотра и изменения таблицы раз-

 

делов диска. Разделы представляются в виде блочных

 

устройств /dev/sda1. . . /dev/sdaN.

lpd

системная программа, реализующая спулинг на прин-

 

тер (сокращение от line printer daemon). Задания

 

для печати хранятся в каталоге /var/spool/lp.

lp

системная программа для создания задания на печать.

40

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]