Введение. Функции и организация операционных систем
В англоязычной технической литературе термин System Software (системное программное обеспечение) означает программы и комплексы программ, являющиеся общими для всех, кто совместно использует технические средства компьютера, и применяемые как для автоматизации разработки (создания) новых программ, так и для организации выполнения программ уже существующих. С этой точки зрения программное обеспечение может быть разделено на следующие пять групп:
1. Операционные системы (ОС).
2. Системы управления файлами (СУФ).
3. Интерфейсные оболочки для взаимодействия пользователя с ОС и программные среды.
4. Системы программирования.
5. Утилиты.
Рассмотрим вкратце эти группы системных программ.
1. Под операционной системой (ОС) обычно понимают комплекс управляющих и обрабатывающих программ, который, с одной стороны, выступает как интерфейс между аппаратурой компьютера и пользователем с его задачами, а с другой – предназначен для наиболее эффективного использования ресурсов вычислительной системы и организации надёжных вычислений. Любой из компонентов прикладного программного обеспечения обязательно работает под управлением ОС.
На рис. 1.1 изображена обобщённая структура программного обеспечения вычислительной системы.
Рис. 1.1. Обобщённая структура программного обеспечения
Вычислительной системы
Видно, что ни один из компонентов программного обеспечения, за исключением самой ОС, не имеет непосредственного доступа к аппаратуре компьютера. Даже пользователи взаимодействуют со своими программами через интерфейс ОС. Любые их команды, прежде чем попасть в прикладную программу, сначала проходят через ОС.
|
Основными функциями, которые выполняют ОС, являются следующие:
1. Управление элементами, блоками и устройствами ЭВМ. Выполняется с помощью набора специальных управляющих программ – драйверов устройств. Так, например, центральная часть операционной системы – ядро ОС, содержит драйверы всех основных устройств ЭВМ. Дополнительные устройства устанавливаются в вычислительную систему вместе со своим драйвером, обычно поставляемым вместе с аппаратными средствами;
2. Обеспечение хранения и доступа к информации (файловая система). Сюда входят правила организации и размещения наборов данных во внешней памяти и правила обращения к внешним устройствам, через которые производится передача данных. В основе лежит так называемая Базовая Система Ввода/Вывода (BIOS);
3. Выделение ресурсов ПЭВМ (памяти, процессорного времени, внешних устройств) для выполняемых процессов (управление ресурсами). Это наиболее сложная функция операционных систем. В зависимости от того, как распределяются ресурсы ЭВМ, определяется тип ОС и ее возможности;
4. Организация взаимодействия между выполняемыми процессами (система прерываний). Данная система позволяет с одной стороны достаточно универсально обеспечивать все виды передач управления, с другой – управлять работой компьютера в диалоговом режиме, независимо от выполняемых в текущий момент программ;
5. Приём от пользователя (или от оператора системы) заданий или команд, сформулированных на соответствующем языке – в виде директив (команд) оператора или в виде указаний (своеобразных команд) с помощью соответствующего манипулятора (например, с помощью «мыши»), – и их обработка.
|
Также следует отметить следующие функции, которые выполняют ОС:
Ø приём исполнение программных запросов на запуск, приостановку, остановку других программ;
Ø загрузка в оперативную память подлежащих исполнению программ;
Ø инициация программы (передача ей управления, в результате чего процессор исполняет программу);
Ø идентификация всех программ и данных;
Ø обеспечение работы систем управления файлами (СУФ) и/или системы управления базами данных (СУБД), что позволяет резко увеличить эффективность всего программного обеспечения;
Ø обеспечение режима мультипрограммирования, то есть выполнения двух или более программ на одном процессоре, создающее видимость их одновременного исполнения;
Ø обеспечение функций по организации и управлению всеми операциями ввода/вывода;
Ø удовлетворение жёстким ограничениям на время ответа в режиме реального времени (характерно для соответствующих ОС);
Ø распределение памяти, а в большинстве современных систем и организация виртуальной памяти;
Ø планирование и диспетчеризация задач в соответствии с заданными стратегией и дисциплинами обслуживания;
Ø организация механизмов обмена сообщениями и данными между выполняющимися программами;
Ø защита одной программы от влияния другой;
Ø обеспечение сохранности данных;
Ø предоставление услуг на случай частичного сбоя системы;
Ø обеспечение работы систем программирования, с помощью которых пользователи готовят свои программы.
|
Из приведенных выше функций видно, что операционная система реализует связи между аппаратными средствами, программами и пользователями. ОС реализует интерфейс пользователя (если одной из сторон взаимодействия является человек), аппаратно-программный интерфейс (если одной из сторон выступает техническое устройство) и программный интерфейс (если взаимодействуют между собой два программных процесса).
Примерами операционных систем являются: Windows, Linux, Mac OS, Android, iOS и др.
2. Система управления файлами предназначена для организации более удобного доступа к данным, организованным как файлы. Именно благодаря системе управления файлами вместо низкоуровневого доступа к данным с указанием конкретных физических адресов нужной нам записи используется логический доступ с указанием имени файла и записи в нём. Как правило, все современные ОС имеют соответствующие системы управления файлами. Однако выделение этого вида системного программного обеспечения в отдельную категорию представляется целесообразным, поскольку ряд ОС позволяет работать с несколькими файловыми системами (либо с одной из нескольких, либо сразу с несколькими одновременно). В этом случае говорят о монтируемых файловых системах (дополнительную систему управления файлами можно установить), и в этом смысле они самостоятельны. Более того, можно назвать примеры простейших ОС, которые могут работать и без файловых систем, а значит, им необязательно иметь систему управления файлами, либо они могут работать с одной из выбранных систем.
Нужно понимать, что любая система управления файлами (СУФ) не существует сама по себе – она разработана для работы в конкретной ОС и с конкретной файловой системой. Можно сказать, что всем известная файловая система FAT (file allocation table) имеет множество реализаций как система управления файлами, например, FAT-16, FAT-32 для Windows. Другими словами, для работы с файлами, организованными в соответствии с некоторой файловой системой, для каждой ОС должна быть разработана соответствующая система управления файлами; и эта система управления файлами будет работать только в той ОС, для которой она и создана.
Примеры: NTFS, FAT, Ext4, XtreemFS, Mac OS X Extended и др.
3. Интерфейсная оболочка предназначена для удобства взаимодействия пользователя с ОС. Назначение – расширить возможности по управлению ОС или изменить встроенные в систему возможности.
В качестве классических примеров интерфейсных оболочек и соответствующих операционных сред выполнения программ можно назвать различные варианты графического интерфейса Explorer в системах семейства Windows, графический интерфейс X Window в системах семейства UNIX.
Ряд операционных систем могут организовывать выполнение программ, созданных для других ОС. Например, в системе Linux можно создать условия для выполнения некоторых программ, написанных для систем семейства Windows.
К этому классу системного программного обеспечения (интерфейсным оболочкам) следует отнести и эмуляторы, позволяющие смоделировать в одной операционной системе какую-либо другую машину или операционную систему. Так, известна система эмуляции VMware, которая позволяет запустить в среде Linux любую другую ОС, например, Windows. Другие примеры - VirtualBox, VirtualPC. Можно, наоборот, создать эмулятор, работающий в среде Windows, который позволит смоделировать компьютер, работающий под управлением любой ОС, в том числе и под Linux.
Следует отметить, что операционная среда определяется программными интерфейсами, то есть API (application program interface). Интерфейс прикладного программирования (API) включает в себя управление процессами, памятью и вводом/выводом.
4. Система программирования на рис. 1.1 представлена такими компонентами, как транслятор с соответствующего языка, библиотеки подпрограмм, редакторы, компоновщики и отладчики.
Транслятор (англ. translator – переводчик) – это программа-переводчик. Она преобразует программу, написанную на одном из языков высокого уровня, в программу, состоящую из машинных команд.
Интерпрета́тор языка программирования осуществляет анализ и перевод текста программы в машинный код пошагово, непосредственно перед выполнением, и сразу же исполняет получившийся машинный код.
Компиля́тор читает всю программу целиком, делает ее перевод и создает законченный вариант программы на машинном языке, который затем и выполняется. Это разновидность транслятора, программный модуль или отдельная программа, задачей которой является полный перевод программы, написанной на одном из языков программирования (исходный язык) в программу на другом языке программирования (целевой язык) до начала ее выполнения. Другой разновидностью трансляторов являются интерпретаторы,
Компоновщик собирает вместе все необходимые объектные файлы.
Далее происходит процесс разрешения ссылок – все внешние по отношению к каждому отдельному модулю ссылки должны быть разрешены, то есть для каждой из них должна быть поставлена в соответствие конкретная функция из другого модуля программы, либо из внешней библиотеки.
Отладчик является модулем среды разработки или отдельным приложением, предназначенным для поиска ошибок в программе. Отладчик позволяет выполнять пошаговую трассировку, отслеживать значения переменных в процессе выполнения программы, устанавливать точки или условия останова и т.д.
Не бывает самостоятельных (оторванных от ОС) систем программирования. Любая система программирования может работать только в соответствующей ОС, под которую она и создана, однако при этом она может позволять разрабатывать программное обеспечение и под другие ОС.
Примеры: MS Visual C++, Code::Blocks, Borland C++ Builder, Borland Delphi и др.
5. Под утилитами понимают специальные системные программы, с помощью которых можно как обслуживать саму операционную систему, так и подготавливать для работы носители данных, выполнять перекодирование данных, осуществлять оптимизацию размещения данных на носителе и производить некоторые другие работы, связанные с обслуживанием вычислительной системы. К утилитам следует отнести и программу разбиения накопителя на магнитных дисках на разделы, и программу форматирования, и программу переноса основных системных файлов самой ОС. Утилиты могут работать только в соответствующей операционной среде.
Основные принципы построения ОС
1. Принцип модульности
Модуль – функционально законченный элемент системы, отвечающий требованиям межмодульного интерфейса. Из определения следует, что один модуль можно заменить на другой. Способы обособления отдельных частей ОС могут различаться, но чаще всего разделение происходит по функциональному принципу.
Принцип модульности отражает технологические и эксплуатационные свойства ОС. Наибольший эффект достигается при распространении принципа модульности на ОС, прикладные программы и аппаратуру.
2. Принцип функциональной избирательности
Часть модулей, которые должны постоянно находиться в оперативной памяти для более эффективной организации вычислительного процесса, называется ядром ОС. При формировании состава ядра следует учитывать два противоречивых требования:
Ø в состав ядра должны войти наиболее часто используемые системные модули;
Ø количество модулей должно быть таковым, чтобы объем памяти, занимаемый ядром, не был слишком большим.
В состав ядра входят, как правило, следующие модули:
Ø модули по управлению системой прерываний;
Ø средства по переводу программ из состояния выполнения в состояние ожидания, готовности и обратно;
Ø средства по распределению основных ресурсов: оперативной памяти и процессорного времени.
Транзитные программные модули загружаются в память только при необходимости и в случае отсутствия свободного дискового пространства могут быть замещены другими транзитными модулями.
3. Принцип генерируемости ОС
Принцип генерируемости – возможность настраивать системную супервизорную часть (ядро и основные компоненты), исходя из конкретной конфигурации вычислительного комплекса и класса решаемых задач. Процедура генерации производится с помощью программы-генератора и языка описания входных данных для этой программы. В результате генерации получается полная версия ОС – совокупность системных наборов модулей и данных.
Принцип модульности положительно проявляется при генерации ОС. Он упрощает настройку ОС на требуемую конфигурацию вычислительной системы. Принцип генерируемости реализован в ОС, типа UNIX.
4. Принцип функциональной избыточности
Этот принцип дает возможность проведения одной и той же работы различными способами. В состав ОС может входить:
Ø несколько типов планировщиков (модулей супервизора, управляющих тем или иным видом ресурсов);
Ø различные средства организации связи между вычислительными процессами.
Это дает возможность пользователям:
Ø быстро и наиболее адекватно адаптировать ОС к определенной конфигурации вычислительной системы;
Ø обеспечить максимально эффективную загрузку технических средств при решении конкретного класса задач;
Ø получить максимальную производительность при решении заданного класса задач.
5. Принцип независимости программ от внешних устройств
Этот принцип в настоящее время реализуется в подавляющем большинстве современных ОС общего назначения. Принцип независимости заключается в том, что связь программ с конкретными устройствами производится не на уровне трансляции программ, а в период планирования ее исполнения. При работе с новым устройством для хранения данных перекомпиляция не требуется.
Принцип независимости позволяет одинаково осуществлять операции управления внешними устройствами независимо от конкретных физических характеристик. Смена носителя и данных, размещенных на нем, не принесет каких-либо изменений в программу, если в системе реализован принцип независимости.
6. Принцип совместимости
Одним из аспектов совместимости является способность ОС выполнять программы, написанные:
Ø для других ОС;
Ø для более ранних версий данной операционной системы;
Ø для другой аппаратной платформы.
Одним из средств обеспечения совместимости программных и пользовательских интерфейсов является соответствие стандартам POSIX. Использование стандарта POSIX позволяет создавать программы в стиле UNIX, которые могут легко переноситься из одной ОС в другую.
7. Принцип открытой и наращиваемой ОС
Открытая ОС доступна для анализа как системным специалистам, обслуживающим вычислительную систему, так и пользователям. Наращиваемая ОС позволяет не только использовать возможности генерации, но и вводить в состав ОС новые модули, совершенствовать старые и т.д. Этот принцип требует, чтобы можно было легко внести дополнения и изменения в ОС, если потребуется, и не нарушить целостность ОС.
К открытым системам в первую очередь относятся UNIX-подобные системы.
8. Принцип модульности (переносимости)
Операционная система должна относительно легко переноситься:
Ø с процессора одного типа на процессор другого типа;
Ø с аппаратной платформы (архитектуры вычислительной системы) одного типа на аппаратную платформу другого типа.
Принцип переносимости близок принципу совместимости, но это не одно и то же.
Написание переносимой ОС, как и любой переносимой программы, должно следовать определенным правилам:
Ø большая часть операционной системы должна быть написана на языке, который имеется во всех вычислительных системах, на которые планируется в дальнейшем ее переносить. Это должен быть стандартизованный язык высокого уровня, например, язык С. программы, написанные на ассемблере, в общем случае не являются переносимыми;
Ø минимизировать или исключить ту часть кода, которая непосредственно взаимодействует с аппаратурой. Если аппаратный код не может быть исключен, он должен быть изолирован в нескольких модулях.
9. Принцип обеспечения безопасности вычислений
Обеспечение безопасности при выполнении вычислений является желательным свойством для любой многопользовательской системы. Правила безопасности определяют следующие свойства:
Ø защита ресурсов одного пользователя от других;
Ø установка квот по ресурсам для предотвращения захвата одним пользователем всех системных ресурсов.
Процессы, операции над процессами
Понятие «вычислительный процесс » (или просто – «процесс») является одним из основных при рассмотрении операционных систем.
Последовательный процесс (или задача) – это выполнение отдельной программы с её данными на последовательном процессоре. Также в литературе встречается другое определение процесса. Процесс – минимальный программный объект, обладающий собственными системными ресурсами (запущенная программа).
В качестве примеров можно назвать следующие процессы (задачи): прикладные программы пользователей, утилиты и другие системные обрабатывающие программы. Процессами могут быть редактирование какого-либо текста, трансляция исходной программы, её компоновка, исполнение.
Операционная система контролирует следующую деятельность, связанную с процессами:
Ø создание и удаление процессов;
Ø планирование процессов;
Ø синхронизация процессов;
Ø коммуникация процессов;
Ø разрешение тупиковых ситуаций.
Не следует смешивать понятия процесс и программа. Программа – это план действий, а процесс – это само действие, поэтому понятие процесса включает:
Ø программный код;
Ø данные;
Ø содержимое стека;
Ø содержимое адресного и других регистров процессора.
Таким образом, для одной программы могут быть созданы несколько процессов в том случае, если с помощью одной программы в CPU выполняется несколько несовпадающих последовательностей команд.
С понятием «процесс» связано понятие ресурса.
Термин ресурс обычно применяется по отношению к повторно используемым, относительно стабильным и часто недостающим объектам, которые запрашиваются, используются и освобождаются процессами в период их активности. Т.е. ресурсом называется всякий объект, который может распределяться внутри системы.
Процесс может порождать новые процессы. В этом случае порождающий процесс называют родительским (parent process), а второй, созданный процесс – дочерним (child process). Каждый дочерний имеет один родительский процесс. В результате такого подхода формируется иерархическая структура процессов (hierarchical process structure), изображенная на рис. 3.1, в которой у дочернего процесса есть только один родительский (например, процесс А является родительским по отношению к процессу С; Н – родительским процессом для I), но каждый родительский процесс может иметь произвольное количество дочерних процессов (например, процессы В, С и D являются дочерними по отношению к А; F и G – дочерними по отношению к С).
Рис. 3.1.
В UNIX-подобных системах, таких как Linux, многие процессы порождаются главным процессом init, создаваемым во время загрузки ядра (рис. 3.2). В Linux в роли таких процессов выступают kswapd, xfs и khubd – эти процессы управляют памятью, файловой системой и устройствами, соответственно. Процесс login отвечает за аутентификацию пользователей в операционной системе, требуя от пользователя ввести свое имя и пароль. После прохождения пользователем аутентификации с помощью процесса login, он порождает процесс оболочки, например, bash (В ourne- a gain sh ell), дающий возможность пользователю взаимодействовать с операционной системой (рис. 3.2). После этого пользователь может задавать команды в оболочке командной строки, например, запустить программу vi (текстовый редактор) или другие.
Рис. 3.2.
Уничтожение процесса подразумевает его полное удаление из системы. Занимаемая им память и ресурсы возвращаются в распоряжение системы, информация о нем стирается из всех системных списков или таблиц, удаляется блок управления процессом, после чего память, выделенная под хранение блока управления процесса (дескриптора) данного процесса, становится доступной другим процессам системы. Удалить процесс, породивший другие процессы, сложнее. В некоторых операционных системах все созданные процессы уничтожаются автоматически при уничтожении родительского, в других ОС созданные процессы существуют независимо от родительских, и уничтожение родительского процесса не влияет на дочерние.
Динамика состояния процесса
Рассмотрим динамику состояния процесса.
Выполнение |
Готовность к выполнению |
Ожидание (состояние блокирования) |
Бездействие (пассивное состояние) |
Если обобщать и рассматривать не только обычные ОС общего назначения, но и, например, ОС реального времени, то можно сказать, что процесс может находиться в активном и пассивном (не активном) состоянии (рис. 3.3).
Рис. 3.3. Граф состояний процесса
В активном состоянии процесс может участвовать в конкуренции за использование ресурсов вычислительной системы, а в пассивном – он только известен системе, но в конкуренции не участвует (хотя его существование в системе сопряжено с предоставлением ему оперативной и/или внешней памяти). В свою очередь, активный процесс может быть в одном из следующих состояний:
Ø выполнения – все затребованные процессом ресурсы выделены. В этом состоянии в каждый момент времени может находиться только один процесс, если речь идёт об однопроцессорной вычислительной системе;
Ø готовности к выполнению – ресурсы могут быть предоставлены, тогда процесс перейдёт в состояние выполнения;
Ø блокирования или ожидания – затребованные ресурсы не могут быть предоставлены, или не завершена операция ввода/вывода.
В обычных (не реального времени) ОС, как правило, процесс появляется при запуске какой-нибудь программы. ОС организует (порождает или выделяет) для нового процесса соответствующий дескриптор (описатель) процесса, и процесс (задача) начинает развиваться (выполняться). Поэтому пассивного состояния не существует.
В ОС реального времени (ОСРВ) ситуация иная. Обычно при проектировании системы реального времени, как правило, уже заранее известен состав программ (задач), которые должны будут выполняться. Известны и многие их параметры, которые необходимо учитывать при распределении ресурсов (например, объём памяти, приоритет, средняя длительность выполнения, открываемые файлы, используемые устройства и т.п.). Поэтому для них заранее заводят дескрипторы задач с тем, чтобы впоследствии не тратить драгоценное время на организацию дескриптора и поиск для него необходимых ресурсов. Таким образом, в ОСРВ многие процессы (задачи) могут находиться в состоянии бездействия, что мы и отобразили на рис. 3.3, отделив это состояние от остальных состояний пунктиром.
За время своего существования процесс может неоднократно совершать переходы из одного состояния в другое. Это обусловлено:
Ø обращениями к ОС с запросами ресурсов;
Ø выполнением системных функций, которые предоставляет ОС;
Ø взаимодействием с другими процессами;
Ø появлением сигналов прерывания от таймера, каналов и устройств ввода/вывода, а также других устройств.
Возможные переходы процесса из одного состояния в другое отображены на рис. 3.3.
Рассмотрим эти переходы из одного состояния в другое более подробно.
Процесс из состояния бездействия может перейти в состояние готовности в следующих случаях:
Ø по команде оператора (пользователя). Имеет место в тех диалоговых операционных системах, где программа может иметь статус задачи (и при этом являться пассивной), а не просто быть исполняемым файлом и только на время исполнения получать статус задачи (в большинстве современных ОС для ПК);
Ø при выборе из очерёди планировщиком (характерно для ОС, работающих в пакетном режиме);
Ø по вызову из другой задачи (посредством обращения к супервизору один процесс может создать, инициировать, приостановить, остановить, уничтожить другой процесс);
Ø по прерыванию от внешнего инициативного1 устройства (сигнал о свершении некоторого события может запускать соответствующую задачу);
Ø при наступлении запланированного времени запуска программы.
Последние два способа запуска задачи, при которых процесс из состояния бездействия переходит в состояние готовности, характерны для ОСРВ.
Из состояния выполнения процесс может выйти по одной из следующих причин:
Ø процесс завершается, при этом он посредством обращения к супервизору передаёт управление ОС и сообщает о своем завершении. В результате этих действий супервизор либо переводит его в список бездействующих процессов (процесс переходит в пассивное состояние), либо уничтожает.
В состояние бездействия процесс может быть переведен принудительно: по команде оператора (действие этой и других команд оператора реализуется системным процессом, который «транслирует» команду в запрос к супервизору с требованием перевести указанный процесс в состояние бездействия), или путем обращения к супервизору операционной системы из другой задачи с требованием остановить данный процесс;
Ø процесс переводится супервизором операционной системы в состояние готовности к исполнению в связи с появлением более приоритетной задачи или в связи с окончанием выделенного ему кванта времени;
Ø процесс блокируется (переводится в состояние ожидания) либо вследствие запроса операции ввода/вывода (которая должна быть выполнена прежде, чем он сможет продолжить исполнение), либо в силу невозможности предоставить ему ресурс, запрошенный в настоящий момент (причиной перевода в состояние ожидания может быть и отсутствие сегмента или страницы в случае организации механизмов виртуальной памяти), а также по команде оператора на приостановку задачи или по требованию через супервизор от другой задачи.
Процесс деблокируется и переводится в состояние готовности к исполнению при наступлении соответствующего события:
Ø завершение операции ввода/вывода;
Ø освобождение затребованного ресурса;
Ø загрузка в оперативную память страницы виртуальной памяти и т.д.
Таким образом, движущей силой, меняющей состояния процессов, являются события.
Идентификация процесса
Для того чтобы ОС могла управлять процессами, она должна располагать всей необходимой для этого информацией. С этой целью на каждый процесс заводится специальная информационная структура, называемая дескриптором процесса (описателем задачи, блоком управления задачей). В общем случае дескриптор процесса содержит следующую информацию:
Ø идентификатор процесса (так называемый PID – process identificator);
Ø тип (или класс) процесса, который определяет для супервизора некоторые правила предоставления ресурсов;
Ø приоритет процесса, в соответствии с которым супервизор предоставляет ресурсы. В рамках одного класса процессов в первую очередь обслуживаются более приоритетные процессы;
Ø переменную состояния, которая определяет, в каком состоянии находится процесс (готов к работе, в состоянии выполнения, ожидание устройства ввода/вывода и т. д.);
Ø защищённую область памяти (или адрес такой зоны), в которой хранятся текущие значения регистров процессора, если процесс прерывается, не закончив работы. Эта информация называется контекстом задачи;
Ø информацию о ресурсах, которыми процесс владеет и/или имеет право пользоваться (указатели на открытые файлы, информация о незавершенных операциях ввода/вывода, т.п.);
Ø место (или его адрес) для организации общения с другими процессами;
Ø параметры времени запуска (момент времени, когда процесс должен активизироваться, и периодичность этой процедуры);
Ø в случае отсутствия системы управления файлами – адрес задачи на диске в её исходном состоянии и адрес на диске, куда она выгружается из оперативной памяти, если её вытесняет другая (для диск-резидентных задач, которые постоянно находятся во внешней памяти на системном магнитном диске и загружаются в оперативную память только на время выполнения).
Описатели задач, как правило, постоянно располагаются в оперативной памяти с целью ускорить работу супервизора, который организует их в списки (очереди) и отображает изменение состояния процесса перемещением соответствующего описателя из одного списка в другой. Для каждого состояния (за исключением состояния выполнения для однопроцессорной системы) операционная система ведет соответствующий список задач, находящихся в этом состоянии. Однако для состояния ожидания может быть не один список, а столько, сколько различных видов ресурсов могут вызывать состояние ожидания. Например, состояний ожидания завершения операции ввода/вывода может быть столько, сколько устройств ввода/вывода имеется в системе.
В некоторых ОС количество описателей определяется жестко и заранее (на этапе генерации варианта операционной системы или в конфигурационном файле, который используется при загрузке ОС), в других – по мере необходимости система может выделять участки памяти под новые описатели. Например, в OS/2 максимально возможное количество описателей задач определяется в конфигурационном файле CONFIG.SYS. Следует отметить, что в данном файле указывается количество не процессов, а именно задач, и под задачей в данном случае понимается как процесс, так и поток этого же процесса. Например, строка в файле CONFIG.SYS
THREADS=1024
указывает, что всего в системе может параллельно существовать и выполняться до 1024 задач, включая вычислительные процессы и их потоки.
В ОСРВ зачастую количество процессов фиксируется и целесообразно заранее определять (на этапе генерации или конфигурирования ОС) их количество. Поскольку дескрипторы процессов постоянно располагаются в оперативной памяти (с целью ускорить работу диспетчера), то их количество не должно быть большим. При необходимости иметь большое количество задач один и тот же дескриптор может в разное время предоставляться для разных задач, но это сильно снижает скорость реагирования системы.
Для более эффективной обработки данных в ОСРВ целесообразно иметь постоянные задачи полностью или частично всегда существующие в системе независимо от того, поступило на них требование или нет. Каждая постоянная задача обладает некоторой собственной областью оперативной памяти (ОЗУ-резидентные задачи) независимо от того, выполняется задача в данный момент или нет. Эта область, в частности, может использоваться для хранения данных, полученных задачей ранее. Данные могут храниться в ней и тогда, когда задача находится в состоянии ожидания или даже в состоянии бездействия.
Понятие процесса было введено для реализации идей мультипрограммирования.
Мультипрограммный режим работы вычислительной системы заключается в том, что пока одна программа (процесс, задача) ожидает завершения очередной операции ввода/вывода, другая программа (задача) может быть поставлена на выполнение. При мультипрограммировании повышается пропускная способность системы, но отдельный процесс никогда не может быть выполнен быстрее, чем, если бы он выполнялся в однопрограммном режиме.
Когда говорят о процессах, то тем самым хотят отметить, что ОС поддерживает их обособленность: у каждого процесса имеется свое виртуальное адресное пространство, каждому процессу назначаются свои ресурсы (файлы, окна, семафоры и т.д.). Такая обособленность нужна для того, чтобы защитить один процесс от другого, поскольку они, совместно используя все ресурсы вычислительной системы, конкурируют друг с другом. В общем случае процессы никак не связаны между собой и могут принадлежать даже разным пользователям, разделяющим одну вычислительную систему. Другими словами, ОС считает процессы совершенно несвязанными и независимыми. При этом именно ОС регулирует конкуренцию между процессами по поводу ресурсов.
Однако желательно иметь возможность задействовать внутренний параллелизм, который может быть в самих процессах. Такой внутренний параллелизм встречается достаточно часто и его использование позволяет ускорить их решение. Например, некоторые операции, выполняемые приложением, могут требовать для своего исполнения достаточно длительного использования центрального процессора. В этом случае при интерактивной работе с приложением пользователь вынужден долго ожидать завершения заказанной операции и не может управлять приложением до тех пор, пока операция не выполнится до самого конца. Такие ситуации встречаются достаточно часто, например, при обработке больших изображений в графических редакторах.
Если же программные модули, исполняющие длительные операции, оформлять в виде самостоятельных «подпроцессов», которые будут выполняться параллельно с другими «подпроцессами», то у пользователя появляется возможность параллельно выполнять несколько операций в рамках одного приложения (процесса). «Подпроцессы» это и есть нити или, как встречается в литературе, треды (thread). Еще одним синонимом, встречающимся в литературе, является поток. Легковесными их называют потому, что ОС не должна для них организовывать полноценную виртуальную машину. Эти задачи:
Ø не имеют своих собственных ресурсов;
Ø они развиваются в том же виртуальном адресном пространстве;
Ø могут пользоваться теми же файлами, виртуальными устройствами и иными ресурсами, что и данный процесс.
Единственное, что им необходимо иметь, – это процессорный ресурс. В однопроцессорной системе нити (треды) разделяют между собой процессорное время так же, как это делают обычные процессы, а в мультипроцессорной системе могут выполняться одновременно, если не встречают конкуренции из-за обращения к иным ресурсам.
Особенно эффективно можно использовать многопоточность для выполнения распределённых приложений; например, многопоточный сервер может параллельно выполнять запросы сразу нескольких клиентов.