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


РАЗРАБОТКА ПРОГРАММЫ, СОЗДАЮЩЕЙ ДВА НЕЗАВИСИМЫХ ПАРАЛЛЕЛЬНЫХ ПОДПРОЦЕССА, ВЫПОЛНЯЮЩИХ ПРОСТЫЕ АРИФМЕТИЧЕСКИЕ ЗАДАЧИ

Выполнил:

Ст. группы М-34д

Ярославцев Д. А.

Севастополь

2010

Постановка задачи

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

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

Проанализировать полученные результаты.

Фибоначчи подпроцесс арифметический приоритет

Текст Программы С Комментариями

Class ThreadTest10 implements Runnable {

Final static int iterations=90;

Final static int sleepTime=1;

Boolean yield=false;

Static long n1;

Static long fibsubLast1=0;

Static long fibLast1=1;

ThreadTest10() {

FibsubLast1=0; fibLast1=1; n1=0; //обнуление вспомогательных переменных

Thread t1 = new Thread(this, "Thread 1");

T1.setPriority(priority1);

System. out. println("Thread created: " + t1);

T1.start();

Thread t2 = new Thread(this, "Thread 2");

T2.setPriority(priority2);

System. out. println("Thread created: " + t2);

System. out. println("Thread 2 1"); // первое число Фиббоначчи

T2.start();

Try {t1.join(); t2.join(); } // ожидание окончания работы потоков

Catch (InterruptedException e) {System. out. println("interrupted");}

System. out. println("exiting main thread"); }

Public void run() {

Thread t = Thread. currentThread();

If(t. getName().equals("Thread 1")){

For (int i=1; i<=iterations; i++) { n1+=i;

System. out. println(t. getName()+" " + ((double)n1/(double)i)); // среднее арифметическое

Try{ t. sleep(sleepTime); } catch(Exception e){}

If(yield)t. yield();

}

} else {

For(int i=0;i<iterations;i++){

System. out. println(t. getName()+" " + fib(fibLast1,fibsubLast1)); // Фиббоначчи

Try{ t. sleep(sleepTime); } catch(Exception e){}

If(yield)t. yield();

}

System. out. println("exiting "+t. getName());

}

}

Public static int fibonacci(int n) { return (n<=2?1:fibonacci(n-1)+fibonacci(n-2)); }

Public static long fib(long fibsubLast, long fibLast) {

Long sum=fibsubLast+fibLast;

FibsubLast1=fibLast1;

FibLast=sum;

FibsubLast1=fibsubLast;

FibLast1=fibLast;

Return sum;

}

Public static void main() { new ThreadTest10(); }

}

Протоколы испытаний

При каждом испытании будет получен пример исполнения программы для 90 циклов работы каждого из двух потоков. Для наглядности в отчете представлены наиболее характерные участки выводимого результата. Испытания будем проводить по трем основным направлениям:

    1. Исследуем поведение программы при различных значениях приоритетов подпроцессов. 2. Исследуем влияние временных задержек. 3. Исследуем влияние средств явной передачи управления.

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

Опыты проводим на 2-хядерном процессоре Intel E6550 2.13 Ghz, под управлением ОС Windows.

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

Результат (приведен в полном виде):

Thread created: Thread[Thread 1,5,main]

Thread created: Thread[Thread 2,5,main]

Thread 1 1.0

Thread 1 1.5

Thread 1 2.0

Thread 1 2.5

Thread 1 3.0

Thread 1 3.5

Thread 1 4.0

Thread 1 4.5

Thread 1 5.0

Thread 1 5.5

Thread 1 6.0

Thread 1 6.5

Thread 1 7.0

Thread 1 7.5

Thread 1 8.0

Thread 1 8.5

Thread 1 9.0

Thread 1 9.5

Thread 1 10.0

Thread 1 10.5

Thread 1 11.0

Thread 1 11.5

Thread 1 12.0

Thread 1 12.5

Thread 1 13.0

Thread 1 13.5

Thread 1 14.0

Thread 1 14.5

Thread 1 15.0

Thread 1 15.5

Thread 1 16.0

Thread 1 16.5

Thread 1 17.0

Thread 1 17.5

Thread 1 18.0

Thread 1 18.5

Thread 1 19.0

Thread 1 19.5

Thread 1 20.0

Thread 1 20.5

Thread 1 21.0

Thread 1 21.5

Thread 1 22.0

Thread 1 22.5

Thread 1 23.0

Thread 1 23.5

Thread 1 24.0

Thread 1 24.5

Thread 1 25.0

Thread 1 25.5

Thread 1 26.0

Thread 1 26.5

Thread 1 27.0

Thread 1 27.5

Thread 1 28.0

Thread 1 28.5

Thread 1 29.0

Thread 1 29.5

Thread 1 30.0

Thread 1 30.5

Thread 1 31.0

Thread 1 31.5

Thread 1 32.0

Thread 1 32.5

Thread 2 1

Thread 1 33.0

Thread 2 2

Thread 1 33.5

Thread 2 3

Thread 1 34.0

Thread 2 5

