ТОП 10:

Средства оценки эффективности исполнения программы



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

Команда time позволяет выяснить три значения потраченного на решение указанной программы времени в секундах: реального, равного времени, замеренному по секундомеру, зависящего от количества пользователей в данный момент; пользовательского, равного времени счета программы по командам пользователя, и системного, равного времени системы при обслуживании этой программы. Команда time в Shell и в C-Shell имеет разные формы выдачи.

Пример (в Shell):

$ time test

real 30.0

user 27.6

sys 0.5

$

 

Команда size показывает размер памяти в байтах трех различных частей программы: выполняемого кода (называемого текстом), области инициируемых данных и области неинициируемых данных.

Пример:

$ size test

1356 + 260 + 613 = 2226 b = 004265 b

 

Общий размер программы test равен 4265 байтов. Если имя оцениваемого файла отсутствует, подразумевается a.out.

Для программы на языке C есть более тонкое средство, позволяющее получить профиль программы, показывающий для каждой подпрограммы долю времени ее выполнения в процентах (% time), суммарное время ее выполнения в секундах (cumsecs), количество ее вызовов (# call) и время, потраченное на один вызов в миллисекундах (ms/call). Для получения профиля следует перетранслировать программу с ключом -p (профиль), а после запуска программы, во время которого статистическая информация будет собрана в файле mon.out, выполнить команду prof для обработки указанного файла.

Пример:

$ cc -p program.c

$ mv a.out program

$ program

$ ls

mon.out

program

program.c

$ prof program

name % time cumsecs # call ms/call

conv 58.6 11.38 2000 5.69

strcat 30.1 9.50 100 95.0

main 1.1 2.1 1 2.1

. . . . . . . . . . . . . . . . . . . . .

atoi 0.0 0.1 1 0.0

 

Создание процессов

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

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

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

Рассмотрим функцию fork(). fork() — порождает процесс, являющийся его точной копией. Новый процесс выполняется в том же адресном пространстве и наследует все данные порождающего процесса.

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

Пример, использования функции fork():

 

printf(“PID родителя равен %d\n”, getpid());

if (child_pid = fork()) {

printf(“Это родитель, PID сына %d\n”, child_pid);

} else {

printf(“Это сын, PID %d\n”, getpid());

}

 

Задание на выполнение

 

  1. Изучить процедуру компиляции.

 

  1. Повторить стандартный ввод – вывод, разбор аргументов и переменных среды. Исследовать работу функций fopen(), fclose(), fprintf(), функция fork() - запуск программы в фоновом режиме, в системе unix.

 

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

 


ЛАБОРАТОРНАЯ РАБОТА №2 «Разработка программы моделирующей различные механизмы планирования заданий»

Цель работы

 

Изучение механизмов планирования заданий

 

Диспетчеризация потоков

 

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

Многозадачность подразумевает параллельное выполнение нескольких действий, однако практическая реализация парал­лельной работы упирается в проблему совместного использова­ния ресурсов вычислительной системы. И главным ресурсом, распределение которого между несколькими задачами называ­ется диспетчеризацией (scheduling), является процессор. Поэтому в однопроцессорной системе по-настоящему параллельное вы­полнение нескольких задач невозможно. Существует достаточно большое количество различных методов диспетчеризации.

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

Каждый поток имеет важное свойство, на основании кото­рого ОС принимает решение о том, когда предоставить ему вре­мя процессора. Это свойство называется приоритетом потока и выражается целочисленным значением. Количество приорите­тов (или уровней приоритетов) определяется функциональны­ми возможностями ОС, при этом самое низкое значение (0) закрепляется за потоком, который предназначен для корректной работы системы, когда ей "ничего не надо делать".

Поток может находиться в одном из следующих состояний:

– Активный поток — это тот поток, который в данный момент выполняется системой.

– Поток в состоянии готовности — поток, который может
выполняться и ждет своей очереди.

– Блокированный поток — поток, который не может выполняться по некоторым причинам (например, ожидание события или освобождения нужного ресурса).

 

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

FIFO (First In First Out). Первой выполняется задача, первой вошедшая в очередь, при этом она выполняется до тех пор, пока не закончит свою работу или не будет заблокирована в ожидании освобождения некоторого ресурса или события. После это­го управление передается следующей в очереди задаче.

Карусельная многозадачность (round robin). При этом мето­де диспетчеризации в системе задается специализирован­ная константа, определяющая продолжительность непре­рывного выполнения потока, так называемый квант вре­мени выполнения (time slice). Таким образом, выполне­ние потока может быть прервано либо окончанием его работы, либо блокированием в ожидании ресурса или события, либо завершением кванта времени (того самого time slice). После этого управление передается следующе­му в очередности потоку. По окончании времени после­днего потока управление передается первому потоку, на­ходящемуся в состоянии готовности. Таким образом, вы­полнение каждого потока разбито на последовательность временных циклов.

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

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

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

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

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


Задание на выполнение

 

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

Создайте программу, реализующую механизмы планирования выполнения заданий: FIFO, Round Robin, приоритет­ная многозадачность, адаптивная многозадачность.

Для этого создайте в программе класс, имеющий свойствa Number=0, Priority=N и метод AddNumber(), в котором происходит инкрементирование (увеличение на единицу) свойства Number.

По нажатию на кнопку окна программы в ней генерируются несколько экземпляров этого класса (например, 5), и запускается цикл или периодическое событие (перед стартом работы события, выбирается тип используемого механизма планирования), которое в зависимости от выбранного вида планирования заданий вызывает метод AddNumber() какого-либо экземпляра объекта.

На экране в виде таблицы печатается номер экземпляра, его приоритет Priority[3] и свойство Number.

Программа не должна «зависать» и может быть закрыта в любой момент времени.

Подготовьте отчет о работе программы.

 







Последнее изменение этой страницы: 2016-08-16; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 34.239.167.74 (0.008 с.)