Как внешне реализована многозадачность в windows

Обновлено: 03.07.2024

То, что вам никто не говорил о многозадачности в Windows.

Многозадачность – это просто?

Когда я только начинал разрабатывать многопоточные приложения, мои мысли были просты и прямолинейны: нужно просто создать второй поток, и выполнять в нем какую-либо работу. Потоки будут выполняться одновременно, все сложности на себя берет операционная система, мне только остается воспользоваться несколькими функциями WinAPI.

К сожалению, реально дела обстоят не так просто, и особенно когда это касается real-time приложений (которыми являются компьютерные игры). Чтобы это понять, мне пришлось пройти долгий путь от недоумения (почему все работает нет так, как должно?) к более-и-менее ясному представлению о том, как на самом деле реализована многозадачность в Windows.

В этой статье я готов поделиться добытой информацией, разоблачить некоторые распространенные заблуждения, наглядно показать изложенные принципы и, в тоже время, не претендуя на полную достоверность, услышать другие мнения.

Основная цель исследования фокусируется на возможности использования многопоточности в играх, и, в частности, в DirectX приложениях. Второй поток предполагается использовать для фоновой загрузки уровней с диска, но забирая не более 10% процессорного времени у основного потока (при запуске фоновых задач FPS не должен значительно падать).

О чем НЕ будет идти речь в этой статье

Я не буду рассказывать, почему важна синхронизация между потоками. Я не буду описывать функции и объекты WinAPI, используемые в многопоточных программах. Я даже не буду описывать, какие алгоритмы и шаблоны следует применять в многопоточных приложениях. На эти темы есть масса статей, а я хочу дать ответы на те вопросы, на которые найти ответ очень трудно – нюансы, которые часто сводят на нет всю архитектуру приложения.

Примечание. Термины.Поток – thread. Многопоточность – multithreading. Многозадачность – multitasking.

Часть первая. Принципы работы многозадачности.

Начнем с заблуждений. Заблуждение первое – потоки выполняются одновременно.

Если вы хоть чуть-чуть знакомы с аппаратной частью и языком ассемблера, то знаете, что процессор изначально рассчитан на исполнение только одного потока команд. У него есть только один регистр-указатель выборки команд и один набор регистров общего назначения.


Рисунок 1. Упрощенная схема процессора.

Процессор не может физически выполнять несколько потоков одновременно (о HyperThreading и DualCore мы поговорим в третьей части статьи. Начнем с простого – с обычного процессора). На самом деле, иллюзию одновременного исполнения для нас создает операционная система.

Есть два основных способа организовать многозадачную ОС:

Очевидным недостатком является то, что операционной системой никак не контролируется количество процессорного времени, использованного приложением. Как только одно из приложений «зависает» и не вызывает функцию PeekMessage(), перестают работать все остальные приложения, включая операционную систему. Остается только сделать Reset. Понятно, что о «одновременном исполнении потоков» здесь говорить не приходится.

Несмотря на существенные недостатки, благодаря простоте реализации такая система часто применяется в операционных системах для портативных устройств, например – PalmOS.

2. В серьезных ОС используется так называемая «вытесняющая многозадачность».

При инициализации, ядро операционной системы настраивает таймер для вызова аппаратного прерывания через определенные промежутки времени (quantum). В обработчике аппаратного прерывания ОС может сохранить полное состояние процессора (регистры), восстановить состояние для другого потока, и передать ему управление. Поток не обязан вызывать какие-либо функции, и даже может исполнять бесконечный цикл – операционная система все равно прервет исполнение, и выделит другому потоку некоторое количество процессорного времени (называемое “time slice”).

Налицо преимущества: зависание одного потока не приводит к зависанию других потоков и операционной системы. Операционная система даже может в любой момент уничтожить поток, который посчитает «зависшим».

Нюансом здесь является период времени вызова аппаратного прерывания (quantum) и количество времени, выделяемого каждому потоку (time slice). Этой информации вы не найдете ни в одной документации, и тому есть причина: Microsoft Windows не претендует на звание “Real-time OS”. Просто гарантируется, что все будет нормально работать для обычных (читай: офисных) приложений.

Эти временные промежутки отличаются в разных версиях Windows, и для Windows XP составляют quantum=10ms, time slice = 130ms (!). Здесь разработчик игр уже должен насторожиться, т.к. при 50 FPS длина кадра составляет 20ms.

Примечание. Вопреки распространенному заблуждению, Windows 95/98 построены именно по второй схеме. Просто в этих системах есть масса объектов, требующих эксклюзивного доступа (наследие ДОС), и если поток «завиcает», захватив и не освободив один такой объект, то никакая вытесняющая многозадачность не поможет предотвратить зависание других потоков и всей системы в целом.


Рисунок 2. Приложение ThreadTest.

Для экспериментов я написал специальное приложение (исходные коды прилагаются к статье). Оно содержит набор тестов, иллюстрирующих приведенные утверждения.

