Тема OS02асу. Мультипрограммирование Мультипрограммирование - это способ организации вычислительного процесса, при котором на одном процессоре попеременно выполняются несколько программ. Пока одна программа выполняет операцию ввода-вывода, процессор не простаивает, как это происходило при последовательном выполнении программ (однопрограммный режим), а выполняет другую программу (многопрограммный режим). При этом каждая программа загружается в свой участок оперативной памяти, называемый образом процесса (разделом). МУЛЬТИПРОГРАММИРОВАНИЕ (многозадачность, multitasking) - метод одновременного выполнения на одной ЭВМ нескольких программ. Мультипрограммным режимом работы (многозадачностью) называется способ организации работы системы, при котором в ее памяти одновременно содержатся программы и данные для выполнения нескольких процессов обработки информации (задач). При этом должна обеспечиваться взаимная защита программ и данных, относящихся к различным задачам, а также возможность перехода от выполнения одной задачи к другой (переключение задач). Мультипрограммирование позволяет повысить общую производительность работы ЭВМ за счет более эффективного использования ее ресурсов. Однако, при выполнении мультипрограммирования расходуются дополнительные ресурсы (накладные расходы - особенно, память и процессорное время). Основные черты мультипрограммного режима: - в оперативной памяти находятся несколько пользовательских программ в состояниях активности, ожидания или готовности; - время работы процессора разделяется между программами, находящимися в памяти в состоянии готовности; - параллельно с работой процессора происходит подготовка и обмен с несколькими устройствами ввода-вывода. Мультипрограммирование предназначено для повышения пропускной способности вычислительной системы путем более равномерной и полной загрузки всего ее оборудования, в первую очередь процессора. При этом скорость работы самого процессора и номинальная производительность ЭВМ не зависят от мультипрограммирования. Однако, мультипрограммирование предпологает наличие накладных расходов, обусловленных переключением задач, что понижает быстродействие каждой из них в отдельности. Поэтому, для более быстрого выполнения одной из задач необходимо отключать режим мултипрограммирования. Мультипрограммный режим имеет в ЭВМ аппаратную и программную поддержку: - аппаратная: контроллеры устройств ввода-вывода; система прерывания; аппаратные средства системы защиты программ и данных и т.п.; - программная: мультизадачная операционная система (ОС); системные программы, управляющие работой устройств ввода-вывода и специализированных средств вычислительной системы. Управляющая программа (ОС), реализуя мультипрограммный режим, должна распределять (в том числе динамически) ресурсы системы (время процессора, оперативную и внешнюю память, устройства ввода-вывода и т.д.) между параллельно выполняемыми программами, чтобы обеспечить увеличение пропускной способности компьютера с учетом ограничений на ресурсы и требований по срочности выполнения отдельных программ. Производительность мультипрограммной ЭВМ оценивается количеством задач, выполненных в единицу времени (пропускная способность) и временем выполнения каждой программы Тi. При анализе работы ЭВМ важно определить степень использования ее ресурсов. Для этого широко применяются следующие показатели: kq - коэффициент загрузки q-го устройства; kq=Tq/T, где Tq - время занятости устройства q за общее время T работы ЭВМ; Lq=?Lqi*?ti/T - средняя длина очереди запросов к устройству q, где Lqi - длина очереди к устройству q на интервале времени ?ti и ?ti=T Помимо средней длины очереди важна также и динамика изменения текущей длины очереди. По значениям kq, Lq и динамике изменения Lq можно определить наиболее дефицитный ресурс в системе, ее "узкое место". Устранить "узкие места" можно или увеличением производительности соответствующего ресурса, или выбором такого набора задач, который обеспечивал бы более равномерное использование всех ресурсов (например, одни задачи более активно используют процессор (счетные задачи), другие - жесткий диск (работа с базами данных), третьи - устройства ввода-вывода). Режим классического мультипрограммирования, или пакетной обработки, применительно к однопроцессорным ЭВМ является основой для построения всех других видов многопрограммной работы. Режим имеет целью обеспечить минимальное время обработки пакета заданий и максимально загрузить процессор. Пакет заданий упорядочивается в соответствии с приоритетами заданий, и обслуживание программ ведется в порядке очередности. Обычно процессор обслуживает наиболее приоритетную программу. Как только ее решение завершается, процессор переключается на следующую по приоритетности программу. В этом режим во многом похож на режим косвенного доступа. В режиме мультипрограммирования имеется существенное отличие. Если при обслуживании наиболее приоритетной программы создается ситуация, что вычисления не могут быть продолжены (например, требуется ввести дополнительные данные), то прерывание обслуживания сопровождается передачей управления следующей по приоритетности программе. Но как только условия, препятствующие продолжению наиболее приоритетной задачи, отпадут, процессор вновь возвращается к продолжению решения ранее прерванной программы. Многопрограммный режим пакетной обработки Подобные прерывания и передачи управления могут многократно наслаиваться друг на друга. Это позволяет до минимума сократить непроизводительные простои процессора. Из вышеизложенного следует, что в однопроцессорных ЭВМ многопрограммность является кажущейся, так как процессор предоставляется программам в непересекающиеся интервалы времени. Уменьшение времени обслуживания обеспечивается также за счет параллельной работы процессора и устройств ввода-вывода. В качестве недостатка надо отметить, что в режиме мультипрограммирования улучшение качества обслуживания пользователей по сравнению с косвенным доступом не предусматривается. Здесь также отдельные программы могут надолго монополизировать процессор, блокируя тем самым программы других пользователей. Генезис мультипрограммирования С 1962 по 1969 г. в больших ОС стал почти повсеместно использоваться новый метод обработки заданий -мультипрограммирование, был также разработан новый способ выполнения вычислений, разделение времени, как альтернатива пакетной обработке. Большие дисковые устройства с быстрым доступом обеспечили непосредственно управляемую память для систем и библиотечных программ пользователей, а также для ожидающих обработки заданий пользователей. Во многие ЭВМ были введены аппаратные средства защиты команд и памяти; в некоторых больших машинах появились системы основной памяти с аппаратными средствами настройки адресов, которые допускали реализацию большой "виртуальной" памяти; стали более распространенными мультипроцессорные конфигурации, Проблемы распределения ресурсов и защиты стали более острыми и трудноразрешимыми в мультипрограммной среде, где много процессов могут одновременно запрашивать как совместное, так и монопольное использование ресурсов системы, часто должны передавать сигналы друг другу и могут являться потенциально "злонамеренными" или ошибочными. Именно в этот период исследование операционных систем стало одним из главных направлений в области вычислительной техники. В настоящее время большинство средних и крупных операционных систем пакетной обработки, интерактивных систем, систем реального времени и общего назначения являются мультипрограммными. Однако преимущества такого режима работы не даются даром. Требуются специальные средства программного обеспечения, а также дополнительная аппаратура, а перерасход времени и пространства памяти, вызванный системой при выполнении, часто бывает значительным. Существуют четыре связанных между собой проблемы, которые свойственны мультипрограммным ОС. 1) преобразование виртуальных машин Проблема трансляции виртуальной машины возникает и в статической форме, как в примере из предыдущего раздела (Рис 2), и в динамической форме, как, например, настройка адресов команд и данных во время выполнения. Эту трансляцию можно рассматривать как установление соответствия имя/ресурс. Предположим, например, что периферийные устройства обозначены символически и что адреса памяти перемещаемы на некотором виртуальном уровне. Тогда они должны быть преобразованы в абсолютные адреса устройств и памяти соответственно. Распределение ресурсов и планирование становятся проблемой обеспечения эффективного использования аппаратуры при тех ограничениях, которые пользователь накладывает на время получения ответа. 2) распределение ресурсов между программами 3) Третья проблема - это проблема защиты. Мы должны гарантировать сохранность ОС и программ пользователей от случайного или умышленного повреждения или ошибочного обращения к ним со стороны пользователей или самой ОС. Это не только вопрос предотвращения разрушения информации, но и вопрос сохранения секретности и охраны собственности. Частные пользовательские файлы или части операционной системы могут потребовать гарантий от несанкционированного считывания или выполнения. Кроме того, владелец файла (т. е. данных или программ) должен иметь возможность разрешать определенному классу пользователей считывание, запись или выполнение своего файла. 4) Четвертая проблема, которая характеризует эти системы, возникает из необходимости синхронизовать и обеспечивать взаимодействие резидентных системных процессов и иногда пользовательских процессов. Физически, а также абстрактно, многие процессы развиваются одновременно. Данная независимая программа, например задание пользователя, должна всегда вырабатывать один и тот же ответ, независимо от других программ, которые могут выполняться в то же самое время. Когда программы требуют синхронизации (например, когда программа ввода поставляет буферизованные данные для основной программы), необходимо быть внимательным, чтобы предотвратить ситуации, в которых не выполняется ни одна программа, потому что каждая ждет сигнала от другой, или ситуации, когда программа пропускает сигнал. "виртуальные машины", воспринимаемые различными классами пользователей, так как они редко являются реальными ЭВМ, а наиболее часто - результатом наслоений программного обеспечения на аппаратуру ЭВМ. Иерархия виртуальных машин Программист на АЛГОЛе обращается к ЭВМ с этой подсистемой как к машине, которая непосредственно выполняет АЛГОЛ. Следовательно, пользователь этой виртуальной машины не имеет дело с проблемами распределения регистров и памяти, программами канала, прерываниями, функциями размещения массивов и другими задачами, которые возникают на "нижнем" уровне. Разработчики подсистемы , возможно, использовали макроассемблерную систему, которая включает ряд "системных" макросов, например, для ввода-вывода. Программисты на языке макроассемблера могут не беспокоиться о деталях распределения памяти для своих программ, если их виртуальная машина автоматически обеспечивает это; однако им необходимо проектировать стандартные программы управления памятью для АЛГОЛ - машины, например для обслуживания стека во время выполнения. Системный программист, работающий над базовым модулем, таким, как система буферизации ввода-вывода, обычно использует виртуальную машину, состоящую частично из реальной машины, но дополненную некоторыми примитивами "ядра" операционной системы, например макросами для передачи сообщений между процессами и для манипуляции с очередями. Язык управления заданиями, на котором пользователь описывает свое задание и требования к ресурсам, представляет виртуальную машину с функциями операционных систем по отношению к заданиям и шагам заданий. У пользователя можно вызвать иллюзию работы с очень большой центральной памятью; система в свою очередь реализует эту виртуальную память на значительно меньшей и, может быть, по-другому организованной реальной основной памяти. Пользователь, таким образом, имеет доступный ряд машин, из которых он может создать более абстрактные машины. На самом нижнем уровне расположена реальная ЭВМ. Системный программист, использующий машину на уровне i и ниже, пишет программное обеспечение для построения новой виртуальной машины на уровне i + 1. Вейдерман (1971) графически изобразил эту иерархию виртуальных машин, как показано на Рис 2. Mi обозначает машину, a Si - программное обеспечение на уровне i. На этом рисунке программный модуль S0, представленный на языке реальной ЭВМ M0, реализует новую виртуальную машину M1. Аналогично, программное обеспечение S2, написанное для виртуальной машины М2, дает новую виртуальную машину М3, в то время как , написанное для той же самой машины, что и S2, дает другую виртуальную машину . VM5 | VM4------------>Soft4 <--------------- VM4' | | Soft3'<--- VM3' VM3''---> Soft2'' | | Soft2'<---- VM2 ----> Soft2'' | Soft1<--VM1 VM1- виртуальная машина 1 уровня | Soft1 - СПО для VM1 M0---> S0 M0 - реальная ЭВМ Семантический разрыв Современные вычислительные системы имеют нежелательно большой семантический разрыв, выражающийся в том, что объекты манипулирования и соответствующие им операции, реализуемые архитектурой вычислительной системы, редко имеют близкое "родство" с объектами и операциями, описываемыми в языках программирования. Расширим это определение утверждением, что существует большой разрыв в семантике между "программным окружением" ЭВМ и представлением принципов построения программ на уровне ее архитектуры или, развивая эту мысль далее, между архитектурой машины и средой, в которую ее помещают для использования. Как будет показано ниже, этот большой семантический разрыв обусловливает возникновение большого количества существенных проблем, к которым относятся высокая стоимость разработки программного обеспечения, его ненадежность и эксплуатационная: неэффективность, чрезмерный объем программ, сложность компиляторов и операционной системы, наличие отступлений от правил построения языков программирования, т. е. факторы, отрицательно влияющие на экономический показатель вычислений. Поколения ЭВМ по критерию элементной базы: Эпоха механических счетных устройств -6000-1939 1. Электронные лампы 1945-1955 2. Полупроводники (транзисторы) 1955-1965 3. Интегральные схемы (ИС) 1965-1975 4. Большие интегральные схемы (БИС, микропроцессоры) 1975-1985 5. Персональные компьютеры () 1985-1995 6. Чипсеты 1995-2005 -------------------------- 7. гетерогенная (нейро-гено-сете-квантовые) компьютерные системы (?) 2005-2015 Глобальные, региональные и локальные, виртуальные и мобильные сети (метакомпьютинг) 2005- 6 поколений ОС по критерию базы: 1. Мониторы пакетной обработки () 1955-1965 2. Монолитные ОС (майнфреймы, IBM OS/360) 1965-1975 3. ОС Реального Времени (мини-компьютеры, Unix) 1975-1985 4. ОС персональных компьютеров (ПК, MS DOS) 1985-1995 5. Сетевые операционные системы (Сети, Windows) 1995-2005 ----------------------------- 6. Адаптируемые интеллектуальные распределенные ОС 2005-2015 В период с 1959 до 1963 гг. несколько значительных аппаратных разработок получили широкое распространение и стимулировали развитие ОС. Вероятно, наиболее важным аппаратурным новшеством был канал данных - простейшая ЭВМ со своей собственной системой команд, регистрами и устройством управления, которое управляет связью и передачей данных между основной ЭВМ и устройствами ввода-вывода. При получении запроса на ввод-вывод от центрального обрабатывающего устройства (ЦОУ) канал выполняет операцию ввода-вывода асинхронно и параллельно с продолжающейся работой ЦОУ; становится возможным совмещение во времени операций ввода-вывода и ЦОУ. Основная память разделяется ЦОУ и каналом, поскольку она хранит программы и данные для них. Вначале ЦОУ могло лишь опрашивать состояние канала, но вскоре стало ясно, что можно повысить эффективность, если бы канал с целью передачи сообщения мог также прерывать работу ЦОУ. в большинстве случаев при завершении операции ввода-вывода. Были написаны более сложные системы программирования ввода-вывода с целью использования преимуществ потенциальной эффективности этой новой архитектуры. В их состав вошли программные средства буферизации для обеспечения автоматического считывания данных, прежде чем они понадобятся программе, и для помещения выходных данных в очередь, с тем чтобы отложить их вывод, а также стандартные программы обработки прерываний, которые должны реагировать на прерывания ввода-вывода и возвращать управление прерванным программам. Прерывания стали использоваться, чтобы сигнализировать об исключительных внутренних условиях, таких, как арифметическое переполнение, и были добавлены команды для выборочного разрешения (включения), запрещения (выключения) и приостановки (задержки действия) механизмов прерывания. Стали доступными внутренние часы, которые могли быть запрограммированы для прерывания ЦОУ через определенный интервал времени. Они позволили супервизорной программе управлять значением интервала времени ЦОУ, выделяемого каждому пользователю, что сделало возможным автоматическое распознавание некоторых ошибочных или слишком длинных программ. ЭВМ 2-го поколения: IBM 1401/1460/1410/7010, IBM 7070/7074, 7044, 7090/7094, IBM 7044/7094 Directly Coupled System, IBM S/360-50, S/360-65, S/360-75 IBM S/370-145, S/370-155, S/370-165 Basic Programming Systems (BPS Cobol, BPS Assembler, BPS Fortran, BPS Sort). 8K-BOS - Basic Operating System, disk-resident, designed to run in an 8k systems...nucleus took 4k but needed 6K to do anything useful so mostly run on 16K systems. TOS (same as DOS but Tape-resident OS...lasted about 3 months before 1st DOS came out). DOS disk-resident system outside SDD, designed for 16k memory, needed 12k nucleus for anything useful so mostly run on 32K systems....used to tell customers to use DOS on 32K-128K systems and not move to OS with less than 256K. 1nd Generation: 1401 frontend to 7090/94 - no name I ever heard. 2nd Generation:7044 frontend to 7094 - DCS (Directly Coupled System) 3rd Generation: S/360-40 frontend to S/360-65 - ASP (Attached Support Processor) Система 370 отображает большинство традиционных архитектурных решений. OS/VS1 - OS/VS2 SVS OS/VS2 MVS Release 3.8 MVS/SE1, which introduced TSO logical swap and MVS/SE2. OS/390 1.3 to 2.10. z/OS-OS/390-MVS Virtual Universe Operating System -- OS/VU. "Virtual Reality" OS/VR IMS Multics (Multiplexed Information and Computing Service) was a timesharing operating system begun in 1965 and still in use today. The system was started as a joint project by MIT Project MAC, Bell Telephone Laboratories, and GE. Prof. F. J. Corbato of MIT led the project. Bell Labs withdrew from the development effort in 1969, and later GE sold its computer business to Honeywell, which continued Multics development and offered Multics as a commercial product. At the peak there were almost 100 Multics sites. Появление мультипрограммных операционных систем (для мэйнфреймов 1965-1975 г) В это время в технической базе вычислительных машин произошел переход от отдельных полупроводниковых элементов типа транзисторов к интегральным микросхемам, что открыло путь к появлению следующего поколения компьютеров. Большие функциональные возможности интегральных схем сделали возможным реализацию на практике сложных компьютерных архитектур, таких, например, как IBM/360. В этот период были реализованы практически все основные механизмы, присущие современным ОС: мультипрограммирование, мультипроцессирование, поддержка многотерминального многопользовательского режима, виртуальная память, файловые системы, разграничение доступа и сетевая работа. В эти годы начинается расцвет системного программирования. Из направления прикладной математики, представляющего интерес для узкого круга специалистов, системное программирование превращается в отрасль индустрии, оказывающую непосредственное влияние на практическую деятельность миллионов людей. Революционным событием данного этапа явилась промышленная реализация мультипрограммирования. (Заметим, что в виде концепции и экспериментальных систем этот способ организации вычислений существовал уже около десяти лет.) В условиях резко возросших возможностей компьютера по обработке и хранению данных выполнение только одной программы в каждый момент времени оказалось крайне неэффективным. Решением стало мультипрограммирование -- способ организации вычислительного процесса, при котором в памяти компьютера находилось одновременно несколько программ, попеременно выполняющихся на одном процессоре. Эти усовершенствования значительно улучшили эффективность вычислительной системы: компьютер теперь мог использоваться почти постоянно, а не менее половины времени работы компьютера, как это было раньше. Мультипрограммирование было реализовано в двух вариантах -- в системах пакетной обработки и разделения времени. Мультипрограммные системы пакетной обработки так же, как и их однопрограммные предшественники, имели своей целью обеспечение максимальной загрузки аппаратуры компьютера, однако решали эту задачу более эффективно. В мультипрограммном пакетном режиме процессор не простаивал, пока одна программа выполняла операцию ввода-вывода (как это происходило при последовательном выполнении программ в системах ранней пакетной обработки), а переключался на другую готовую к выполнению программу. В результате достигалась сбалансированная загрузка всех устройств компьютера, а следовательно, увеличивалось число задач, решаемых в единицу времени. В мультипрограммных системах пакетной обработки пользователь по-прежнему был лишен возможности интерактивно взаимодействовать со своими программами. Для того чтобы хотя бы частично вернуть пользователям ощущение непосредственного взаимодействия с компьютером, был разработан другой вариант мультипрограммных систем -- системы разделения времени. Этот вариант рассчитан на многотерминальные системы, когда каждый пользователь работает за своим терминалом. В числе первых операционных систем разделения времени, разработанных в середине 60-х годов, были TSS/360 (компания IBM), CTSS и MULTICS (Массачусетский технологический институт совместно с Bell Labs и компанией General Electric). Вариант мультипрограммирования, применяемый в системах разделения времени, был нацелен на создание для каждого отдельного пользователя иллюзии единоличного владения вычислительной машиной за счет периодического выделения каждой программе своей доли процессорного времени. В системах разделения времени эффективность использования оборудования ниже, чем в системах пакетной обработки, что явилось платой за удобства работы пользователя. Многотерминальный режим использовался не только в системах разделения времени, но и в системах пакетной обработки. При этом не только оператор, но и все пользователи получали возможность формировать свои задания и управлять их выполнением со своего терминала. Такие операционные системы получили название систем удаленного ввода заданий. Терминальные комплексы могли располагаться на большом расстоянии от процессорных стоек, соединяясь с ними с помощью различных глобальных связей -- модемных соединений телефонных сетей или выделенных каналов. Для поддержания удаленной работы терминалов в операционных системах появились специальные программные модули, реализующие различные (в то время, как правило, нестандартные) протоколы связи. Такие вычислительные системы с удаленными терминалами, сохраняя централизованный характер обработки данных, в какой-то степени являлись прообразом современных сетей, а соответствующее системное программное обеспечение -- прообразом сетевых операционных систем. К этому времени можно констатировать существенное изменение в распределении функций между аппаратными и программными средствами компьютера. Операционные системы становились неотъемлемыми элементами компьютеров, играя роль "продолжения" аппаратуры. В первых вычислительных машинах программист, напрямую взаимодействуя с аппаратурой, мог выполнить загрузку программных кодов, используя пультовые переключатели и лампочки индикаторов, а затем вручную запустить программу на выполнение, нажав кнопку "пуск". В компьютерах 60-х годов большую часть действий по организации вычислительного процесса взяла на себя операционная система. (В большинстве современных компьютеров не предусмотрено даже теоретической возможности выполнения какой-либо вычислительной работы без участия операционной системы. После включения питания автоматически происходит поиск, загрузка и запуск операционной системы, а в случае ее отсутствия компьютер просто останавливается.) Реализация мультипрограммирования потребовала внесения очень важных изменений в аппаратуру компьютера, непосредственно направленных на поддержку нового способа организации вычислительного процесса. При разделении ресурсов компьютера между программами необходимо обеспечить быстрое переключение процессора с одной программы на другую, а также надежно защитить коды и данные одной программы от непреднамеренной или преднамеренной порчи другой программой. В процессорах появился привилегированный и пользовательский режимы работы, специальные регистры для быстрого переключения с одной программы на другую, средства защиты областей памяти, а также развитая система прерываний. В привилегированном режиме, предназначенном для работы программных модулей операционной системы, процессор мог выполнять все команды, в том числе и те из них, которые позволяли осуществлять распределение и защиту ресурсов компьютера. Программам, работающим в пользовательском режиме, некоторые команды процессора были недоступны. Таким образом, только ОС могла управлять аппаратными средствами и исполнять роль монитора и арбитра для пользовательских программ, которые выполнялись в непривилегированном, пользовательском режиме. Система прерываний позволяла синхронизировать работу различных устройств компьютера, работающих параллельно и асинхронно, таких как каналы ввода-вывода, диски, принтеры и т. п. Аппаратная поддержка операционных систем стала с тех пор неотъемлемым свойством практически любых компьютерных систем, включая персональные компьютеры. Еще одной важной тенденцией этого периода является создание семейств программно-совместимых машин и операционных систем для них. Примерами семейств программно-совместимых машин, построенных на интегральных микросхемах, являются серии машин IBM/360 и IBM/370 (аналоги этих семейств советского производства -- машины серии ЕС), PDP-11 (советские аналоги -- СМ-3, СМ-4, СМ-1420). Вскоре идея программно-совместимых машин стала общепризнанной. Программная совместимость требовала и совместимости операционных систем. Однако такая совместимость подразумевает возможность работы на больших и на малых вычислительных системах, с большим и с малым количеством разнообразной периферии, в коммерческой области и в области научных исследований. Операционные системы, построенные с намерением удовлетворить всем этим противоречивым требованиям, оказались чрезвычайно сложными. Они состояли из многих миллионов ассемблерных строк, написанных тысячами программистов, и содержали тысячи ошибок, вызывающих нескончаемый поток исправлений. Операционные системы этого поколения были очень дорогими. Так, разработка OS/360, объем кода для которой составил 8 Мбайт, стоила компании IBM 80 миллионов долларов. Однако несмотря на необозримые размеры и множество проблем, OS/360 и другие ей подобные операционные системы этого поколения действительно удовлетворяли большинству требований потребителей. За это десятилетие был сделан огромный шаг вперед и заложен прочный фундамент для создания современных операционных систем. К середине 70-х годов наряду с мэйнфреймами широкое распространение получили мини-компьютеры, такие как PDP-11, Nova, HP. Мини-компьютеры первыми использовали преимущества больших интегральных схем, позволившие реализовать достаточно мощные функции при сравнительно невысокой стоимости компьютера. Архитектура мини-компьютеров была значительно упрощена по сравнению с мэйнфреймами, что нашло отражение и в их операционных системах. Многие функции мультипрограммных многопользовательских ОС мэйнфреймов были усечены, учитывая ограниченность ресурсов мини-компьютеров. Операционные системы мини-компьютеров часто стали делать специализированными, например только для управления в реальном времени (ОС RT-11 для мини-компьютеров PDP-11) или только для поддержания режима разделения времени (RSX-11M для тех же компьютеров). Эти операционные системы не всегда были многопользовательскими, что во многих случаях оправдывалось невысокой стоимостью компьютеров. Важной вехой в истории мини-компьютеров и вообще в истории операционных систем явилось создание ОС UNIX. Первоначально эта ОС предназначалась для поддержания режима разделения времени в мини-компьютере PDP-7. С середины 70-х годов началось массовое использование ОС UNIX. К этому времени программный код для UNIX был на 90% написан на языке высокого уровня С. Широкое распространение эффективных C-компиляторов сделало UNIX уникальной для того времени ОС, обладающей возможностью сравнительно легкого переноса на различные типы компьютеров. Поскольку эта ОС поставлялась вместе с исходными кодами, то она стала первой открытой ОС, которую могли совершенствовать простые пользователи-энтузиасты. Хотя UNIX была первоначально разработана для мини-компьютеров, гибкость, элегантность, мощные функциональные возможности и открытость позволили ей занять прочные позиции во всех классах компьютеров: суперкомпьютерах, мэйнфреймах, мини-компьютерах, серверах и рабочих станциях на базе RISC-процессоров, персональных компьютерах. Доступность мини-компьютеров и вследствие этого их распространенность на предприятиях послужили мощным стимулом для создания локальных сетей. Предприятие могло себе позволить иметь несколько мини-компьютеров, находящихся в одном здании или даже в одной комнате. Естественно, возникала потребность в обмене информацией между ними и в совместном использовании дорогого периферийного оборудования. Первые локальные сети строились с помощью нестандартного коммуникационного оборудования, в простейшем случае -- путем прямого соединения последовательных портов компьютеров. Программное обеспечение также было нестандартным и реализовывалось в виде пользовательских приложений. Первое сетевое приложение для ОС UNIX -- программа UUCP (UNIX-to-UNIX Copy program) -- появилась в 1976 году и начала распространяться с версией 7 AT&T UNIX с 1978 года. Эта программа позволяла копировать файлы с одного компьютера на другой в пределах локальной сети через различные аппаратные интерфейсы -- RS-232, токовую петлю и т. п., а кроме того, могла работать через глобальные связи, например модемные. Спулинг (spooling) - определялся как способ организации вычислительного процесса, в соответствии с которым задания считывались с перфокарт на диск в том темпе, в котором они появлялись в помещении вычислительного центра, а затем, когда очередное задание завершалось, новое задание с диска загружалось в освободившийся раздел. Термин спулинг (spooling) не имеет общепринятого русского аналога. В соответствии с программистским фольклором, слово это происходит отаббревиатуры Simultaneous Peripherial Operation Off Line.Эту фразу трудно дословно перевести на русский язык; имеется в виду метод работы с внешними устройствами вывода (реже - ввода) в многозадачной ОС или многомашинной среде, при которой задачам создается иллюзия одновременного доступа к устройству. При этом, однако, задачи не получают к устройству прямого доступа, а работают в режиме off-line (без прямого подключения). Выводимые данные накапливаются системой, а затем выводятся на устройство так, чтобы вывод различных задач не смешивался. Видно, что этот метод работы отчасти напоминает простую отложенную запись, но основная задача здесь не только и не столько повышение производительности, сколько разделение доступа к медленному внешнему устройству. Чаще всего спулинг используется для работы с печатающими устройствами, а для промежуточного хранения данных используется диск. Многие почтовые системы используют механизм, аналогичный спулингу: если получатель не готов принять письмо или линия связи с получателемзанята либо вообще разорвана, предназначенное к отправке письмо помещается вочередь. Затем, когда соединение будет установлено, письмо отправляется. Классический спулинг реализован в ОС семейства Unix.В этих ОС вывод задания на печать осуществляется командой lpr.Эта команда копирует предназначенные для печати данные в каталог/usr/spool/lp, возможно, пропуская их при этом через программу-фильтр. Каждая порция данных помещается в отдельный файл. Имена файлов генерируются так, что имя каждого вновьсозданного файла было ``больше'' предыдущего при сравнении ASCII-кодов. За счет этого файлы образуют очередь. Системный процесс-демон (daemon) lpd (или lpshed вUnix SVR4) периодически просматривает каталог. Еслитам что-то появилось, а печатающее устройство свободно, демон копирует появившийся файл на устройство. По окончании копированияон удаляет файл, тем или иным способом уведомляет пользователя обокончании операции (в системах семейства Unix чаще всегоиспользуется электронная почта) и вновь просматривает каталог. Если там по-прежнему что-то есть, демон выбирает первый по порядку запрос и также копирует его на устройство. Тот же механизм используется почтовой системой Unix -программой sendmail, только вместо каталога/usr/spool/lp используется /usr/spool/mail. Этот механизм очень прост, но имеет один специфический недостаток: демонне может непосредственно ожидать появления файлов в каталоге, как можно было бы ожидать установки семафора или другого флага синхронизации.Если бы демон непрерывно сканировал каталог,это создавало бы слишком большую и бесполезную нагрузку на систему. Поэтому демон пробуждается через фиксированные интервалы времени; если за это время ничего в очереди не появилось, демон засыпает вновь. Такой подход также очень прост, но увеличивает время прохождения запросов: запрос начинает исполняться не сразу же после установки,а лишь после того, как демон в очередной раз проснется. В OS/2 и Windows NT спулинг организован отчасти похожим образом с той разницей, что установка запроса в очередь можетпроисходить не только командой PRINT, но и простым копированиемданных на псевдоустройство LPT[1-9]. В отличие от систем семействаUnix как программа PRINT, так ипсевдоустройства портов активизируют процесс спулеранепосредственно при установке запроса. Графические драйверы печатающих устройств в этих системах такжеиспользуют спул вместо прямого обращения к физическому порту. Novell Netware предоставляет специальный механизм для организации спулинга - очереди запросов. Для хранения данных в этихочередях также используется диск, но прикладные программы вместопросмотра каталога могут пользоваться системными функциями GetNextMessage и PutMessage.Вызов GetNextMessage блокируется, если очередь пуста; таким образом,нет необходимости ожидать пробуждения демона или специальным образомактивизировать его - демон сам пробуждается при появлении запроса. Любопытно, что почтовая система Mercury Mail дляNovell Netware может использовать для промежуточного храненияпочты как очередь запросов, так и выделенный каталог в зависимости от конфигурации.