Thread 1 34.5

Thread 2 8

Thread 1 35.0

Thread 2 13

Thread 1 35.5

Thread 2 21

Thread 1 36.0

Thread 2 34

Thread 1 36.5

Thread 2 55

Thread 1 37.0

Thread 2 89

Thread 1 37.5

Thread 2 144

Thread 1 38.0

Thread 2 233

Thread 1 38.5

Thread 2 377

Thread 1 39.0

Thread 2 610

Thread 1 39.5

Thread 2 987

Thread 1 40.0

Thread 2 1597

Thread 1 40.5

Thread 2 2584

Thread 1 41.0

Thread 2 4181

Thread 1 41.5

Thread 2 6765

Thread 1 42.0

Thread 2 10946

Thread 1 42.5

Thread 2 17711

Thread 1 43.0

Thread 2 28657

Thread 1 43.5

Thread 2 46368

Thread 1 44.0

Thread 2 75025

Thread 1 44.5

Thread 2 121393

Thread 1 45.0

Thread 2 196418

Thread 1 45.5

Thread 2 317811

Thread 2 514229

Thread 2 832040

Thread 2 1346269

Thread 2 2178309

Thread 2 3524578

Thread 2 5702887

Thread 2 9227465

Thread 2 14930352

Thread 2 24157817

Thread 2 39088169

Thread 2 63245986

Thread 2 102334155

Thread 2 165580141

Thread 2 267914296

Thread 2 433494437

Thread 2 701408733

Thread 2 1134903170

Thread 2 1836311903

Thread 2 2971215073

Thread 2 4807526976

Thread 2 7778742049

Thread 2 12586269025

Thread 2 20365011074

Thread 2 32951280099

Thread 2 53316291173

Thread 2 86267571272

Thread 2 139583862445

Thread 2 225851433717

Thread 2 365435296162

Thread 2 591286729879

Thread 2 956722026041

Thread 2 1548008755920

Thread 2 2504730781961

Thread 2 4052739537881

Thread 2 6557470319842

Thread 2 10610209857723

Thread 2 17167680177565

Thread 2 27777890035288

Thread 2 44945570212853

Thread 2 72723460248141

Thread 2 117669030460994

Thread 2 190392490709135

Thread 2 308061521170129

Thread 2 498454011879264

Thread 2 806515533049393

Thread 2 1304969544928657

Thread 2 2111485077978050

Thread 2 3416454622906707

Thread 2 5527939700884757

Thread 2 8944394323791464

Thread 2 14472334024676221

Thread 2 23416728348467685

Thread 2 37889062373143906

Thread 2 61305790721611591

Thread 2 99194853094755497

Thread 2 160500643816367088

Thread 2 259695496911122585

Thread 2 420196140727489673

Thread 2 679891637638612258

Thread 2 1100087778366101931

Thread 2 1779979416004714189

Thread 2 2880067194370816120

Thread 2 4660046610375530309

Exiting Thread 2

Exiting main thread

1. Исследуем поведение программы при различных значениях приоритетов подпроцессов, повысив приоритет потока 2 на 3 единицы.

Thread created: Thread[Thread 1,5,main]

Thread created: Thread[Thread 2,7,main]

Thread 2 1

Thread 2 1

Thread 2 2

Thread 2 3

Thread 2 5

Thread 2 8

Thread 2 13

Thread 2 21

Thread 2 34

Thread 2 55

Thread 2 89

Thread 2 144

Thread 2 233

Thread 2 377

Thread 2 610

Thread 2 987

Thread 2 1597

Thread 2 2584

Thread 2 4181

Thread 2 6765

Thread 2 10946

Thread 2 17711

Thread 2 28657

Thread 2 46368

Thread 2 75025

Thread 2 121393

Thread 2 196418

Thread 2 317811

Thread 2 514229

Thread 2 832040

Thread 2 1346269

Thread 2 2178309

Thread 2 3524578

Thread 1 1.0

Thread 1 1.5

Thread 1 2.0

Thread 1 2.5

Thread 1 3.0

Thread 1 3.5

Thread 1 4.0

Thread 1 4.5

Thread 1 5.0

Thread 1 5.5

Thread 1 6.0

Thread 1 6.5

Thread 1 7.0

Thread 1 7.5

Thread 1 8.0

Thread 1 8.5

Thread 1 9.0

Thread 1 9.5

Thread 1 10.0

Thread 1 10.5

Thread 1 11.0

Thread 1 11.5

Thread 1 12.0

Thread 1 12.5

Thread 1 13.0

Thread 1 13.5

Thread 1 14.0

Thread 1 14.5

Thread 1 15.0

Thread 1 15.5

Thread 1 16.0

Thread 1 16.5

Thread 1 17.0

Thread 1 17.5

Thread 1 18.0

Thread 1 18.5

Thread 2 5702887

Thread 1 19.0

Thread 2 9227465

Thread 1 19.5

Thread 2 14930352

Thread 1 20.0

Thread 2 24157817

Thread 1 20.5

Thread 2 39088169

Thread 1 21.0

