Недавние прибавления семейства устройств массовой памяти имеют в своей основе потребительскую электронику и обеспечивают очень высокую плотность хранения в маленьком объеме. Сюда относятся: (а) оптические диски вроде тех, что используются в проигрывателях, с емкостью около гигабайта. Они служат в качестве ПЗУ, WORM-памяти (Write Once, Read Many — записать один раз, прочитать многократно) или как полностью стираемая память для записи/чтения; (б) видеокассеты формата VHS или 8 мм, которые позволяют иметь гигабайты памяти с возможностью записи/чтения на недорогой ленте. Основной недостаток кассет — большое время доступа. Обе упомянутые системы памяти используют изощренные методы коррекции ошибок, возникающих из-за дефектов поверхности и по другим причинам; в обычных аудио/видеоприменениях эти ошибки не имеют особого значения, однако при хранении данных или программ они, не будучи исправлены, носили бы разрушительный характер.
Использование памяти. Файлы хранятся в устройствах массовой памяти, однако программы в процессе их выполнения должны находиться в оперативной памяти. Простую автономную программу вроде той, что будет рассмотрена в следующей главе, можно загрузить почти в любое место памяти. Однако в компьютере с операционной системой всегда имеются специальные области, зарезервированные для выполнения специальных функций. Например, сама операционная система MS-DOS, вместе с ее интерпретатором команд, дисковыми буферами, стеком и прочим, обычно загружается в начало памяти, заполняя при этом векторами прерываний выделенные ячейки, адреса которых известны ЦП, в то время как часть MS-DOS, заключенная в ПЗУ, располагается в конце памяти, за областью, отведенной под видеобуферы дисплея. Если компьютер работает под управлением операционной системы, выделением памяти под программы пользователя ведает система. Понимание этого момента особенно важно при использовании ПДП; в этом случае вы должны предоставить системе возможность определить, где будет располагаться ваш буфер данных, и использовать этот адрес в качестве стартового для блочной передачи по каналу ПДП.
Ситуация еще более усложняется, если программы по ходу выполнения выгружаются и загружаются (так называемый «свопинг») или перемещаются по памяти. В памяти одновременно может находиться много программ, которым в многозадачном режиме выделяются «кванты времени» ЦП. К тому же большинство микрокомпьютеров используют «отображение памяти», при котором физические адреса памяти отображаются на различные логические адреса (т. е. те, по которым программа располагается с ее точки зрения). Если всего сказанного недостаточно, чтобы сбить вас с толку, подумайте о «виртуальной памяти», используемой в более совершенных моделях микрокомпьютеров, когда ваша программа разделяется на небольшие «страницы», каждая из которых в любой момент времени может быть, а может и не быть в памяти; программа «листает» эти страницы, гоняя их между памятью и диском в безумном пароксизме бешеной активности.
Обсуждение памяти нельзя считать законченным, если не упомянут электронный (псевдо) диск, который можно организовать даже на относительно простых машинах, если только хватит оперативной памяти. Идея псевдодиска заключается в такой организации памяти, чтобы с точки зрения операционной системы она выглядела, как диск; в эту псевдодисковую память можно затем загрузить часто используемые программы. Такая процедура может оказаться полезной при разработке программ, когда приходится постоянно обращаться к редактору, компилятору, ассемблеру и компоновщику. При использовании псевдодиска работа идет значительно быстрее, поскольку отпадает необходимость в обращениях к настоящему диску. Правда, если произойдет отказ компьютера, вы потеряете все, что сделали, так как файлы не сохраняются на диске автоматически. Схожая идея лежит в основе кеш-памяти; в этом случае область ОЗУ хранит результаты последних обращений к диску.
Драйверы. Компьютерный мир полон разнообразия — каждый месяц мы сталкиваемся с новинками технологии в области запоминающих устройств (магнитных, оптических), принтеров (лазерные, электролюминесцентные), сетей и проч. Различное электронное оборудование требует и различных управляющих сигналов с разными требованиями к временной синхронизации и т. д. Это могло бы привести к серьезным программным трудностям, так как программное обеспечение, разработанное, например, для матричного принтера, абсолютно не годилось бы для лазерного наборного автомата.