Завершите все лишние приложения, и запустите Тест №1.


У вас должно получиться, как показано на рисунке. Поток выполнялся практически непрерывно, изредка прерываясь операционной системой на выполнение служебных задач и других потоков (здесь мы также можем заметить, что промежутки между перерывами равны примерно 10ms, то есть quantum).

Примечание. Для выполнения тестов следует использовать компьютер с одним процессором, без технологии HT, или выключить HT в BIOS.

Здесь у неопытного программиста сразу может возникнуть вопрос: но ведь наш поток – не единственный, в системе их множество. Судя по графику, наш поток выполнялся практически непрерывно. Получается, остальные потоки не работают?

Дело в том, что у остальных потоков нет работы, и они, быстро проверив несколько флагов, отдают свое процессорное время, используя функции Sleep(), WaitForObject() и т.д. Соответственно, перебрав все потоки, ОС переключается обратно на наш поток. Этим и объясняются небольшие пробелы в выполнении нашего потока. Эта концепция является основополагающей в Windows, что позволяет запускать большое количество фоновых потоков без видимого влияния на производительность приложений.

Для сравнения, запустите архиватор WinRar запаковывать большой файл, и повторите Тест №1.


Рисунок 4. Работа потока, если на фоне запущен WinRar.

На этот раз мы можем наблюдать значительные пробелы в работе потока. Он периодически прерывается на 130ms (time slice) – очевидно, свое процессорное время использует WinRar. Соответственно, наше приложение снизило скорость выполнения «полезной» работы (вычисление матриц) на 25%.

Наше приложение получает в 3 раза больше времени, т.к. его окно является активным. Если запустить тест, и быстро переключиться на WinRar, картина меняется на противоположную:


Рисунок 5. Работа потока фонового приложения.

Мы можем наглядно увидеть работу потоков, запустив тесты 2 (два потока с нормальным приоритетом) и 3(4 потока с нормальным приоритетом).


Рисунок 6. Тест №2. Два потока с нормальным приоритетом.


Рисунок 7. Тест №3. Четыре потока с нормальным приоритетом.

Здесь следует отметить, что сумма скоростей выполнения «полезной» работы равна скорости работы одного потока. Тут все понятно – как ни крути – процессор то у нас один!

Заблуждение второе. Приоритет потока влияет на длину timeslice.

Из теста №2 можно сделать вывод, что, запустив второй поток, выполняющий какую-либо работу, мы тем самым снижаем производительность основного потока приложения ровно вдвое. Это значит, что, открыв второй поток, мы наполовину снизим FPS. А нам хотелось бы, чтобы второй поток не спеша выполнял какую-то фоновую задачу (например, фоновую загрузку уровня), забирая не больше 10% производительности.


Рисунок 8. Тест №4. Основной поток с нормальным приоритетом, второй – ниже нормального.

Что же мы видим? Приоритет не влияет на длину time slice. Он даже не влияет на то, насколько часто второй поток получает time slice (как многие думают). На самом деле, WINDOWS НЕ БУДЕТ ВЫПОЛНЯТЬ ПОТОК С НИЗКИМ ПРИОРИТЕТОМ, ПОКА ЕСТЬ ГОТОВЫЕ К ВЫПОЛНЕНИЮ ПОТОКИ С БОЛЕЕ ВЫСОКИМ ПРИОРИТЕТОМ. Второй поток вообще не получил процессорного времени, пока первый поток не вышел из цикла.

Все становится на свои места, если четко понимать, как работает планировщик потоков (scheduler) Microsoft Windows.

Планировщик потоков содержит очереди потоков, готовых к выполнению. Для каждого приоритета – своя очередь. Когда поток готов к выполнению (ready for execution) – то есть не находится внутри Sleep() или WaitForObject() – система помещает его в очередь потоков соответствующего приоритета. Планировщик просматривает все очереди, начиная с самого высокого приоритета. Как только находит непустую очередь, он выдает один time slice первому потоку, перемещает его в конец очереди, и начинает просмотр сначала. Планировщик даже не будет просматривать очереди с меньшим приоритетом, пока есть непустые очереди с большим приоритетом.

Заблуждение третье. Sleep(1) всегда занимает 1 ms.

Ну не получилось. Но мы не сдаемся! Мы лезем в MSDN и находим замечательную функцию Sleep(). По идее, вызывая Sleep(1) между кадрами, мы сможем запускать второй поток на 1ms, т.к. текущий поток перестает быть ready for execution, исчезает из очереди, и планировщик может перейти к очереди с более низким приоритетом.

Примечание. Планировщик может получить управление не только в результате аппаратного прерывания, но и при вызове выполняемым потоком функций Sleep(), WaitForObject().

