КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Организация многозадачности в операционной системе Windows. Понятие процесса и потока. Контекст потока. Создание и завершение процессов и потоков.Многозадачность (англ. multitasking) — свойство операционной системы или среды программирования обеспечивать возможность параллельной (или псевдопараллельной) обработки нескольких процессов. Истинная многозадачность операционной системы возможна только в распределённых вычислительных системах. Существует 2 типа многозадачности: § Процессная многозадачность (основанная на процессах - одновременно выполняющихся программах). Здесь программа - наименьший элемент кода, которым может управлять планировщик операционной системы. § Поточная многозадачность (основанная на потоках). Наименьший элемент управляемого кода - поток (одна программа может выполнять 2 и более задачи одновременно). Многопоточность - специализированная форма многозадачности. Процесс – экземпляр выполняемой программы. Хотя на первый взгляд кажется, что программа и процесс понятия практически одинаковые, они фундаментально отличаются друг от друга. Программа представляет собой статический набор команд, а процесс это набор ресурсов и данных, использующихся при выполнении программы. Процесс в Windows состоит из следующих компонентов: - Структура данных, содержащая всю информацию о процессе, в том числе список открытых дескрипторов различных системных ресурсов, уникальный идентификатор процесса, различную статистическую информацию и т.д.; - Адресное пространство - диапазон адресов виртуальной памяти, которым может пользоваться процесс; - Исполняемая программа и данные, проецируемые на виртуальное адресное пространство процесса. Процесс создается при вызове Вашим приложением функции CreateProcess(много параметров). Когда поток в приложении вызывает CreateProcess, система создает объект ядра "процесс" с начальным значением счетчика числа его пользователей, равным 1. Этот объект — не сам процесс, а компактная структура данных, через которую операционная система управляет процессом. (Объект ядра "процесс" следует рассматривать как структуру данных со статистической информацией о процессе.) Затем система создает для нового процесса виртуальное адресное пространство и загружает в него код и данные как для исполняемого файла, тaк и для любых DLL (если таковые требуются). Далее система формирует объект ядра "поток" (со счетчиком, равным 1) для первичного потоки нового процесса. Как и в первом случае, объект ядра "поток" — это компактная структура данных, через которую система управляет потоком. Процесс можно завершить четырьмя способами: • входная функция первичного потока возвращает управление (рекомендуемый способ), • один из потоков процесса вызывает функцию ExitProcess (нежелательный способ); • поток другого процесса вызывает функцию TerminateProcess (тоже нежелательно); • все потоки процесса умирают по своей воле (большая редкость). Процессы инертны. Отвечают же за исполнение кода, содержащегося в адресном пространстве процесса, потоки. Поток (thread) - некая сущность внутри процесса, получающая процессорное время для выполнения. В каждом процессе есть минимум один поток. Этот первичный поток создается системой автоматически при создании процесса. Далее этот поток может породить другие потоки, те в свою очередь новые и т.д. Таким образом, один процесс может владеть несколькими потоками, и тогда они одновременно исполняют код в адресном пространстве процесса. Каждый поток имеет: - Уникальный идентификатор потока; - Содержимое набора регистров процессора, отражающих состояние процессора; - Два стека, один из которых используется потоком при выполнении в режиме ядра, а другой - в пользовательском режиме; - Закрытую область памяти, называемую локальной памятью потока (thread local storage, TLS) и используемую подсистемами, run-time библиотеками и DLL. Если Вы хотите создать дополнительные потоки, нужно вызывать из первичного потока функцию CreateThread: HANDLE CreateThread(PSECURITY_ATTRIBUTES psa, DWORD cbStack, PTHREAD_START_ROUTINE pfnStartAddr, PVOID pvParam, DWORD tdwCreate, PDWORD pdwThreadID); При каждом вызове этой функции система создает объект ядра "поток» Это не сам поток, а компактная структура данных, которая используется операционной системой для управления потоком и хранит статистическую информацию о потоке. Так что объект ядра "поток" — полный аналог объекта ядра "процесс". Система выделяет память под стек потока из адресного пространства процесса. Новый поток выполняется в контексте того же процесса, что и родительский поток. Поэтому он получает доступ ко всем описателям объектов ядра, всей памяти и стекам всех потоков в процессе. За счет этого потоки в рамках одного процесса могут легко взаимодействовать друг с другом. Поток можно завершить четырьмя способами: • функция потока возвращает управление (рекомендуемый способ), • поток самоуничтожается вызовом функции ExitThread (нежелательный способ); • один из потоков данного или стороннего процесса вызывает функцию TerminateThread (нежелательный способ); • завершается процесс, содержащий данный поток (тоже нежелательно).
|