что значит многозадачность в информатике
Многозадачность в операционных системах, виды многозадачности
Многозада́чность — свойство ОС или среды выполнения обеспечивать возможность параллельной обработки нескольких процессов. Иными словами, многозадачность — способ выполнения нескольких задач в один период времени. При этом задачи делят между собой общие ресурсы (resources sharing), помимо этого осуществляется планирование (scheduling). [1]
Система называется однозадачной,если она не обладает свойством многозадачности, т.е. задачи в ней выполняются последовательно. DOS — однозадачная ОС.
Многозадачность имеет место при наличии нескольких потоков исполнения.
Поток исполнения — набор последовательных инструкций, выполняемых процессором во время работы программы. На одном процессорном ядре одновременно выполняется лишь один поток исполнения, который называется активным. Процесс выбора активного исполнительного потока носит название планирование.
По типу наименьшего элемента управляемого кода
Процессная многозадачность.
Здесь программа — наименьший элемент управляемого кода, которым может управлять планировщик операционной системы. Известна большинству пользователей (одновременная работа в текстовом редакторе и прослушивание музыки). Многозадачная система позволяет двум или более программам выполняться одновременно.
Поточная многозадачность.
Многопоточность — специализированная форма многозадачности. Наименьший элемент управляемого кода — поток. Многопотоковая (multi-threaded) система предоставляет возможность одновременного выполнения одной программой 2 и более задач
По способу организации времени выполнения каждого процесса
Параллельная многозадачность
Параллельная многозадачность, когда каждая задача исполняется в своём аппаратном микропроцессорном ядре действительно одновременно друг с другом. Реализация данного типа многозадачности требует больших материальных вложений. Альтернативой параллельной многозадачности является применение псевдопараллельной многозадачности или совокупности параллельной и псевдопараллельной многозадачности при наличии нескольких процессорных ядер.
Типы псевдопараллельной многозадачности
Невытесняющая многозадачность. Существенным ограничением такого подхода является то, что время, затрачиваемое программой на обработку сообщения может быть очень большим, а управление операционной системе передается только после обработки сообщения.
Совместная или кооперативная многозадачность. ОС передает управление от одного приложения другому не в любой момент времени, а только когда текущее приложение отдает управление системе, получил, как было упомянуто, название кооперативной многозадачности
Вытесняющая, или приоритетная, многозадачность (режим реального времени)
С Windows 95 ОС действительно контролирует и управляет процессами, потоками и их переключением. Способность ОС прервать выполняемый поток практически в любой момент времени и передать управление другому ожидающему потоку определяется термином preemptive multitasking — преимущественная, или вытесняющая, многозадачность.
Многозадачность
Многозада́чность (англ. multitasking ) — свойство операционной системы или среды программирования обеспечивать возможность параллельной (или псевдопараллельной) обработки нескольких процессов. Истинная многозадачность операционной системы возможна только в распределённых вычислительных системах.
Существует 2 типа многозадачности [1] :
Содержание
Свойства многозадачной среды
Примитивные многозадачные среды обеспечивают чистое «разделение ресурсов», когда за каждой задачей закрепляется определённый участок памяти, и задача активизируется в строго определённые интервалы времени.
Более развитые многозадачные системы проводят распределение ресурсов динамически, когда задача стартует в памяти или покидает память в зависимости от её приоритета и от стратегии системы. Такая многозадачная среда обладает следующими особенностями:
Трудности реализации многозадачной среды
Основной трудностью реализации многозадачной среды является её надёжность, выраженная в защите памяти, обработке сбоев и прерываний, предохранении от зависаний и тупиковых ситуаций.
Кроме надёжности, многозадачная среда должна быть эффективной. Затраты ресурсов на её поддержание не должны: мешать процессам проходить, замедлять их работу, резко ограничивать память.
История многозадачных операционных систем
Поначалу реализация многозадачных операционных систем представляла собой серьёзную техническую трудность, отчего внедрение многозадачных систем затягивалось, а пользователи долгое время после внедрения предпочитали однозадачные.
В дальнейшем, после появления нескольких удачных решений, многозадачные среды стали совершенствоваться, и в настоящее время употребляются повсеместно.
Впервые многозадачность операционной системы была реализована в ходе разработки операционной системы Multics (1964 год). Одной из первых многозадачных систем была OS/360 (1966 [2] ), используемая для компьютеров фирмы IBM и их советских аналогов ЕС ЭВМ. Разработки системы были сильно затянуты, и на начальное время фирма IBM выдвинула однозадачный DOS, чтобы удовлетворить заказчиков до полной сдачи OS/360 в эксплуатацию. Система подвергалась критике по причине малой надёжности и трудности эксплуатации.
В 1969 году на основе Multics была разработана система UNIX с достаточно аккуратным алгоритмическим решением проблемы многозадачности. В настоящее время на базе UNIX созданы десятки операционных систем.
На компьютерах PDP-11 и их советских аналогах СМ-4 использовалась многозадачная система RSX-11 (советский аналог — ОСРВ СМ ЭВМ), и система распределения времени TSX-PLUS, обеспечивающая ограниченные возможности многозадачности и многопользовательский режим разделения времени, эмулируя для каждого пользователя однозадачную RT-11 (советский аналог — РАФОС). Последнее решение было весьма популярно из-за низкой эффективности и надёжности полноценной многозадачной системы.
Аккуратным решением оказалась операционная система VMS, разработанная первоначально для компьютеров VAX (советский аналог — СМ-1700) как развитие RSX-11.
Первый в мире мультимедийный персональный компьютер Amiga 1000 (1984 год) изначально проектировался с расчётом на полную аппаратную поддержку вытесняющей многозадачности реального времени в ОС AmigaOS. В данном случае разработка аппаратной и программной части велась параллельно, это привело к тому, что по показателю квантования планировщика многозадачности (1/50 секунды на переключение контекста) AmigaOS долгое время оставалась непревзойдённой на персональных компьютерах.
Типы псевдопараллельной многозадачности
Невытесняющая многозадачность
Тип многозадачности, при котором операционная система одновременно загружает в память два или более приложений, но процессорное время предоставляется только основному приложению. Для выполнения фонового приложения оно должно быть активизировано. Подобная многозадачность может быть реализована не только в операционной системе, но и с помощью программ-переключателей задач. В этой категории известна программа DESQview, работавшая под DOS и выпущенная первый раз в 1985 году.
Совместная или кооперативная многозадачность
Тип многозадачности, при котором следующая задача выполняется только после того, как текущая задача явно объявит себя готовой отдать процессорное время другим задачам. Как частный случай, такое объявление подразумевается при попытке захвата уже занятого объекта mutex (ядро Linux), а также при ожидании поступления следующего сообщения от подсистемы пользовательского интерфейса (Windows версий до 3.x включительно, а также 16-битные приложения в Windows 9x).
Кооперативную многозадачность можно назвать многозадачностью «второй ступени» поскольку она использует более передовые методы, чем простое переключение задач, реализованное многими известными программами (например, DOS Shell из MS-DOS 5.0 при простом переключении активная программа получает все процессорное время, а фоновые приложения полностью замораживаются. При кооперативной многозадачности приложение может захватить фактически столько процессорного времени, сколько оно считает нужным. Все приложения делят процессорное время, периодически передавая управление следующей задаче.
Преимущества кооперативной многозадачности: отсутствие необходимости защищать все разделяемые структуры данных объектами типа критических секций и mutex’ов, что упрощает программирование, особенно перенос кода из однозадачных сред в многозадачные.
Недостатки: неспособность всех приложений работать в случае ошибки в одном из них, приводящей к отсутствию вызова операции «отдать процессорное время». Крайне затрудненная возможность реализации многозадачной архитектуры ввода-вывода в ядре ОС, позволяющей процессору исполнять одну задачу в то время, как другая задача инициировала операцию ввода-вывода и ждет её завершения.
Реализована в пользовательском режиме ОС Windows версий до 3.х включительно, Mac OS версий до Mac OS X, а также внутри ядер многих UNIX-подобных ОС, таких, как FreeBSD, а в течение долгого времени — и Linux.
Вытесняющая или приоритетная многозадачность (режим реального времени)
Вид многозадачности, в котором операционная система сама передает управление от одной выполняемой программы другой в случае завершения операций ввода-вывода, возникновения событий в аппаратуре компьютера, истечения таймеров и квантов времени, или же поступлений тех или иных сигналов от одной программы к другой. В этом виде многозадачности процессор может быть переключен с исполнения одной программы на исполнение другой без всякого пожелания первой программы и буквально между любыми двумя инструкциями в её коде. Распределение процессорного времени осуществляется планировщиком процессов. К тому же каждой задаче может быть назначен пользователем или самой операционной системой определенный приоритет, что обеспечивает гибкое управление распределением процессорного времени между задачами (например, можно снизить приоритет ресурсоёмкой программе, снизив тем самым скорость её работы, но повысив производительность фоновых процессов). Этот вид многозадачности обеспечивает более быстрый отклик на действия пользователя.
Преимущества: возможность полной реализации многозадачного ввода-вывода в ядре ОС, когда ожидание завершения ввода-вывода одной программой позволяет процессору тем временем исполнять другую программу. Сильное повышение надежности системы в целом, в сочетании с использованием защиты памяти — идеал в виде «ни одна программа пользовательского режима не может нарушить работу ОС в целом» становится достижимым хотя бы теоретически, вне вытесняющей многозадачности он не достижим даже в теории. Возможность полного использования многопроцессорных и многоядерных систем.
Недостатки: необходимость особой дисциплины при написании кода, особые требования к его реентрантности, к защите всех разделяемых и глобальных данных объектами типа критических секций и mutex’ов.
Реализована в таких ОС, как:
Проблемные ситуации в многозадачных системах
Голодание (starvation)
Задержка времени от пробуждения потока до его вызова на процессор, в течение которой он находится в списке потоков, готовых к исполнению. Возникает по причине присутствия потоков с большими или равными приоритетами, которые исполняются все это время.
Негативный эффект заключается в том, что возникает задержка времени от пробуждения потока до исполнения им следующей важной операции, что задерживает исполнение этой операции, а следом за ней и работу многих других компонентов.
Голодание создаёт узкое место в системе и не дает выжать из неё максимальную производительность, ограничиваемую только аппаратно обусловленными узкими местами.
Любое голодание вне 100 % загрузки процессора может быть устранено повышением приоритета голодающей нити, возможно — временным.
Как правило, для предотвращения голодания ОС автоматически вызывает на исполнение готовые к нему низкоприоритетные потоки даже при наличии высокоприоритетных, при условии, что поток не исполнялся в течение долгого времени (
10 секунд). Визуально эта картина хорошо знакома большинству пользователей Windows — если в одной из программ поток зациклился до бесконечности, то переднее окно работает нормально несмотря на это — потоку, связанному с передним окном, Windows повышает приоритет. Остальные же окна перерисовываются с большими задержками, по порции в секунду, ибо их отрисовка в данной ситуации работает только за счет механизма предотвращения голодания (иначе бы голодала вечно).
Гонка (race condition)
Недетерминированный порядок исполнения двух путей кода, работающих с одними и теми же данными и исполняемыми в двух различных нитях. Приводит к зависимости порядка и правильности исполнения от случайных факторов.
Устраняется добавлением необходимых блокировок и примитивов синхронизации. Обычно является легко устраняемым дефектом (забытая блокировка).
Инверсия приоритета
Поток L имеет низкий приоритет, поток M — средний, поток H — высокий. Поток L захватывает mutex, и, выполняясь с удержанием mutex’а, преемптивно прерывается потоком M, который пробудился по какой-то причине, и имеет более высокий приоритет. Поток H пытается захватить mutex.
В полученной ситуации поток H ожидает завершения текущей работы потоком M, ибо, пока поток M исполняется, низкоприоритетный поток L не получает управления и не может освободить mutex.
Устраняется повышением приоритета всех нитей, захватывающих данный mutex, до одного и того же высокого значения на период удержания mutexa. Некоторые реализации mutex’ов делают это автоматически.
Многозадачность. Как справиться с призраками посторонних дел
Автор иллюстрации: John Kenn
Многозадачность мешает сосредоточиться, довести начатое дело до конца, вызывает беспокойство и усталость, постоянное ощущение спешки, чувство неудовлетворенности, при этом эффективность работы падает.
О многозадачности, а точнее о том как с ней справиться, в статье и пойдет речь.
Что такое многозадачность
Это способность, а если точнее — неспособность, справляться одновременно с несколькими делами и сосредотачиваться на чем-то одном. И хотя многозадачность считается эффективным методом решения проблем и отличным подходом к делам — это не так. Она легко добавит несколько рабочих часов в конце дня и растянет достижение цели на месяцы, а может, и на годы. Казалось бы, если браться за два дела сразу, время на исполнение сократится наполовину, но, на самом деле, времени и усилий понадобится в два раза больше, а шансы на успех сократятся вдвое.
Как заметить многозадачность
Первичное действие: я отклоняюсь от темы.
На работе мы едва способны проработать час и не проверить электронную почту, отправить СМС, позвонить, посерфить в интернете, залезть на YouTube или Facebook, твитнуть что-то или поискать на Shazam отличную песню.
Во время общения едва выдерживаем часовую беседу с друзьями, не пользуясь смартфоном.
У нас всегда много дел, ведь жизнь состоит из соперничающих за внимание требований. Мы жонглируем задачами и принимаем множество решений, перезваниваем, завершаем проекты, начинаем новые, кого-то куда-то отвозим, а других людей откуда-то забираем. При этом ведем домашнее хозяйство и не теряем голову. Разве это не круто? Не это ли доказывает, что мы мастера многозадачности почти как Юлий Цезарь?
Мы постоянно перегружены, пытаясь уместить в час как можно больше дел: ответ на письмо, участие в конференции, проверка материалов для встречи. Наш ежедневник уже напоминает небольшой роман.
А еще у нас появляются необычные симптомы.
Мы не можем надолго сконцентрироваться на одной задаче, мысли путаются, особенно если дело скучное, трудоемкое или длительное. При этом переходы от дела к делу отнимают все больше сил и вызывают подавленность и истощение. Все чаще задумываемся о качестве работы, но при этом появляется все больше ошибок. Проявляется небрежность и теряются вещи, забываются идеи, пропускаются встречи и не отправляются ответы на письма.
Для нас стало нормой во время разговора не дослушать до конца собеседника и начать придумывать ответ или мысленно его критиковать. А иногда в голову лезут посторонние мысли.
Я выключил газ?
Вам не нужно сосредотачивать внимание. *вжух*
Скрытый механизм многозадачности: неспособность управлять вниманием
Мозг способен работать в многозадачном режиме и делает это отлично. Даже в этот момент, читая статью, мы обрабатываем прочитанное, понимаем смысл написанного и создаем зрительные образы, возможно, даже комментируем про себя. При этом сердце продолжает биться, а легкие наполнятся воздухом. Наш желудок не перестает функционировать, а температура тела не выходит за пределы нормы, мы замечаем звуки и запахи.
Мозг производит миллионы вычислений в любой момент времени, и хотя в фоновом режиме он эффективен и способен работать со многими вещами одновременно, на первом плане всегда будет что-то одно. На чем будет сосредоточен мозг — зависит от задачи и потребностей. При чтении — понимание цепочки символов и смысла написанного. Когда мы слушаем кого-то — смысл сказанного. Во время вождения — дорожная обстановка.
Представим себя в темной комнате с фонариком в руке. Наше внимание — это луч света от фонарика, мы видим только то, что попадает под него. Нужно осмотреться? Для этого надо водить фонарем из стороны в сторону, но при этом будет видно все равно только то, что освещено.
Выделяют четыре типа управления вниманием:
Например, вести автомобиль и разговаривать по телефону или читать книгу и слушать музыку. Но позже обнаружилось, что при этом страдает результативность.
Разделяя внимание на две задачи, мы начинаем делать больше ошибок и пропускать что-то в одной задаче или в обеих.
Разделенное внимание — параллельная многозадачность. При разделении внимание будет делиться между разными задачами, и одна может получить 30%, а другая 70%. Полностью сосредоточиться на чем-то одном не удастся. Такой подход будет полезен при выполнении пары дел, одно из которых выполняется на автомате. Например, когда беседуете с другом, прогуливаясь по парку.
В случае, когда требуется уделять 100% внимания выполняемой задачи, будет полезно переключение.
Чередующееся внимание, оно же переключение — серийная многозадачность. Сначала мы уделяем все внимание одной задаче, потом переключаемся на другую и погружаемся в нее с головой. Например, прерываем беседу, проверяем почту, отвечаем на сообщения, а потом продолжаем разговор. Не кажется сложным, но на это требуется много энергии.
Побочные эффекты многозадачности
В большинстве случаев многозадачность не завидное умение, а дурная привычка. Она мешает сосредоточиться и ухудшает концентрацию — становится сложно разобраться в распределении внимания. Мы становимся рассеянными и хуже сопротивляемся отвлечению. Многозадачность бьет по эффективности, а между ней и топтанием на месте — тонкая грань.
Многозадачность — враг совершенства.
Как бы не хотелось, но, занимаясь несколькими делами одновременно, не получиться уделить внимание деталям, и от этого будет страдать результат. Можно стать мастером на все руки, но в конкретном деле высот достичь не удастся. Еще одно из последствий многозадачности — потеря способности сохранять сосредоточенность. Умение сосредоточиться на одном деле более пяти секунд — почти утраченный навык.
Как преодолеть многозадачность
Тренируем однозадачность
TED 2012, Паоло Кардини рассказывает о однозадачности. Субтитры на русском языке.
Паоло Кардини, на TED 2012 предложил противоядие — однозадачность. Хотим сделать что-то хорошо — концентрируемся на текущей задаче. Главное — помнить о текущей цели. Готовим обед? Тогда ограничимся нарезкой, варкой и жаркой. Не стоит разговаривать по телефону, слушать телевизор, заказывать книгу рецептов по саге «Песнь льда и пламени». Ведем машину? Руки на руль, ноги на педали, а взгляд на дорогу. Не трогаем навигатор, не читаем СМС, не болтаем с пассажирами.
Отдыхаем с друзьями? Тогда забудем о важных письмах, звонках, работе и флирте с официантками.
Конечно, при необходимости можно и отойти немного от однозадачности: если промелькнула отличная мысль — запишем в блокнот и отложим до свободного времени. Так мы ее не забудем, а идея стала побочной задачей. Побочные задания — это как блокнот, только не блокнот, в который записывается все, что отвлекает от текущего дела. Главное ими не злоупотреблять, иначе так недалеко и до многозадачности.
Тренируем мозг
Мозг — это как мускул, хотя и не мускул, и ему требуются упражнения, которые включают и укрепляют механизмы контроля когнитивных функций и делают их эффективными.
Замечаем ловушки
Для большинства людей ТОП ловушек такой:
Списки дел
Главное — перечень дел должен нравиться, иначе мы к нему не будет возвращаться. Не важно, где вести список дел — в блокноте или в приложении, главное чтобы это доставляло удовольствие.
Если взять список задач, то в нем почти не будет пунктов, объединяющих несколько дел. Причина проста — многозадачность интуитивно воспринимается бессмысленной. Важно выработать привычку держать список дел под рукой и регулярно сверяться с ним особенно перед началом работы. Главное — работать по порядку приоритетности задач, а если появилась какая-то новая — фиксируем ее на будущее.
Учимся говорить «нет»
Начальник дал дополнительную работу, а подруга просит помочь с проектом? А может нужна помощь в организации какого-то мероприятия в школе у ребенка?
Часто мы чувствуем себя обязанными делать что-то для других, хотя и своих забот хватает. Многие набирают кучу проектов из рвения, чувства долга или желания быть полезными, хотя отлично знают, что это им не по силам.
Мы обязаны научиться говорить «нет» и отбросить все волнения о чужих проектах и делах, еще важно при этом не корить себя за невозможность кому-то помочь.
Делегируем полномочия
Лучшее лекарство от многозадачности — попросить о помощи. Это сложно и порождает стресс, ведь доверив работу другим, забот может добавиться. Хотя это может быть неприятным, все равно стоит привлекать других. Обращение за помощью можно считать взаимовыгодным сотрудничеством, мы же помогали другим, когда они просили. Настала пора платить по счетам.
Лучший обмен взаимопомощью — просто кого-нибудь нанять.
Тренируем мозг скукой
Хотя многозадачность дает стимулы и энергию, а однозадачность навевает зевоту и оцепенение — неинтересные задачи лучше всего тренируют мозг. Не бросать долгое и утомительное дело — отличное упражнение на внимание.
На этом по многозадачности все.
Надеюсь, что время, которые вы потратили на статью, дали полезную информацию для размышлений.
Всем добра, и да пребудет с вами Сила!
Читайте больше статей в нашем блоге: SmartTalks
О многозадачности и планировщике задач (шедулер)
Небольшой экскурс в проблемы многозадачности и реализации планировщиков.
Такими были большинство компьютеров со времён их возникновения. В память помещалась программа и данные, которые она обрабатывала. В конце работы программы в памяти хранился результат выполнения.
Тут сразу у современного пользователя возникает вопрос: а где мышка, клавиатура и монитор? А это уже надстройки над нашим конвейером. Через прерывания контроллера переферийных устройств в стройный ряд инструкций и данных, летящих из памяти вклиниваются и аппаратные команды, которые заставляют наш конвейер прерваться и перейти к определённому адресу, где расположена программа-обработчик прерывания.
Данная команда будет выводить статистику каждую секунду 5 раз:
После выполнения программы-обработчика прерывания работа конвейера возобновляется. Так работает обработка сигналов от мышки и клавиатуры. Работа с видео-картой и монитором построена иначе, но сейчас мы не будем это рассматривать.
Как вы думаете, что произойдёт, если по какой-то причине перестанут поступать прерывания от таймера? Или таймер начнёт медленнее тикать?
Операционная система посчитает, что мир стал медленнее, или же компьютер быстрее. В предельном случае процессор будет исполнять текущую задачу, не обращая внимания на остальное.
Иллюзия многозадачности
В частности, наша система станет однозадачной. Ведь никакой многозадачности нет (особенно, если мы рассматриваем однопроцессорную систему). Однако, потребность в этом есть: на компьютере могут работать несколько пользователей одновременно, а каждый пользователь хочет запустить несколько задач.
И тут появляется планировщик
Также важно помнить, что пользователю важен отклик системы. Поэтому планировщик должен быть привязан как-то к реальному времени.
И тут есть множество проблем для планировщика. Так, к примеру, нельзя определить, когда программа дойдёт до определённого момента (идеальный момент для переключения) чисто по алгоритмическим причинам.
К слову, может быть кто-то знает альтернативные подходы к реализации вычислительных систем, не процессор-шина-память?
Пара слов о проблемах реализации многозадачности
Работа с системными ресурсами напрямую предполагает работу программы в реальном режиме процессора, а не в защищённом. Работая в GNU/Linux нам невозможно получить доступ напрямую к любому участку памяти, а также работать с регистрами процессора типа sp, ip и т.д. без изменения кода ядра и его пересборки.
Как можно было заметить, действий производится довольно много, чтобы одна программа могла работать рядом с другой. При этом очень многое держится чисто на человеческих договорённостях. И любой отход от договорённостей или ошибка в программе может привести к отказу работы всего компьютера.
Надеюсь, в общих чертах было ясно, какие действия необходимы и на сколько непросто написать даже такой примитивный планировщик?
Многозадачность и справедливость
Но это в идеальном мире. В реальности же процессы вольно или невольно стараются получить времени больше, или же отдают управление раньше (через тот же sched_yield), чем им выделено. Тем не менее, за условной “справедливостью” следить нужно.
Есть 2 основных подхода к многозадачности: кооперативный и вытесняющий. В кооперативной многозадачности процессы сами решают, когда они готовы отдать управление. В вытесняющей многозадачности планировщик ведёт подсчёт времени
исполнения процессов (с помощью таймера) и сам прерывает рабочий процесс, когда тот выходит за выделенный лимит.
Кооперативная многозадачность
К примеру, для переключения между тредами может быть использована команда ThreadSwitch. Текущая задача остаётся активной (готовой) и передаёт управление следующей готовой задаче. Хоть внутри и выполняются низкоуровневые операции, для языка программирования высокого уровня данная функциональная возможность выглядит как обычная функция.
Все помнят, что такое очередь? Как работает FIFO?
Вытесняющая многозадачность
Однако, если размер кусков, на которые мы нарезаем процессорное время мал, то из-за частых смен задач (смен контекста) можно получить потерю производительности.
За счёт прогнозируемости и отзывчивости данный подход распространился на почти все современные ОС.
Говоря о расходе времени при переключении контекста, как вы думаете, на чём же больше всего теряется время?
Смена контекста (context switch)
Само собой, при смене контекста производится много работы. Часть из неё мы уже описали выше, но особого внимания заслуживает отдельный момент, который мы ещё не обсуждали.
Кеш процессора
В следующем примере мы запустим программу в 8 потоков на 8-ми ядрах. Они будут увеличивать общий счётчик до довольно большого числа. Так как они будут параллельно обрабатывать одни и те же данные, компьютер будет постоянно синхронизировать кеши.
nice и приоритет исполнения процессов
Для примера, запустим параллельно с разными приоритетами несколько экземпляров предыдущей программы:
И посмотрим на результат выполнения:
Идут почти в порядке приоритетов.
Также есть renice для изменения приоритета процессу, группе процессов или процессам определённого пользователя.
Кванты времени
Для начала посмотрим настройки, которые можно использовать для тюнинга планировщика:
Планировщики в Linux
Уже гораздо лучше. Однако и здесь есть свои проблемы. При балансировке нагрузки между процессорам необходимо время от времени производить миграцию процессов с одного процессора на другой. Для этого приходится блокировать очередь работы одного процессора другим.
Также имелись и проблемы с честным выделением ресурсов пользователям. Если один запустит 10 процессов, а другой 1, то разделение времени будет нечестым.
Помимо планировщиков общего назначения в Linux есть и планировщик для систем реального времени. Это системы, в которых важно, чтобы время реакции системы на внешний сигнал не превышало определённого времени. К примеру, от момента определения заноса до запуска сервоприводов тормозных колодок должно пройти не более 5мс. Помимо планировщика на работу влияют и многие другие части ОС, например, буферы, обработчики прерываний и т.д. Однако, и планировщик и программы должны быть специальными для работы в реальном времени.
Планировщик ввода-вывода
Помимо ресурса процессора также немаловажен ресурс ввода / вывода. С появлением и распространением SSD дела стали лучше, чем при HDD (аж 10мс для перехода к нужному участку носителя), но всё равно это сильно медленнее, чем работа с памятью. Да и в целом ресурсами лучше зря не разбрасываться.
При работе с дисковой подсистемой используется планировщик ввода / вывода. Причём для разных устройств и задач подходят разные планировщики. Так CFQ (Completely Fair Queue) и deadline планировщики сначала будут буферизировать запросы на чтение / запись, чтобы сгруппировать запросы к устройству так, чтобы эффективнее с него считать. Например, чтобы за один оборот диска можно было прочитать сектора для разных процессов.
Посмотреть доступные для устройства планировщики можно через