Примечание. Если ваше приложение в системе – не единственное активное, может пройти очень много времени, пока управление вернется в вызвавший поток после истечения периода Sleep(). Да, система поставит поток в очередь, по крайней мере, через 10 ms, но она поставит его в конец очереди. На самом деле система гарантирует, что Sleep(1) займет НЕ МЕНЬШЕ 1ms, а верхний предел не лимитируется.

Функция Sleep() позволяет передавать 0 (ноль), и при этом ее поведение описывается как «отдать остаток time slice” другим процессам. Для интереса посмотрим, можем ли мы отдать остаток time slice потоку с меньшим приоритетом.


Рисунок 9. Тест №5. Основной поток с нормальным приоритетом, второй поток – ниже нормального. Основной поток вызывает Sleep(0).

Нет, картина не изменилась. Второй поток не выполняется, пока основной находится в цикле. Это объясняется следующим: Sleep(0) готов отдать остаток времени, но, поскольку эта функция не убирает поток из очереди, он (единственный) там все еще находится, и Sleep(0) немедленно возвращает управление в тот же поток.

Согласно утверждению, с помощью Sleep(0) можно отдать time slice только потоку с таким же приоритетом, что и подтверждает тест №6.


Рисунок 10. Тест №6. Два потока с нормальным приоритетом, оба вызывают Sleep(0).

В результате мы видим мнимое параллельное выполнение (на самом деле очень быстрое переключение). Только вот скорость выполнения «полезной» работы снизилась – из-за того, что процессор 50% времени занимается переключением потоков.

Здесь следует оговориться, что через некоторое время, когда система поймет, что поток с низким приоритетом совсем не получает процессорное время из-за того, что есть агрессивные потоки с высоким приоритетом(CPU time starvation detection), планировщик все же будет чуть-чуть выделять время этому потоку. Чтобы он начал это делать, должен пройти некоторый период времени, который равен примерно 5 сек.


Рисунок 11. Тест №7. Основной поток с нормальным приоритетом, второй поток – ниже нормального (на графике показан только второй поток). Через 5 сек второй поток получил time slice. Второй поток начал нормально выполняться после завершения основного (через 10 секунд).

Этим объясняется тот факт, что открыв второй поток с idle приоритетом в DirectX приложении, не засыпающем ни на миллисекунду в попытках выдать наибольший FPS, второй поток вроде бы работает, но о-о-очень медленно.


Рисунок 12. Тест №8. Два потока с нормальным приоритетом. Второй поток работает 2 ms, и вызывает Sleep(10).

Нам принципиально мешает большой quantum – можно ли его уменьшить?

Поверье четвертое. timeBeginPeriod() предназначена для изменения разрешения таймеров.

Если прочитать описание функции timeBeginPeriod() в MSDN, то ни за что не догадаться, что на самом деле она изменяет quantum.

Функция timeBeginPeriod(1) призвана повысить разрешение multimedia и waitable timers до 1ms. На самом деле, таймеры обрабатываются планировщиком, и их события не могут возникнуть чаще, чем планировщик получает управление. Понижая quantum до 1ms, мы позволяем планировщику более точно вызывать события таймера.

Ну что же, пора ставить эксперимент.


Рисунок 13. Тест №9. Основной поток с нормальным приоритетом, второй поток – ниже нормального. Основной поток вызывает Sleep(2) каждые 20ms, чтобы выполнять второй поток. Используется timeBeginPeriod(1).

Наконец-то мы добились, чего требовалось – во втором потоке выполняется не модифицированный алгоритм, и он забирает не больше 10% процессорного времени.

Результат

Собственно, к примерно такой архитектуре мы и пришли при создании игры «Xenus: Точка кипения». К сожалению, задача не решена до конца. При выполнении реальной работы во втором потоке, мы сбрасываем кеш процессора, вызываем перераспределение страниц памяти, захватываем объекты, требуемые первому потоку, и, что еще хуже, вызываем свопинг. Это приводит к тому, что при фоновой загрузке уровня FPS становится нестабильным, с непрогнозируемыми задержками на 1-10 мс, что значительно снижает комфорт игры.

Также необходимо понимать тот факт, что, поскольку поток использует всего 10% процессорного времени, то реальная работа в нем выполняется в 10 раз медленнее. Это значит, что если в основном потоке уровень загружается 1 сек, то во втором это же займет 10 сек.

С многозадачностью в Windows есть еще много нюансов, включающих повышение приоритета потока (priority boost) при его создании или с целью наискорейшего освобождения объекта синхронизации, задержку при создании нового потока (thread creation timeout, примерно 100ms), тайминги восстановления работы потока при освобождении ожидаемого объекта синхронизации, сценарий поведения при борьбе за захват объектов синхронизации (race conditions) и т.д. Обо всем этом можно почитать в статьях, ссылки на которые прилагаются.

Примечания.

В качестве однопроцессорной системы в статье была использована:

AMD Athlon XP 2.5GHz
nVidia nForce2 chipset
1,5GB RAM 400MHz
Radeon 9600 PRO

