Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МетУказКурсРабСистемПрогрЗИЭИТ2005.doc
Скачиваний:
6
Добавлен:
13.09.2019
Размер:
698.37 Кб
Скачать

Тема 6. Монитор системных ресурсов для Windows 98/2000.

Техническое задание.

Программа сбора информации о системе. Возможности ее включают в себя полный набор сведений о компьютере. Функционально присутствуют закладки: System, Memory, Software, Drives, I/O Devices. Раздел System содержит сведения о содержимом компьютера: процессоре, оперативной памяти, видеосистеме, дисках, шине PCI, Plug and Play-устройствах, BIOS и CMOS. Закладка Memory содержит информацию об оперативной памяти: памяти, занимаемой различными процессами; распределении физической памяти; системной и разделяемой памяти; содержимом первого адресуемого мегабайта. Закладка Software показывает программное обеспечение, установленное на компьютере. Summary покажет версию операционной системы, общую информацию по запущенным процессам, нитям, виртуальным машинам. Следующая закладка Drives содержит информацию о дисках: флоппи, винчестерах, CD-ROM и др. Закладка I/O это данные о сети, звуковых адаптерах, последовательных и параллельных портах, принтерах.

Методические указания.

Рекомендуется использовать следующие API функции: GetSystemInfo (информация о процессоре), GlobalMemoryStatys (информация об оперативной памяти), GetDeviseCaps и EnumDisplaySettins (позволит получить информацию о дисплее и все режимы которые поддерживаются видеокартой), CommConfigDialogs (вызовет диалоговую панель наладки параметров для коммуникационного устройства), MixerGetNumDevis (число микшеров), MixerGetDevCaps (получение их характеристик), WaveOutGetNumDevs (количество Wav устройств), WaveOutGetDevCaps (характеристики Wav устройств), MidiOutGetNumDevs (число Midi устройств), MidiOutGetDevCaps (характеристики Midi устройств), GetVolumeInformation (определить тип файловой системы).

КакЧтобы узнать, кто в данный момент присоединен через Сеть к машине можно использовать сессии:

SESSION_INFO_2 *psi2;

NET_API_STATUS Result;

wchar_t wcServerName[MAX_COMPUTERNAME_LENGTH + 1];

DWORD prefmaxlen = MAX_PREFERRED_LENGTH;

DWORD entriesread;

DWORD totalentries;

StringToWideChar( name, wcServerName, MAX_COMPUTERNAME_LENGTH );

Result = NetSessionEnum( (LPTSTR) wcServerName, NULL, NULL, 2,

(unsigned char**) &psi2, prefmaxlen, &entriesread, &totalentries, NULL );

if( Result != NERR_Success )

throw Exception("Информация о сессиях не получена!");

Чтобы узнать тип диска для NT можно воспользоваться функцией QueryDosDevice. Для Windows 95 надо использовать GetDeviceParameters.

Тема 7. Менеджер процессов и потоков для Windows 98/2000.

Техническое задание.

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

Методические указания.

Чтобы получить список всех запущенных процессов и потоков для Windows 9x используйте CreateToolhelp32Snapsot, Process32First, Process32Next, Thread32First, Thread32Next. Для WinNT: NTQuerySystemInformation. А можно так: получить список окон в системе (каким угодно способом, если нужны только процессы - можно ограничиться top-level), далее - GetWindowTreadProcessId - получаете ID процесса (и нити). OpenProcess - дает handle процесса.

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

Главной идеей, заложенной в основе синхронизации потоков в Win32, является использование объектов синхронизации и функций ожидания. Объекты могут находиться в одном из двух состояний — Signaled или Not Signaled. Функции ожидания блокируют выполнение потока до тех пор, пока заданный объект находится в состоянии Not Signaled. Таким образом, поток, которому необходим эксклюзивный доступ к ресурсу, должен выставить какой-либо объект синхронизации в несигнальное состояние, а по окончании — сбросить его в сигнальное. Остальные потоки должны перед доступом к этому ресурсу вызвать функцию ожидания, которая позволит им дождаться освобождения ресурса.

