Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Освоение среды операционной системы Microsoft W...doc
Скачиваний:
75
Добавлен:
09.11.2019
Размер:
6.83 Mб
Скачать

4.3. Порядок выполнения работы

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

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

  1. Изучение теоретического материала по теме лабораторной работы.

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

  3. Освоение приемов работы с Диспетчером задач и Планировщиком заданий.

  4. Освоение приемов настройки виртуальной памяти.

  5. Освоение других приемов оптимизации среды Windows XP.

  6. Выполнение специальных заданий.

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

4.4. Содержание отчета

  1. Цель работы.

  2. Описание результатов выполнения специальных заданий.

  3. Выводы по проделанной работе.

4.5. Контрольные вопросы и задания

  1. Для чего необходима индивидуальная настройка и оптимизация Windows XP?

  2. Что такое «Рабочий стол», каковы его основные параметры?

  3. Каковы цели настройки Рабочего стола?

  4. Перечислите основные направления настройки Рабочего стола.

  5. На основе анализа состояния и вида Рабочего стола сформулируйте предложения по его оптимизации.

  6. Как производится настройка отдельных элементов Рабочего стола?

  7. Какие два стиля меню «Пуск» вы знаете и как можно перейти от одного к другому?

  8. Расскажите об основных настройках меню «Пуск».

  9. Каким образом можно изменить оформление Windows XP (перейти к классическому стилю ОС)?

  10. Перечислите основные настройки свойств папки.

  11. К каким изменениям приводит отключение «Приветствия»?

  12. Каким образом можно настроить Панель задач?

  13. Каковы основные параметры Панели задач?

  14. Какие параметры можно оптимизировать в элементе «Свойства системы»?

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

  16. Опишите назначение и возможности Диспетчера задач.

  17. Опишите основные приемы работы с Диспетчером задач.

  18. Опишите назначение и возможности Планировщика заданий.

  19. Опишите основные приемы работы с Планировщиком заданий.

  20. Какими двумя подходами может быть осуществлена виртуализация памяти?

  21. Что такое файл подкачки и для каких целей он предназначен?

  22. Как можно изменить размер файла подкачки?

  23. Возможна ли работа Windows XP без файла подкачки?

  24. Как осуществляется выбор оптимального значения файла подкачки?

  25. Можно ли произвести дефрагментацию файла подкачки?

  26. Как выполняется автоматическая очистка файла подкачки?

  27. На основе анализа состояния и использования файловой системы сформулируйте предложения по их оптимизации (фрагментация, разделы, подкачка).

  28. За счет каких средств можно добиваться ускорения работы Windows XP?

  29. Опишите влияние визуальных эффектов Windows XP на ее быстродействие.

  30. Как можно изменять визуальные эффекты?

  31. Каким образом распределение времени процессора может влиять на быстродействие Windows XP?

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

  33. Используя средства Диспетчера задач, дайте оценку оптимальности процесса автозагрузки данного компьютера.

5. ЛАБОРАТОРНАЯ РАБОТА № 5 «Многозадачность и многопоточность в Windows XP»

5.1. Цель работы:

Изучение возможностей поддержки многозадачного и многопоточного режимов в среде Windows XP.

Получение навыков разработки многозадачных и многопоточных приложений.

5.2. Теоретическая часть

5.2.1. Общие сведения

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

При кооперативной многозадачности приложение само определяет момент, когда следует отдать ресурсы центрального процессора ядру ОС, и делает это «по своему усмотрению». При вытесняющей многозадачности приложение владеет всеми ресурсами центрального процессора только в течение заранее определенного времени – кванта. По истечении кванта ОС обязательно переключит процессор на выполнение другой задачи. Модель кооперативной многозадачности использовалась в очень старых версиях ОС Windows. Во всех современных ОС используется вытесняющее планирование и его различные вариации, поэтому необходимо знать о тех механизмах, которые использует ОС Windows XP для реализации именно этого вида многозадачности. В среде ОС Windows XP реализованы вытесняющая многозадачность и многопоточность для приложений Win32, а для приложений Win16 – кооперативная многозадачность.

Среда C++ Builder дает возможность создавать приложения для ОС Windows NT/98/Me/2000/XP, поддерживающих вытесняющую многоза­дачность. Это означает, что приложения работают как бы одновременно. Вре­мя работы процессора делится на короткие кванты, по истечении которых ОС переключает его с одной задачи на другую (задачи вытесняют друг друга). Если кванты времени достаточно малы, у пользовате­ля складывается впечатление, что задачи решаются одновременно.

Многозадачность дает следующие преимущества:

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

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

    • зацикливание одной задачи не приводит к блокированию всех остальных.

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

