§ Задачи
Под термином задача (task) как правило подразумевается программа, выполняющая определённые действия, т.е. задача - это программа. Всякая программа характеризуется своей средой исполнения (execution environment) - это сегменты кода, которые она использует, сегменты и типы данных, порты ввода/вывода, различные устройства и даже состояние регистров, в общем, всё, с чем она взаимодействует.- Если компьютер управляется одной программой, то все ресурсы этого компьютера она может использовать монопольно и так, как ей это будет нужно, то есть в компьютере будет один "хозяин".
- Если же необходимо выполнять параллельно несколько различных программ, то возникает ряд проблем, и все они связаны с тем, что компьютер один, а программ - много. Даже в мультипроцессорной системе, где каждой задаче можно выделить отдельный процессор, возникает проблемы с коллективным доступом к одиночным устройствам, например, шине данных, памяти, дисковой, сетевой, видео системам и пр.
На самом деле любая мультизадачная система реализуется так, что одновременно выполняется только одна задача и лишь при быстром переключении с одной задачи на другую, создаётся иллюзия, что задачи работают параллельно. Так построены все операционные системы и иначе нельзя - ведь процессор может выполнять одновременно только одну программу, даже имея несколько параллельных конвейеров, всё равно он выполняет одну задачу. Каждая задача имеет свою среду исполнения и надёжность мультизадачной системы заключается в том, что на состояние любой задачи не может повлиять никакая другая. Пока работает текущая задача, все остальные находятся в состоянии паузы, в это время их команды не выполняются и данные не меняются.
Для корректной работы мультизадачной системы нужны следующие основные факторы:
- Каждая задача (т.е. программа) должна быть изолирована от других, её код, данные и стек должны использоваться только ею самой и в идеале задача не должна "подразумевать" наличие других задач.
- В мультизадачной системе должна быть одна задача - "хозяин", которая имеет высший приоритет по сравнению со всеми остальными задачами. Это нужно для того, чтобы переключать между собой задачи и управлять ресурсами, доступ к которым одновременно возможен для нескольких задач.
- Использование разделяемых ресурсов (т.е. тех, которые разделяют между собой несколько задач, например, дисковая подсистема) должно быть корректным - либо каждая задача должна быть "в курсе" того, что кроме неё ещё кто-то может использовать этот ресурс, либо для каждого ресурса создаётся свой диспетчер - процедура или даже отдельная задача, которой принадлежит исключительное право на управление ресурсом.
- При переключении с одной задачи на другую система должна обеспечить способ, благодаря которому состояние "старой" задачи не изменится состоянием "новой" задачи.
- Необходимо учитывать временные характеристики - каждая задача должна подразумевать, что её выполнение может быть прервано в любой момент на неопределённое время. Этот фактор нужно учитывать при построении систем ввода/вывода, зависящих от времени, например, задача, управляющая модемом не должна терять данные по причине своего прерывания.
В этом разделе вашему вниманию будут представлены несколько примеров мультизадачных систем, сложность которых будет постепенно возрастать. Эти примеры приводятся только для того, чтобы показать, как именно реализуется мультизадачность, но ни в коем случае не рассматривайте эти примеры, как единственно или наиболее правильные варианты построения мультизадачности, т.к. эта часть ОС сильно зависит от её предназначения и является одной из главных характеристик любой системы.