МЕНЮ


Фестивали и конкурсы
Семинары
Издания
О МОДНТ
Приглашения
Поздравляем

НАУЧНЫЕ РАБОТЫ


  • Инновационный менеджмент
  • Инвестиции
  • ИГП
  • Земельное право
  • Журналистика
  • Жилищное право
  • Радиоэлектроника
  • Психология
  • Программирование и комп-ры
  • Предпринимательство
  • Право
  • Политология
  • Полиграфия
  • Педагогика
  • Оккультизм и уфология
  • Начертательная геометрия
  • Бухучет управленчучет
  • Биология
  • Бизнес-план
  • Безопасность жизнедеятельности
  • Банковское дело
  • АХД экпред финансы предприятий
  • Аудит
  • Ветеринария
  • Валютные отношения
  • Бухгалтерский учет и аудит
  • Ботаника и сельское хозяйство
  • Биржевое дело
  • Банковское дело
  • Астрономия
  • Архитектура
  • Арбитражный процесс
  • Безопасность жизнедеятельности
  • Административное право
  • Авиация и космонавтика
  • Кулинария
  • Наука и техника
  • Криминология
  • Криминалистика
  • Косметология
  • Коммуникации и связь
  • Кибернетика
  • Исторические личности
  • Информатика
  • Инвестиции
  • по Зоология
  • Журналистика
  • Карта сайта
  • Теория многозадачности и многопоточности

    Теория многозадачности и многопоточности

    Введение

    К моменту появления персональных компьютеров в мире существовало

    несколько технических решений позволяющих реализовать многозадачность на

    больших машинах. В бывшем СССР это были машины серии ЕС и болгарские ИЗОТ.

    Они теоретически позволяли подключать до 255 терминалов, где каждому

    терминалу выделялось некоторое количество ресурсов компьютера и

    процессорного времени. На практике нормальная работа такого комплекса

    обеспечивалась при наличии не более 25-30 терминалов, или меньше при

    сложных задачах.

    Для персональных ЭВМ многозадачность не вводилась принципиально. Ведь

    исходя из названия PC – “Personal Computer” предполагалось, что работать

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

    была принята переработанная система CP/M под названием MS-DOS. Она так же

    не предусматривала многозадачности. Основная проблема разработки

    многозадачной операционной системы это не реентерабильность ее функций. То

    есть если один процесс запустил функцию чтения файла, то другой процесс не

    сможет не только обращаться к файлам, но и вообще вызвать другие ее

    функции. Для этого необходима поддержка на уровне процессора которая была

    введена с разработкой линейки 286.

    Многозадачность и многопоточность 1

    Режимы многозадачности 2

    Многозадачность в DOS 2

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

    Presentation Manager и последовательная очередь сообщений 6

    Решения, использующие многопоточность 7

    Многопоточная архитектура 9

    Коллизии, возникающие при использовании потоков 10

    Преимущества Windows 11

    Новая усовершенствованная многопоточная программа 13

    О использовании функции Sleep 13

    Критический раздел 14

    Объект Mutex 17

    Уведомления о событиях 18

    Локальная память потока 18

    Многозадачность и многопоточность

    Многозадачность (multitasking) – это способность операционной системы

    выполнять несколько программ одновременно. В основе этого принципа лежит

    использование операционной системой аппаратного таймера для выделения

    отрезков времени (time slices) для каждого из одновременно выполняемых

    процессов. Если эти отрезки времени достаточно малы, и машина не

    перегружена слишком большим числом программ, то пользователю кажется, что

    все эти программы выполняются параллельно.

    Идея многозадачности не нова. Многозадачность реализуется на больших

    компьютерах типа мэйнфрэйм (mainframe), к которым подключены десятки, а

    иногда и сотни, терминалов. У каждого пользователя, сидящего за экраном

    такого терминала, создается впечатление, что он имеет эксклюзивный доступ

    ко всей машине. Кроме того, операционные системы мэйнфрэймов часто дают

    возможность пользователям перевести задачу в фоновый режим, где они

    выполняются в то время, как пользователь может работать с другой

    программой.

    Для того, чтобы многозадачность стала реальностью на персональных

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

    приближаемся к эпохе использования многозадачности на ПК (PC). Как мы

    увидим вскоре, некоторые расширенные 16-разрядные версии Windows

    поддерживают многозадачность, а имеющиеся теперь в нашем распоряжении

    Windows NT и Windows 95 – 32-разрядные версии Windows, поддерживают кроме

    многозадачности еще и многопоточность (multithreading).

    Многопоточность – это возможность программы самой быть многозадачной.

    Программа может быть разделена на отдельные потоки выполнения (threads),

    которые, как кажется, выполняются параллельно. На первый взгляд эта

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

    могут использовать многопоточность для выполнения протяженных во времени

    операций в фоновом режиме, не вынуждая пользователя надолго отрываться от

    машины.

    Режимы многозадачности

    На заре использования персональных компьютеров некоторые отстаивали

    идею многозадачности для будущего, но многие ломали головы над вопросом:

    какая польза от многозадачности на однопользовательской машине? В

    действительности оказалось, что многозадачность – это именно то, что

    необходимо пользователям, даже не подозревавшим об этом.

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

    Микропроцессор Intel 8088, использовавшийся в первых ПК, не был

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

    (как было показано в предыдущей главе) заключалась в недостатках управления

    памятью. В то время, как множество программ начинает и заканчивает свое

    выполнение, многозадачная операционная система должна осуществлять

    перемещение блоков памяти для объединения свободного пространства. На

    процессоре 8088 это было невозможно реализовать в стиле, прозрачном для

    приложений.

    Сама DOS не могла здесь чем-либо существенно помочь. Будучи

    разработанной таким образом, чтобы быть маленькой и не мешать приложениям,

    DOS поддерживала, кроме загрузки программ и обеспечения им доступа к

    файловой системе, еще не так много средств.

    Тем не менее, творческие программисты, работавшие с DOS на заре ее

    появления, нашли путь преодоления этих препятствий, преимущественно при

    использовании резидентных (terminate-and-stay-resident, TSR) программ.

    Некоторые TSR-программы, такие как спулер печати, использовали прерывание

    аппаратного таймера для выполнения процесса в фоновом режиме. Другие,

    подобно всплывающим (popup) утилитам, таким как SideKick, могли выполнять

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

    работы утилиты. DOS также была усовершенствована для обеспечения поддержки

    резидентных программ.

    Некоторые производители программного обеспечения пытались создать

    многозадачные оболочки или оболочки, использующие переключение между

    задачами, как надстройки над DOS (например, Quarterdeck's DeskView), но

    только одна из этих оболочек получила широкое распространение на рынке.

    Это, конечно. Windows.

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

    Когда Microsoft выпустила на рынок Windows 1.0 в 1985 году, это было

    еще в большой степени искусственным решением, придуманным для преодоления

    ограничений MS DOS. В то время Windows работала в реальном режиме (real

    mode), но даже тогда она была способна перемещать блоки физической памяти

    (одно из необходимых условий многозадачности) и делала это, хотя и не очень

    прозрачно для приложений, но все-таки вполне удовлетворительно.

    В графической оконной среде многозадачность приобретает гораздо

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

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

    системе UNIX, работающей с командной строкой, существует возможность

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

    фоновом режиме. Однако, любой вывод на экран из программы должен быть

    переадресован в файл, иначе этот вывод смешается с текущим содержимым

    экрана.

    Оконная оболочка позволяет нескольким программам выполняться

    совместно, разделяя один экран. Переключение вперед и назад становится

    тривиальным, существует возможность быстро передавать данные из одной

    программы в другую, например, разместить картинку, созданную в программе

    рисования, в текстовом файле, образованном с помощью текстового процессора.

    Передача данных поддерживалась в различных версиях Windows: сначала с

    использованием папки обмена (clipboard), позднее – посредством механизма

    динамического обмена данными (Dynamic Data Exchange, DDE), сейчас – через

    внедрение и связывание объектов (Object Linking and Embedding, OLE).

    И все же, реализованная в ранних версиях Windows многозадачность не

    была традиционной вытесняющей, основанной на выделении отрезков времени,

    как в многопользовательских операционных системах. Такие операционные

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

    выполнения одной задачи и запуска другой. 16-разрядные версии Windows

    поддерживали так называемую невытесняющую многозадачность (non-preemptive

    multitasking). Такой тип многозадачности был возможен благодаря основанной

    на сообщениях архитектуре Windows. В общем случае, Windows-программа

    находилась в памяти и не выполнялась до тех пор, пока не получала

    сообщение. Эти сообщения часто являлись прямым или косвенным результатом

    ввода информации пользователем с клавиатуры или мыши. После обработки

    сообщения программа возвращала управление обратно Windows.

    16-разрядные версии Windows не имели возможности произвольно

    переключать управление с одной Windows-программы на другую, основываясь на

    квантах времени таймера. Переключение между задачами происходило в момент,

    когда программа завершала обработку сообщения и возвращала управление

    Windows. Такую невытесняющую многозадачность называют также кооперативной

    многозадачностью (cooperative multitasking) потому, что она требует

    некоторого согласования между приложениями. Одна Windows-программа могла

    парализовать работу всей системы, если ей требовалось много времени для

    обработки сообщения.

    Хотя невытесняющая многозадачность была основным типом многозадачности

    в 16-разрядных версиях Windows, некоторые элементы вытесняющей

    (примитивной, preemptive) многозадачности в них тоже присутствовали.

    Windows использовала вытесняющую многозадачность для выполнения DOS-

    программ, а также позволяла библиотекам динамической компоновки (DLL)

    получать прерывания аппаратного таймера для задач мультимедиа.

    16-разрядные версии Windows имели некоторые особенности, которые

    помогали программистам если не разрешить, то, по крайней мере, справиться с

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

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

    это не решение проблемы, а только лишь возможность дать знать пользователю,

    что программа занята выполнением протяженной во времени работы, и что

    система какое-то время будет недоступна. Другим частичным решением является

    использование системного таймера Windows, что позволяет выполнять какие-

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

    часов и приложениях, работающих с анимацией.

    Другим решением по преодолению ограничений невытесняющей

    многозадачности является вызов функции PeekMessage, как мы видели в

    программе RANDRECT в главе 4. Обычно программа использует вызов функции

    GetMes-sage для извлечения сообщений из очереди. Однако, если в данный

    момент времени очередь сообщений пуста, то функция GetMessage будет ждать

    поступления сообщения в очередь, а затем возвратит его. Функция PeekMessage

    работает иначе – она возвращает управление программе даже в том случае,

    если нет сообщений в очереди. Таким образом, выполнение работы, требующей

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

    не появятся сообщения для данной или любой другой программы.

    Presentation Manager и последовательная очередь сообщений

    Первой попыткой фирмы Microsoft (в сотрудничестве с IBM) внедрить

    многозадачность в квази-DOS/Windows оболочку была система OS/2 и

    Presentation Manager (PM). Хотя OS/2, конечно, поддерживала вытесняющую

    многозадачность, часто казалось, что это вытеснение не было перенесено в

    PM. Дело в том, что PM выстраивал в очередь сообщения, формируемые в

    результате пользовательского ввода от клавиатуры или мыши. Это означает,

    что PM не предоставляет программе такое пользовательское сообщение до тех

    пор, пока предыдущее сообщение, введенное пользователем, не будет полностью

    обработано.

    Хотя сообщения от клавиатуры или мыши – это только часть множества

    сообщений, которые может получить программа в PM или Windows, большинство

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

    мышью. Например, сообщение от меню команд является результатом выбора

    пункта меню с помощью клавиатуры или мыши. Сообщение от клавиатуры или мыши

    не будет обработано до тех пор, пока не будет полностью обработано

    сообщение от меню.

    Основная причина организации последовательной очереди сообщений

    состоит в том, чтобы отследить все действия пользователя. Если какое-либо

    сообщение от клавиатуры или мыши вызывает переход фокуса ввода от одного

    окна к другому, то следующее сообщение клавиатуры должно быть направлено в

    окно, на которое установился фокус ввода. Таким образом, система не знает,

    в какое окно передавать сообщение на обработку до тех пор, пока не будет

    обработано предыдущее сообщение.

    В настоящее время принято соглашение о том, что не должно быть

    возможности для какого-либо одного приложения парализовать работу всей

    системы, и что требуется использовать непоследовательную очередь сообщений,

    поддерживаемую системами Windows 95 и Windows NT. Если одна программа

    занята выполнением протяженной во времени операции, то существует

    возможность переключить фокус ввода на другое приложение.

    Решения, использующие многопоточность

    Выше был рассмотрен Presentation Manager операционной системы OS/2

    только из-за того, что это была первая оболочка, которая подготовила

    сознание некоторых ветеранов программирования под Windows (в том числе и

    автора) к введению многопоточности. Интересно, что ограниченная поддержка

    многопоточности в РМ дала программистам основную идею организации программ,

    использующих многопоточность. Хотя эти ограничения сейчас преимущественно

    преодолены в Windows 95, тем не менее уроки, полученные при работе с более

    ограниченными системами, остаются актуальными и по сей день.

    В многопоточной среде программы могут быть разделены на части,

    называемые потоками выполнения (threads), которые выполняются одновременно.

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

    последовательной очереди сообщений в РМ и приобретает полный смысл при ее

    реализации в Windows 95.

    В терминах программы "поток" – это просто функция, которая может также

    вызывать другие функции программы. Программа начинает выполняться со своего

    главного (первичного) потока, который в традиционных программах на языке С

    является функцией main, а в Windows-программах – WinMain. Будучи

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

    системный вызов с указанием функции инициализации потока (initial threading

    function). Операционная система в вытесняющем режиме переключает управление

    между потоками подобно тому, как она это делает с процессами.

    В РМ системы OS/2 любой поток может либо создавать очередь сообщений,

    либо не создавать. РМ-поток должен создавать очередь сообщений, если он

    собирается создавать окно. С другой стороны, поток может не создавать

    очередь сообщений, если он осуществляет только обработку данных или

    графический вывод. Поскольку потоки, не создающие очереди сообщений, не

    обрабатывают сообщения, то они не могут привести к "зависанию" системы. На

    поток, не имеющий очереди сообщений, накладывается только одно ограничение

    – он не может посылать асинхронное сообщение в окно потока, имеющего

    очередь сообщений, или вызывать какую-либо функцию, если это приведет к

    посылке сообщения. (Однако эти потоки могут посылать синхронные сообщения

    потокам, имеющим очередь сообщений.)

    Таким образом, программисты, работавшие с РМ, научились разбивать свои

    программы на один поток с очередью сообщений, создающий все окна и

    обрабатывающий сообщения для них, и один или несколько потоков, не имеющих

    очередей сообщений, и выполняющих продолжительные действия в фоновом

    режиме. Кроме того, программисты, работавшие с РМ, узнали о "правиле 1/10

    секунды". Оно состоит в том, что поток с очередью сообщений тратит не более

    1/10 секунды на обработку любого сообщения. Все, что требует большего

    времени, следовало выделять в отдельный поток. Если все программисты

    придерживались этого правила, то никакая РМ-программа не могла вызвать

    зависание системы более чем на 1/10 секунды.

    Многопоточная архитектура

    Как уже отмечалось выше, ограничения РМ дали программистам основные

    идеи для понимания того, как использовать множество потоков в программе,

    выполняемой в графической среде. Ниже приведены наши рекомендации по

    архитектуре многопоточных программ: первичный или главный (primary) поток

    вашей программы создает все окна и соответствующие им оконные процедуры,

    необходимые в программе и обрабатывает все сообщения для этих окон. Все

    остальные потоки – это просто фоновые задачи. Они не имеют интерактивной

    связи с пользователем, кроме как через первичный поток.

    Один из способов добиться этого состоит в том, чтобы первичный поток

    обрабатывал пользовательский ввод и другие сообщения, возможно создавая при

    этом вторичные (secondary) потоки в процессе. Эти вторичные потоки

    выполняют не связанные с пользователем задачи.

    Другими словами, первичный поток вашей программы является

    губернатором, а вторичные потоки – свитой губернатора. Губернатор поручает

    всю большую работу своим помощникам на то время, пока он осуществляет

    контакты с внешним миром. Поскольку вторичные потоки являются членами

    свиты, они не могут проводить свои пресс-конференции. Они скромно выполняют

    каждый свое задание, делают отчет губернатору и ждут новых указаний.

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

    Страницы: 1, 2


    Приглашения

    09.12.2013 - 16.12.2013

    Международный конкурс хореографического искусства в рамках Международного фестиваля искусств «РОЖДЕСТВЕНСКАЯ АНДОРРА»

    09.12.2013 - 16.12.2013

    Международный конкурс хорового искусства в АНДОРРЕ «РОЖДЕСТВЕНСКАЯ АНДОРРА»




    Copyright © 2012 г.
    При использовании материалов - ссылка на сайт обязательна.