Многозадачность Windows от NT до Vista

Автор работы: Пользователь скрыл имя, 03 Апреля 2011 в 14:01, реферат

Описание работы

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

Содержание работы

1.Что такое многозадачность?....................................................стр.3


2.Основные принципы многозадачности в Windows………...стр.4



3.Синхронизация потоков……………………………………...стр.5


4.Windows NT как родоначальник многозадачности………...стр.10



5.NT и ее улучшенные версии…………………………………стр.11


Windows 95……………………………………………………………….стр.11


Windows 98……………………………………………………………….стр.12


Windows 2000…………………………………………………………….стр.12


Windows XP………………………………………………………………стр.13


Windows Vista…………………………………………………………….стр.14


6.Сходства и различия Windows 9x и Windows NT (2000, XP)..стр.15


7.Заключение ……………………………………………………стр.17



8.Список литературы……………………………………………стр.18

Файлы: 1 файл

Многозадачность Windows(1).doc

— 192.50 Кб (Скачать файл)

ный период времени  или если завершилось выполнение фоновой операции вво-

да/вывода. 
 

    DWORD WaitForSingleObjectEx (

        HANDLE hObject,                              // объект, сигнал от которого ожидается

        DWORD dwMilliseconds,                                   // максимальное время ожидания

        BOOL bAlertable );                                 // TRUE - прекращение ожидания

                                                                         // при завершении операции ввода/вывода

    DWORD WaitForMultipleObjectsEx(

        DWORD dwNumObjects,                         // количество ожидаемых объектов

        LPHANDLE lpHandles,                                            // массив дескрипторов

        BOOL bWaitAll,                                  // TRUE - ожидание сигналов

                                                                     // сразу от всех объектов;

                                                                     // FALSE - ожидание сигнала от

                                                                    // любого из объектов

          DWORD dwMilliseconds,                                // максимальный период ожидания

          BOOL bAlertable );                                // TRUE - прекращение ожидания

                                                                         // при завершении операции ввода/вывода 
     
     

      При успешном выполнении функции  ожидания объект, сигнал от которого  ожи-

дался, обычно определенным образом изменяется. Например, если поток ожидал и по-

лучил сигнал от исключающего семафора, функция восстанавливает  несигнальное со-

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

Кроме того, функции  ожидания декрементируют значение счетчика семафора и сбрасы-

вают информацию о некоторых событиях.

      Функции ожидания не изменяют  состояния указанного объекта  до тех пор, пока не

поступит сигнал от одного или нескольких других объектов. В частности, поток не за-

хватывает исключающий  семафор сразу же после поступления  сигнала от него, а ожида-

ет сигналов от других объектов. Кроме того, в  течение времени ожидания исключающий

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

стояние ожидания.

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

этот объект уже создан. Начнем с создания исключающих  семафоров и семафоров, по-

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

давать и уничтожать эти объекты, захватывать их и  освобождать, а также получать их

дескрипторы.

      Функциям, создающим исключающие  семафоры и семафоры, нужно указать тре-

буемые привилегии доступа и начальные параметры  создаваемого объекта (можно также

указать его  имя, но это необязательно) [12]. 

    HANDLE CreateMutex (

        LPSECURITY_ATTRIBUTES lpsa,      // необязательные атрибуты безопасности

        BOOL bInitialOwner                                       // TRUE - создатель хочет

                                                                                // завладеть полученным объектом

        LPTSTR lpszMutexName )                                            // имя объекта 

    HANDLE CreateSemaphore(

        LPSECURITY_ATTRIBUTES lpsa,        //необязательные атрибуты безопасности

        LONG lInitialCount,                                  // исходное значение счетчика (обычно 0)

        LONG lMaxCount,                                         // максимальное значение

                                                                               // счетчика (ограничивает число потоков)

        LPTSTR lpszSemName );              // имя семафора (может иметь значение NULL) 

     Если  в качестве атрибута безопасности задано значение NULL, результирующий

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

цессами. Имена  объектов являются необязательными, однако они становятся полезными

