Впервые слово «многозадачный» начали использовать в 60-х годах в сфере обработки данных. Оно описывало возможность компьютера обрабатывать несколько задач одновременно. Но потом этот термин начали применять и к людям.
В обработке данных многозадачность — это не параллельное выполнение нескольких действий. Просто в таком режиме в обработке одновременно находится больше одной задачи. При этом одна задача непосредственно обрабатывается, а другая ожидает своей очереди. Переключение центрального процессора с одной задачи на другую называется переключением контекста, а иллюзия параллельного выполнения дел возникает при частых переключениях.
Многозадачность — это всего лишь иллюзия. В действительности мы просто снова и снова переключаемся с одного дела на другое.
Наш мозг просто не может обрабатывать больше двух сложных задач одновременно. Это обнаружили учёные из Национального института здоровья и медицинских исследований (INSERM) в Париже.
Во время эксперимента они попросили участников выполнять два дела одновременно и наблюдали за их мозговой активностью с помощью функциональной магнитно-резонансной томографии. Оказалось, при одновременном выполнении двух задач мозг «раздваивается»: активизируются два участка (две лобные доли) .
Многозадачность. Когда она полезна, а когда (и как) её стоит избегать?
Потом учёные попросили участников выполнять три задачи одновременно. В этом случае участники постоянно забывали об одной из трёх задач и чаще ошибались. Получается, хоть мы и можем без проблем переключаться между двумя делами, большее количество задач нам уже не под силу (просто потому, что у нас всего две лобные доли).
Цена постоянных переключений
Преимущества многозадачности
Для пользователя преимуществом многозадачности является возможность одновременного открытия и работы нескольких приложений. Например, пользователь может изменить файл с одним приложением, а другое приложение пересчитывает электронную таблицу.
Для разработчика приложений преимуществом многозадачности является возможность создавать приложения, использующие несколько процессов, и создавать процессы, использующие несколько потоков выполнения. Например, процесс может иметь поток пользовательского интерфейса, который управляет взаимодействием с пользователем (вводом клавиатуры и мыши), а рабочие потоки, выполняющие другие задачи, пока поток пользовательского интерфейса ожидает ввода данных пользователем. Если предоставить потоку пользовательского интерфейса более высокий приоритет, приложение будет более быстро реагировать на пользователя, а рабочие потоки эффективно используют процессор во время отсутствия входных данных пользователя.
Источник: learn.microsoft.com
Многозадачность, типы многозадачности в программировании
Примитивные многозадачные среды обеспечивают чистое «разделение ресурсов», когда за каждой задачей закрепляется определенный участок памяти, и задача активизируется в строго определенные интервалы времени.
КАК РАБОТАЕТ МНОГОЗАДАЧНОСТЬ? | РАЗБОР
Более развитые многозадачные системы проводят распределение ресурсов динамически, когда задача стартует в памяти или покидает память в зависимости от ее приоритета и от стратегии системы. Такая многозадачная среда обладает следующими особенностями:
- Каждая задача имеет свой приоритет, в соответствии с которым получает процессорное время и память
- Система организует очереди задач так, чтобы все задачи получили ресурсы, в зависимости от приоритетов и стратегии системы
- Система организует обработку прерываний, по которым задачи могут активироваться, деактивироваться и удаляться
- По окончании положенного кванта времени ядро временно переводит задачу из состояния выполнения в состояние готовности, отдавая ресурсы другим задачам. При нехватке памяти страницы невыполняющихся задач могут быть вытеснены на диск (своппинг), а потом, через определенное системой время, восстанавливаться в памяти
- Система обеспечивает защиту адресного пространства задачи от несанкционированного вмешательства других задач
- Система обеспечивает защиту адресного пространства своего ядра от несанкционированного вмешательства задач
- Система распознает сбои и зависания отдельных задач и прекращает их
- Система решает конфликты доступа к ресурсам и устройствам, не допуская тупиковых ситуаций общего зависания от ожидания заблокированных ресурсов
- Система гарантирует каждой задаче, что рано или поздно она будет активирована
- Система обрабатывает запросы реального времени
- Система обеспечивает коммуникацию между процессами
Трудности реализации многозадачной среды
Основной трудностью реализации многозадачной среды является ее надежность, выраженная в защите памяти, обработке сбоев и прерываний, предохранении от зависаний и тупиковых ситуаций.
Кроме надежности, многозадачная среда должна быть эффективной. Затраты ресурсов на ее поддержание не должны: мешать процессам проходить, замедлять их работу, резко ограничивать память.
История многозадачных операционных систем
Поначалу реализация многозадачных операционных систем представляла собой серьезную техническую трудность, отчего внедрение многозадачных систем затягивалось, а пользователи долгое время после внедрения предпочитали однозадачные.
В дальнейшем, после появления нескольких удачных решений, многозадачные среды стали совершенствоваться, и в настоящее время употребляются повсеместно.
Впервые многозадачность операционной системы была реализована в ходе разработки операционной системы Multics (1964 год). Одной из первых многозадачных систем была OS/360 (1966 ), используемая для компьютеров фирмы IBM и их советских аналогов ЕС ЭВМ. Разработки системы были сильно затянуты, и на начальное время фирма IBM выдвинула однозадачный DOS, чтобы удовлетворить заказчиков до полной сдачи OS/360 в эксплуатацию. Система подвергалась критике по причине малой надежности и трудности эксплуатации.
В 1969 году на основе Multics была разработана система UNIX с достаточно аккуратным алгоритмическим решением проблемы многозадачности. В настоящее время на базе UNIX созданы десятки операционных систем.
На компьютерах PDP-11 и их советских аналогах СМ-4 использовалась многозадачная система RSX-11 (советский аналог — ОСРВ СМ ЭВМ), и система распределения времени TSX-PLUS, обеспечивающая ограниченные возможности многозадачности и многопользовательский режим разделения времени, эмулируя для каждого пользователя однозадачную RT-11 (советский аналог — РАФОС) . Об этом говорит сайт https://intellect.icu . Последнее решение было весьма популярно из-за низкой эффективности и надежности полноценной многозадачной системы.
Аккуратным решением оказалась операционная система VMS, разработанная первоначально для компьютеров VAX (советский аналог — СМ-1700) как развитие RSX-11.
Первый в мире мультимедийный персональный компьютер Amiga 1000 (1984 год) изначально проектировался с расчетом на полную аппаратную поддержку вытесняющей многозадачности реального времени в ОС AmigaOS. В данном случае разработка аппаратной и программной части велась параллельно, это привело к тому, что по показателю квантования планировщика многозадачности (1/50 секунды на переключение контекста) AmigaOS долгое время оставалась непревзойденной на персональных компьютерах.
Многозадачность обеспечивала также фирма Microsoft в операционных системах Windows. Использование опыта VMS обеспечило системам существенно более высокую производительность и надежность. По времени переключения контекста многозадачности (квантование) только эти операционные системы могут быть сравнимы с AmigaOS и UNIX (а также его потомками, такими, как ядро Linux).
Интересно, что многозадачность может быть реализована не только в операционной, но и языковой среде. Например, спецификации языков программирования Modula-2 и Ada требуют поддержки многозадачности вне привязки к какой-либо операционной системе. В результате популярная в первой половине 1990-х годов реализация языка программирования TopSpeed Модула-2 от JPI/Clarion позволяла организовывать различные типы многозадачности (кооперативную и вытесняющую — см. ниже) для потоков одной программы в рамках такой принципиально однозадачной операционной системы, как MS-DOS. Это осуществлялось путем включения в модуль программы компактного планировщика задач, содержащего обработчик таймерных прерываний. Языки программирования, обладающие таким свойством, иногда называют языками реального времени
Типы псевдопараллельной многозадачности
Простое переключение
Тип многозадачности, при котором операционная система одновременно загружает в память два или более приложений, но процессорное время предоставляется только основному приложению. Для выполнения фонового приложения оно должно быть активизировано. Подобная многозадачность может быть реализована не только в операционной системе, но и с помощью программ-переключателей задач. В этой категории известна программа DESQview, работавшая под DOS и впервые выпущенная в 1985 году.
Преимущества: можно задействовать уже работающие программы, написанные без учета многозадачности.
Недостатки: невозможно в неинтерактивных системах, работающих без участия человека. Взаимодействие между программами крайне ограничено.
Совместная или кооперативная многозадачность
Тип многозадачности, при котором следующая задача выполняется только после того, как текущая задача явно объявит себя готовой отдать процессорное время другим задачам. Как частный случай такое объявление подразумевается при попытке захвата уже занятого объекта мьютекс (ядро Linux), а также при ожидании поступления следующего сообщения от подсистемы пользовательского интерфейса (Windows версий до 3.x включительно, а также 16-битные приложения в Windows 9x).
Кооперативную многозадачность можно назвать многозадачностью «второй ступени», поскольку она использует более передовые методы, чем простое переключение задач, реализованное многими известными программами (например, DOS Shell из MS-DOS 5.0). При простом переключении активная программа получает все процессорное время, а фоновые приложения полностью замораживаются. При кооперативной многозадачности приложение может захватить фактически столько процессорного времени, сколько оно считает нужным. Все приложения делят процессорное время, периодически передавая управление следующей задаче.
Преимущества кооперативной многозадачности: отсутствие необходимости защищать все разделяемые структуры данных объектами типа критических секций и мьютексов, что упрощает программирование, особенно перенос кода из однозадачных сред в многозадачные.
Недостатки: неспособность всех приложений работать в случае ошибки в одном из них, приводящей к отсутствию вызова операции «отдать процессорное время». Крайне затрудненная возможность реализации многозадачной архитектуры ввода-вывода в ядре ОС, позволяющей процессору исполнять одну задачу, в то время как другая задача инициировала операцию ввода-вывода и ждет ее завершения.
Вытесняющая, или приоритетная, многозадачность (режим реального времени) Вытесняющая многозадачность
Вид многозадачности, в котором операционная система сама передает управление от одной выполняемой программы другой в случае завершения операций ввода-вывода, возникновения событий в аппаратуре компьютера, истечения таймеров и квантов времени, или же поступлений тех или иных сигналов от одной программы к другой. В этом виде многозадачности процессор может быть переключен с исполнения одной программы на исполнение другой без всякого пожелания первой программы и буквально между любыми двумя инструкциями в ее коде. Распределение процессорного времени осуществляется планировщиком процессов. К тому же каждой задаче может быть назначен пользователем или самой операционной системой определенный приоритет, что обеспечивает гибкое управление распределением процессорного времени между задачами (например, можно снизить приоритет ресурсоемкой программе, снизив тем самым скорость ее работы, но повысив производительность фоновых процессов). Этот вид многозадачности обеспечивает более быстрый отклик на действия пользователя.
- возможность полной реализации многозадачного ввода-вывода в ядре ОС, когда ожидание завершения ввода-вывода одной программой позволяет процессору тем временем исполнять другую программу;
- cильное повышение надежности системы в целом, в сочетании с использованием защиты памяти — идеал в виде «ни одна программа пользовательского режима не может нарушить работу ОС в целом» становится достижимым хотя бы теоретически, вне вытесняющей многозадачности он не достижим даже в теории.
- возможность полного использования многопроцессорных и многоядерных систем.
- необходимость особой дисциплины при написании кода, особые требования к его реентерабельности, к защите всех разделяемых и глобальных данных объектами типа критических секций и мьютексов.
Реализована в таких ОС, как:
- VMS
- MenuetOS
- Linux
- в пользовательском режиме (а часто и в режиме ядра) всех UNIX-подобных ОС, включая версии Mac OS X, iOS; Symbian OS
- в режиме ядра ОС Windows 3.x — только при исполнении на процессоре 386 или старше, «задачами» являются только все Windows-приложения, вместе взятые, и каждая отдельная виртуальная машина ДОС, между приложениями Windows вытесняющая многозадачность не использовалась
- Windows 95/98/ME — без полноценной защиты памяти, что служило причиной крайне низкой, на одном уровне с MS-DOS, Windows 3.x и Mac OS версий до X — надежности этих ОС
- Windows NT/2000/XP/Vista/7 и в режиме ядра, и в пользовательском режиме.
- AmigaOS — все версии, до версии 4.0 без полноценной защиты памяти, что на практике для системных программ почти не сказывалось на надежности из-за высокой стандартизированности, прозрачных API и SDK. Программы, ориентированные на «железо» Амиги, наоборот, не отличались надежностью.
Проблемные ситуации в многозадачных системах
Голодание (starvation)
Задержка времени от пробуждения потока до его вызова на процессор, в течение которой он находится в списке потоков, готовых к исполнению. Возникает по причине присутствия потоков с большими или равными приоритетами, которые исполняются все это время.
Негативный эффект заключается в том, что возникает задержка времени от пробуждения потока до исполнения им следующей важной операции, что задерживает исполнение этой операции, а следом за ней и работу многих других компонентов.
Голодание создает узкое место в системе и не дает выжать из нее максимальную производительность, ограничиваемую только аппаратно обусловленными узкими местами.
Любое голодание вне 100 % загрузки процессора может быть устранено повышением приоритета голодающей нити, возможно — временным.
Как правило, для предотвращения голодания ОС автоматически вызывает на исполнение готовые к нему низкоприоритетные потоки даже при наличии высокоприоритетных, при условии, что поток не исполнялся в течение долгого времени (~10 секунд). Визуально эта картина хорошо знакома большинству пользователей Windows — если в одной из программ поток зациклился до бесконечности, то переднее окно работает нормально, несмотря на это — потоку, связанному с передним окном, Windows повышает приоритет. Остальные же окна перерисовываются с большими задержками, по порции в секунду, ибо их отрисовка в данной ситуации работает только за счет механизма предотвращения голодания (иначе бы голодала вечно).
Гонка (race condition)
Недетерминированный порядок исполнения двух потоков кода, обрабатывающих одни и те же данные, исполняемые в двух различных потоках (задачах). Приводит к зависимости порядка и правильности исполнения от случайных факторов.
Устраняется добавлением необходимых блокировок и примитивов синхронизации. Обычно является легко устраняемым дефектом (забытая блокировка).
Инверсия приоритета
Поток L имеет низкий приоритет, поток M — средний, поток H — высокий. Поток L захватывает мьютекс, и, выполняясь с удержанием мьютекса, прерывается потоком M, который пробудился по какой-то причине, и имеет более высокий приоритет. Поток H пытается захватить мьютекс.
В полученной ситуации поток H ожидает завершения текущей работы потоком M, ибо, пока поток M исполняется, низкоприоритетный поток L не получает управления и не может освободить мьютекс.
Устраняется повышением приоритета всех нитей, захватывающих данный мьютекс, до одного и того же высокого значения на период удержания мьютексa. Некоторые реализации мьютексов делают это автоматически. Альтернативно, повышение приоритета нити, уже захватившей мьютекс, происходит после попытки одновременного захвата мьютекса более высокоприоритетной нитью.
Вау!! Ты еще не читал? Это зря!
- неопределённость параллелизма , состояние гонки , ресурсный голод , process starvation ,
- потоки , процессы , нити , контексты ,
- процесс отличается от потока ,
- понятие процесса , процессы в unix ,
В общем, мой друг ты одолел чтение этой статьи об многозадачность. Работы в переди у тебя будет много. Смело пишикоментарии, развивайся и счастье окажется в ваших руках. Надеюсь, что теперь ты понял что такое многозадачность, типы многозадачности и для чего все это нужно, а если не понял, или есть замечания, то нестесняся пиши или спрашивай в комментариях, с удовольствием отвечу.
Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Высоконагруженные проекты.Паралельные вычисления. Суперкомпьютеры. Распределенные системы
Источник: intellect.icu