Задания, процессы, потоки и волокна. Ядро многозадачных ОС не знает, что такое «программа» или «приложение», вместо них оно использует такие базовые объекты, как процессы и потоки. Помимо базового набора объектов, которые реализованы в любых (или почти любых) многозадачных ОС, в Windows существуют и свои специфичные объекты – волокна/нити и задания.

Объект, наиболее близкий по своему смыслу к тому, что обычные пользователи привыкли называть «программой» – это процесс (process), загруженный и готовый к исполнению модуль кода, вместе с его контекстом (текущее значение счетчиков команд, других регистров процессора и переменных) и принадлежащие ему ресурсы. Ресурсами являются открытые файлы, очередь необработанных сообщений и многое другое. Различие между процессом и программой трудноуловимо, но, имеет принципиальное значение. Для процессов характерны следующие атрибуты: у каждого из них должна быть спроецированная в память программа, входные и выходные данные, а также текущее состояние, или контекст. Созданием процессов в основном занимается пользо­ватель, который запускает новые экземпляры приложений. Процесс – достаточно сложный объект, включающий в себя некоторое число более простых объектов – потоков.

Поток (thread) – это подпрограмма, выполняемая параллельно с главной программой (вообще говоря, главная программа тоже счи­тается потоком, но этот поток ассоциирован с целым процессом). Несколько потоков могут одновременно выполнять одну и ту же подпрограмму, причем все потоки имеют одно и то же виртуальное адресное пространство, обращаются к одним глобальным перемен­ным и ресурсам своего процесса. Поток – это элементарная единица исполнения, которыми, собственно, и управляет ОС, выделяет время процессора, реализуя многозадачность. У потока есть счетчик команд, регистры и стек, однако, в отличие от процессов, у них нет ни индивидуального адресного пространства, ни других принадлежащих им ресурсов. Например, в DOS каждая программа, по сути, была одним процессом, внутри которого имелся один, и только один поток. В ОС Windows это ограничение снято, в каждом процессе может быть много потоков, они представляют собой своеобразные «программы в программе». Процесс сам по себе выполняться не может – он только предоставляет потокам переменные окружения, контекст и адресное пространство. У всех потоков одного процесса единое адресное пространство – 4 Гб, и они могут равноправно его использовать (вернее, если в системе «настройки по умолчанию», они могут использовать только нижние 2 Гб, верхние 2 Гб зарезервированы для использования операционной системой). Здесь необходимо обратить внимание на то, что ни один поток не может быть запущен вне процесса, а при создании нового процесса, внутри него обязательно создается хотя бы один поток.

С помощью потоков можно, например, организовать одновременную проверку синтаксиса одного документа и редак­тирование другого. В приложении, работающем с БД, потоки по­зволяют выполнять длительные SQL-запросы параллельно с просмотром дру­гих данных. Создание, управление и синхронизация потоков полностью лежит на плечах программиста, эти вопросы и будут рассмотрены далее.

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

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

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

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

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

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

Windows делит потоки на более и менее важные. Вполне логично, что в первую очередь выполняются самые важные потоки, затем – чуть менее значимые и т. д., в последнюю же очередь (если до них вообще дойдет дело) – самые «ненужные». Низший приоритет имеет поток, заполняющий освобожденную процессами память. Приоритет потока может иметь значение в диапазоне от 0 до 31, причем в процессе работы он может изменяться. Текущий уровень приоритета определяется довольно сложным образом. Изначально он устанавливается на основе величины базового приоритета родительского процесса, который присваивается ему при запуске. Базовый приоритет процесса может иметь всего 6 значений: низкий – 4, ниже среднего – 6, средний – 8, выше среднего – 10, высокий – 13, реального времени – 24. Его можно изменить с помощью Диспетчера задач, окно которого (рис.40) появляется при нажатии клавиш Ctrl+Alt+Delete. Перейдя в нем на вкладку «Процессы», можно наблюдать процессы, которые выполняются в системе в настоящий момент.

Для настройки этой вкладки, необходимо открыть меню «Вид», и запустить команду «Выбрать столбцы» (рис.41).

Далее нужно галочкой выбрать столбцы, которые необходимо отображать. Например, нужно знать объем виртуальной памяти, выделяемый под каждый процесс, его базовый приоритет, а также число потоков данного процесса (рис.42).

Рис.40

Рис.41

Рис.42

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

Рис.43

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

Реализация многозадачности. Теоретически реализовать многозадачность достаточно просто: каждому исполняемому в данный момент потоку выделяется квант времени, в течение которого он будет выполняться, после истечения этого кванта (а в некоторых случаях даже раньше) ОС принудительно переключает процессор на выполнение другой программы. Но вот технически реализовать такой механизм гораздо сложнее, чем описать его на словах.

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

    • какая часть ОС (и как) будет управлять распределением процессорного времени между различными потоками, выполняющимися в данный момент;

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

    • как синхронизовать выполняющиеся параллельно потоки и процессы;

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

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

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

