Асинхронный ввод-вывод характерен для большинства мультипрограммных операционных систем, особенно если операционная система поддерживает мультизадачность с помощью механизма потоков выполнения. Однако если асинхронный ввод-вывод в явном виде отсутствует, его можно реализовать самому, организовав для вывода данных отдельный поток выполнения.
Аппаратуру ввода-вывода можно рассматривать как совокупность аппаратных процессоров, которые способны работать параллельно друг другу, а также параллельно центральному процессору (процессорам). На таких «процессорах» выполняются так называемые внешние процессы. Например, для печатающего устройства (внешнее устройство вывода данных) внешний процесс может представлять собой совокупность операций, обеспечивающих перевод печатающей головки, продвижение бумаги на одну позицию, смену цвета чернил или печать каких-то символов. Внешние процессы, используя аппаратуру ввода-вывода, взаимодействуют как между собой, так и с обычными «программными» процессами, выполняющимися на центральном процессоре. Важным при этом является обстоятельство, что скорости выполнения внешних процессов будут существенно (порой на порядок или больше) отличаться от скорости выполнения обычных (внутренних) процессов. Для своей нормальной работы внешние и внутренние процессы обязательно должны синхронизироваться. Для сглаживания эффекта значительного несоответствия скоростей между внутренними и внешними процессами используют упомянутую выше буферизацию. Таким образом, можно говорить о системе параллельных взаимодействующих процессов.
Буферы (буфер) являются критическим ресурсом в отношении внутренних (программных) и внешних процессов, которые при параллельном своем развитии информационно взаимодействуют. Через буферы данные либо посылаются от некоторого процесса к адресуемому внешнему (операция вывода данных на внешнее устройство), либо от внешнего процесса передаются некоторому программному процессу (операция считывания данных). Введение буферизации как средства информационного взаимодействия выдвигает проблему управления этими системными буферами, которая решается средствами супервизорной части операционной системы. При этом на супервизор возлагаются задачи не только по выделению и освобождению буферов в системной области памяти, но и по синхронизации процессов в соответствии с состоянием операций заполнения или освобождения буферов, а также по их ожиданию, если свободных буферов в наличии нет, а запрос на ввод-вывод требует буферизации. Обычно супервизор ввода-вывода для решения перечисленных задач использует стандартные средства синхронизации, принятые в данной операционной системе. Поэтому если операционная система имеет развитые средства для решения проблем параллельного выполнения взаимодействующих приложений и задач, то, как правило, она реализует и асинхронный ввод-вывод.
Организация внешней памяти на магнитных дисках
Для организации внешней памяти желательно использовать относительно недорогие, но достаточно быстродействующие и емкие устройства с прямым доступом к данным. К таким устройствам, прежде всего, относятся накопители на жестких магнитных дисках (НЖМД). Нынче чаще всего такие накопители называют «винчестерами».
Поскольку большинство компьютеров имеет накопители на жестких магнитных дисках и фактически ни одна современная операционная система для повсеместно распространенных персональных компьютеров не обходится без дисковой подсистемы, мы ознакомимся с логической организацией хранения и доступа к данным в этих устройствах, причем применительно к персональным компьютерам.
Действительно, дисковая подсистема для большинства компьютеров является одной из важнейших. Именно на магнитных дисках чаще всего располагается загружаемая в компьютер операционная система, которая и обеспечивает нам удобный интерфейс для работы. Благодаря использованию систем управления файлами, данные на магнитных дисках располагаются в виде именованных наборов данных, называемых файлами. Таким образом, помимо файлов самой операционной системы, на дисках располагаются многочисленные прикладные программы и разнообразные файлы пользователей. Наконец, благодаря тому, что по сравнению с другими устройствами внешней памяти дисковые механизмы обладают большими быстродействием и вместительностью, а также средствами непосредственной (прямой) адресации блоков данных, дисковую подсистему часто используют для организации механизмов виртуальной памяти, что существенно расширяет возможности компьютера.
Основные понятия
Из оперативной памяти в НЖМД и обратно информация передается байтами, а вот записывается на диск и считывается с него она уже последовательно (побитно). Из-за того, что запись и считывание бита данных не являются абсолютно надежными операциями, информация перед записью кодируется с достаточно большой избыточностью. Для этой цели применяют коды Рида-Соломона. Избыточное кодирование информации позволяет не только обнаруживать ошибки, но и автоматически исправлять их. Следовательно, перед тем как данные, считанные с поверхности магнитного диска, будут переданы в оперативную память, их нужно предварительно обработать (перекодировать). На эту операцию необходимо время, поэтому в ходе обработки данных быстро вращающийся диск успевает повернуться на некоторый угол, и мы можем констатировать, что на магнитном диске данные располагаются не сплошь, а порциями (блоками). Говорят, что НЖМД относится к блочным устройствам. Нельзя прочитать (или записать) байт или несколько байтов. Можно прочитать сразу только блок данных и уже потом извлекать из него нужные байты, использовать их в своих вычислениях и изменять. Записать потом данные обратно тоже можно только сразу блоком.
За счет того, что при вращении диска магнитная головка, зафиксированная на некоторое время в определенном положении, образует окружность (дорожку — track), блоки данных на таких окружностях называют секторами (sectors). С некоторых пор размер сектора стал стандартным и в абсолютном большинстве случаев он равен 512 байт хранимых данных. Все сектора пронумерованы, и помимо данных пользователя на магнитных дисках размещается и служебная информация, с помощью которой можно находить искомый сектор. Служебная информация (сервоинформация), как правило, располагается в межсекторных промежутках.
Группы дорожек (треков) одного радиуса, расположенные на поверхностях магнитных дисков, образуют так называемые цилиндры (cylinders). Современные жесткие диски могут иметь по нескольку десятков тысяч цилиндров. Выбор конкретной дорожки в цилиндре осуществляется указанием порядкового номера той головки (head) чтения/записи данных, которая и образует эту дорожку. Таким образом, адрес конкретного блока данных указывается с помощью уже упоминавшихся трех координат C-H-S — номеров цилиндра, головки и сектора. Устройство управления НЖМД обеспечивает позиционирование блока головок на нужный цилиндр, выбирает заданную поверхность и находит требуемый сектор. Этот способ адресации нынче считается устаревшим и почти не используется. Второй способ адресации блоков данных основывается на том, что все блоки (секторы) пронумерованы.
Логическая структура магнитного диска
Для того чтобы можно было загрузить с магнитного диска операционную систему, а уже с ее помощью организовать работу с файлами, были приняты специальные системные соглашения о структуре диска. Хранение данных на магнитном диске можно организовать различными способами. Можно поделить все дисковое пространство на несколько частей — разделов (partitions), а можно его и не делить. Деление НЖМД на разделы позволяет организовать на одном физическом устройстве несколько логических; в этом случае говорят о логических дисках. Следует, однако, заметить, что не во всех операционных системах используется понятие логического диска. Так, UNIX-системы не имеют логических дисков.
Разделение всего дискового пространства на разделы полезно по нескольким соображениям. Во-первых, это структурирует хранение данных. Например, выделение отдельного раздела под операционную систему и программное обеспечение и другого раздела под данные пользователей позволяет отделить последние от системных файлов и не только повысить надежность системы, но и сделать более удобным ее обслуживание. Во-вторых, на каждом разделе может быть организована своя файловая система, что иногда бывает необходимо. Например, при установке операционной системы Linux нужно иметь не менее двух разделов[3], поскольку файл подкачки (страничный файл) должен располагаться в отдельном разделе. Наконец, в ряде случаев на компьютере может потребоваться установка более одной операционной системы.
Для того чтобы системное программное обеспечение получило информацию о том, как организовано хранение данных на каждом конкретном накопителе, нужно разместить в одном из секторов соответствующие данные. Даже если НЖМД используется как единственный логический диск, все равно нужно указать, что имеется всего один диск, и его размер. Структура данных, несущая информацию о логической организации диска, вместе с небольшой программой, с помощью которой можно ее проанализировать, а также найти и загрузить в оперативную память программу загрузки операционной системы, получила название главной загрузочной записи (Master Boot Record, MBR). MBR располагается в самом первом секторе НЖМД, то есть в секторе с координатами 0-0-1. Программа, расположенная в MBR, носит название внесистемного загрузчика (Non-System Bootstrap, NSB).
Вследствие того, что сектор состоит только из 512 байт и помимо программы в нем должна располагаться информация об организации диска, внесистемный загрузчик очень прост, а структура данных, называемая таблицей разделов (Partition Table, РТ), занимает всего 64 байт. Таблица разделов располагается в MBR по смещению 0x1BE и содержит четыре элемента. Структура записи элемента таблицы разделов приведена в табл. 1. Каждый элемент этой таблицы описывает один раздел, причем двумя способами: через координаты C-H-S начального и конечного секторов, а также через номер первого сектора в спецификации LBA[4] (Logical Block Addressing) и общее число секторов в разделе. Важно отметить, что каждый раздел начинается с первого сектора на заданных цилиндре и поверхности и имеет размер не менее одного цилиндра. Поскольку координаты MBR равны 0-0-1, то первый сектор первого раздела в большинстве случаев получается равным 0-1-1 (в координатах LBA это будет сектор 64).
Первым байтом в элементе таблицы разделов идет флаг активности раздела Boot Indicator (значение 0 — не активен, h)) — активен). Он позволяет определить, является ли данный раздел системным загрузочным. В результате процесс загрузки операционной системы осуществляется путем загрузки первого сектора с такого активного раздела и передачи управления на расположенную в нем программу, которая и продолжает загрузку. Активным может быть только один раздел, и это обычно проверяется программой NSB, расположенной в MBR.
Таблица 1. Формат элемента таблицы разделов
Название записи элемента таблицы разделов | Длина, байт |
Флаг активности раздела | 1 |
Номер головки начала раздела | 1 |
Номера сектора и цилиндра загрузочного сектора раздела | 2 |
Кодовый идентификатор операционной системы | 1 |
Номер головки конца раздела | 1 |
Номера сектора и цилиндра последнего сектора раздела | 2 |
Младшее и старшее двухбайтовые слова относительного номера начального сектора | 4 |
Младшее и старшее двухбайтовые слова размера раздела в секторах | 4 |
За флагом активности раздела следует байт номера головки, с которой начинается раздел. За ним следуют два байта, означающие соответственно номер сектора и номер цилиндра загрузочного сектора, где располагается первый сектор загрузчика операционной системы. Затем следует кодовый идентификатор System ID (длиной в один байт), указывающий на принадлежность данного раздела к той или иной операционной системе и на установку в этом разделе соответствующей файловой системы. Поскольку крайне сложно найти информацию по этим кодовым идентификаторам, которыми помечаются разделы дисков, в табл. 2 приведены не полтора десятка наиболее часто встречающихся, а все известные сигнатуры (кодовые идентификаторы).
Таблица 2. Кодовые идентификаторы разделов диска
| Код | Описание | Код | Описание |
| 000h | Раздел не использован | 085h | Linux Extended, XOSL |
| 001h | FAT12 | 086h | FAT16 volume set |
| 002h | Xenix root | 087h | NTFS volume set |
| 003h | Xenix/usr | 08Ah | AiR-Boot |
| 004h | FAT16(<32Mb) | 08Bh | FAT32 volume set |
005h | Extended | 08Ch | FAT32 LBA volume set | |
006h | FAT16 | 08Dh | Free FDISK FAT12 | |
007h | NTFS, HPFS | 08Eh | Linux LVM | |
008h | AIXBoot | 090h | Free FDISK FAT16 (<32Mb) | |
009h | AIXData | 091h | Free FDISK Extended | |
00Ah | OS/2 Boot Manager | 092h | Free FDISK FAT16 | |
00Bh | FAT32 | 093h | Amoeba native | |
00Ch | FAT32LBA | 094h | Amoeba BBT | |
00Eh | FAT16LBA | 095h | MIT EXOPC | |
00Fh | Extended LBA | 097h | Free FDISK FAT32 | |
010h | Opus | 098h | Free FDISK FAT32 LBA | |
011h | Hidden FAT12 | 099h | DCE376 | |
012h | Compaq Setup | 09Ah | Free FDISK FAT16 LBA | |
013h | B-TRON | 09Bh | Free FDISK Extended LBA | |
014h | Hidden FAT16 (<32Mb) | 09Fh | BSDI | |
016h | Hidden FAT16 | 0A0h | Laptop hibernation | |
017h | Hidden NTFS, HPFS | 0A1h | NEC hibernation | |
018h | AST Windows Swap | 0A5h | Free BSD, BSD/386 | |
019h | Photon | 0A6h | Open BSD | |
01 Bh | Hidden FAT32 | 0A7h | NextStep | |
01 Ch | Hidden FAT32 LBA | 0A8h | Apple UFS | |
01 Eh | Hidden FAT16 LBA | 0A9h | Net BSD | |
020h | OFS1 | 0Aah | Olivetti service | |
022h | Oxygen | 0Abh | Apple Booter | |
024h | NEC DOS | 0Aeh | ShagOS native | |
035h | OS/2JFS | 0Afh | ShagOS swap | |
035h | Theos3.x | 0B0h | BootStar Dummy | |
039h | Theos 4.x spanned, Plan9 | 0B7h | BSDI old native | |
03Ah | Theos 4.x 4G | 0B8h | BSDI old swap | |
03Bh | Theos 4.x Extended | 0BBh | OS Selector | |
03Ch | Partition Magic | 0Beh | Solaris 8 boot | |
040h | Venix 80286 | 0C0h | CTOS, REAL/32 smal | |
041 h | Minix, PPC Boot | 0C1h | DR-DOSFAT12 | |
042h | LinuxSwp/DR-DOS, SFS, Win2K DDM | 0C6h | DR-DOS FAT16, FAT16 set corrupt | |
043h | LinuxNat/DR-DOS | 0C2h | Hidden Linux swap | |
045h | Eumel/Ergos45h, Boot-US | 0C3h | Hidden Linux native | |
046h | Eumel/Ergos46h | 0C4h | DR-DOS FAT16 (<32Mb) | |
047h | Eumel/Ergos 47h | 0C7h | Syrinx boot, NTFS set corrupt | |
048h | Eumel/Ergos 48h | 0CBh | DR-DOS FAT32 | |
04Dh | QNX 4.x first | 0CCh | DR-DOS FAT32 LBA | |
04Eh | QNX 4.x second | 0CDh | CTOSmemdump | |
04Fh | QNX 4.x third, Oberon | 0Ceh | DR-DOS FAT16 LBA | |
050h | OnTrack DM R/O, Lynx RTOS | 0D0h | REAL/32 big | |
051 h | DM6Aux1,DMR/W | 0D1h | Multiuser DOS FAT12 | |
052h | CP/M, Microport System V | 0D4h | Multiuser DOS FAT16 (<32Mb) | |
053h | OnTrack DM6 Aux3 | 0D5h | Multiuser DOS Extended | |
054h | OnTrack DM6 DDO | 0D6h | Multiuser DOS FAT16 | |
055h | EZ-Drive | 0D8h | CP/M-86 | |
056h | GoldenBowVfeature | 0DBh | Concurrent DOS, CTOS | |
057h | Drive Pro | 0DDh | Hidden CTOS memdump | |
05Ch | Priam Edisk | 0DFh | DG/UX | |
061 h | Speed Stor | 0E0h | STAVFS | |
063h | Unix | 0E1h | Speed Stor FAT32 | |
064h | NetWare 2.x, PC-ARMOUR | 0E3h | Speed Stor R/O | |
065h | NetWare 3.x | 0E4h | Speed Stor FAT 16 | |
067h | Novell 67h | 0Ebh | BeOS | |
068h | Novell 68h | 0Eeh | EFI header | |
068h | Novell 69h | 0Efh | EFI file system | |
070h | DiskSecure Multi-Boot | 0F0h | Linux/PA-RISC boot | |
074h | ScramDisk | 0F1h | Storage Dimensions | |
075h | PC/AX | 0F2h | DOS Secondary | |
078h | XOSL | 0F4h | Speed Stor large, Prologue singl | |
07Eh | F. I.X | 0F5h | Prologue multi | |
080h | MINIX1.1-1.4a | 0FBh | VMware native | |
081h | MINIX1.4b+,ADM | 0FCh | Vmware swap | |
082h | Linux swap, Solaris | 0FDh | Linux RAID | |
083h | Linux native | 0Feh | Speed Stor (>1024), LanStep | |
084h | Hibernation, OS/2 C: Hidden | 0FFh | Xenix BB | |
Можно сказать, что таблица разделов — одна из наиболее важных структур данных на жестком диске. Если эта таблица повреждена, то не только не будет загружаться ни одна из установленных на компьютере операционных систем, но станут недоступными данные, расположенные в НЖМД, особенно если жесткий диск был разбит на несколько разделов.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 |



