- •Общие требования к выполнению лабораторных работ Содержание отчета
- •3. Оборудование
- •4. Задание на работу
- •3. Оборудование
- •4. Задание на работу
- •3. Оборудование
- •4. Задание на работу
- •3. Оборудование
- •4. Задание на работу
- •Страничная организация памяти
- •1. Цель работы
- •2. Краткие теоретические сведения
- •3. Оборудование
- •4. Задание на работу
- •5 Контрольные вопросы
- •Защищенный режим процессора. Обработка исключений
- •1. Цель работы
- •2. Краткие теоретические сведения
- •Защищенный режим процессора. Многозадачность
- •1. Цель работы
- •2. Краткие теоретические сведения
- •Процессы и потоки в Windows
- •1. Цель работы
- •Краткие теоретические сведения
- •Структура сервиса
- •Дополнительная
- •Периодические издания
- •Программное обеспечение и Интернет-ресурсы
Процессы и потоки в Windows
1. Цель работы
Получить представление о принципах организации процессов и потоков в ОС Windows
Краткие теоретические сведения
Процессы
Процесс – объект ядра, которому принадлежат системные ресурсы, используемые исполняемым приложением. Выполнение процесса начинается с первичного потока. Во время своего исполнения процесс может создавать другие потоки.
Исполнение процесса заканчивается при завершении всех его потоков.
Пример. Создание дочернего процесса
Дочерний процесс
#include <conio.h>
int main(int argc, char *argv[])
{
int i;
_cputs("I am created.");
_cputs("\nMy name is: ");
_cputs(argv[0]);
for (i = 1; i < argc; ++i)
_cprintf ("\n My %d parameter = %s", i, argv[i]);
_cputs("\nPress any key to finish.\n");
_getch();
return 0;
}
Родительский процесс
#include <windows.h>
#include <conio.h>
int main()
{
char lpszAppName[] = "ConsoleProcess.exe";
STARTUPINFO si;
PROCESS_INFORMATION piApp;
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
// создаем новый консольный процесс
if (!CreateProcess(lpszAppName, NULL, NULL, NULL, FALSE,
CREATE_NEW_CONSOLE, NULL, NULL, &si, &piApp))
{
_cputs("The new process is not created.\n");
_cputs("Check a name of the process.\n");
_cputs("Press any key to finish.\n");
_getch();
return 0;
}
_cputs("The new process is created.\n");
// ждем завершения созданного процесса
WaitForSingleObject(piApp.hProcess, INFINITE);
// закрываем дескрипторы этого процесса в текущем процессе
CloseHandle(piApp.hThread);
CloseHandle(piApp.hProcess);
return 0;
}
Потоки
Поток – последовательность инструкций программы, выполняемая процессором.
Потоком в Windows называется объект ядра, которому операционная система выделяет процессорное время для выполнения приложения.
Программа называется многопоточной, если в ней может одновременно существовать несколько потоков.
Пример. Создание потока
#include <windows.h>
#include <iostream.h>
volatile int n;
DWORD WINAPI Add(LPVOID iNum)
{
cout << "Thread is started." << endl;
n += (int)iNum;
cout << "Thread is finished." << endl;
return 0;
}
int main()
{
int inc = 10; HANDLE hThread; DWORD IDThread;
cout << "n = " << n << endl;
// запускаем поток Add
hThread = CreateThread(NULL, 0, Add, (void*)inc, 0, &IDThread);
if (hThread == NULL)
return GetLastError();
// ждем, пока поток Add закончит работу
WaitForSingleObject(hThread, INFINITE);
// закрываем дескриптор потока Add
CloseHandle(hThread);
cout << "n = " << n << endl;
return 0;
}
Пример. Завершение потока
#include <windows.h>
#include <iostream.h>
volatile UINT count;
void thread()
{
for (;;)
{ ++count; Sleep(100); } // задержка
}
int main()
{
HANDLE hThread; DWORD IDThread; char c;
hThread =
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread, NULL, 0, &IDThread);
if (hThread == NULL)
return GetLastError();
for (;;)
{
cout << "Input 'y' to display the count or any char to finish: ";
cin >> c;
if (c == 'y') cout << "count = " << count << endl;
else break;
}
// прерываем выполнение потока thread
TerminateThread(hThread, 0);
// закрываем дескриптор потока
CloseHandle(hThread);
return 0;
}
3. Оборудование
4. Задание на работу
Спроектировать программу, использующую многопоточную структуру, по варианту, заданному пеподавателем.
5. Содержание отчета
6. Контрольные вопросы
Библиотеки динамической компоновки
1. Цель работы
Получить представление о принципах создания библиотек динамической компоновки.
2. Краткие теоретические сведения
Создание DLL-модуля
Для создания DLL-модуля в среде разработки Visual Studio необходимо выбрать проект типа Win32 DinamicLinkLibrary. DLL-модуль должен иметь главную функцию DllMain , которая является точкой входа.
Пример. Создание DLL-модуля
#include <windows.h>
// главная функция
BOOL WINAPI DllMain(HINSTANCE hDll, DWORD dwReason, LPVOID lpReserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH: // загрузка DLL
break;
case DLL_THREAD_ATTACH: // создание потока
break;
case DLL_THREAD_DETACH: // завершение потока
break;
case DLL_PROCESS_DETACH: // отключение DLL
break;
}
return TRUE;
}
extern "C" __declspec(dllexport) int count = 0;
extern "C" __declspec(dllexport) int Add(int n)
{ count += n; return count;}
extern "C" __declspec(dllexport) int Sub(int n)
{ count -= n; return count;}
Оформление функций и переменных, которые могут использоваться клиентами.
В примере приведены определение переменной count и две функции
int Add(int n) и int Sub(int n).
Пример. Использование функций DLL-модуля
#include <windows.h>
#include <iostream.h>
int main()
{
HMODULE hDll; // дескриптор DLL
int (*Add)(int); // для адреса функции Add из DLL
int (*Sub)(int); // для адреса функции Sub из DLL
int *pCount; // для адреса переменной count из DLL
// загружаем динамически подключаемую библиотеку
hDll = LoadLibrary("Count.dll");
if (!hDll)
{ cerr << "Load library failed." << endl; return GetLastError(); }
// настраиваем адрес переменной count из DLL
pCount = (int *)GetProcAddress(hDll, "count");
if (!pCount)
{ cerr << "Get variable address failed." << endl; return GetLastError(); }
// выводим начальное значение переменной count
cout << "Initial count = " << (*pCount) << endl;
// настраиваем адреса функций
Add = (int (*)(int))GetProcAddress(hDll, "Add");
Sub = (int (*)(int))GetProcAddress(hDll, "Sub");
if (!Add || !Sub)
{ cerr << "Get procedure address failed." << endl; return GetLastError(); }
// изменяем значение счетчика
cout << "count = " << Add(20) << endl;
cout << "count = " << Sub(15) << endl;
// отключаем библиотеку
if (!FreeLibrary(hDll))
{ cerr << "Free library failed." << endl; return GetLastError(); }
// выходим из программы
cout << "Press any key to exit.";
cin.get();
return 0;
}
3. Оборудование
4. Задание на работу
Создать и протестировать работу Dll-модуля по варианту, заданному преподавателем.
6. Контрольные вопросы
Программирование сервисов
1. Цель работы
Получить представление о принципах создания и использования сервисов.
2. Краткие теоретические сведения
Концепция сервиса
Сервис – процесс, который выполняет служебные функции.
Сервис запускается при загрузке операционной системы или по специальной команде.
Завершение работы сервиса осуществляется либо по специальной команде, либо при завершении работы ОС.
Пример сервиса – фоновый процесс для доступа к базе данный. Этот тип сервиса называется сервером.
Другой тип сервиса –программа доступа к внешним устройствам.
Монитор – сервис, который отслеживает работу приложения.
Управляет работой сервисов специальноая программа – менеджер сервисов.
Установка сервиса влечет изменение ключа реестра Services.
