Windows Vista это версия Microsoft Windows, из серии графических операционных систем для персональных компьютеров, используется как для дома так и для работы icon

Windows Vista это версия Microsoft Windows, из серии графических операционных систем для персональных компьютеров, используется как для дома так и для работы






Скачать 365.86 Kb.
НазваниеWindows Vista это версия Microsoft Windows, из серии графических операционных систем для персональных компьютеров, используется как для дома так и для работы
Дата конвертации15.01.2013
Размер365.86 Kb.
ТипДокументы
ОГЛАВЛЕНИЕ





Введение


Windows Vista – это версия Microsoft Windows, из серии графических операционных систем для персональных компьютеров, используется как для дома так и для работы. До объявления о ее разработке 22 июля 2005, Vista была известна как Longhorn. 8 ноября 2006, разработка Windows Vista была завершена и версия вышла в продажу.

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

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

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

  1. Осветить сущность многозадачности.

  2. Изучить модель режима многозадачности.

  3. Уделить особое внимание рассмотрению реализации многозадачности в Windows Vista.

Объектом исследования в данной работе являются операционная система Windows Vista. Предметом исследования – реализация многозадачности в Windows Vista.

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

Глава 1. Сущность многозадачности


1.1. Свойства многозадачной среды


Многозадачность (англ. multitasking) – свойство операционной системы или среды программирования, обеспечивать возможность параллельной (или псевдопараллельной) обработки нескольких процессов1. Истинная многозадачность операционной системы возможна только в распределенных вычислительных системах.

Примитивные многозадачные среды обеспечивают чистое «разделение ресурсов», когда за каждой задачей закрепляется определённый участок памяти, и задача активизируется в строго определённые интервалы времени.

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

  • Каждая задача имеет свой приоритет, в соответствии с которым получает время и память.

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

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

  • По окончании положенного кванта времени задача может временно выбрасываться из памяти, отдавая ресурсы другим задачам, а потом через определённое системой время, восстанавливаться в памяти (свопинг).

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

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

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

  • Система гарантирует каждой задаче, что рано или поздно она будет активирована.

  • Система обрабатывает запросы реального времени.

  • Система обеспечивает коммуникацию между процессами.



1.2. Типы псевдопараллельной многозадачности


Распределение процессов между имеющимися ресурсами носит название «планирование процессов». Существует два основных типа процедур планирования процессов – вытесняющие (preemptive) и невытесняющие (non-preemptive).

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

Вытесняющая многозадачность (preemptive multitasking) – это такой способ, при котором решение о переключении процессора с выполнения одного процесса на выполнение другого процесса принимается планировщиком операционной системы, а не самой активной задачей.

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

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

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


1.3. История развития многозадачных операционных систем


Основным признаком многозадачной ОС является способность совмещать выполнение нескольких прикладных программ. Большое значение при этом имеет способ совмещения, то есть на каком уровне или как конкретно реализовано совмещение. Если однопроцессорная, но многозадачная, система выделяет каждой прикладной программе определенный квант времени (time slice), спустя который она переключается на выполнение следующей программы, то это система с разделением времени (time-sharingsystem).

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

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

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

Первые операционные системы, реализованные на персональных компьютерах, сильно уступали в концептуальном плане и по своим реальным возможностям системам с разделением времени, давно реализованным в mainframe-компьютерах. В Win16, например, тоже существует понятие многозадачности. Реализовано оно следующим образом: обработав очередное сообщение, приложение передает управление операционной системе, которая может передать управление другому приложению. Такой вид многозадачности, при котором операционная система передает управление от одного приложения другому не в любой момент времени, а только когда текущее приложение отдает управление системе, получил, как было упомянуто, название кооперативной многозадачности (cooperative multitasking).

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

В Windows начиная с Windows 95 реализован принципиально другой вид многозадачности, в котором операционная система действительно контролирует и управляет процессами, потоками и их переключением. Способность операционной системы прервать выполняемый поток практически в любой момент времени и передать управление другому ожидающему потоку определяется термином preemptive multitasking – преимущественная, или вытесняющая, многозадачность. Реализация ее выглядит так: все существующие в данный момент потоки, часть из которых может принадлежать одному и тому же процессу, претендуют на процессорное время и, с точки зрения пользователя должны выполняться одновременно. Для создания этой иллюзии система через определенные промежутки времени забирает управление, анализирует свою очередь сообщений, распределяет сообщения по другим очередям в пространстве процессов и, если считает нужным, переключает потоки (рис. 1).

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

