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

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

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

Организация внешней памяти на магнитных дисках

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

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

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

Основные понятия

Из оперативной памяти в НЖМД и обратно информация передается байтами, а вот записывается на диск и считывается с него она уже последовательно (побитно). Из-за того, что запись и считывание бита данных не являются абсолютно надежными операциями, информация перед записью кодируется с достаточно большой избыточностью. Для этой цели применяют коды Рида-Соломона. Избыточное кодирование информации позволяет не только обнаруживать ошибки, но и автоматически исправлять их. Следовательно, перед тем как данные, считанные с поверхности магнитного диска, будут переданы в оперативную память, их нужно предварительно обработать (перекодировать). На эту операцию необходимо время, поэтому в ходе обработки данных быстро вращающийся диск успевает повернуться на некоторый угол, и мы можем констатировать, что на магнитном диске данные располагаются не сплошь, а порциями (блоками). Говорят, что НЖМД относится к блочным устройствам. Нельзя прочитать (или записать) байт или несколько байтов. Можно прочитать сразу только блок данных и уже потом извлекать из него нужные байты, использовать их в своих вычислениях и изменять. Записать потом данные обратно тоже можно только сразу блоком.

За счет того, что при вращении диска магнитная головка, зафиксированная на некоторое время в определенном положении, образует окружность (дорожку — 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