Функции синхронизации делятся на две основные категории: функции, ожидающие единственный объект, и функции, ожидающие один из нескольких объектов. Простейшей функцией ожидания является функция WaitForSingleObject:

DWORD WaitForSingleObject( HANDLE hHandle, // идентификатор объекта

DWORD dwMilliseconds); // период ожидания

Функция возвращает одно из следующих значений: WAIT_OBJECT_0 (объект перешел в сигнальное состояние), WAIT_TIMEOUT (истек срок ожидания.), WAIT_ABANDONED (поток, владевший объектом, завершился, не переведя объект в сигнальное состояние).

Объекты синхронизации.

Объектами синхронизации называются объекты Windows, идентификаторы которых могут использоваться в функциях синхронизации.

  1. Event (событие).

Even позволяет известить один или несколько ожидающих потоков о наступлении события. Event бывает:

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

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

Для создания объекта используется функция CreateEvent:

HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpSecurityAttribs,

BOOL bManualReset, // Задает, будет Event переключаемым

// вручную (TRUE) или автоматически (FALSE)

BOOL bInitialState, // Задает начальное состояние. Если TRUE -

// объект в сигнальном состоянии

LPCTSTR lpszEventName); // Имя или NIL, если имя не требуется

Параметр lpszEventName позволяет разделять объекты между процессами. Если lpszEventName совпадает с именем уже существующего объекта типа Event, созданного текущим или любым другим процессом, то функция не создает нового объекта, а возвращает идентификатор уже существующего.

После получения идентификатора можно приступать к его использованию. Для этого имеются следующие функции:

BOOL SetEvent(HANDLE hEvent) – устанавливает объект в сигнальное состояние.

BOOL ResetEvent(HANDLE hEvent) – сбрасывает объект, устанавливая его в несигнальное состояние.

  1. Mutex.

Мьютекс — это объект синхронизации, который находится в сигнальном состоянии только тогда, когда не принадлежит ни одному из процессов. Как только хотя бы один процесс запрашивает владение мьютексом, он переходит в несигнальное состояние и остается таким до тех пор, пока не будет освобожден владельцем. Такое поведение позволяет использовать мьютексы для синхронизации совместного доступа нескольких процессов к разделяемому ресурсу. Для создания мьютекса используется функция:

HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,

BOOL bInitialOwner, // Задает, будет ли процесс владеть

// мьютексом сразу после создания

LPCTSTR lpszMutexName); // Имя мьютекса

Функция возвращает идентификатор созданного объекта либо 0. Если мьютекс с заданным именем уже был создан, возвращается его идентификатор.

Мьютекс переходит в сигнальное состояние после срабатывания функции ожидания, в которую был передан его идентификатор. Для возврата в несигнальное состояние служит функция ReleaseMutex:

BOOL ReleaseMutex(HANDLE hMutex).

  1. Semaphore (семафор).

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

Для создания семафора служит функция CreateSemaphore:

DWORD CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,

LONG lInitialCount, // Начальное значение счетчика

LONG lMaximumCount, // Максимальное значение счетчика

LPCTSTR lpszSemName); // Имя объекта

Функция возвращает идентификатор созданного семафора либо 0, если создать объект не удалось. Параметр lMaximumCount задает максимальное значение счетчика семафора, lInitialCount задает начальное значение счетчика и должен быть в диапазоне от 0 до lMaximumCount. lpszSemName задает имя семафора. Если в системе уже есть семафор с таким именем, то новый не создается, а возвращается идентификатор существующего семафора. В случае если семафор используется внутри одного процесса, можно создать его без имени, передав в качестве lpszSemName значение NULL.

Для увеличения счетчика семафора используется функция ReleaseSemaphore:

BOOL ReleaseSemaphore(

HANDLE hSemaphore, // Описатель семафора

LONG lReleaseCount, // Счетчик будет увеличен на эту величину

LPLONG lpPreviousCount); // Адрес 32-битной переменной, принимающей предыдущее значение счетчика.

Если значение счетчика после выполнения функции превысит заданный для него функцией CreateSemaphore максимум, то ReleaseSemaphore возвращает FALSE и значение семафора не изменяется. В качестве параметра lpPreviousCount можно передать NULL, если это значение нам не нужно.