Если компьютер имеет несколько процессоров, то системы Windows NT/2000 могут действительно совмещать выполнение нескольких приложений. Если процессор один, то совмещение остается иллюзией. Когда заканчивается квант времени, отведенный текущей программе, система ее прерывает, сохраняет контекст и отдает управление другой программе, которая ждет своей очереди. Величина кванта времени (time slice) зависит от ОС и типа процессора, в Windows NT она в среднем равна 20 мс. Следует отметить, что добиться действительно одновременного выполнения потоков можно только на машине с несколькими процессорами и только под управлением Windows, ядра которых поддерживают распределение потоков между процессорами и процессорного времени между потоками на каждом процессоре. Например, Windows 95 работала только с одним процессором. Даже если у компьютера несколько процессоров, под управлением Windows 95 мог быть задействован лишь один из них, а остальные должны простаивать3.

Глава 2. Моделирование режима многозадачности


2.1. Процессы и потоки


Различают два способа реализации многозадачности:

– создать один процесс, имеющий несколько потоков выполнения (threads);

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

Многозадачная (multi-process) система позволяет двум или более программам выполняться одновременно.

Многопотоковая (multi-threaded) система позволяет одной программе выполнять сразу несколько потоков одновременно.

Современные операционные системы сочетают в себе оба эти свойства. Приложение Win32 может состоять из одного или более процессов. Например, приложение по расчету параметров турбогенератора может состоять из удобной оболочки, написанной на языке C++ (главный процесс), и вычислительных модулей, написанных на языке FORTRAN и запускаемых в виде отдельных (порожденных) процессов. При этом возможен вариант, когда один процесс (модуль программы) занят выводом геометрии расчетной области, а другой одновременно производит расчет электромагнитного поля.

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

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

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

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

Все потоки (threads) одного процесса пользуются ресурсами породившего их процесса. Кроме того, каждому потоку система и/или программист приписывает приоритет выполнения и набор структур языка С, описывающих контекст потока. Система использует их для запоминания контекста потока, когда его выполнение прерывается. В контекст входят:

– состояние регистров;

– системный стек ядра ОС (kernel stack);

– стек пользователя (user stack), расположенный в адресном пространстве процесса;

– блок переменных окружения потока.

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

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

– управление вводом в различные документы МШ-интерфейса. Ввод данных каждого документа приложения организован в виде отдельного потока;

– управление вводом данных из нескольких устройств телекоммуникации;

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

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

Обычно более эффективной является реализация многозадачности в виде одного процесса с несколькими потоками, чем в виде многих процессов с одним потоком, так как:

– контексты потоков занимают меньший объем, чем контексты процессов и система переключает их быстрее;

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

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


2.2. Модель режима многозадачности


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

Лучше выстраивать модель на основе вероятностного взгляда на использование центрального процессора. Предположим, что процесс проводит часть своего времени р в ожидании завершения операций ввода-вывода. При одновременном присутствии в памяти п процессов вероятность того, что все п процессов ожидают завершения ввода-вывода (в случае чего процессор простаивает), равна рn. Тогда время задействования процессора вычисляется по формуле:

Время задействования ЦП = 1 - рп.

На рис. 1 Приложения 2 показано время задействования центрального процессора в виде функции от аргумента п, который называется степенью многозадачности.

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

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

Несмотря на упрощенность модели, представленной на рис. 2.4, тем не менее она может быть использована для специфических, хотя и весьма приблизительных предсказаний, касающихся производительности центрального процессора. Предположим, к примеру, что память компьютера составляет 512 Мбайт, операционная система занимает 128 Мбайт, а каждая пользовательская программа также занимает до 128 Мбайт. Этот объем позволяет одновременно разместить в памяти три пользовательские программы. При среднем ожидании ввода-вывода в 80% мы имеем загруженность центрального процессора (если игнорировать издержки на работу операционной системы), равную 1 - 0,83, или около 49%. Увеличение объема памяти еще на 512 Мбайт позволит системе перейти от трехкратной многозадачности к семикратной, что повысит загруженность центрального процессора до 79%. Иными словами, дополнительные 512 Мбайт памяти увеличат его производительность на 30%.

