Многозадачность компьютера
В вычислительной технике многозадачность — это одновременное выполнение нескольких задач (также известных как процессы ) в течение определенного периода времени. Новые задачи могут прерывать уже начатые до их завершения, вместо того, чтобы ждать их завершения. В результате компьютер выполняет сегменты нескольких задач чередующимся образом, при этом задачи используют общие ресурсы обработки, такие как центральные процессоры (ЦП) и оперативную память . Многозадачность автоматически прерывает работающую программу, сохраняя ее состояние (частичные результаты, содержимое памяти и содержимое регистров компьютера) и загружая сохраненное состояние другой программы и передавая ей управление. Это « переключение контекста » может быть инициировано через фиксированные интервалы времени ( вытесняющая многозадачность ), или работающая программа может быть закодирована так, чтобы сигнализировать управляющему программному обеспечению, когда ее можно прервать ( кооперативная многозадачность ).
Многозадачность не требует параллельного выполнения нескольких задач одновременно; вместо этого он позволяет выполнять более одной задачи в течение заданного периода времени. [1] Даже на многопроцессорных компьютерах многозадачность позволяет выполнять гораздо больше задач, чем имеется процессоров.
Многозадачность является общей чертой компьютерных операционных систем, по крайней мере, с 1960-х годов. Это позволяет более эффективно использовать компьютерное оборудование; когда программа ожидает завершения какого-либо внешнего события, такого как ввод пользователя или передача ввода-вывода с периферийным устройством, центральный процессор все равно может использоваться с другой программой. В системе с разделением времени несколько человек-операторов используют один и тот же процессор, как если бы он был предназначен для их использования, в то время как за кулисами компьютер обслуживает множество пользователей, выполняя в режиме многозадачности их отдельные программы. В мультипрограммных системах задача выполняется до тех пор, пока ей не придется ждать внешнего события или пока планировщик операционной системы принудительно не вытеснит выполняющуюся задачу из ЦП. Системы реального времени , например, предназначенные для управления промышленными роботами, требуют своевременной обработки; один процессор может использоваться совместно для вычислений движения машины, связи и пользовательского интерфейса. [2]
Часто многозадачные операционные системы включают меры по изменению приоритета отдельных задач, чтобы важные задания получали больше процессорного времени, чем те, которые считаются менее важными. В зависимости от операционной системы задача может достигать размера всей прикладной программы или может состоять из более мелких потоков , выполняющих части всей программы.
Процессор, предназначенный для использования с многозадачными операционными системами, может включать в себя специальное оборудование для безопасной поддержки нескольких задач, например, защиту памяти и защитные кольца , которые гарантируют, что контролирующее программное обеспечение не может быть повреждено или нарушено программными ошибками пользовательского режима.
Термин «многозадачность» стал международным термином, поскольку это же слово используется во многих других языках, таких как немецкий, итальянский, голландский, румынский, чешский, датский и норвежский.
Мультипрограммирование [ править ]
На заре вычислительной техники процессорное время было дорогим, а периферийные устройства работали очень медленно. Когда на компьютере запускалась программа, которой требовался доступ к периферийному устройству, центральному процессору (ЦП) приходилось прекращать выполнение программных инструкций, пока периферийное устройство обрабатывало данные. Обычно это было очень неэффективно. Мультипрограммирование — это вычислительная техника, которая позволяет одновременно загружать и выполнять несколько программ в памяти компьютера, позволяя процессору быстро переключаться между ними. Это оптимизирует загрузку ЦП, заставляя его участвовать в выполнении задач, что особенно полезно, когда одна программа ожидает завершения операций ввода-вывода.
Bull Gamma 60 , первоначально разработанный в 1957 году и впервые выпущенный в 1960 году, был первым компьютером, разработанным с учетом мультипрограммирования. Его архитектура включала центральную память и дистрибьютор программ, снабжающих кодом и данными до двадцати пяти автономных процессоров и позволяющих одновременную работу нескольких кластеров.
Еще одним таким компьютером был LEO III , впервые выпущенный в 1961 году. Во время пакетной обработки в память компьютера загружалось несколько различных программ, и первая из них начинала работать. Когда первая программа достигла инструкции, ожидающей периферийного устройства, контекст этой программы был сохранен, и вторая программа в памяти получила возможность запуститься. Процесс продолжался до тех пор, пока все программы не завершили работу. [3]
Использование мультипрограммирования расширилось с появлением виртуальной памяти и технологии виртуальных машин , которые позволили отдельным программам использовать память и ресурсы операционной системы, как если бы другие одновременно работающие программы для всех практических целей не существовали. [ нужна ссылка ]
Мультипрограммирование не дает гарантии, что программа будет запущена своевременно. Действительно, первая программа вполне может работать часами без необходимости доступа к периферийному устройству. Поскольку у интерактивного терминала не было пользователей, проблем не было: пользователи сдавали оператору колоду перфокарт и через несколько часов возвращались за распечатанными результатами. Мультипрограммирование значительно сократило время ожидания при обработке нескольких пакетов. [4] [5]
Кооперативная многозадачность [ править ]
Ранние многозадачные системы использовали приложения, которые добровольно уступали время друг другу. Этот подход, который в конечном итоге был поддержан многими компьютерными операционными системами , сегодня известен как кооперативная многозадачность. Хотя сейчас она редко используется в более крупных системах, за исключением конкретных приложений, таких как CICS или подсистема JES2 , кооперативная многозадачность когда-то была единственной схемой планирования, используемой Microsoft Windows и классической Mac OS для обеспечения одновременного запуска нескольких приложений. Кооперативная многозадачность до сих пор используется в системах RISC OS . [6]
Поскольку совместно многозадачная система полагается на то, что каждый процесс регулярно отдает время другим процессам в системе, одна плохо спроектированная программа может потреблять все время ЦП для себя, либо выполняя обширные вычисления, либо занимаясь ожиданием ; всей системы оба могут привести к зависанию . В серверной среде это опасность, которая делает всю среду неприемлемо хрупкой.
Вытесняющая многозадачность [ править ]
Вытесняющая многозадачность позволяет компьютерной системе более надежно гарантировать каждому процессу регулярный «кусочек» рабочего времени. Это также позволяет системе быстро реагировать на важные внешние события, такие как входящие данные, которые могут потребовать немедленного внимания того или иного процесса. Операционные системы были разработаны для использования преимуществ этих аппаратных возможностей и упреждающего запуска нескольких процессов. Вытесняющая многозадачность была реализована в PDP-6 Monitor and Multics в 1964 году, в OS/360 MFT в 1967 году и в Unix в 1969 году и была доступна в некоторых операционных системах для таких маленьких компьютеров, как DEC PDP-8; это основная функция всех Unix-подобных операционных систем, таких как Linux , Solaris и BSD с их производными , [7] а также современные версии Windows.
В любой конкретный момент времени процессы можно сгруппировать в две категории: те, которые ожидают ввода или вывода (так называемые « с привязкой ввода-вывода »), и те, которые полностью используют ЦП (« с привязкой к ЦП »). В примитивных системах программное обеспечение часто « опрашивало » или « ожидало занятости », ожидая запрошенного ввода (например, ввода с диска, клавиатуры или сети). За это время система не выполняла полезной работы. С появлением прерываний и вытесняющей многозадачности процессы, связанные с вводом-выводом, можно было «заблокировать» или приостановить до прибытия необходимых данных, позволяя другим процессам использовать ЦП. Поскольку поступление запрошенных данных приведет к прерыванию, заблокированным процессам может быть гарантировано своевременное возвращение к выполнению. [ нужна ссылка ]
Вероятно, самой ранней вытесняющей многозадачной ОС, доступной для домашних пользователей, была Microware от OS-9 , доступная для компьютеров на базе Motorola 6809, таких как TRS-80 Color Computer 2 , [8] с операционной системой, поставляемой Tandy в качестве обновления для дисковых систем. [9] В 1984 году последовал Sinclair QDOS на Sinclair QL , но он не имел большого успеха. В следующем году была выпущена Commodore Amiga , предлагающая сочетание многозадачности и мультимедийных возможностей. Microsoft сделала вытесняющую многозадачность основной функцией своей флагманской операционной системы в начале 1990-х годов при разработке Windows NT 3.1 , а затем Windows 95 . В 1988 году Apple предложила A/UX как основанную на UNIX System V альтернативу классической Mac OS . В 2001 году Apple перешла на NeXTSTEP под влиянием Mac OS X .
Похожая модель используется в Windows 9x и семействе Windows NT , где собственные 32-разрядные приложения выполняются в многозадачном режиме с упреждением. [10] 64-разрядные версии Windows, как для архитектуры x86-64 , так и для Itanium , больше не поддерживают устаревшие 16-разрядные приложения и, таким образом, обеспечивают вытесняющую многозадачность для всех поддерживаемых приложений.
В реальном времени [ править ]
Другая причина многозадачности заключалась в разработке вычислительных систем реального времени , где существует ряд, возможно, несвязанных между собой внешних действий, которые необходимо контролировать с помощью одной процессорной системы. В таких системах иерархическая система прерываний сочетается с определением приоритетов процессов, чтобы гарантировать, что ключевым действиям будет уделяться большая доля доступного времени процесса . [11]
Многопоточность [ править ]
Поскольку многозадачность значительно повысила производительность компьютеров, программисты начали реализовывать приложения как наборы взаимодействующих процессов (например, один процесс собирает входные данные, один процесс обрабатывает входные данные, один процесс записывает результаты на диск). Однако для этого потребовались некоторые инструменты, позволяющие процессам эффективно обмениваться данными. [ нужна ссылка ]
Потоки возникли из идеи, что наиболее эффективным способом взаимодействия процессов для обмена данными будет совместное использование всего их пространства памяти. Таким образом, потоки фактически представляют собой процессы, которые выполняются в одном и том же контексте памяти и совместно используют другие ресурсы со своими родительскими процессами , например открытые файлы. Потоки описываются как облегченные процессы , поскольку переключение между потоками не требует изменения контекста памяти. [12] [13] [14]
Хотя потоки планируются упреждающе, некоторые операционные системы предоставляют вариант потоков, называемый волокнами , которые планируются совместно. В операционных системах, которые не предоставляют волокна, приложение может реализовать свои собственные волокна, используя повторяющиеся вызовы рабочих функций. Волокна даже более легкие, чем потоки, и их несколько проще программировать, хотя они имеют тенденцию терять некоторые или все преимущества потоков на машинах с несколькими процессорами . [15]
Некоторые системы напрямую поддерживают многопоточность аппаратно .
Защита памяти [ править ]
Важнейшим элементом любой многозадачной системы является безопасное и эффективное разделение доступа к системным ресурсам. Доступ к памяти должен строго контролироваться, чтобы гарантировать, что ни один процесс не сможет случайно или намеренно прочитать или записать данные в области памяти за пределами адресного пространства процесса. Это делается с целью общей стабильности системы и целостности данных, а также безопасности данных.
В общем, управление доступом к памяти является обязанностью ядра операционной системы в сочетании с аппаратными механизмами, обеспечивающими вспомогательные функции, такими как блок управления памятью (MMU). Если процесс пытается получить доступ к ячейке памяти за пределами своего пространства памяти, MMU отклоняет запрос и сигнализирует ядру о необходимости предпринять соответствующие действия; обычно это приводит к принудительному прекращению нарушающего процесса. В зависимости от конструкции программного обеспечения и ядра, а также конкретной ошибки пользователь может получить сообщение об ошибке нарушения доступа, например «ошибка сегментации».
В хорошо спроектированной и правильно реализованной многозадачной системе данный процесс никогда не может напрямую обращаться к памяти, принадлежащей другому процессу. Исключением из этого правила является разделяемая память; например, в System V механизме межпроцессного взаимодействия ядро выделяет память для совместного использования несколькими процессами. Такие функции часто используются программным обеспечением для управления базами данных, например PostgreSQL.
Неадекватные механизмы защиты памяти, либо из-за недостатков в их конструкции, либо из-за плохой реализации, допускают уязвимости безопасности, которые потенциально могут быть использованы вредоносным программным обеспечением.
Подмена памяти [ править ]
Использование файла подкачки или раздела подкачки позволяет операционной системе выделить больше памяти, чем физически доступно, сохраняя части основной памяти во вторичном хранилище . Хотя многозадачность и подкачка памяти — это два совершенно не связанных друг с другом метода, они очень часто используются вместе, поскольку подкачка памяти позволяет загружать больше задач одновременно. Обычно многозадачная система позволяет запустить другой процесс, когда работающий процесс достигает точки, когда ему приходится ждать перезагрузки некоторой части памяти из вторичного хранилища. [16]
Программирование [ править ]
Полностью независимые процессы не представляют особых проблем для программирования в многозадачной среде. Большая часть сложности многозадачных систем связана с необходимостью распределять компьютерные ресурсы между задачами и синхронизировать работу взаимодействующих задач. [ нужна ссылка ]
Различные методы параллельных вычислений используются, чтобы избежать потенциальных проблем, вызванных попытками нескольких задач получить доступ к одному и тому же ресурсу. [ нужна ссылка ]
Большие системы иногда строились с центральным процессором(ами) и некоторым количеством процессоров ввода-вывода , что представляло собой своего рода асимметричную многопроцессорную обработку . [ нужна ссылка ]
С годами многозадачные системы совершенствовались. Современные операционные системы обычно включают подробные механизмы определения приоритетов процессов, в то время как симметричная многопроцессорность привнесла новые сложности и возможности. [17]
См. также [ править ]
Ссылки [ править ]
- ^ «Параллелизм против параллелизма, параллельное программирование против параллельного программирования» . Оракул. Архивировано из оригинала 7 апреля 2016 года . Проверено 23 марта 2016 г.
- ^ Энтони Ралстон, Эдвин Д. Рейли (редактор), Энциклопедия компьютерных наук, третье издание , Ван Ностранд Рейнхольд, 1993, ISBN 0-442-27679-6 , статьи «Многозадачность» и «Многопрограммирование».
- ^ МАГИСТЕРСКАЯ ПРОГРАММА И СИСТЕМА ИСПЫТАНИЯ ПРОГРАММ ЧАСТЬ 1 СПЕЦИФИКАЦИЯ МАГИСТЕРСКОЙ ПРОГРАММЫ . Февраль 1965 г. раздел 6 «ПРИОРИТЕТНЫЕ ПРОЦЕДУРЫ КОНТРОЛЯ».
- ^ Литми (20 мая 2019 г.). «В чем разница между пакетной обработкой и мультипрограммированием» . Pediaa.Com . Проверено 14 апреля 2020 г.
- ^ «Эволюция операционной системы» . 29 сентября 2017 г. Проверено 14 апреля 2020 г.
- ^ «Вытесняющая многозадачность» . riscos.info . 03.11.2009 . Проверено 27 июля 2014 г.
- ^ «UNIX, часть первая» . Инициатива цифровых исследований . ibiblio.org. 30 января 2002 г. Проверено 9 января 2014 г.
- ^ Даунард, Дэн (сентябрь 1983 г.). «Динамический Уно» . Радуга . стр. 236–240 . Проверено 9 мая 2024 г.
- ^ 1984 Каталог ТРС-80 . Корпорация Танди. 1984. стр. 53–54 . Проверено 14 мая 2024 г.
- ^ Джозеф Моран (июнь 2006 г.). «Windows 2000 и 16-разрядные приложения» . Умные вычисления . Том. 16, нет. 6. С. 32–33. Архивировано из оригинала 25 января 2009 года.
- ^ Лю, CL; Лейланд, Джеймс В. (1 января 1973 г.). «Алгоритмы планирования для мультипрограммирования в среде жесткого реального времени» . Журнал АКМ . 20 (1): 46–61. дои : 10.1145/321738.321743 . ISSN 0004-5411 . S2CID 59896693 .
- ^ Эдуардо Сильендо; Такечика Кунимаса (25 апреля 2008 г.). «Руководство по производительности и настройке Linux» (PDF) . redbooks.ibm.com . ИБМ . п. 4. Архивировано из оригинала (PDF) 26 февраля 2015 года . Проверено 1 марта 2015 г.
- ^ «Определение переключения контекста» . linfo.org . 28 мая 2006. Архивировано из оригинала 18 февраля 2010 года . Проверено 26 февраля 2015 г.
- ^ «Что такое потоки (пользователь/ядро)?» . tldp.org . 8 сентября 1997 года . Проверено 26 февраля 2015 г.
- ^ Различные методы многозадачности Доступ: 19 февраля 2019 г.
- ^ «Что такое файл подкачки?» . kb.iu.edu . Проверено 26 марта 2018 г.
- ^ «Архитектура операционных систем» . cis2.oc.ctc.edu . Проверено 17 марта 2018 г.