Главная страница
Навигация по странице:

  • Основные требования к оформлению и содержанию отчета о лабораторной работе

  • Лабораторная работа № 1

  • Теоретические сведения Виды потоков

  • Относительный приоритет потока

  • Функции Win32 для управления потоками, состояния потока

  • Окончание потока

  • TerminateThread

  • Лабораторная работа № 2

  • Теоретические сведения Блокирующие функции

  • Системное_программирование. Практикум для студентов специальностей 140 01 02 Информационные системы и технологии


    Скачать 1.66 Mb.
    НазваниеПрактикум для студентов специальностей 140 01 02 Информационные системы и технологии
    Дата02.09.2020
    Размер1.66 Mb.
    Формат файлаpdf
    Имя файлаСистемное_программирование.pdf
    ТипПрактикум
    #136562
    страница1 из 6
      1   2   3   4   5   6

    82
    Министерство образования
    Республики Беларусь
    БЕЛОРУССКИЙ НАЦИОНАЛЬНЫЙ
    ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
    Кафедра «Программное обеспечение вычислительной техники
    и автоматизированных систем»
    СИСТЕМНОЕ
    ПРОГРАММИРОВАНИЕ
    Лабораторный практикум
    Минск
    БНТУ
    2012

    1
    Министерство образования Республики Беларусь
    БЕЛОРУССКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ
    УНИВЕРСИТЕТ
    Кафедра «Программное обеспечение вычислительной техники и автоматизированных систем»
    СИСТЕМНОЕ ПРОГРАММИРОВАНИЕ
    Лабораторный практикум для студентов специальностей 1-40 01 02
    «Информационные системы и технологии» и 1-40 01 01
    «
    Программное обеспечение информационных технологий»
    М и н с к
    Б Н Т У
    2 0 1 2

    2
    УДК 004.451 (076.5)
    ББК 32.973

    018у7
    С 40
    Составитель Н.А. Разорёнов
    Рецензенты:
    А.А. Москаленко, О.В. Бугай
    С 40
    Системное программирование: лабораторный практикум для студен- тов специальностей 1-40 01 02 «Информационные системы и техноло- гии» и 1-40 01 01 «Программное обеспечение информационных тех- нологий» / сост. Н.А. Разорёнов. – Минск: БНТУ, 2012. – 81 с.
    Приведен теоретический материал по выполнению лаборатор- ных работ по дисциплине «Системное программирование». Рассмат- риваются вопросы организации и принципы программирования в операционных системах (ОС) семейства Windows, графический оконный интерфейс, использование аппаратных и программных средств современных ОС, предназначенных для управления памя- тью, динамические библиотеки, управление файлами, создание,
    управление и взаимодействие процессов и потоков.
    Указания могут быть полезны студентам специальностей, свя- занных с программированием, и лицам, которые занимаются разра- боткой программного обеспечения на базе прикладного программно- го интерфейса операционных систем.
    ISBN 978-985-525-767-8
    © БНТУ, 2012

    3
    СОДЕРЖАНИЕ
    Основные требования к оформлению и содержанию отчета о лабораторной работе. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
    Лабораторная работа № 1.
    Управление потоками в Windows. . . . . . . . . . . . . . . . . . . . . . . . . . . . .6
    Лабораторная работа № 2.
    Синхронизация потоков Windows. . . . . . . . . . . . . . . . . . . . . . . . . . . .14
    Лабораторная работа № 3.
    Управление памятью в Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
    Лабораторная работа № 4.
    Создание и использование DLL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
    Лабораторная работа № 5.
    Графика Windows. Основы управления выводом графической и текстовой информации на базе библиотеки GDI. . . . . . . . . . . . . ..43
    Лабораторная работа № 6.
    Растровая графика. . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
    Лабораторная работа № 7.
    Передача информации между процессами . . . . . . . . . . . . . . . . . . . . 54
    Лабораторная работа № 8.
    Буфер обмена. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .62
    Лабораторная работа № 9.
    Межпроцессорное взаимодействие. . . . . . . . . . . . . . . . . . . . . . . . . . .68
    Литература . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
    Приложение. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .73

    4
    Основные требования к оформлению
    и содержанию отчета о лабораторной работе
    При оформлении отчета о работе следует соблюдать следующие требования:
    1.
    Шрифт – Times New Roman, 12–14 пт, через полтора интерва- ла. Параметры страницы: формат А4, левое поле 30 мм, правое поле
    10 мм, верхнее и нижнее поля 20 мм. Абзацы 15–17 мм, одинаковые по всему тексту. Страницы следует нумеровать в верхнем правом углу. Номер страницы на титульном листе не ставится, но включа- ется в общую нумерацию страниц.
    2.
    Отчёт оформляется персонально и самостоятельно, представ- ляется к защите в установленный срок в бумажном/электронном виде перед защитой лабораторной работы. Форма отчета устанав- ливается преподавателем. Выполненные лабораторные работы и отчеты сохраняются до конца семестра. Объем отчета 5–7 листов формата А4. Отчет может содержать приложения.
    3.
    Отчет должен содержать следующие листы и пункты:
    1- й лист – титульный лист (пример оформления титульного листа отчета приведен на рис. 1);
    2- й и последующие листы отчета содержат пункты:
    1)
    Цель работы.
    2)
    Изучаемые вопросы. берутся из описания работы
    3)
    Постановка задачи.
    4)
    Ход выполнения работы (содержит подпункты, комменти- рующие фрагменты кода разработанной программы, которые рас- крывают изучаемый вопрос. В подпунктах допускается приводить краткие теоретические сведения, схемы, рисунки, фрагменты дам- пов изучаемых объектов и т. д.).
    5)
    Результаты работы программного обеспечения.
    6)
    Выводы (не менее шести пунктов).
    7)
    Приложения (при необходимости).

    5
    БЕЛОРУССКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ
    УНИВЕРСИТЕТ
    Факультет информационных технологий и робототехники
    Кафедра «Программное обеспечение вычислительной техники и автоматизированных систем»
    О Т Ч Е Т о лабораторной работе № N
    Дисциплина
    «Системное программирование»
    Тема
    «
    Управление памятью в Windows
    »
    Выполнил: студент гр.1073ХХ Сидоров Н.Н.
    Проверил: Разорёнов Н.А.
    Минск 201х
    Рис. 1. Пример оформления титульного листа отчета

    6
    Лабораторная работа № 1
    УПРАВЛЕНИЕ ПОТОКАМИ В WINDOWS
    Цель работы: изучить основы создания и управления потоками в ОС Windows.
    Изучаемые вопросы
    1.
    Виды потоков, состояния потока.
    2.
    Структура CONTEXT.
    3.
    Создание потока.
    4.
    Относительный приоритет потока.
    5.
    Потоковая функция.
    6.
    Функции WinAPI для управления потоками.
    7.
    Окончание потока.
    8.
    Время выполнения потока.
    Постановка задачи
    Разработать многопоточное Win32-приложение, которое исполь- зует диалоговое окно для управления потоками процессов. Дизайн диалогового окна задается вариантом, преподавателем или самостоя- тельно. Для визуализации работы потоков использовать соответ- ствующие элементы управления диалога, графику. Приложение должно содержать три потока. Предусмотреть вывод системной ин- формации о потоках (например полей CONTEXT , временны пара- метры и т.д.). В отчете привести диаграмму состояния потоков, ко- пии окон.
    Теоретические сведения
    Виды потоков
    Поток – последовательность команд, обрабатываемых CPU. В рамках одного процесса может находиться один или несколько пото- ков. Процесс предоставляет ресурсы, поток – команды и данные для

    7 обработки. Процесс содержащий один поток называется однопоточ- ным, в противном случае – многопоточным.
    Многопоточная модель охватывает 2 категории потоков и их ком- бинацию:
    − потоки на уровне пользователя ULT (User Level Thread);
    − потоки на уровне ядра KLT (Kernel Level Thread);
    − комбинированная модель UKLT.
    ULT управляются самим приложением. KLT управляется самим яд- ром через интерфейс прикладного программирования средств ядра ОС.
    Структура CONTEXT
    В структуре CONTEXT хранятся данные о состоянии регистров с учетом специфики конкретного процессора. Она используется систе- мой для выполнения различных внутренних операций. В настоящее время такие структуры определены для процессоров Intel, MIPS,
    Alpha и PowerPC. Эта структура разбита на несколько разделов.
    Раздел CONTEXT_CONTROL содержит управляющие регистры процессора: указатель команд, указатель стека, флаги и адрес возвра- та функции.
    Раздел CONTEXT_INTEGER соответствует целочисленным ре- гистрам процессора, CONTEXT_FLOATING_POINT – регистрам с плавающей точкой, CONTEXT_SEGMENTS – сегментным реги- страм (только для x86), CONTEXT_DEBUG_REGISTERS – реги- страм, предназначенным для отладки (только для x86), a
    CONTEXT_ EXTENDED_REGISTERS – дополнительным реги- страм
    (только для x86).
    Получить сведения о текущем состоянии регистров процессора. можно с помощью функции:
    BOOL GetThreadContext( HANDLE hThread, PCONTEXT pContext);
    Пример.
    Объявляем структуру ct:
    CONTEXT ct;
    //
    Заполняем структуру CONTEXT с помощью функции
    GetThreadContext:

    8
    GetThreadContext(hThread[num], &ct);
    Описание структуры CONTEXT: typedef struct _CONTEXT {
    DWORD ContextFlags;
    DWORD Dr0; DWORD Dr1;
    DWORD Dr2; DWORD Dr3;
    DWORD Dr6; DWORD Dr7;
    DWORD SegGs;
    DWORD SegFs;
    DWORD SegEs;
    DWORD SegDs;
    DWORD Edi; DWORD Esi;
    DWORD Ebx; DWORD Edx;
    DWORD Ecx; DWORD Eax;
    DWORD Ebp; DWORD EFlags;
    DWORD Esp; DWORD SegSs;
    BYTE ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
    } CONTEXT;
    Некоторые поля данной структуры отображаются в окне про- граммы, приведенной на рисунке 1.1.

    9
    Рис. 1.1. Главное окно программы
    Создание потока
    Ниже приведен фрагмент кода, демонстрирующий создание пото- ка в приостановленном состоянии. hThread[0] = CreateThread(
    NULL,
    // указатель на структуру SECURITY_ATTRIBUTES
    0,
    // определяет размер стека по умолчанию
    ThreadOneProc, //определяет адрес потоковой функции
    NULL,
    // указатель на аргумент потоковой функции
    CREATE_SUSPENDED, // поток остановлен
    &dwThreadId
    [0]); // возвращает идентификатор потока
    Относительный приоритет потока
    При создании потока функцией CreateThread() существует воз- можность задать относительный приоритет потока. Если не указы- вать данный флаг, то по умолчанию потоку присвоится нормальный приоритет. Возможные приоритеты перечислены в таблице 1.1. Так- же задать приоритет потока можно с помощью функции
    SetThreadPriority:
    SetThreadPriority(hThread[i], THREAD_PRIORITY_NORMAL);
    Таблица 1.1
    Относительные приоритеты потоков
    Приоритет
    Флаговый идентификатор
    Below normal (ниже обычного)
    THREAD_PRIORITY_BELOW_NORMAL
    Norm al (обычный)
    THREAD_PRIORITY_NORMAL
    Above normal (выше обычного)
    THREAD_PRIORITY_ABOVE_NORMAL
    Highest (высокий)
    THREAD_PRIORITY_HIGHEST
    Realtime (реального времени)
    THREAD_PRIORITY_TIME_CRITICAL
    Lowest (низкий)
    THREAD_PRIORITY_LOWEST
    Idle (простаивающий)
    THREAD_PRIORITY_IDLE
    Потоковая функция

    10
    Функция потока принимает указатель на структуру с параметрами типа LPVOIDи возвращает значение типа DWORD .
    DWORD WINAPI ThreadOneProc(LPVOID lpParam)
    {

    ExitThread(0); // завершение потока return 0;
    }
    Функция потока может выполнять любые задачи. Рано или поздно она закончит свою работу и вернет управление. В этот момент поток остановится, память, отведенная под его стек, будет освобождена, а счетчик пользователей его объекта ядра "поток" уменьшится на 1.
    Когда счетчик обнулится, этот объект ядра будет разрушен. Но, как и объект ядра "процесс", он может жить гораздо дольше, чем сопостав- ленный с ним поток.
    Пример функции потока, визуализирующий свою работу трек ба- ром, приведен ниже.
    DWORD WINAPI TrackBarThread(PVOID pvParam)
    { static int count=0; for(;;)//for(int i=0;i<=100;i++)
    { for(int i=0;i<=10000000;i++)
    {
    } count++; if(count==100) count=0;
    SendMessage(hTB, TBM_SETPOS,(WPARAM)
    TRUE,(LPARAM) count);
    } return 0;
    }
    Функции Win32 для управления потоками, состояния потока
    Создание потока:

    11
    CreateThread(NULL,0,ThreadOneProc,NULL, CREATE_SUSPENDED,
    &dwThreadId[0]);.
    Назначение потоку относительного приоритета:
    SetThreadPriority(hThread[i], THREAD_PRIORITY_NORMAL);.
    Возобновление потока:
    ResumeThread(hThread[i]);.
    Приостановка потока:
    SuspendThread(hThread[i]);.
    Получение времени создания, окончания потока и др.:
    GetThreadTimes(hThread[i],&creationTime,&exitTime,
    &kernelTime, &userTime);.
    Ожидание завершения множества потоков:
    WaitForMultipleObjects(3, hThread, TRUE, INFINITE);.
    Получение контекста потока:
    GetThreadContext(hThread[num], &ct);.
    Завершение потока:
    ExitThread(0);.
    Завершение потока извне:
    TerminateThread(hThread[i],0);.
    Окончание потока
    Поток можно завершить способами:
    − функция потока возвращает управление (рекомендуемый способ);
    − поток самоуничтожается вызовом функции ExitThread (не- желательный способ);
    − один из потоков данного или стороннего процесса вызывает функцию TerminateThread (нежелательный способ);
    − завершается процесс, содержащий данный поток (тоже не- желательно);
    − какой-либо поток процесса вызывает функцию ExitProcess();
    − какой-либо поток вызывает функцию TerminateThread() с де- скриптором потока;
    − какой-либо поток вызывает функцию TerminateProcess() с дескриптором процесса.
    Время выполнения потока
    Временные показатели работы потока определяются функцией
    GetThreadTimes
    , которая возвращает четыре временных параметра, приведенных в таблице 1.2.
    BOOL GetThreadTimes(HANDLE hThread,

    12
    PFILETIME pftCreationTime, PFILETIME pftExitTime,
    PFILETIME pftKernelTime, PFILETIME pftUserTime);
    Таблица 1.2
    Временные параметры GetThreadTimes
    Показатель времени
    Описание
    Время создания
    (creation time)
    Абсолютная величина, выраженная в интервалах по 100 нс. Отсчитывается с полуночи 1 января
    1601 года по Гринвичу до момента создания по- тока
    Время завершения
    (exit time)
    Абсолютная величина, выраженная в интервалах по 100 нс. Отсчитывается с полуночи 1 января
    1601 года по Гринвичу до момента завершения потока. Если поток все еще выполняется, этот показатель имеет неопределенное значение
    Время выполнения ядра (kernel time)
    Относительная величина, выраженная в интерва- лах по 100 нс. Сообщает время, затраченное этим потоком на выполнение кода операционной си- стемы
    Время выполнения
    User (User time)
    Относительная величина, выраженная в интерва- лах по 100 нс. Сообщает время, затраченное по- током на выполнение кода приложения.
    В программе определение и вывод времени создания потоков можно выполнить следующим образом:
    GetThreadTimes(hThread[i],&creationTime,
    &exitTime,&kernelTime,&userTime);
    // Дата и время создания процесса по Гринвичу
    FileTimeToSystemTime(&creationTime, &stUTC);
    /
    / Конвертируем время создания процесса в местное время
    SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal); j+=wsprintf(buf+j, L"Время создания %d-го потока:
    %02d/%02d/%d %02d:%02d:%02d\r\n\n", i+1, stLocal.wDay, stLocal.wMonth, stLocal.wYear, stLocal.wHour, stLocal.wMinute, stLocal.wSecond);
    // Дата и время завершения процесса по Гринвичу
    FileTimeToSystemTime(&exitTime, &stUTC);
    // Конвертируем время завершения процесса в местное время

    13
    SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal); j+=wsprintf(buf+j, L
    "Время завершения %d-го потока:
    %02d/%02d/%d %02d:%02d:%02d\r\n\n", i+1, stLocal.wDay, stLocal.wMonth, stLocal.wYear, stLocal.wHour, stLocal.wMinute, stLocal.wSecond);
    На рисунке 1.2 приведен вывод временных показателей потоков.
    Рис. 1.2. Информация о времени создания потоков

    14
    Лабораторная работа № 2
    СИНХРОНИЗАЦИЯ ПОТОКОВ В WINDOWS
    Цель работы: Изучить основы синхронизации потоков в ОС
    Windows.
    Изучаемые вопросы
    1.
    Блокирующие функции. Защищённый доступ к перемен- ным.
    2.
    Критические секции.
    3.
    Ожидающие функции.
    4.
    Взаимоисключения.
    5.
    События.
    6.
    Семафоры.
    Постановка задачи
    Разработать многопоточное Win32-приложение, синхронизиру- ющее работу трех вторичных потоков:
    − первый помещает данные типа Type в хранилище на n элементов;
    второй сортирует данные в хранилище;
    − третий извлекает данные из хранилища и визуализирует их.
    Тип хранилища и тип данных задается преподавателем.
    Теоретические сведения
    Блокирующие функции
    Большая часть синхронизации потоков связана с атомарным до-
    ступом (atomic access) – монопольным захватом ресурса обращаю- щимся к нему потоком.
    DWORD WINAPI FirstThread(LPVOID)
    {

    15 while (InterlockedExchange((PLONG)&g_fResourceInUse, TRUE)
    == TRUE) Sleep(Х); char buffer[3];
    GetWindowText(hEdit3,buffer,GetWindowTextLength(hEdit
    3)+1); n=atoi(buffer);
    GetWindowText(hEdit4,buffer,GetWindowTextLength(hEdit
    4)+1); m=atoi(buffer); for(short i=0;i{ for(short j=0;j{ sMatr[i][j]=rand()%32000-16000;
    }
    }
    InterlockedExchange((PLONG)&g_fResourceInUse, FALSE); return 0;
    }
    В этой функции постоянно "крутится" цикл while, в котором пе- ременной g_fResourceInUse присваивается значение TRUE и прове- ряется ее предыдущее значение. Если оно было равно FALSE, зна- чит, ресурс не был занят, но вызывающий поток только что занял его, на этом цикл завершается. В ином случае (значение было равно
    TRUE) ресурс занимал другой поток, и цикл повторяется.
    Ожидающие функции
    Wait- функции позволяют потоку в любой момент приостановиться и ждать освобождения какого-либо объекта ядра. Из всего семейства этих функций чаще всего используется WaitForSingleObject:
    DWORD WaitForSingleObject( HANDLE hObject, DWORD dwMilliseconds);
    Первый параметр, hObject, идентифицирует объект ядра, под- держивающий состояния «свободен-занят». Второй параметр,
    dwMilliseconds,
    указывает, сколько времени (в миллисекундах) по- ток готов ждать освобождения объекта. hThreadI=CreateThread(NULL,0,ThreadFuncI,0,0,&dwThreadIDI);

    16
    DWORD dw = WaitForSingleObject(hThreadI, 500); switch (dw)
    { case WAIT_OBJECT_0:
    SendMessage(hResult,LB_RESETCONTENT,0,0L); for (i=0; i<=5;i++)
    SendMessage(hResult,LB_ADDSTRING,0,
    (LPARAM)(LPSTR)szBuffer[i]); break; case WAIT_TIMEOUT:
    MessageBox(hWnd,"Не успели...","Предупреждение",MB_OK); break; case WAIT_FAILED:
    MessageBox(hWnd,"
    Нет такого описателя.",
    "Предупреждение",MB_OK); break;
    }
      1   2   3   4   5   6


    написать администратору сайта