
- •Концепция программы управляемой событиями.
- •Кодировки символов. Unicode.
- •Создание и завершение процессов.
- •Базовый приоритет процесса. Установка базового приоритета.
- •Многопоточность. Достоинства и недостатки.
- •Создание потоков.
- •Динамический приоритет потока. Установка приоритета.
- •Управление потоками: приостановка, возобновление, завершение.
- •11 Потоки и процессы как синхронизационные объекты.
- •Использование виртуальной памяти в приложениях
- •Виртуальное адресное пространство процесса
- •Как адресное пространство разбивается на разделы
- •Раздел для выявления нулевых указателей (Windows 2000 и Windows 98)
- •Раздел для совместимости с программами dos и 16-разрядной Windows (только Windows 98)
- •Раздел для кода и данных пользовательского режима (Windows 2000 и Windows 98)
- •Увеличение раздела для кода и данных пользовательского режима до 3 Гб на процессорах х86 (только Windows 2000)
- •Закрытый раздел размером 64 Кб (только Windows 2000)
- •Раздел для общих mmf (только Windows 98)
- •Раздел для кода и данных режима ядра (Windows2000 и Windows98)
- •20) Передача физической памяти страницам региона.
- •21) Проецируемые в память файлы (концепция).
- •22) Создание проекции файла
- •23) Отображение проекции в память процесса.
Базовый приоритет процесса. Установка базового приоритета.
Windows поддерживает шесть классов приоритета.
Класс приоритета |
Описание
|
Real-lime (реального времени) |
Потоки в этом процессе обязаны немедленно реагировать на события, обеспечивая выполнение критических по времени задач. Такие потоки вытесняют даже компоненты операционной системы |
High (высокий) |
Потоки в этом процессе тоже должны немедленно реагировать на события, обеспечивая выполнение критических по времени задач. |
Above normal (выше обычного) |
Класс приоритета, промежуточный между normal и high |
Normal (обычный) |
Потоки в этом процессе не предъявляют особых требований к выделению им процессорного времени. |
Below normal (ниже обычного) |
Класс приоритета, промежуточный между normal и idle. |
Idle (простаивающий) |
Потоки в этом процессе выполняются, когда система не занята другой работой. Этот класс приоритета обычно используется для утилит, работающих в фоновом режиме, экранных заставок и приложений, собирающих статистическую информацию |
Вызывая CreateProcess, Вы можете указать в ее параметр fdwCreate нужный класс приоритета. Идентификаторы этих классов приведены в следующей таблице.
Класс приоритета |
Идентификатор |
Real-time |
RFALTIME_PRIORITY_CLASS |
High |
HIGH_PRIORITY_CLASS |
Above normal |
ABOVE_NORMAL_PRIORITY_CLASS |
Normal |
NORMAL_PRIORITY_CLASS |
Below normal |
BELOW_NORMAL_PRIORITY_CLASS |
Idle |
IDLE_PRIORITY_CLASS |
В сис теме предусмотрена возможность изменения класса приоритета самим выполняемым процессом — вызовом функции SetPriontyClass
BOOL SetPriontyClass( HANDLE hProcess, DWORD fdwPriority);
Эта функция меняет класс приоритета процесса, определяемого описателем hProcess, в соответствии со значением параметра fdwPriority. Последний должен содержать одно из значений, указанных в таблице выше.
Парная ей функция GetPriorityClass позволяет узнать класс приоритета любого процесса.
DWORD GetPriorityClass(HANDLE hProcess);
Она возвращает один из ранее перечисленных флагов.
Многопоточность. Достоинства и недостатки.
Поток (thread) определяет последовательность исполнения кода в процессе. При инициализации процесса система всегда создает первичный поток. Начинаясь со стартового кода из библиотеки C++, который в свою очередь вызывает входную функцию (WinMain, wWinMain, main или wmain) из программы, он живет до того момента, когда входная функция возвращает управление стартовому коду и тот вызывает функцию ExitProcess. Большинство приложений обходится единственным, первичным потоком. Однако процессы могут создавать дополнительные потоки, что позволяет им эффективнее выполнять свою работу.
Любой поток тоже состоит из двух компонентов:
объекта ядра, через который операционная система управляет потоком. Там же хранится статистическая информация о потоке;
стека потока, который содержит параметры всех функций и локальные переменные, необходимые потоку для выполнения кода.
Потоки исполняют код и манипулируют данными в адресном пространстве процесса. Поэтому, если два и более потоков выполняется в контексте одного процесса, все они делят одно адресное пространство. Потоки могут исполнять один и тот же код и манипулировать одними и теми же данными, а также совместно использовать описатели объектов ядра, поскольку таблица описателей создается не в отдельных потоках, а в процессах.
Многопоточное приложение легче масштабируется. Каждый поток можно закрепить за определенным процессором. В каждом процессе есть хотя бы один поток.
Так как потоки расходуют существенно меньше ресурсов, чем процессы, лучше использовать дополнительные потоков и избегайте создания новых процессов. Но многие проекты лучше реализовать на основе множества процессов.
Разработка пользовательского интерфейса в приложении. В подавляющем большинстве программ все компоненты пользовательского интерфейса (окна) обрабатываются одним и тем же потоком. И дочерние окна любого окна определенно должен создавать только один поток. Создание разных окон в разных потоках иногда имеет смысл, но такие случаи действительно редки. Обычно в приложении существует один поток, отвечающий за поддержку пользовательского интерфейса, — он создает все окна и содержит цикл GetMessage. Любые другие потоки в процессе являются рабочими (т. е. отвечают за вычисления, ввод-вывод и другие операции) и не создают никаких окон. Поток пользовательского интерфейса, как правило, имеет более высокий приоритет, чем рабочие потоки, — это нужно для того, чтобы он всегда быстро реагировал на действия пользователя.