В качестве системы с HyperThreading была использована:

Intel Pentium 2,8 GHz
ABIT AA8XE
ATI X1600
1GB RAM DDR II

В качестве двуядерной системы была использована:

Intel Pentium D Smithfield 2.67GHz
Asus P5LD2-VM
Intel GMA
1GB RAM DDR 533MHz

Марат Хайрулин, эксперт Microsoft в России, продолжает исследовать нюансы работы с несколькими задачами и рассказывает о совмещении окон и разделении экрана, о вашей личной машине времени для сайтов и документов, и о реальной пользе виртуальных столов.

В прошлой заметке мы писали о том, как современная наука относится к многозадачности и делились небольшими приемами, которые помогут сосредоточиться на одной задаче. А теперь хочтим напомнить (а кого-то может быть и познакомить) с полезными возможностями, которые помогут, если решение вашей задачи требует работы сразу с несколькими приложениями.


Переключение по-старому и по-новому

Переключение между приложениями – наверное то, что большинство из нас делает «на автомате», и никого, конечно, не удивит сочетание клавиш Alt + Tab. Но если одновременно нажать также и Ctrl (то есть Ctrl + Alt + Tab), то эта комбинация зафиксирует меню со всеми открытыми окнами на экране и позволит выбрать нужное приложение одним кликом мыши или касанием пальца (выбрать окно можно также с помощью стрелок на клавиатуре, а открыть – с помощью Enter). Может быть полезно, когда у вас открыто много окон.

Чуть менее известное, но тоже классическое сочетание клавиш Windows + Tab дает больше возможностей, чем кажется на первый взгляд.

Нажимая эти клавиши в актуальных версиях Windows 10, мы попадаем в раздел «Представление задач». Здесь можно не только переключаться между приложениями, но и воспользоваться «Временной шкалой» и «Виртуальными рабочими столами». К слову, вместо горячих клавиш вы можете кликнуть по кнопке «Представление задач» (обычно она расположена рядом с кнопкой «Пуск») или провести пальцем от левого края к центру сенсорного экрана. Кстати, если у вас современный ноутбук – попробуйте жест для тачпада: проведите по нему тремя пальцами вверх.



Режим Представление задач

«Временная шкала»

«Временная шкала» появилась в Windows 10 два года назад. Она помогает вернуться к задачам, над которыми вы работали ранее на вашем компьютере. При необходимости вы также сможете синхронизировать ее и с другими устройствами с вашей учетной записью*.

Для меня «Временная шкала» стала своеобразной машиной времени. Работа над многими проектами длится несколько дней. И если, допустим, в прошлую пятницу я работал с определенными сайтами и документами, вернувшись к этому проекту в среду, я смогу легко восстановить картину. Я просто отмотаю шкалу до нужной даты – той самой пятницы, увижу и смогу открыть те самые сайты и документы, в которые я тогда был погружен.



Поиск на Временной шкале

Поиск на «Временной шкале» тоже не раз меня выручал. В отличие от обычного поиска по файлам, я смогу искать не среди всех документов на устройстве (а их может быть очень много), а именно среди тех, с которыми я работал в последние дни. Возможно, вам знакомо сочетание Ctrl + F, запускающее поиск в Проводнике и во многих приложениях. Эта комбинация сработает и на экране «Представление задач»: то есть можно нажать сначала Windows + Tab, а затем – Ctrl + F и ввести искомое слово для поиска по «Временной шкале».

Виртуальные рабочие столы Windows 10

Концепция виртуальных рабочих столов далеко не нова. Если говорить о Windows, то одним из вариантов их использования была утилита Desktops, которую когда-то (последняя версия вышла в 2012 году) разработал Марк Руссинович. В Windows 10 виртуальные рабочие столы встроены в систему и помогают разделять потоки задач, переключаться между ними.

Если раньше вы не работали с виртуальными столами, для понимания их логики представьте такую аналогию: вам доступно несколько мониторов, на каждом вы можете открыть нужные программы, разделив их по рабочим потокам, например: на одном мониторе – работа с почтой и календарем, на другом – работа с несколькими документами Word, а на третьем – работа с браузером и OneNote. В каждый момент вы смотрите только на один монитор (виртуальный рабочий стол) со своим набором приложений. А переключаясь между виртуальными столами, вы как будто переводите взгляд с одного монитора на другой.



Перетаскивание окна для переноса его на новый виртуальный рабочий стол

Создать новый виртуальный рабочий стол можно на экране «Представление задач»: нажмите Windows + Tab и перетащите нужные окна открытых приложений на поле с надписью «+ Создать рабочий стол», и они будут перемещены на другой виртуальный рабочий стол. Можно также создать новый, пустой виртуальный стол (Windows + Ctrl + D) и уже затем открыть на нем нужные программы.