Увеличение памяти еще на 512 Мбайт поднимет уровень производительности всего лишь с 79 до 91%, то есть дополнительный прирост производительности составит только 12%. Используя эту модель, владельцы компьютеров могут прийти к выводу, что первое наращивание объема памяти станет, в отличие от второго, неплохим вкладом в повышение производительности процессора.

Глава 3. Реализация многозадачности в Windows Vista


3.1. Фундаментальные концепции


В Windows Vista процессы являются контейнерами для программ. Они содержат виртуальное адресное пространство, описатели объектов режима ядра, а также потоки. Как контейнеры для потоков они содержат также общие ресурсы (используемые для выполнения потоков), такие как указатель на структуру квоты, совместно используемый объект маркера, а также параметры по умолчанию (используемые для инициализации потоков), включая приоритет и класс планирования.

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

Процессы создаются из объектов сегментов, каждый из которых описывает объект памяти, основанный на дисковом файле. При создании процесса создающий процесс получает описатель для процесса, который позволяет ему модифицировать новый процесс (посредством отображения сегментов, выделения виртуальной памяти, записи параметров и данных окружения, дублирования дескрипторов файлов в свою таблицу описателей, создания потоков). Это отличается от того, как процессы создаются в системах UNIX, и демонстрирует разницу между UNIX и Windows. UNIX была спроектирована для 16-битных однопроцессорных систем, которые применяли подкачку для совместного использования памяти процессами. В таких системах использование процесса как единицы параллельности и операции fork для создания процессов было просто блестящей идеей. Для выполнения нового процесса в небольшом количестве памяти (при отсутствии аппаратных средств виртуальной памяти) приходилось процессы из памяти выгружать на диск. Первоначально fork в системе UNIX была реализована при помощи простой выгрузки родительского процесса и передачи его физической памяти дочернему процессу.

На момент написания системы NT обычной аппаратной средой были 32-битные многопроцессорные системы с аппаратной виртуальной памятью, которая использовала от 1 до 16 Мбайт физической памяти. Наличие нескольких процессоров позволяет одновременно выполнять части программ, поэтому NT применяла процессы как контейнеры для совместного использования памяти и ресурсов объектов, а потоки – как единицу параллельности (для планирования).

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

Процесс может находиться внутри только одного задания (максимум).

На рис. 1 Приложения 3 показана связь между заданиями (jobs), процессами (processes), потоками (threads) и волокнами (fibers). Задания содержат процессы. Процессы содержат потоки. Но потоки не содержат волокна. Связь между потоками и волокнами обычно имеет тип «многие-ко-многим».

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

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

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

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

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

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

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

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

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

Семафоры – это объекты режима ядра и поэтому они имеют дескрипторы безопасности и описатели. Семафор создается при помощи функции CreateSemaphore интерфейса Win32 API, которая может инициализировать его заданным значением, а также задать максимальное значение. Описатель для семафора может быть сдублирован при помощи DuplicateHandle и передан в другой процесс (чтобы по одному и тому же семафору могли синхронизироваться несколько процессов). Семафору можно дать имя в пространстве имен Win32. Иногда совместное использование семафора по имени более удобно, чем дублирование описателя.

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

Третий механизм синхронизации называется «критическая секция» (critical section). Он реализует концепцию «критических областей». В Windows он похож на мьютекс, за исключением того, что он является локальным для адресного пространства создающего потока. Поскольку критические секции не являются объектами режима ядра, они не имеют явных описателей или дескрипторов безопасности и не могут передаваться между процессами. Блокирование и разблокирование выполняется соответственно вызовами EnterCriticalSection и LeaveCriticalSection. Поскольку эти функции API выполняются первоначально в пространстве пользователя и делают вызовы ядра только при необходимости в блокировке, то они гораздо быстрее мьютексов. Критические секции оптимизированы для комбинированного использования спин-блокировок (на многопроцессорных системах) и синхронизации ядра (при необходимости). Во многих приложениях большинство критических секций так редко становятся объектом соперничества или имеют такое краткое время удерживания, что необходимость в выделении объекта синхронизации ядра никогда не возникает. Это приводит к очень существенной экономии памяти ядра.


3.2. Реализация процессов и потоков в Windows Vista


Рассмотрим, как в Windows Vista создается процесс (и начальный поток). Процесс создается тогда, когда другой процесс делает вызов CreateProcess интерфейса Win32. Этот вызов запускает процедуру (пользовательского режима) из kernel.dll, которая создает процесс5:

