Методические указания к лабораторным работам
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

для студентов IV курса АВТФ

(специальность 2 1 0 1 00)

Дневной формы обучения

НОВОСИБИРСК

2004

Составитель: А.В. Гунько, канд. техн. наук, доц.

Работа подготовлена на кафедре автоматики

© Новосибирский государственный технический университет, 200 4 г.

ЛАБОРАТОРНАЯ РАБОТА № 1

МНОГОЗАДАЧНОЕ И МНОГОПОТОЧНОЕ

ПРОГРАММИРОВАНИЕ В WINDOWS

 

1. Цель работы: Изучить способы и средства написания параллельно выполняющихся процессов и потоков средствами языка C++ в операционных системах семейства Windows.

 

2. Краткие теоретические сведения. 

Применяемые функции WinAPI, их параметры.

CreateProcess – создание процесса :

BOOL CreateProcess

(LPCTSTR lpApplicationName, // имя исполняемого модуля

LPTSTR lpCommandLine, // Командная строка

LPSECURITY_ATTRIBUTES lpProcessAttributes,

// Указатель на структуру SECURITY_ATTRIBUTES

LPSECURITY_ATTRIBUTES lpThreadAttributes, 

// Указатель на структуру SECURITY_ATTRIBUTES

BOOL bInheritHandles,  // Флаг наследования текущего процесса

DWORD dwCreationFlags, // Флаги способов создания процесса

LPVOID lpEnvironment,  // Указатель на блок среды

LPCTSTR lpCurrentDirectory, // Текущий диск или каталог

LPSTARTUPINFO lpStartupInfo,// Указатель нас структуру STARTUPINFO

LPPROCESS_INFORMATION lpProcessInformation

// Указатель нас структуру PROCESS_INFORMATION

);

pApplicationName. Указатель на строку которая заканчивается нулем и содержит имя выполняемого модуля. Этот параметр может быть NULL - тогда имя модуля должно быть в lpCommandLine самым первым элементом. Если операционная система NT и модуль 16 разрядов - параметр NULL стоит обязательно. Имя модуля может быть абсолютным или относительным. Если относительное, то будет использована информация из lpCurrentDirectory или текущий каталог.

lpCommandLine. Командная строка. Здесь передаются параметры. Она может быть NULL. Здесь можно указать и путь и имя модуля.

lpProcessAttributes.Здесь определяются атрибуты защиты для нового приложения. Если указать NULL то система сделает это по умолчанию.

lpThreadAttributes. Здесь определяются атрибуты защиты для первого потока созданного приложением. NULL опять приводит к установке по умолчанию.

bInheritHandles. Флаг наследования от процесса, производящего запуск. Здесь наследуются дескрипторы. Унаследованные дескрипторы имеют те же значения и права доступа, что и оригиналы.

dwCreationFlags. Флаг способа создание процесса и его приоритет:

CREATE_DEFAULT_ERROR_MODE - новый процесс не наследует режим ошибок (error mode) вызывающего процесса.

CREATE_NEW_CONSOLE - новый процесс получает новую консоль вместо того, чтобы унаследовать родительскую.

CREATE_NEW_PROCESS_GROUP - создаваемый процесс - корневой процесс новой группы.

CREATE_SEPARATE_WOW_VDM - (только Windows NT): Если этот флаг установлен, новый процесс запускается в собственной Virtual DOS Machine (VDM). 

CREATE_SHARED_WOW_VDM - (только Windows NT): Этот флаг указывает функции CreateProcess - запустить новый процесс в разделяемой Virtual DOS Machine.

CREATE_SUSPENDED - первичная нить процесса создается в спящем (suspended) состоянии и не выполняется до вызова функции ResumeThread.

CREATE_UNICODE_ENVIRONMENT - если этот флаг установлен, блок переменных окружения, указанный в параметре lpEnvironment, использует кодировку Unicode. Иначе - кодировку ANSI.

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

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

DETACHED_PROCESS - создаваемый процесс не имеет доступа к родительской консоли.

Этот флаг нельзя использовать с флагом CREATE_NEW_CONSOLE.

HIGH_PRIORITY_CLASS - указывает на то, что процесс выполняет критичные по времени задачи

IDLE_PRIORITY_CLASS - указывает процесс, выполняются только когда система находится в состоянии ожидания

NORMAL_PRIORITY_CLASS - указывает на процесс, без каких либо специальных требований к выполнению.

REALTIME_PRIORITY_CLASS - указывает процесс имеющий наивысший возможный приоритет.