в ситуации, когда  несколько процессов управляют одним и тем же объектом.

     Если  флагу bInitialOwner присвоить значение TRUE, поток сразу после создания

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

тех пор, пока поток  не освободит его.

     В  отличие от исключающего семафора, который может принадлежать только од-

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

ка его счетчик  захватов не получит значения iMaxCount. Если другие потоки в этот момент попытаются завладеть семафором, они будут приостановлены до тех пор, пока

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

      Пока семафор (или исключающий  семафор) существует, поток взаимодействует  с

ним посредством  операций захвата и освобождения. Для захвата любого объекта поток

вызывает функцию WaitForSingleObject (или одну из ее разновидностей). Завершив вы-

полнение задачи, которая синхронизировалась захваченным  объектом, поток освобож-

дает этот объект с помощью одной из следующих  функций: 
 
 

BOOL ReleaseMutex( HANDLE hMutex ) ; 

BOOL ReleaseSemaphore(

     HANDLE hSemaphore,

     LONG lRelease,        // величина, на которую

                                      // инкрементируется значение счетчика

                                      // при освобождении объекта (обычно 1)

      LPLONG lplPrevious );           // переменная, которой присваивается

                                                      // предыдущее значение счетчика 
 
 

     При  освобождении семафора: или исключающего  семафора значение счетчика за-

хватов инкрементируется. Значение счетчика, превышающее 0, воспринимается систе-

мой как сигнал объекта ожидающим его потокам.

     Освободить  исключающий семафор может только  тот поток, который завладел  им.

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

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

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

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

Обратите внимание, что функция CreateSemaphore позволяет при  создании нового сема-

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

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

позволит заблокировать  все потоки до тех пор, пока программа  не произведет инициали-

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

     Не  забывайте вовремя освобождать  синхронизирующие объекты. Не задав макси-

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

руете все ожидающие  его потоки.

     Поток  может ожидать несколько сигналов  от одного и того же объекта,  не будучи

заблокированным, однако после завершения каждого из процессов ожидания необходи-

мо, выполнять  операцию освобождения. Это требование справедливо для семафоров,

исключающих семафоров  и критических разделов.

     Событие  представляет собой объект, который  создается программой при необхо-

димости информировать потоки о выполнении определенных действий. В простейшем

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

(сигнал включен)  и ResetEvent (сигнал выключен). Когда  сигнал включается, его полу-

чают все потоки, которые ожидают появления соответствующего события. Если сигнал

выключается, все  такие потоки блокируются. В отличие  от семафоров и исключающих

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

ствующей команды  каким-нибудь потоком.

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

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

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

работы с событиями: 
 
 

HANDLE CreateEvent(

    LPSECURITY_ATTRIBUTES lpsa,                       // привилегии доступа

                                                                                     // (по умолчанию = NULL)

      BOOL bManualReset,                      // TRUE - событие должно быть

                                                               // сброшено вручную

      BOOL bInitialState,                                 // TRUE - создание события в

                                                                        // сигнальном состоянии

      LPTSTR lpszEventName );           //имя события (допускается

                                                            // значение NULL)

BOOL SetEvent ( HANDLE hEvent );

BOOL ResetEvent( HANDLE hEvent ); 
 
 

      При установке параметра bInitialState функция CreateEvent создает событие,  кото-

рое сразу же будет находиться в сигнальное состоянии. Функции SetEvent и ResetEvent в

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

- значение FALSE.

      Параметр bManualReset функции CreateEvent позволяет  создать событие, сбрасы-

ваемое не вручную, а автоматически. Автоматически  сбрасываемое событие переходит  в

несигнальное  состояние сразу же после выполнения функции SetEvent. Для таких собы-

тий функция ResetEvent является избыточной. Кроме того, перед  автоматическим сбро-

сом по каждому  сигналу событие освобождает  только один поток. Автоматически сбра-

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

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

нового набора данных основной поток устанавливает  событие, по которому освобожда-

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

Информация о работе Многозадачность Windows от NT до Vista