«Переводить взгляд» (то есть переключаться между настроенными рабочими столами) можно, выбирая нужный стол на экране «Представление задач», но намного удобнее переключаться с помощью горячих клавиш: Windows + Ctrl + стрелки вправо/влево, а на современных тачпадах – 4 пальца влево или вправо.

Полезные решения для работы с несколькими приложениями

Теперь еще об одной повседневной необходимости – работе с несколькими приложениями одновременно.

Разделение экрана

Первой возможности, о которой хочу напомнить, уже много лет, и в первоначальном виде (под названием Aero Snap) она появилась еще в Windows 7. В Windows 10 ее возможности расширили и назвали Snap Assist. Речь про разделение экрана для закрепления двух (а в Windows 10 – до четырех) приложений.



Snap Assist предлагает выбрать второе окно для закрепления справа

Чтобы это сделать, нужно взять приложение за самую верхнюю полоску, поднести его к правой или левой границе экрана до появления на экране его «тени» и отпустить (тем самым, закрепив первое приложение), а затем в появившихся рядом миниатюрах других приложений выбрать второе для закрепления рядом. Сценарий несложный, работает и для мыши, и для пальца. Еще проще это можно сделать с помощью сочетания клавиш Windows + клавиши со стрелками вправо/влево. Этому сочетанию уже больше 10 лет, но у тех, кто применяет его впервые, и сейчас порой возникает ощущение «цифровой магии».

Любознательным пользователям также напомню, что в Windows 10 можно отправлять приложение в «четвертинку» экрана, перенеся его в угол (или используя дополнительно клавиши Windows + стрелки вверх/вниз). При закреплении двух приложений можно перемещать границу между ними, выделяя какому-то из приложений больше места. Чтобы выбрать приложения для закрепления на экране, можно кликнуть правой кнопкой мыши по их миниатюрам на экране «Представление задач».

Окно поверх

У меня было довольно мало ситуаций, когда требовалось закреплять окно одного приложения поверх другого (кажется, на телевизорах подобное называлось режимом «картинка в картинке»), но если у вас такая необходимость возникает, напомню в завершение заметки о двух небольших возможностях.

Мини-режим встроенного видеоплеера (приложение «Кино и ТВ», которое воспроизводит видео в Windows 10 по умолчанию). Запустите видео и нажмите на небольшую кнопку в правом нижнем углу (Воспроизвести в мини-режиме), окно с видеороликом будет размещено поверх всех окон.



Видео в режиме Окно поверх

В этом обзоре я поделился некоторыми возможностями при работе с одной или несколькими задачами, которыми пользуюсь сам. В следующих заметках продолжу разговор о приемах, которые помогут сделать нашу «цифровую жизнь» более продуктивной.


Советы

Многозадачность настолько выросла в нас, что мы на самом деле забыли, что делаем это. Любой опытный пользователь Windows будет впечатлен тем, насколько улучшился Windows 10 , начиная с Windows 95. Теперь не только управление несколькими приложениями стало намного проще, но вы можете увидеть предварительный просмотр всех ваших окон.

Многозадачность в Windows 10

В этой статье я расскажу вам несколько советов о том, как вы можете прекрасно управлять несколькими окнами, выполнять многозадачность различными способами, экономить много времени и быть более продуктивным в трудных ситуациях.

1. Представление задач вместо ALT + TAB

Использование ALT + TAB/SHIFT + ALT + TAB использовалось с давних времен. Хотя они хорошо позволяют вам переключаться между следующей и предыдущей вкладками, если у вас открыто от десяти до пятнадцати окон, вы в конечном итоге потратите больше времени, чтобы найти окно, которое хотите переключить. Не стоит забывать, что по мере увеличения количества открытых окон уменьшается размер текста заголовка для каждой вкладки.

При использовании Windows 10 лучше использовать представление задач. Он дает вам графическое представление всех открытых приложений в одном увеличенном прямоугольнике и предварительный просмотр каждого окна. Вы можете выбрать тот, который вы хотите переключить, и он переключается мгновенно. Вот как это выглядит:


Вы можете вызвать представление задач, используя Windows + Tab вместе или найти сложенные прямоугольники рядом с полем поиска Cortana на панели задач.

2. Нет второго монитора? Использовать виртуальные рабочие столы

Использование нескольких мониторов является одним из лучших способов сделать многозадачность. Вы можете не только увидеть больше, но и запустить несколько приложений, которые могут обрабатываться одним дисплеем. Но тогда не всем нужен второй дисплей, и если вы относитесь к категории людей, которые путешествуют с ноутбуком, то о дополнительном мониторе не может быть и речи.

Windows 10 предлагает виртуальные рабочие столы, где вы можете создавать практически любое количество рабочих столов. Вы получаете доступ к панели задач, меню «Пуск» и т. Д.