lpEnvironment. Указывает на блок среды. Если NULL, то будет использован блок среды родительского процесса. Блок среды это список переменных имя=значение в виде строк с нулевым окончанием.

lpCurrentDirectory.Указывает текущий диск и каталог. Если NULL то будет использован диск и каталог процесса родителя.

LpStartupInfo. Используется для настройки свойств процесса, например расположения окон и заголовок. Структура должна быть правильно инициализирована

STARTUPINFO sti;// структура

ZeroMemory(&sti,sizeof(STARTUPINFO));// обнулить

sti.cb=sizeof(STARTUPINFO);// указать размер

lpProcessInformation Структура PROCESS_INFORMATION с информацией о процессе. Будет заполнена Windows.

В результате выполнение функций вернет FALSE или TRUE. В случае успеха TRUE. Пример использования.

#include "stdafx.h"

#include "windows.h"

#include "iostream.h"

void main()

{

STARTUPINFO cif;

ZeroMemory(&cif,sizeof(STARTUPINFO));

PROCESS_INFORMATION pi;

if (CreateProcess("c:\\windows\\notepad.exe",NULL,

NULL,NULL,FALSE,NULL,NULL,NULL,&cif,pi)==TRUE)

{

cout << "process" << endl;

cout << "handle " << pi.hProcess << endl;

Sleep(1000);// подождать

TerminateProcess(pi.hProcess,NO_ERROR);// убрать процесс

}

}

CreateThread – создание потока:

HANDLE  CreateThread(

LPSECURITY_ATTRIBUTES lpThreadAttributes

DWORD dwStackSize,                       

LPTHREAD_START_ROUTINE lpStartAddress,   

LPVOID lpParameter,                      

DWORD dwCreationFlags,                   

LPDWORD lpThreadId);

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

dwStackSize - размер стека. Каждый поток имеет собственный стек.

lpStartAddress - адрес памяти, где стартует поток. Он должен быть равен адресу функции в стандартном модуле, полученном при использовании оператора AddressOf.

lpParameter - long 32 разрядный параметр, который передается функции, запускающей новый поток.

dwCreationFlags - 32 бит переменная флагов, которая позволяет Вам управлять запуском потока (активный, приостановленный и т.д.). Подробнее об этих флагах можно почитать в Microsoft's online 32 bit reference.

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

Для упорядоченного вывода результатов работы процессов (потоков) на экран можно использовать функцию Sleep ():

VOID Sleep(

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

);

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

Если параметр функции Sleep задан равным нулю, то поток будет лишен остатка выделенного ему кванта процессорного времени.

Когда поток вызывает функцию Sleep, задержка на заданное время относится к этому потоку. Система продолжает выполнять другие потоки этого и других процессов.

 

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

Проект может быть реализован на Visual C++ 6.0 или в среде Borland C++ 5.0. В первом случае выбирается консольное приложение Win32 без дополнительных библиотек. Во втором случае в программу необходимо добавить файл включения windows.h.

Для обмена информацией между процессами рекомендуется использовать файлы. При использовании потоков для обмена информацией целесообразно использовать глобальные переменные.

 

Порядок выполнения работы.

4.1. Написать и отладить программу, реализующую порожденный процесс.

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

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

 

Варианты заданий.

5.1. Поиск всех простых чисел в указанном интервале чисел, разделенном на несколько диапазонов:

5.1.1. разработать программу, вычисляющую все простые числа в произвольном интервале;

5.1.2. написать программу, разбивающую заданный интервал на несколько диапазонов и проводящую поиск в каждом диапазоне в отдельном процессе. Запуск написанной ранее программы осуществлять функцией CreateProcess().

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

5.2. Поиск указанной строки в указанном файле:

5.2.1. написать программу, которая производит поиск заданного сочетания символов в одной строке текстового файла;

5.2.2. разработать программу, которая обеспечивала бы поиск сочетания символов во всем файле. Но для обработки каждой строки следует вызывать написанную ранее программу, передавая ее в качестве параметра командной строки в функцию CreateProcess();

5.2.3. написанную программу поиска сочетания символов в одной строке представить в виде функции, которую следует вызывать из главной подпрограммы посредством функции CreateThread().

5.3. Умножение матрицы произвольного порядка на вектор:

5.3.1. Написать программу, умножающую строку произвольной длины на столбец;

5.3.2. разработать программу, реализующую произведение матрицы произвольного порядка на вектор. Умножение каждой строки производить в отдельном процессе, вызывая написанную подпрограмму умножения строки на столбец;