1. Преобразуется имя исполняемого файла (заданное в виде параметра) из маршрута Win32 в маршрут NT. Если исполняемый файл имеет только имя (без маршрута в виде каталогов), то поиск его ведется в тех каталогах, которые перечислены в качестве каталогов по умолчанию (они включают и те, которые содержатся в переменной окружения PATH – но не только их).

2. Собираются все параметры создания процесса и передаются (вместе с полным маршрутом к исполняемой программе) собственному интерфейсу NtCreateUserProcess. (Этот API был добавлен в Windows Vista для того, чтобы подробности создания процесса можно было реализовывать в режиме ядра, позволяя использовать процессы как границы безопасности. Предыдущие собственные API по-прежнему существуют, но вызовом CreateProcess они больше не используются.)

3. Работая в режиме ядра, NtCreateUserProcess обрабатывает параметры, а затем открывает образ программы и создает объект сегмента, который может использоваться для отображения программы на виртуальное адресное пространство нового процесса.

4. Диспетчер процессов выделяет и инициализирует объект процесса (структуру данных ядра, представляющую процесс, как для ядра, так и для исполнительного уровня).

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

6. Для нового процесса создается таблица описателей, в которую дублируются все те описатели вызвавшей стороны, для которых разрешается наследование.

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

8. Исполнительный уровень создает и инициализирует блок Process Environment Block (РЕВ) пользовательского режима, который используется как пользовательским режимом, так и ядром для поддержания информации о состоянии процесса.

9. В новом процессе выделяется виртуальная память, которая используется для передачи параметров (в том числе строк окружения и командной строки).

10. Из специальной таблицы описателей (которую поддерживает ядро для эффективного выделения локально-уникальных идентификаторов для процессов и потоков) выделяется идентификатор процесса.

11. Выделяется и инициализируется объект потока. Выделяется стек пользовательского режима и блок Thread Environment Block (ТЕВ). Инициализируется запись CONTEXT, которая содержит начальные значения регистров процессора для потока (в том числе указатели команд и стека).

12. Объект процесса добавляется в глобальный список процессов. В таблице описателей вызвавшей стороны выделяется место под описатели для объектов процесса и потока. Для начального потока выделяется идентификатор (из таблицы идентификаторов).

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

14. Если интерфейс NT API дает сбой, то код Win32 проверяет, не принадлежит ли данный процесс к другой подсистеме (например, WOW64). Или, возможно, данная программа помечена для выполнения под управлением отладчика. Эти специальные случаи обрабатываются специальным кодом пользовательского режима в CreateProcess.

15. Если NtCreateUserProcess отработал успешно, то процессы Win32 нужно зарегистрировать в процессе csrss.exe подсистемы Win32. Kernel32.dll посылает сообщение в csrss, которое сообщает ему о новом процессе (а также передает описатели процесса и потока, чтобы он мог себя сдублировать). Процесс и потоки вносятся в таблицы подсистемы (чтобы там имелся полный список всех процессов и потоков Win32). Затем подсистема показывает курсор (указатель с песочными часами), чтобы сообщить пользователю о том, что в данный момент что-то происходит, но курсор все же можно использовать. Когда процесс делает свой первый вызов графического интерфейса пользователя (обычно это делается для создания окна), то курсор исчезает (если нет других вызовов) – тайм-аут у него 2 с.

16. Если процесс ограничен (как имеющий низкие права Internet Explorer), то маркер модифицируется для ограничения доступа к объектам из нового процесса.

17. Если приложение было помечено как подлежащее исправлению (shimmed) для совместимой работы в текущей версии Windows, то применяются указанные исправления (shims). Исправления обычно заключают в оболочку вызовы библиотек, чтобы модифицировать их поведение – например, вернуть сфальсифицированный номер версии или отложить освобождение памяти.

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


3.3. Планирование


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

1. Текущий выполняющийся поток блокируется на семафоре, мьютексе, событии, вводе-выводе и т. д.

2. Поток сигнализирует объект (то есть делает up на семафоре или приводит к сигнализированию события).

3. Истекает квант.

В случае 1 поток уже работает в режиме ядра (для выполнения операции над диспетчером или объектом ввода-вывода). Вероятно, он не может продолжить выполнение, поэтому он вызывает код планировщика для выбора своего преемника и загружает запись CONTEXT этого потока (для продолжения его выполнения).

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

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

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

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