Чтобы создать виртуальный рабочий стол, нажмите кнопку «Просмотр задач» на панели задач или используйте вкладку Windows +. Это покажет список запущенных приложений и опцию «Новый рабочий стол» со знаком плюс в правом нижнем углу.


Теперь вы можете создавать любое количество рабочих столов один за другим, и это будет выглядеть так.


Окно Windows + Tab/Task View отображает как виртуальные рабочие столы, так и предварительный просмотр окон на каждом рабочем столе при наведении на них курсора.


Наконец, если вы хотите переключаться между виртуальными рабочими столами, используйте сочетания клавиш Windows Key + Ctrl + Left и Windows Key + Ctrl + Стрелка вправо.

Примечание. Если вы закроете какой-либо из виртуальных рабочих столов, все окна этого рабочего стола станут доступны в Desktop One.

3. Стек окна рядом с Snap Assist

Если вы хотите использовать несколько окон рядом, Windows 10 поставляется с встроенной поддержкой многозадачности. Используя функцию Snap Assist , вы можете перетащить одно окно до полного влево, если только вы не видите прозрачную панель, похожую на док, где окна могут прилипать. Вы можете сложить до 4 окон рядом, как показано на рисунке ниже:


Это очень удобно, когда вам нужно посмотреть в одно окно и заметить или проанализировать во втором. Windows 10 предлагает встроенную настройку многозадачности, которую можно искать в приложении «Настройки», и предлагает следующие параметры:


Эти настройки включены по умолчанию, но если вы хотите изменить поведение Snap Assistant, вы можете изменить его здесь. Скажем, например, я не люблю изменять размеры окон, когда я изменяю размер одного из окон.

Вы можете привязать до 4 окон, как это, и, хотя они происходят автоматически, вы всегда можете изменить их размер для наилучшего соответствия.

4. Вы также можете прокручивать неактивные Windows!

Много раз, у вас есть второе окно, в котором много данных, и вам нужно прокрутить. Windows 10 позволяет вам прокручивать такие окна, не переключаясь на них, используя Scroll Inactive Windows.

Перейдите в «Настройки»> «Устройство»> «Мышь», и вы увидите, что Прокручивать неактивные окна при наведении на них курсора , параметр, который необходимо включить, чтобы включить. Теперь, используя вашу мышь, все, что вам нужно, это навести туда указатель и прокрутить, и все заработает. Фокус останется на том окне, которое вы хотите, и вы все равно получите доступ ко всем данным во втором окне.


5. Любите смотреть видео при работе? Мини-плеер здесь, чтобы помочь


Это большинство вещей, которые я использую при многозадачности на ПК с Windows 10.

Я уверен, что их много, и если вы о них знаете, сообщите нам об этом в разделе комментариев. Я уверен, что вы делаете намного лучше, чем я!


В вычислении , многозадачности является одновременное выполнение множества задач (также известный как процессы ) в течение определенного периода времени. Новые задачи могут прерывать уже начатые до их завершения, а не ждать их завершения. В результате компьютер выполняет сегменты множества задач с чередованием, в то время как задачи совместно используют общие ресурсы обработки, такие как центральные процессоры (ЦП) и основная память . Многозадачность автоматически прерывает запущенную программу, сохраняя ее состояние (частичные результаты, содержимое памяти и содержимое регистров компьютера) и загружая сохраненное состояние другой программы и передавая ей управление. Это « переключение контекста » может быть инициировано через фиксированные интервалы времени ( упреждающая многозадачность ), или выполняющаяся программа может быть закодирована так, чтобы сигнализировать управляющему программному обеспечению, когда она может быть прервана ( совместная многозадачность ).

Многозадачность не требует параллельного выполнения нескольких задач в одно и то же время; вместо этого он позволяет продвигаться более чем одной задаче за определенный период времени. Даже на многопроцессорных компьютерах многозадачность позволяет выполнять гораздо больше задач, чем есть центральные процессоры.

Многозадачность - обычная черта компьютерных операционных систем. Это позволяет более эффективно использовать компьютерное оборудование; если программа ожидает какого-либо внешнего события, такого как ввод пользователя или передача ввода / вывода с периферийным устройством для завершения, центральный процессор все еще может использоваться с другой программой. В системе с разделением времени несколько человек-операторов используют один и тот же процессор, как если бы он был выделен для их использования, в то время как за кулисами компьютер обслуживает множество пользователей, выполняя многозадачность их индивидуальных программ. В многопрограммных системах задача выполняется до тех пор, пока ей не придется ждать внешнего события или пока планировщик операционной системы принудительно не выгружает выполняющуюся задачу из ЦП. Системы реального времени , такие как системы, предназначенные для управления промышленными роботами, требуют своевременной обработки; один процессор может использоваться совместно для вычислений движения машины, обмена данными и пользовательского интерфейса.

Часто многозадачные операционные системы включают меры по изменению приоритета отдельных задач, чтобы важные задания получали больше процессорного времени, чем те, которые считаются менее важными. В зависимости от операционной системы задача может быть такой же большой, как вся прикладная программа, или может состоять из более мелких потоков, которые выполняют части общей программы.

