DAY19 (Старые версии Машбука или нечто подобное)

2019-05-08СтудИзба

Описание файла

Файл "DAY19" внутри архива находится в следующих папках: Старые версии Машбука или нечто подобное, Лекции (Машечкин 1998). Документ из архива "Старые версии Машбука или нечто подобное", который расположен в категории "". Всё это находится в предмете "операционные системы" из 3 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .

Онлайн просмотр документа "DAY19"

Текст из документа "DAY19"

9

Лекция №19

Лекция 19

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

Организация ввода/вывода.

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

  • библиотечными функциями;

  • функциями - системными вызовами.

Все версии UNIX предоставляют строго определенный ограниченный набор входов в ядро операционной системы, через которые прикладные задачи имеют возможность воспользоваться базовыми услугами, предоставляемыми UNIX. Эти точки входа получили название системных вызовов. Системный вызов, таким образом, определяет функцию, выполняемую ядром ОС от имени процесса, выполнившего вызов. Типичные системные вызовы по работе с файлами: open, read, write, close.

Помимо системных вызовов программисту предлагается большой набор функций общего назначения. Эти функции не являются точками входа в ядро операционной системы, хотя в процессе выполнения многие из них используют системные вызовы. Приведенным выше системным вызовам соответствуют функции языка C: fopen, fread, fwrite, fclose, продекларированные в стандартной библиотеке ввода/вывода stdio.h.

Продолжим рассмотрение организации ввода/вывода. Приведенные выше системные вызовы и соответствующие им библиотечные функции имеют более глубокую разницу. Вся работа с файлами, например открытие, при использовании системных вызовов осуществляется при помощи файловых дескрипторов. Каждому открытому файлу система выделяет файловый дескриптор. Далее вся работа с файлами с использованием системных вызовов осуществляется через указание того или иного файлового дескриптора. Если мы рассмотрим схему работы с библиотечными функциями, то здесь ситуация иная. Например, при открытии файла с помощью функции fopen происходит ассоциирование открытого файла не с файловым дескриптором, а с неким описателем, структура которого опять таки декларируется в библиотеке stdio.h.

Опустимся «еще ниже»: рассмотрим, что будет находиться в коде откомпилированной программы в том и в другом случаях.

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

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

Следующая стадия нашего разговора - это вопрос буферизации в том и другом случае.

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

Мы упомянули, что системные вызовы и библиотечные функции для работы с вводом/выводом используют разные структуры данных. Для системных вызовов - это файловый дескриптор, для библиотечных функций - некоторый описатель. Замечу, что, т. к. библиотечные функции в своем теле обращаются к системным вызовам, то соответствие между файловыми дескрипторами и описателями «один в один».

Схема организации обмена с системной точки зрения

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

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

Каждая запись в этой таблице содержит некоторую информацию, среди которой нас будет интересовать следующая:

  1. Копия ИД открытого файла. Для любого открытого файла, ИД, который характеризует содержимое этого файла, копируется и размещается в ТИДОФ. После этого все манипуляции с файлом (например, изменение адресации файла) происходят с копией ИД, а не с самим ИД на диске. ТИДОФ размещается в оперативной памяти, т.е. доступ к информации в ней осуществляется быстро.

  2. Счетчик открытых в данный момент файлов, связанных с данным ИД. Это означает, что для любого количества открытий файла, связанного с данным ИД, система работает с единственной копией этого ИД.

Таблица файлов. Таблица файлов состоит из фиксированного количества записей. Каждая запись ТФ соответствует открытому в системе файлу {{или точнее ФД}}. При этом в подавляющем большинстве случаев это есть взаимно однозначное соответствие. А уверенно можно сказать лишь одно: для каждого открытого в системе файла существует запись в ТФ. Тот случай, когда это не есть взаимно однозначное соответствие, мы рассмотрим ниже. Каждая запись ТФ содержит указатели чтения/записи из/в файл. Это означает, что, если открыт один и тот же файл в двух процессах или дважды в одном процессе, то с каждым открытием связан свой указатель, и они друг от друга не зависят (почти всегда, за исключением некоторых случаев). Каждая запись ТФ содержит, так называемый, индекс наследственности - это есть некоторое целое число.

Это данные уровня операционной системы, т.е. данные, которые описывают состояние системы в целом.

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

Рассмотрим пример, иллюстрирующий принципиальную разницу в работе с открытыми и унаследованными файлами. Прежде чем перейти к примеру вспомним, что формирование процесса-сына обладает следующим свойством. Процесс-сын, который будет сформирован после обращения к функции fork(), наследует все те файлы, которые были открыты в процессе-отце.

