Добавил:
Я и кто? Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Билеты РОС.docx
Скачиваний:
10
Добавлен:
10.09.2023
Размер:
1.18 Mб
Скачать

Билет 27

  1. Понятие файла. Открытие и закрытие файлов. Понятие партиции и тома. Понятие подсистемы ввода/вывода

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

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

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

Source файлы (Файл реализации класса) - это последовательность routine и функций, каждый из которых состоит из декларации с последующими вызовами. Когда вы пишете код непонятно, как простыня, вы просто нарушаете определение исходного файла. Последовательность в байтах, которая организована в блоке, понятная линкеру или binder. и когда мы компилируем, мы получаем объектный файл.

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

Любой файл имеет атрибуты:

  • имя

  • тип

  • локация

  • размер

  • уровень доступа (protection)

  • time-date

  • идентификатор пользователя

Над файлами мы можем совершать операции.

Во-первых, это Create файла - это прежде всего значит алокация файла, это на самом деле новые entry системы директории.

Есть операция Write, это всегда systemcall - это обращение к операционной системе. Write - это на самом деле получение write пойнтера на локацию файла, где должна быть следующая запись. Когда я делаю команду Write или Print, то вы получаете поинтер на алокацию файла, где должна производиться следующая запись.

Команда Read – systemcall, это поинтер на блок в файле. Операция Read всегда долго ищет блок и значительно меньше по времени ищет место в блоке, куда я буду потом писать.

Бывают в ОС Power pointer - я получаю и на read, и на write одновременно текущий поинтер на позицию, куда я должен потом писать.

Есть специальная операция File seek (возможно не такое название) ОС - это означает, что мы ищем текущий поинтер в файле, для того, чтобы получить нужное для него значение (я ищу current pointer).

Файлы мы можем delete, trunk, то есть мы можем удалять собственно содержимое без удаления атрибутов (у нас будет длина 0).

Операция открытие (Open) - это systemcall, который даёт нам поинтер на Open Per Process table.

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

Одна называется System Write (? В инете по нулям про название) Table - это табличка где мы на самом деле содержим информацию о файле на диске: где он находится, с какого блока по какой, его размер, какие доступа и так далее. И когда я делаю mount, то я считываю эту табличку в оперативную память и там её содержу. Когда я Process (запускаю какой-то процесс), я создаю Write файл - это означает, что в этой табличке я буду говорить «вот такой-то процесс сейчас загружен, у него есть ссылка Поинтер на Write System Table, где будут характеристики этого файла». Этот процесс буду держать с признаком «открытый». Это означает: процесс обрабатывает этот файл. При этом я могу сделать Lock на файл - я буду делить файл с кем-то ещё, и у меня будет специальный признак Lock-ирования

Операционная система всегда работает с файлом, а единицей её обращения является блок.

Локирования файла означает, что я работаю с ним в эксклюзивном режиме.

Единственное, что она говорила про закрытие файла: close – означает, что пометили и убрали этот вход из open per process table = удалили из таблицы

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

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

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

Чтобы файловой системе найти нужные блоки, надо сначала найти файл правильно. Операционная система торжественно этим занимается, поэтому 2/3 кода это ввод/вывод.

Партиции:

Сама дисковая структура - вещь достаточно сложная. Это то, что я назвала Mass Storage Structure. Значит, вот здесь у меня дисковая кастрюля. На этой дисковой кастрюле может работать не одна операционная система, а несколько. Может работать и Юникс и Windows. Они имеют разные методы доступа (ISAM, B-Tree, про них в файлике лекций), они друг друга не понимают совсем и по-разному они работают с различными вызовами и имеют разные директории. Вот это кастрюля делится на partition (партиции). Это значит, что они по-разному размечены. У них разный размер трека, блоков. Они по-разному ведут всякие области переполнения. Но разные методы доступа могут быть.

Это, собственно, место на дисковом пространстве, где работают различные операционные системы. Вот эта партиция, из-под которой все не запускается, называется primary. Потому что это первая партиция, из-под которой грузится операционная система при помощи BIOS Loader. У него ссылки на то, где хранится операционная система первой партиции.

Она загружается, и из-под неё загружается другая операционная система. Кто вам сказал, что они, например, правильно делают адресацию диска одинаково?

Масса проблем здесь может возникнуть.

Значит, у любой такой партиции есть partitionTable. Это на нулевом блоке. Там, собственно говоря, табличка, в которой говорится, что партиции начинают отсюда, заканчиваются вот здесь. У партиции есть, например, такие-то блоки, которые являются блоками для back-блок. Его форматировали и партиции идут для контроллера. Это low-level format.

А дальше у нас будет производиться high-level format. Это форматирование для операционных систем. Я размечу вот эту (partition) уже для операционной системы. У контроллеров 16 треков операционной системы 17 (я хочу посмотреть в глаза человеку кто писал этот конспект). У контроллеров размер в блок 1024, я фантазирую, да? У операционной системы 1046. Обычно совпадает. После этого я разбиваю на тома Volume это просто логическая часть partition. Вначале каждого тома у нас тоже что? Табличка, Volume Table, и когда я начинаю работать, то всегда идет процесс монтирования тома (эти вещи делаются где-то автоматически).

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