Thread 2 63245986

Thread 1 21.5

Thread 2 102334155

Thread 1 22.0

Thread 2 165580141

Thread 1 22.5

Thread 2 267914296

Thread 1 23.0

Thread 2 433494437

Thread 1 23.5

Thread 2 701408733

Thread 1 24.0

Thread 2 1134903170

Thread 1 24.5

Thread 2 1836311903

Thread 1 25.0

Thread 2 2971215073

Thread 1 25.5

Thread 2 4807526976

Thread 1 26.0

Thread 2 7778742049

Thread 1 26.5

Thread 2 12586269025

Thread 1 27.0

Thread 2 20365011074

Thread 1 27.5

Thread 2 32951280099

Thread 1 28.0

Thread 2 53316291173

Thread 1 28.5

Thread 2 86267571272

Thread 1 29.0

Thread 2 139583862445

Thread 1 29.5

Thread 2 225851433717

Thread 1 30.0

Thread 2 365435296162

Thread 1 30.5

Thread 2 591286729879

Thread 1 31.0

Thread 2 956722026041

Thread 1 31.5

Thread 2 1548008755920

Thread 1 32.0

Thread 2 2504730781961

Thread 1 32.5

Thread 2 4052739537881

Thread 2 6557470319842

Thread 2 10610209857723

Thread 2 17167680177565

Thread 2 27777890035288

Thread 2 44945570212853

Thread 2 72723460248141

Thread 2 117669030460994

Thread 2 190392490709135

Thread 2 308061521170129

Thread 2 498454011879264

Thread 2 806515533049393

Thread 2 1304969544928657

Thread 2 2111485077978050

Thread 2 3416454622906707

Thread 2 5527939700884757

Thread 2 8944394323791464

Thread 2 14472334024676221

Thread 2 23416728348467685

Thread 2 37889062373143906

Thread 2 61305790721611591

Thread 2 99194853094755497

Thread 2 160500643816367088

Thread 2 259695496911122585

Thread 2 420196140727489673

Thread 2 679891637638612258

Thread 2 1100087778366101931

Thread 2 1779979416004714189

Thread 2 2880067194370816120

Thread 2 4660046610375530309

Exiting Thread 2

Thread 1 33.0

Thread 1 33.5

Thread 1 34.0

Thread 1 34.5

Thread 1 35.0

Thread 1 35.5

Thread 1 36.0

Thread 1 36.5

Thread 1 37.0

Thread 1 37.5

Thread 1 38.0

Thread 1 38.5

Thread 1 39.0

Thread 1 39.5

Thread 1 40.0

Thread 1 40.5

Thread 1 41.0

Thread 1 41.5

Thread 1 42.0

Thread 1 42.5

Thread 1 43.0

Thread 1 43.5

Thread 1 44.0

Thread 1 44.5

Thread 1 45.0

Thread 1 45.5

Exiting main thread

2. Исследуем влияние временных задержек, для чего заставим кажды поток ожидать 5 мс перед следующей итерацией (метод "sleep()").

Результат:

Thread 2 267914296

Thread 1 20.5

Thread 2 433494437

Thread 1 21.0

Thread 2 701408733

Thread 1 21.5

Thread 2 1134903170

Thread 1 22.0

Thread 2 1836311903

Thread 1 22.5

Thread 2 2971215073

Thread 1 23.0

Thread 2 4807526976

Thread 1 23.5

Thread 2 7778742049

Thread 1 24.0

Thread 2 12586269025

Thread 1 24.5

Thread 2 20365011074

Thread 1 25.0

Thread 2 32951280099

Thread 1 25.5

Thread 2 53316291173

Thread 1 26.0

Thread 2 86267571272

Thread 1 26.5

Thread 2 139583862445

Thread 1 27.0

Thread 2 225851433717

Thread 1 27.5

Thread 2 365435296162

Thread 1 28.0 Очевидно, что даже при столь небольшой временной задержке ОС позволяет процессору переключиться, таким образом, потоки выполняют задачу с большей степенью параллельности.

3. Исследуем влияние средств явной передачи управления, для чего с помощью метода yield() обеспечим передачу времени процессора от потока, завершившего текущий цикл работы к следующему потоку и наоборот.

Результат:

Thread 1 32.0

Thread 1 32.5

Thread 1 33.0

Thread 1 33.5

Thread 1 34.0

Thread 1 34.5

Thread 2 1

Thread 1 35.0

Thread 2 2

Thread 1 35.5

Thread 2 3

Thread 1 36.0

Thread 2 5

Thread 1 36.5

Thread 2 8

Thread 1 37.0

Thread 2 13

Thread 1 37.5

Thread 2 21

Thread 1 38.0

Thread 2 34

Thread 1 38.5

Thread 2 55

Thread 1 39.0

Thread 2 89

Thread 1 39.5

Thread 2 144 Мы наблюдаем увеличение степени параллельности обработки по сравнению с методом, не использующим средств явной передачи управления, что является вполне ожидаемым явлением.

Выводы

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

Похожие статьи




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

Предыдущая | Следующая