Если в течение этого тайм-аута поток стал готовым, то будет выполнен планировщик, и если новый готовый к выполнению поток имеет более высокий приоритет, то текущий поток вытесняется (как в случае 1).

Теперь рассмотрим сам алгоритм планирования. Интерфейс Win32 API предоставляет два API для работы с планированием потоков. Первый – вызов SetPriorityClass, который устанавливает класс приоритета для всех потоков вызывающего процесса. Допустимые значения: real-time, high, above normal, normal и idle. Класс приоритета определяет относительный приоритет процесса. (Начиная с Windows Vista класс приоритета процесса может также использоваться процессом для того, чтобы временно пометить самого себя как фоновый – это значит, что он не должен мешать никакой другой активности системы.) Класс приоритета устанавливается для процесса, но влияет на реальный приоритет каждого потока процесса (он устанавливает базовое значение приоритета, с которым стартует поток при создании).

Второй интерфейс Win32 API – это SetThreadPriority. Он устанавливает относительный приоритет потока (возможно, вызывающего потока – но это не обязательно) по отношению к классу приоритета своего процесса. Допустимые значения: time critical, highest, above normal, normal, below normal, lowest и idle. Потоки time critical получают самый высокий приоритет планирования, а потоки idle – самый низкий (независимо от класса приоритета). Остальные значения приоритета подстраивают базовый приоритет потока относительно нормального значения, определенного классом приоритета (+2, +1, 0, -1, -2 соответственно). Использование классов приоритета и относительных приоритетов потоков облегчает приложениям принятие решений по указанию приоритетов.

Планировщик работает следующим образом. В системе имеется 32 приоритета с номерами от 0 до 31. Сочетание класса приоритета и относительного приоритета отображается на 32 абсолютных значения приоритета (в соответствии с табл. 1 Приложения 3). Номер в таблице определяет базовый приоритет (base priority) потока. Кроме того, каждый поток имеет текущий приоритет (current priority), который может быть выше (но не ниже) базового приоритета.

Для использования этих приоритетов при планировании система поддерживает массив из 32 списков потоков, соответствующих всем 32 приоритетам (от 0 до 31) в табл. 1 Приложения 3. Каждый список содержит готовые потоки соответствующего приоритета. Базовый алгоритм планирования делает поиск по массиву от приоритета 31 до приоритета 0. Как только будет найден непустой список, то выбирается поток из верха списка и выполняется в течение одного кванта. Если квант истекает, то поток переводится в конец очереди своего уровня приоритета и следующим выбирается поток из верха списка. Иначе говоря, когда есть много готовых потоков на самом высоком уровне приоритета, то они выполняются циклически (по одному кванту времени каждый). Если готовых потоков нет, то процессор переходит в состояние ожидания, то есть переводится в состояние более низкого энергопотребления и ждет прерывания.

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

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

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

Массив заголовков очередей показан на рис. 2 Приложения 3. На схеме показано, что реально имеется четыре категории приоритетов: real-time, user, zero и idle (значение которого фактически равно -1). Это требует особого пояснения. Приоритеты 16-31 называются приоритетами реального времени и предназначены для создания систем, удовлетворяющих ограничениям реального времени (таким, как конечные сроки). Потоки с приоритетами реального времени выполняются до потоков с динамическими приоритетами (но не раньше DPC и ISR). Если приложение реального времени хочет выполняться в системе, то ему могут потребоваться такие драйверы устройств, которые не имеют длительного выполнения DPC или ISR (поскольку это может вызвать пропуск потоками реального времени их конечных сроков).

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

Потоки приложений обычно выполняются с приоритетами 1-15. При помощи установки приоритетов процессов и потоков приложение может определить, какие потоки получают преимущество. Системные потоки обнуления страниц (ZeroPage) работают с приоритетом 0 и преобразуют свободные страницы в заполненные нулями страницы. Для каждого реального процессора имеется отдельный поток обнуления страниц.

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

Теперь рассмотрим, когда приоритет потока повышается. Во-первых, когда операция ввода-вывода завершается и освобождает находящийся в состоянии ожидания поток, то его приоритет повышается (чтобы он мог опять быстро запуститься и начать новую операцию ввода-вывода). Идея состоит в том, чтобы поддерживать загрузку устройств ввода-вывода. Величина повышения приоритета зависит от устройства ввода-вывода – обычно для диска это 1, для последовательной линии – 2, для клавиатуры – 6, а для звуковой карты – 8.