Если хотим сделать create нового файла, то прикладной продукт обратится к ОС (к ее логическому пониманию файловой системы). Сначала создастся файла fcb – file control block. Иногда ОС имеет свободный fcb, тогда он считывается и выделяется для нового файла. В этом файле пишутся разрешения, хозяева, размер, блоки поинтера и тд. Далее считываем соответствующую директорию в память, правим входы в fcb, потом обратно перезаписываем на диск. Если в это время прерывание по питанию и\или программного продукта, то получится развал файловой системы.

После того как файл создан, и созданы fcb, и мы готовы к обработке файловой системы – делаем open на файл. До первого write или read мы должны открыть файл.

Командой open передаем ОС вызов для обращения к логической файловой системе. ОС ищет файл в system wait? Open table (там поинтер стоит), ищет атрибуты этого файла. Дальше обращается к per process table и смотрит был ли уже кем-то открыт файл. Если нет, то соответствующую строчку вставляем в табличку файла для данного процесса. Fcb копируется из wait? Open table в per process table, и там будет стоять поинтер на другую табличку. Как только закрыли файл (close – означает, что пометили и убрали это вход из open per process table = удалили из таблицы). Соответствующий поинтер на wait system table тоже исчез.

Для того, чтобы мы могли работать с дисковой подсистемой, должна быть своя подсистема ввода вывода. Диск – массив блоков, оперативная память – массив слов. Размер блока 512 байт - стандарт. Есть операции диска attachment когда присоединимся к диску, к дисковой подсистеме, но не объявляемся как пользователь системы. Есть операции расписания работы с диском, которые учитывают время поиска на диске, скорость ротации и специальные возможности поиска на диске.

Основанная операция поиска на диске – EDF scan – специальный элеваторстный? Поиск для того чтобы быстро искать с точки зрения ОС.

У диска есть треки и контроллер с головками. Количество треков мы форматируем, когда делаем low level format – разметка для контроллера. Когда мы будем искать данные на диске, а это поиск блока. Искать можно разными способами: с конца, отсюда??. В зависимости от точки, будет разная скорость, и мы должны согласовывать скорость движения со скоростями поиска. Обычно сначала ищется в одной последовательности, потом в обратной. Головка никогда не двигается до конца. Как только нашли останавливаемся – потом в обратной. При этом мы не ищем конкретно на треке, мы считываем все в буфер ОС и дальше разбираемся что считали. Скорость обработки буфера должна совпадать со скоростью вращения диска. Поэтому есть специальный параметр – interleave – обычно 4, - говорит сколько секторов контроллер должен пропускать. Лучше не менять. От него зависит скорость работы и обработки.

Дальше. У любой ОС есть понятие подсистемы ввода вывода(вв). У нас есть хардвер, который обрабатывается ОС. Подсистема вв – это методы контроля устройств вв . При этом ОС под подсистемой понимает вв только с дисковых подсистем.

HBA через шину bus связан с контроллером на диске – это подсистема вв с точки зрения хардвера. Управление подсистемой вв – основная задача.

Нужно сделать расписание работы с адаптером шиной и контролером. Расписание – это расписание дележа частей системы ввода вывода

SCSI («скази» по беленькой)– современная файловая система, которая сейчас существует. Это есть подсистема ввода-вывода, которая может быть по-разному организована. С этой подсистемой ввода-вывода, «я уже сказала, это 2/3 кода операционной системы», можно по-разному работать, и операционная система либо специфицирует работу с этой подсистемой в словах (word) к порту ввода-вывода, либо она работает с этой системой ввода-вывода при помощи memory map, т.е. его контроллер HBA пересылает то, что ему дают непосредственно в память для процессора, т.е. имеем прямой ввод-вывод. Этот способ более современный, но имеет специальной работы контроллеров (важен специальный хард, без него нельзя работать). Для современных сетевых устройств такой же метод доступа, т.е. у сетевых устройств свой процессор, который умеет непосредственно пересылать в память, минуя главный процессор. Это быстрее работает.

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

Во всех современных операционных системах вот эта штуковина существует в варианте «мирроу» (mirror мб?) и в варианте «дуплекс»

Есть HBA, у него на вершине один контроллер, второй контроллер – этот вариант называется «мирроу». Сделано это затем, чтобы у нас шла параллельная запись на два диска сразу двумя контроллерами - надёжность. Запись всегда медленнее, чтение всегда быстрее. Есть во всех ОС.

Второй вариант – когда есть два HBA, и каждый из них синхронно с другим пишет на свой контроллер. Полностью дублируем систему ввода-вывода. Этот вариант называется дуплексным. Есть у всех ОС, входит в состав ОС.

Вот когда мы делаем лог, мы располагаем лог на самом надёжном и быстром диске, ибо к логу будут обращаться абсолютно все.

Вот такая подсистема ввода-вывода – это обработка интераптов от этого хардвера. Сделано совершенно по-разному в разных ОС. Делать это для всех – невозможно.

Любая ОС имеет в своём составе ввод-вывод не только в виде харда, но и софта. Это значит, что будет ядро (кернелл, ико). Ядро в свою очередь обращается к подсистеме, к куску кода (co io sub system). Этот кусок subsystem обращается к драйверам (скази драйвер). Драйвер управляет скази девайсом. По факту в подсистеме ввода-вывода содержатся все дрова (мышь, киборг, HBA), но дрова не являются частью ядра. Ядро ОС занимается только дележом только центрального процессора.