Процессор, предназначенный для использования с многозадачными операционными системами, может включать в себя специальное оборудование для безопасной поддержки нескольких задач, таких как защита памяти , и защитные кольца, которые гарантируют, что программное обеспечение надзора не может быть повреждено или нарушено программными ошибками пользовательского режима.

Термин «многозадачность» стал международным, поскольку это слово используется во многих других языках, таких как немецкий, итальянский, голландский, датский и норвежский.

СОДЕРЖАНИЕ

Мультипрограммирование

На заре вычислений процессорное время было дорогим, а периферийные устройства были очень медленными. Когда компьютер запускал программу, которой требовался доступ к периферийному устройству, центральный процессор (ЦП) должен был бы прекратить выполнение программных инструкций, пока периферийное устройство обрабатывает данные. Обычно это было очень неэффективно.

Первым компьютером, использующим систему мультипрограммирования, был British Leo III, принадлежащий J. Lyons and Co. Во время пакетной обработки в память компьютера было загружено несколько различных программ, и первая из них начала работать. Когда первая программа достигла инструкции, ожидающей периферийного устройства, контекст этой программы сохранялся, а второй программе в памяти давалась возможность выполнить. Процесс продолжался до тех пор, пока все программы не завершили работу.

Использование мультипрограммирования было усилено появлением виртуальной памяти и технологий виртуальных машин , которые позволили отдельным программам использовать память и ресурсы операционной системы, как если бы другие одновременно выполняющиеся программы для всех практических целей не существовали.

Мультипрограммирование не гарантирует своевременного выполнения программы. Действительно, первая программа вполне может работать часами без необходимости доступа к периферийным устройствам. Поскольку у интерактивного терминала не было пользователей, ожидавших результатов, это не было проблемой: пользователи передавали колоду перфокарт оператору и возвращались через несколько часов для распечатки результатов. Мультипрограммирование значительно сокращает время ожидания при обработке нескольких пакетов.

Совместная многозадачность

Ранние системы многозадачности использовали приложения, которые добровольно уступали время друг другу. Этот подход, который в конечном итоге был поддержан многими компьютерными операционными системами , сегодня известен как совместная многозадачность. Хотя сейчас она редко используется в более крупных системах, за исключением конкретных приложений, таких как CICS или подсистема JES2 , совместная многозадачность когда-то была единственной схемой планирования, используемой Microsoft Windows и Classic Mac OS для одновременного запуска нескольких приложений. Кооперативная многозадачность до сих пор используется в системах RISC OS .

Поскольку кооперативная многозадачная система полагается на то, что каждый процесс регулярно уступает время другим процессам в системе, одна плохо спроектированная программа может использовать все время ЦП для себя либо путем выполнения обширных вычислений, либо путем активного ожидания ; оба приведут к зависанию всей системы . В серверной среде это опасность, которая делает всю среду неприемлемо хрупкой.

Вытесняющая многозадачность

Вытесняющая многозадачность позволяет компьютерной системе более надежно гарантировать каждому процессу регулярный «кусок» рабочего времени. Это также позволяет системе быстро справляться с важными внешними событиями, такими как входящие данные, которые могут потребовать немедленного внимания того или иного процесса. Операционные системы были разработаны, чтобы воспользоваться преимуществами этих аппаратных возможностей и упреждающим запуском нескольких процессов. Вытесняющая многозадачность была реализована в PDP-6 Monitor и MULTICS в 1964 году, в OS / 360 MFT в 1967 году и в Unix в 1969 году, и была доступна в некоторых операционных системах для таких небольших компьютеров, как DEC PDP-8; это основная функция всех Unix-подобных операционных систем, таких как Linux , Solaris и BSD с их производными , а также современных версий Windows.

В любое конкретное время процессы можно сгруппировать в две категории: те, которые ожидают ввода или вывода (так называемые « привязки ввода-вывода »), и те, которые полностью используют ЦП (« привязанные к ЦП »). В примитивных системах программное обеспечение часто « опрашивает » или « занято », ожидая запрошенного ввода (такого как ввод с диска, клавиатуры или сети). В это время система не выполняла полезную работу. С появлением прерываний и вытесняющей многозадачности процессы, связанные с вводом-выводом, могли быть «заблокированы» или приостановлены в ожидании поступления необходимых данных, позволяя другим процессам использовать ЦП. Поскольку поступление запрошенных данных приведет к прерыванию, заблокированным процессам может быть гарантирован своевременный возврат к выполнению.