Во-вторых, если поток ждал на семафоре, мьютексе или другом событии, то при его освобождении он получает повышение приоритета на 2 уровня, если он находится в фоновом процессе (например, процесс, который управляет окном, в которое посылается ввод с клавиатуры), и на 1 уровень во всех остальных случаях. Такое повышение поднимает интерактивные процессы над большим количеством процессов, находящихся на уровне 8. И наконец, если поток графического интерфейса пользователя просыпается по причине наличия ввода от пользователя, то он также получает повышение (по той же самой причине).

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

Есть еще один случай корректировки приоритетов. Представим, что два потока работают вместе над задачей «производитель–потребитель». Работа производителя труднее, так что он получает более высокий приоритет (например, 12), чем потребитель (приоритет 4). В определенный момент производитель заполняет совместно используемый буфер и блокируется на семафоре (как показано на рис. 3 а) Приложения 3).До того как потребитель получает возможность запуститься, какой-то другой поток с приоритетом 8 получает готовность и начинает выполнение (рис. 3 б) Приложения 3). Этот поток сможет выполняться столько, сколько он захочет, – поскольку он имеет более высокий приоритет планирования, чем потребитель (а производитель, приоритет которого еще выше, блокирован). В таких обстоятельствах производитель никогда не сможет запуститься (пока поток с приоритетом 8 не уйдет).

Windows решает эту проблему следующим способом. Система отслеживает, сколько времени прошло с того момента, когда в последний раз выполнялся готовый поток. Если это время превышает определенный предел, то его приоритет повышается до 15 на время двух квантов. Это может дать ей возможность разблокировать производителя. После истечения двух квантов времени это повышение резко снимается (а не уменьшается постепенно). Вероятно, более удачным решением было бы штрафовать потоки, которые используют свой квант снова и снова (снижать их приоритет). В конце концов, проблема была вызвана не голодным потоком, а прожорливым. Эта проблема хорошо известна как инверсия приоритетов (priority inversion).

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

На клиентских системах Windows значение кванта по умолчанию равно 20 мс. На серверных системах Windows – 180 мс. Короткий квант полезен интерактивным пользователям, а длинный – уменьшает количество переключений контекста и обеспечивает таким образом более высокую эффективность.

Алгоритм планирования имеет еще одну заплатку: когда новое окно становится окном переднего плана, то все его потоки получают более длинный квант (увеличенный на определенное значение, которое берется из реестра). Это дает им больше процессорного времени, что обычно обеспечивает улучшение восприятия пользователем его работы в данном приложении6.

Заключение


В настоящей работе были рассмотрены основные элементы теоретических основ реализации многозадачности в Windows Vista.

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

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

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

Список использованной литературы



  1. Гордеев А.В. Операционные системы: Учебник. СПб.: Питер, 2004. – 416 с. С. 369-

  2. Левин А.М. Энциклопедия пользователей персональных компьютеров. СПб.: Питер, 2010. – 908 с.

  3. Олифер В.Г., Олифер Н.А. Сетевые операционные системы: Учебник для ВУЗов. СПб.: Питер, 2007. – 544 с.

  4. Руководство по Windows Vista. Корпорация Майкрософт (Microsoft Corp.), 2006.

  5. Таненбаум Э. Современные операционные системы. СПб.: Питер, 2010. – 1120 с.

  6. Таненбаум Э., Вудхалл А. Операционные системы. Разработка и реализация. СПб.: Питер, 2007. – 704 с.

  7. Храпский С. Ф. Операционные системы, среды и оболочки. Основные теоретические сведения: Учебное пособие. – Омск: ОГИС, 2005. – 268 c.

  8. Иллюстрированный самоучитель по Visual Studio.Net // http://www.realcoding.net/teach/visualc7/index.html

  9. Классификация ОС // http://citforum.ru/operating_systems/sos/glava_3.shtml

  10. http://ru.wikipedia.org/wiki/Многозадачность




Приложение 1




Рис. 1. Переключение потоков в системе с вытесняющей многозадачностью

Приложение 2



Рис. 1. Время задействования ЦП в виде функции от количества процессов, присутствующих в памяти

ПРИЛОЖЕНИЕ 3





Рис. 1. Связь между заданиями, процессами, потоками и волокнами. Задания и волокна необязательны;

не все процессы находятся в заданиях или содержат волокна


Таблица 1.