Попробуем разобраться с тем, каким образом достигается компромисс между отказоустойчивостью и производительностью в Windows. То есть, поговорим о том, как именно планирует выполнение потоков ядро ОС.

Как уже говорилось, при использовании вытесняющей многозадачности приложение само явным образом не возвращает ОС управление центральным процессором. Никто не пишет в прикладных программах код, вызывающий API-функции планировщика по истечении отведенного потоку кванта времени. Инициатором переключения процессора на другую задачу является таймер, достаточно часто посылающий аппаратные прерывания центральному процессору. Получив аппаратное прерывание, процессор тут же прерывает свою работу и начинает выполнять код, расположенный по определенному адресу в оперативной памяти. При этом каждому типу аппаратного прерывания сопоставлен свой определенный адрес памяти, а говоря точнее – указатель на начало блока памяти. Таблица соответствия номера прерывания с адресом блока кода для его обработки, называется таблицей диспетчеризации прерываний (Interrupt Dispatch Table, IDT). Эта схема работы прерываний сильно зависит от аппаратной реализации. При загрузке компьютера Windows заносит в IDT указатели на процедуры, обрабатывающие каждое прерывание, после чего защищает занятую память от модификации (устанавливая атрибут Read Only). Приоритет прерывания от таймера – один из самых высоких (его уровень равен 28, максимальный приоритет в Windows равен 31), поэтому, что бы ни случилось, примерно каждые 10 мс приходит прерывание от таймера, в этот момент выполняющийся поток аппаратно приостанавливается, и начинает выполняться специальным образом зарегистрированная в IDT процедура обслуживания прерывания – (Interrupt Service Routine, ISR). Сама она не выполняет диспетчеризацию, но может по завершении передать управление потоку с наивысшем приоритетом, ждущему в очереди потоков, готовых к выполнению, а это и есть планировщик. Передача управления происходит путем генерирования уже программного прерывания. При этом системе нежелательно находиться в состоянии обработки прерывания с высоким приоритетом, поскольку в это время все прерывания с более низким приоритетом запрещены. Это значит, что если бы, например, планировщик работал при уровне 28 одну секунду, все это время прерывания, связанные с движением мышки, процессору не поступали бы. Отложенную планировку как раз и удобно организовать с помощью генерирования программного прерывания с невысоким приоритетом. Тогда процессор очень быстро обработает ISR аппаратного прерывания таймера с уровнем 28, сгенерирует прерывание DPC с уровнем 2 и тут же понизит уровень запрещенных прерываний, так что все они в диапазоне от 3 до 28 «освободятся».

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

    • при изменении приоритета одного из потоков;

    • при появлении нового потока, готового к выполнению;

    • по истечении кванта времени, выделенного выполняющемуся потоку;

    • в результате остановки потока (например, он ожидает на каком-нибудь объекте);

    • (в многопроцессорных системах) при изменении предпочтительного процессора для текущего потока.

Квант времени, выделяемый потоку в Windows XP, не равен интервалу между двумя срабатываниями системного таймера, и может даже принимать не кратные ему значения. Он измеряется в так называемых «квантовых единицах времени». Период между двумя прерываниями от таймера соответствует 3 квантовым единицам времени. Если вспомнить, что период срабатывания таймера может тоже быть разным в разных системах, (это зависит, в первую очередь, от аппаратной конфигурации), все становится еще более запутанным. Тем не менее, важно запомнить: между двумя срабатываниями таймера укладывается 3 квантовых единицы. Каждый раз, когда приходит прерывание от таймера, из счетчика времени выполняющегося в данный момент потока вычитаются как раз эти 3 единицы. В ОС Windows XP один квант, выделяемый потоку, равен 6 квантовым единицам (то есть 2 «тикам» таймера) для настольных систем или 36 единицам (то есть 12 «тикам» таймера) для сервера. При желании эти значения можно изменить. На вкладке «Дополнительно» свойств «Моего компьютера», имеется кнопка «Параметры быстродействия», используя которую, можно поменять значение кванта по умолчанию. Переключатель в положении «Обеспечить наилучшее быстродействие» сделает кванты короткими (равными 6 квантовым единицам), «для служб, работающих в фоновом режиме» – длинными (равными 36 квантовым единицам).

Кроме того, сама ОС кроме динамического изменения приоритета какого-либо потока может изменять и длину выделяемого ему кванта времени (сохраняя его кратным 3 квантовым единицам). Квант выражается величиной, кратной 3, поскольку это позволит уменьшать значение кванта по завершении ожидания на величину, меньшую, чем тик таймера (например, на 1 или 2), и улучшит планирование.

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

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

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