Итак, пусть процесс №1 открывает файл с именем name. С процессом №1 ассоциирована таблица открытых файлов №1. Этому файлу будет поставлен в соответствие файловый дескриптор. В соответствующей строке ТОФ№1 появится запись, имеющая ссылку на строку ТФ. В соответствующей строке ТФ будут находиться определенные атрибуты, связанные с открытием файла, в том числе индекс наследственности, равный 0. Запись в ТФ в свою очередь имеет ссылку на ТИДОФ, в которой находится копия ИД, соответствующего файлу с именем name и счетчик «открытий» этого файла, значение которого равно 1.

Пусть процесс №2 открывает тот же файл name. Этому файлу ставится в соответствие файловый дескриптор. Заполнится строка ТФ, содержащая атрибуты, связанные с данным открытием файла name, в т. ч. значение индекса наследственности будет равно 1. Эта строка ТФ сошлется на тот же ФД из ТИДОФ, что и строка ТФ, соответствующая открытию файла в процессе №1. Но значение поля открытых файлов в ТИДОФ увеличится на 1.

Пусть теперь процесс №1 с помощью fork() породил процесс №3. Как уже было сказано, он получит в наследство открытые файлы. Следовательно, ссылка из соответствующей строки ТОФ№3 будут указывать не на новую запись ТФ, а на ту же самую, на которую ссылался соответствующий ФД родителя. При этом значение индекса наследственности увеличится на единицу. А значение поля открытых файлов строки ТИДОФ останется без изменений, т. к. реально произошло не открытие, а наследование.

Это как раз та ситуация, когда нет взаимно однозначного соответствия между строками ТФ и строками ТОФ.

Что касается, закрытия файла, то, допустим, что процесс два закрыл файл name. Т. к. значение поля индекс наследственности для соответствующей записи ТФ было равно 1, то эта запись в ТФ освободится, а значение открытых файлов в ТИДОФ уменьшится на единицу.

А при закрытии унаследованного открытого файла в процессе№1 значение поля индекса наследственности уменьшится на единицу (картинки не будет - и так все понятно).

Итак, UNIX по-прежнему демонстрирует нам очень элегантное и легкое решение. При такой схеме работы у пользователей системы никогда не возникнут вопросы «А что тут будет?»

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

Взаимодействие с устройствами

Мы уже говорили о том, что со всеми устройствами в ОС UNIX ассоциированы специальные файлы, называемые файлами устройств. Специальный файл устройства связывает прикладное приложение с драйвером устройства. Каждый специальный файл соответствует какому-то физическому устройству (например, диску, стримеру, принтеру или терминалу) или т. н. псевдоустройству (например, сетевому интерфейсу, пустому устройству, сокету или памяти). Вся работа приложения с устройством проходит через специальный файл, а соответствующий ему драйвер обеспечивает выполнение операций ввода/вывода в соответствии с конкретным протоколом обмена данными с устройством. Мы с Вами говорили о том, что существует два типа устройств: байт- и блокориентированные. Пример байториентированного устройства - клавиатура, а устройства второго типа - жесткий диск. Замечу, что одно и то же устройство может трактоваться в системе и как блок, и как байториентированное.

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

Рассмотрим, как выполняется последовательность действий при исполнении заказа на чтение блока. Будем считать, что поступил заказ на чтение N-ого блока из устройства с номером M.

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

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

  3. Осуществляется чтение N-ого блока устройства М в найденный буфер.

  4. Происходит обнуление счетчика времени в данном буфере и увеличение на единицу счетчиков в других буферах.

  5. Передаем в качестве результата чтения содержимое данного буфера.

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

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

Таким образом, эта система рассчитана на надежную аппаратуру и на корректные профессиональные условия эксплуатации. Для борьбы с вероятностью потери информации при появлении нештатных ситуаций, система достаточно «умна», и действует верно. А именно, в системе имеется некоторый параметр, который может оперативно меняться, который определяет периоды времени, через которые осуществляется сброс системных данных. Второе - имеется команда, которая может быть доступна пользователю, - команда SYNC. По этой команде осуществляется сброс данных на диск. И третье - система обладает некоторой избыточностью, позволяющей в случае потери информации, произвести набор действий, которые информацию восстановят или спорные блоки, которые не удалось идентифицировать по принадлежности к файлу, будут записаны в определенное место файловой системы. В этом месте их можно попытаться проанализировать и восстановить вручную, либо что-то потерять. Наш университет одним из первых в стране начал эксплуатировать операционную систему UNIX, и сейчас уже можно сказать, что проблем ненадежности системы, с точки зрения фатальной потери информации, не было.

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

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5224
Авторов
на СтудИзбе
428
Средний доход
с одного платного файла
Обучение Подробнее