Соответствие приоритетов Win32 приоритетам Windows






Рис. 2. Windows Vista поддерживает 32 приоритета для потоков





Рис. 3. Пример инверсии приоритетов

2 Храпский С. Ф. Операционные системы, среды и оболочки. Основные теоретические сведения: Учебное пособие. – Омск: ОГИС, 2005. С. 16.

3 Храпский С. Ф. Операционные системы, среды и оболочки. Основные теоретические сведения: Учебное пособие. – Омск: ОГИС, 2005. С. 17.

4 Иллюстрированный самоучитель по Visual Studio.Net // http://www.realcoding.net/teach/visualc7/index.html

5 Таненбаум Э. Современные операционные системы. СПб.: Питер, 2010. С. 996.

6 Таненбаум Э. Современные операционные системы. СПб.: Питер, 2010. С. 1002.


отлично
  1
Ваша оценка:

Похожие:

Windows Vista это версия Microsoft Windows, из серии графических операционных систем для персональных компьютеров, используется как для дома так и для работы iconНастройки программы запись и сохранение видео сочетания клавиш программы Windows Movie Maker
313.1kb.   В ос windows xp и Windows Vista включены программы для работы с видео. Это программа Проигрыватель Windows Media для просмотра видеоинформации,...
Windows Vista это версия Microsoft Windows, из серии графических операционных систем для персональных компьютеров, используется как для дома так и для работы iconСравнение операционных систем: Linux и Windows
149.8kb.   ыа
Windows Vista это версия Microsoft Windows, из серии графических операционных систем для персональных компьютеров, используется как для дома так и для работы iconПрограмма предназначена для работы с текстовыми файлами в обычном формате, формате rtf. Программа выполняет все действия, указанные в задании и работает в операционных системах Windows 9x/nt на pc. 2 Входные данные
22.7kb.  
Windows Vista это версия Microsoft Windows, из серии графических операционных систем для персональных компьютеров, используется как для дома так и для работы iconОтчёт По лабораторной работе №3 по курсу Разработка графических приложений
103.7kb.   Это важно для обеспечения непрерывного видеонаблюдения, так как для этого требуется обработка изображения в масштабе реального времени....
Windows Vista это версия Microsoft Windows, из серии графических операционных систем для персональных компьютеров, используется как для дома так и для работы icon1. Анализ проблемной области и постановка задач исследования. 6
1386.5kb.   Ос рабочих станцийОпер система Microsoft "Windows 7 Professional 32-bit Russian 1pk dsp oei dvd"40991040990Антивирусное поkaspersky...
Windows Vista это версия Microsoft Windows, из серии графических операционных систем для персональных компьютеров, используется как для дома так и для работы iconТемы курсовых проектов Программы для Windows (WA) №
247.5kb.  
Windows Vista это версия Microsoft Windows, из серии графических операционных систем для персональных компьютеров, используется как для дома так и для работы iconПеритонит - Перитонитом называют воспаление брюшины. Это состояние является крайне опасным для организма, так как нарушает функционирование всех жизненно важных органов. О
48.4kb.   Для студентов, доклад
Windows Vista это версия Microsoft Windows, из серии графических операционных систем для персональных компьютеров, используется как для дома так и для работы iconТехническое задание Приложение: Файловый менеджер Программа представляет собой Windows приложение, состоящее из двух подокон. Задачей программы является предоставление пользователю системных средств, для работы с файлами.
7.6kb.  
Windows Vista это версия Microsoft Windows, из серии графических операционных систем для персональных компьютеров, используется как для дома так и для работы iconПрограммное обеспечение персональных компьютеров. Исторический очерк, классификация текущего состояния, перспективы развития
187.5kb.   В данной курсовой работе приведены результаты исследования истории, классификации и перспективы развития программного обеспечения....
Windows Vista это версия Microsoft Windows, из серии графических операционных систем для персональных компьютеров, используется как для дома так и для работы iconРастровые форматы хорошо подходят для изображений со сложными гаммами цветов, оттенков и форм. Это такие изображения, как фотографии, рисунки, отсканированные д
19.6kb.   Пакеты прикладных программ растровой графики предназначены для работы с фотографическими изображениями
Разместите кнопку на своём сайте:
Рефераты


База данных защищена авторским правом ©CoolReferat 2000-2018
обратиться к администрации | правообладателям | пользователям
Основная база рефератов
Рефераты