Классический приватный университет кафедра системного анализа и программной инженерии Отчет по лабораторной работе № 4 дисциплины "Операционные системы" Тема "Исследование временных характеристик программных процессов операционной системы Windows." Выполнил: ст. гр. DI-112 ______________ Маслий Г.П. Принял: _______________ Хрипко С. Г. Запорожье 2016 г Выполнение работы Задание 3: Подобрать параметр повторения цикла в режимах - "с прерыванием с консоли" и "без прерывания". Зафиксировать в отчете эти значения и времена выполнения. С прерыванием: Без пре рыв ани я: Задание 4: Выполнить подбора параметра повторения с учетом операций ввода-вывода. Зафиксировать в отчете это значение и время выполнения. Без вывода: Задание 5: Выполнить анализ полученных результатов. Выяснить количественно на сколько или во сколько раз операции ввода/вывода замедляют выполнение программы. Задание 6: Выполните подобное сравнение (см. п.5) для случаев: - "вычислительный" процесс не использует вызов процедуры, например для probatime.cpp, "цикл расчета" реализован без вызова процедуры: for(long int k=1; k<=k_out; k++) { for(j=0; j<k_in; j++) { y= exp(x); // что вычисляется.... }; }; - "цикл расчета" реализован с использованием вызова процедуры (в место выше указанного фрагмента): for(long int k=1; k<=k_out; k++) { for(j=0; j<k_in; j++) { y= dig(x); // что вычисляется.... }; }; Саму процедуру оформите как: double dig(double x) { double x, y; y= exp(x); // что вычисляется.... return y; } Цикл расчета с процедурой: Зада ние 7: Выпо лнит е подо бное сравн ение для случа ев -в часто (многократно) вызываемой процедуре определяются ("рождаются") локальные переменные и - в процедуре используются статические переменны: например: double z(10000); - в первом случае, и static double z(10000) - во втором. Напомним, что динамически "получить" оперативную память для использования в программе можно, например, по следующей "схеме": double dig(double x) { double y, *ddd; int n=10000; ddd=(double*)malloc(n*sizeof(double)); y=exp(x); free(ddd); // или delete [] ddd; return y; } double z(10000): static double z(10000): Задание 8: Исследуй те влияния буферизованного (потокового) и не буферизованного ввода/вывода на время выполнения программного процесса. Для этого создайте два процесса по разному выводящие на винчестер достаточно большие файлы разными способами. Буферизованный (потоковый) и не буферизированный вывод в программах может быть организован путем использования соответствующих С++ библиотечных функций. Буферизированный вывод обычно выполняется по следующей схеме: char *buf=new char[101]; FILE *f1; f1=fopen("d:\\fff.txt","w+t"); if (!f1) { perror("d:\\fff.txt"); exit(16); }; //********************** sprintf(buf,"%99d\n", num_str++); fprintf(f1,"%s",buf); //********************** fclose(f1); Не буферизированный вывод обычно выполняется по следующей схеме: char *buf=new char[101]; int handle, result; handle=open("d:\\fff1.txt",O_RDWR|O_TRUNC|O_TEXT|O_CREAT, S_IWRITE); if (handle == -1) { perror("Open d:\\fff1.txt"); exit(16); } //********************** sprintf(buf,"%99d\n", num_str++); result=write(handle, buf, strlen(buf)); // запись блоками по strlen(buf) байт. //********************** close (handle); можно, конечно записывать и по одному байту //********************** sprintf(buf,"%99d\n", num_str++); for(int i=0; buf[i] != '\0'; i++) { result=write(handle, &buf[i], 1); if ( result == -1 ) { perror("write d:\\fff.txt"); exit (16); }; }; Буферизированный вывод: Не буферизированный вывод запись по 100 байт: Не буферизированный вывод запись по 1 байту: Нет отклика от программы.