5.3.3. для разработки многопоточного приложения подпрограмму умножения одной строки представить отдельной функцией, которую в последствии можно будет вызывать в созданном функцией CreateThread() потоке для каждой строки.

5.4. Свертка сигнала с импульсной характеристикой фильтра ( ). N – число отсчетов импульсной характеристики необходимо разбить на несколько диапазонов:

5.4.1. написать программу, реализующую свертку сигнала с некоторым диапазоном отсчетов импульсной характеристики;

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

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

5.4.4. В качестве импульсной характеристики можно использовать характеристику идеального НЧ – фильтра: где  - частота среза (0< <0.5) .

5.5. Warcraft. Заданное количество юнитов добывают золото равными порциями из одной шахты, задерживаясь в пути на случайное время, до ее истощения:

5.5.1. написать программу работы одного юнита;

5.5.2. написать программу с произвольным количеством юнитов, работа каждого должна осуществляться в отдельном процессе. В качестве порожденного процесса применять написанную программу работы одного юнита, запуская ее из функции CreateProcess();

5.5.3.  работу одного юнита представить в отдельной функции и вызывать ее в отдельном потоке для каждого юнита функцией CreateThread().

5.6. Винни-Пух и пчелы. Заданное количество пчел добывают мед равными порциями, задерживаясь в пути на случайное время. Винни-Пух потребляет мед порциями заданной величины за заданное время и столько же времени может прожить без питания.

5.6.1. реализовать программу работы одной пчелы;

5.6.2. разработать программу, в которой осуществляется работа Винни-Пуха и для заданного количества пчел вызывается отдельный процесс работы одной пчелы;

5.6.3. написать функцию работы пчелы и вызывать ее из главной для каждой пчелы в отдельном потоке.

5.7. Net Send. Отправка заданного сообщения по указанному диапазону IP-адресов сети класса «С» (254 адреса, маска 255.255.255.0) разделенному на несколько поддиапазонов:

5.7.1. разработать программу отправки сообщения по диапазону IP-адресов;

5.7.2. написать программу, разбивающую заданный диапазон IP-адресов на поддиапазоны и для каждого поддиапазона в порожденном процессе запускать программу, осуществляющую отправку сообщения;

5.7.3. выделить функцию отправки сообщения по диапазону адресов и вызывать ее из главной подпрограммы в отдельном потоке для каждого поддиапазона.

5.7.4. Для лабораторных работ 3, 4 вместо Net Send использовать команду ping.

5.8. Шарики. Координаты заданного количества шариков изменяются на случайную величину по вертикали и горизонтали, при выпадении шарика за нижнюю границу допустимой области шарик исчезает:

5.8.1. написать программу изменения координат одного шарика;

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

5.8.3. написать программу изменения координат заданного количества шариков, где изменение координат каждого шарика осуществляется функцией в отдельном потоке.

5.9. Противостояние двух команд – каждая команда увеличивается на случайное количество бойцов и убивает случайное количество бойцов участника.

5.9.1. написать программу, которая бы осуществляла уменьшение числа бойцов в противостоящей команде и увеличение в своей на случайную величину;

5.9.2. написать программу, в которой бы в родительском процессе запускались порожденные, реализующие деятельность одной команды (программа, написанная в предыдущем пункте);

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

 

Содержание отчета.

6.1.  Цель работы.

6.2. Вариант задания.

6.3. Листинги программ.

 

7. Контрольные вопросы.

7.1. Что такое API? Какие они бывают?

7.2. Задачи, решаемые API ОС.

7.3. Варианты реализации API. Чем они отличаются?

7.4. Реализация функций API на уровне ОС. Особенности.

7.5. Реализация функций API на уровне системы программирования. Особенности.

7.6. Реализация функций API с помощью внешних библиотек. Особенности.

7.7. Платформенно-независимый интерфейс POSIX.

7.8. Создание процессов средствами WinAPI.

7.9. Создание потоков средствами WinAPI.

7.10. Чем отличаются процессы и потоки?

7.11. Средства синхронизации потоков в WinAPI.

7.12. Средства получения информации о процессах и потоках.

 

ЛАБОРАТОРНАЯ РАБОТА №2

ОЗНАКОМЛЕНИЕ С ОС LINUX

 

1. Цель работы: Ознакомление с операционной системой и основными командами работы с файлами и каталогами ОС Unix/Linux.

 

Дата: 2019-12-22, просмотров: 260.