Самой ранней операционной системой с вытесняющей многозадачностью, доступной домашним пользователям, была Sinclair QDOS на Sinclair QL , выпущенная в 1984 году, но очень немногие люди купили машину. Amiga от Commodore , выпущенная в следующем году, была первым коммерчески успешным домашним компьютером, в котором использовалась эта технология, а его мультимедийные возможности сделали его явным предком современных многозадачных персональных компьютеров. Microsoft сделала вытесняющую многозадачность основной функцией своей флагманской операционной системы в начале 1990-х годов при разработке Windows NT 3.1, а затем Windows 95 . Позже он был принят на Apple Macintosh в Mac OS X, которая, как Unix-подобная операционная система, использует вытесняющую многозадачность для всех собственных приложений.

Похожая модель используется в Windows 9x и семействе Windows NT , где собственные 32-разрядные приложения выполняют многозадачность с вытеснением. 64-разрядные версии Windows для архитектур x86-64 и Itanium больше не поддерживают устаревшие 16-разрядные приложения и, таким образом, обеспечивают вытесняющую многозадачность для всех поддерживаемых приложений.

В реальном времени

Другая причина для многозадачности заключалась в проектировании вычислительных систем реального времени , где существует ряд, возможно, не связанных внешних действий, которые необходимо контролировать с помощью однопроцессорной системы. В таких системах иерархическая система прерываний сочетается с установлением приоритетов процессов, чтобы гарантировать, что ключевым действиям будет отведена большая часть доступного времени процесса .

Многопоточность

Поскольку многозадачность значительно повысила производительность компьютеров, программисты начали реализовывать приложения в виде наборов взаимодействующих процессов (например, один процесс собирает входные данные, один процесс обрабатывает входные данные, один процесс записывает результаты на диск). Однако для этого потребовались некоторые инструменты, позволяющие процессам эффективно обмениваться данными.

Потоки возникли из идеи, что наиболее эффективным способом взаимодействия процессов для обмена данными было бы совместное использование всего пространства их памяти. Таким образом, потоки - это фактически процессы, которые выполняются в одном контексте памяти и совместно используют другие ресурсы со своими родительскими процессами , например, открытые файлы. Потоки описываются как легкие процессы, поскольку переключение между потоками не требует изменения контекста памяти.

Хотя потоки планируются с упреждением, некоторые операционные системы предоставляют вариант потоков, называемых волокнами , которые планируются совместно. В операционных системах, которые не предоставляют волокна, приложение может реализовать свои собственные волокна, используя повторяющиеся вызовы рабочих функций. Волокна даже более легкие, чем потоки, и их несколько легче программировать, хотя они, как правило, теряют некоторые или все преимущества потоков на машинах с несколькими процессорами .

Некоторые системы напрямую поддерживают многопоточность аппаратно .

Защита памяти

Для любой многозадачной системы важно безопасное и эффективное совместное использование доступа к системным ресурсам. Доступ к памяти должен строго управляться, чтобы гарантировать, что ни один процесс не может случайно или намеренно прочитать или записать в области памяти за пределами адресного пространства процесса. Это делается с целью общей стабильности системы и целостности данных, а также безопасности данных.

В хорошо спроектированной и правильно реализованной многозадачной системе данный процесс никогда не может напрямую обращаться к памяти, принадлежащей другому процессу. Исключением из этого правила является общая память; например, в механизме межпроцессного взаимодействия System V ядро выделяет память для совместного использования несколькими процессами. Такие функции часто используются программным обеспечением для управления базами данных, например PostgreSQL.

Неадекватные механизмы защиты памяти либо из-за недостатков в их конструкции, либо из-за плохой реализации допускают уязвимости системы безопасности, которые могут быть потенциально использованы вредоносным программным обеспечением.

Подкачка памяти

Использование файла подкачки или раздела подкачки - это способ для операционной системы предоставить больше памяти, чем доступно физически, путем сохранения частей первичной памяти во вторичной памяти . Хотя многозадачность и подкачка памяти - это два совершенно не связанных между собой техники, они очень часто используются вместе, поскольку подкачка памяти позволяет загружать больше задач одновременно. Обычно многозадачная система позволяет запускать другой процесс, когда выполняющийся процесс достигает точки, в которой ему приходится ждать, пока некоторая часть памяти будет перезагружена из вторичного хранилища.

Программирование

Полностью независимые процессы не представляют больших проблем для программирования в многозадачной среде. Большая часть сложности в многозадачных системах возникает из-за необходимости разделять ресурсы компьютера между задачами и синхронизировать работу взаимодействующих задач.

Различные методы одновременных вычислений используются, чтобы избежать потенциальных проблем, вызванных попытками нескольких задач получить доступ к одному и тому же ресурсу.

Более крупные системы иногда строились с центральным процессором (-ами) и некоторым количеством процессоров ввода-вывода , что-то вроде асимметричной многопроцессорной обработки .

С годами системы многозадачности совершенствовались. Современные операционные системы обычно включают подробные механизмы для приоритезации процессов, в то время как симметричная многопроцессорная обработка привнесла новые сложности и возможности.

Читайте также: