Управление вводом-выводом

Кооперация процессов при работе с файлами

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

Подходы к кооперации:

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

2. Блокировка одного из буферов на время системного вызова

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

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

1. Операции по порядку и полностью

2. Вести журнал

Если проблема всё-таки возникла, можно воспользоваться утилитой chkdsk (вообще она иногда включается при загрузке системы автоматически, после сбоя – прим. ред.)

Если существуют дефектные блоки на диске, то:

Способ 1: Найти дефектные блоки и составить их список. Каждому дефектному поставить в соответствие рабочий резервный. Когда будет обращение к дефектному, будет происходить перенаправление к резервному.

Способ 2: Создание файла, который занимает все дефектные блоки и изолирование его от других программ.

Способы увеличения производительности файловой системы:

1. Кэширование. Если надо работать с блоком, то копируем его в кэш-память и работаем с ним там. Когда пришел новый блок, надо убрать старый. Например, по стандартному FIFO алгоритму. При этом надо по каким-то параметрам оценить, насколько он будет «важен» в дальнейших действиях. Также данные надо своевременно синхронизировать, чтобы потом не считались старые для нового действия.

2. Оптимальное размещение информации на диске. Например, индексные узлы физически разместить близко к блокам данных, на которые они ссылаются. Ещё надо иногда делать дефрагментацию.

С именем файла работают функции: create, open, link(текущее_имя_файла, новое_имя_файла), unlink.

С файловым дескриптором (handler-ом) работают: read, write, lseek.

Современные ОС могут работать с несколькими ФС одновременно. Собственно, FAT32 на флешке и NTFS на винчестере – очевидно.

Примеры современных ФС: FAT16, FAT32, NTFS, ext2, ext3, ext4.

Управление вводом-выводом

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

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

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

Известные шины:

1. Шина данных – передает информацию между устройствами

2. Адресная шина – задание адресов ячеек памяти и указание устройств

3. Шина управления – управление линиями локальной магистрали

Ширина шины – количество проводов, из которых она состоит.

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

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

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

Контроллер имеет в своём составе регистры:
Состояния – занят/свободен/ошибка
Управления – данные для инициализации устройства и управления им.
Входных данных – помещаем сюда данные для чтения устройством
Выходных данных – помещаем сюда данные для чтения системой

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

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

Устройства ввода-вывода различаются по типу интерфейса:
Символьные (клавиатура, модем) – передают байт за байтом (Функции get, put, halt)
Блочные (диски, ленты) – передают блоки байтов друг за другом (Функции read, write, halt)
Сетевые (сетевые карты)
Остальные

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

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

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

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

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

Прерывание: возникновение, сохранение контекста, обработка прерывания, планирование использования процессора, восстановление контекста.

Обработка прерывания:

1. Выявление устройства, вызвавшего прерывание

2. Выявление процесса, вызвавшего прерывание

3. Определение, успешно завершилась прошлая операция или нет – проверка бита ошибки

4. Попытки исправить ошибку, если таки она была.

Планирование запросов к диску можно делать несколькими алгоритмами:

1. First come first served – все запросы организуются в очередь FIFO и обслуживаются в порядке поступления. Неэффективно.

2. Short seek time first – самое короткое время поиска первым

Алгоритмы сканирования:

1. SCAN – головки перемещаются от одного края диска до другого, обслуживая все встречающие запросы.

2. LOOK – если знаем, что обслужили последний попутный запрос в направлении движения головки, то можно, не доходя до края, сменить направление головки.

3. C—SCAN – достигли одного края диска и, не выполняя промежуточные запросы, возвращаемся к другому краю диска. Оттуда уже начинаем выполнять.

4. C-LOOK – по аналогии.

Управление портами ввода-вывода Raspberry Pi


Похожие статьи.

Понравилась статья? Поделиться с друзьями: