Организация конвейерных вычислений
Разработка программной модели, выполняющей конвейерную (поэтапную) обработку массива данных, регулировку 3 процессов и одного генератора. Исследование поведения программы при использовании различных методов синхронизации (семафоры, событийные переменные).
Рубрика | Программирование, компьютеры и кибернетика |
Вид | лабораторная работа |
Язык | русский |
Дата добавления | 24.08.2014 |
Размер файла | 34,6 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://allbest.ru
Министерство образования и науки Украины
Севастопольский национальный технический университет
Кафедра Кибернетики и вычислительной техники
Лабораторная работа
по курсу: «Параллельные и распределенные вычисления»
Организация конвейерных вычислений
Выполнил: ст. гр. М-34д
Ярославцев Д.А.
Проверил: Абрамов Т.А.
Севастополь
2010 г.
1. Исходные данные
программный конвейерный семафор синхронизация
Цель:
Исследовать методы и средства организации конвейерной обработки данных.
Задание на лабораторную работу:
Разработать в соответствии с вариантом задания программу, выполняющую конвейерную (поэтапную) обработку массива данных
Исследовать поведение программы при использовании различных методов синхронизации (семафоры, событийные переменные)
Проанализировать полученные результаты.
2. Ход работы
Конвейерная обработка данных применяется при решении сложных вычислительных задач, допускающих разбиение процесса решения на относительно независимые части. В этом случае выходные данные (результаты работы) очередного процесса являются входными данными следующего процесса и т.д. Соответственно, за счет параллельной обработки сокращается общее время решения задачи. Типовая схема конвейерной обработки выглядит следующим образом:
В нашем случае существует всего 4 процесса, один из которых является генератором. Генератор формирует массив из 1000 случайных элементов.
После этого первый процесс берёт этот массив из буфера генератора и производит над ним следующие действия:
- формируется массив из 100 чисел;
- каждому числу массива присваивается минимальное число из 10 по порядку чисел первоначального массива;
- сформированный новый массив помещается в буфер 1 процесса.
После этого второй процесс берёт из буфера первого процесса исходный массив из 100 чисел и производит следующие действия:
- формируется массив из 10 чисел;
- каждому числу массива присваивается минимальное число из 10 по порядку чисел первоначального массива;
- сформированный новый массив помещается в буфер 2 процесса.
После этого третий процесс берёт из буфера второго процесса исходный массив из 10 чисел и производит следующие действия:
- вывод на экран этих чисел.
Регулировку данных конвейерных вычислений будем производить при помощи уже известных нам семафоров. Для этого создадим пары семафоров. Открытый семафор с четным номером сигнализирует о том, что соответствующий буфер свободен для записи информации, открытый семафор с нечетным номером - соответствующий буфер заполнен и доступен для выборки. В таком случае текст программы будет следующим.
3. Текст программы
import java.util.concurrent.*;
import java.util.Random;
class SEMAPHORE {
public static void main(String args[])
{Q q = new Q();
new Generator(q,0);
new Worker(q,1);
new Worker(q,2);
new Worker(q,3);
try {Thread.sleep(5000);} catch(InterruptedException e) {} ;
q.work = false;
System.out.println("Количество полных циклов:"+q.count);}}
class Q
{int n;
boolean work = true;
Semaphore s02 = new Semaphore(1,true);
Semaphore s11 = new Semaphore(0,true); Semaphore s12 = new Semaphore(1,true);
Semaphore s21 = new Semaphore(0,true); Semaphore s22 = new Semaphore(1,true);
Semaphore s31 = new Semaphore(0,true);
int [] A = new int[1000];
int [] B = new int[100];
int [] C = new int[10];
int count=0;}
class Generator implements Runnable
{Q q;
int num;
Generator(Q q,int num)
{this.q = q;
this.num = num;
new Thread(this, "Generator "+num).start();}
public int number(int begin, int end) {return (int)(begin + Math.random()*(end-begin+1));}
public void run() {
Thread t = Thread.currentThread();
while (q.work)
{try { q.s02.acquire(); } catch(InterruptedException e) {} ;
System.out.println(t.getName()+" start");
for(int i=0; i<1000; i++){
q.A[i] =number(10,1000);}
try { Thread.sleep(100); } catch(InterruptedException e) {} ;
System.out.println(t.getName()+" stop");
q.s11.release();}}
class Worker implements Runnable
{Q q;
int num;
Worker(Q q,int num)
{this.q = q;
this.num = num;
new Thread(this, "Worker "+num).start();}
public void run()
{Thread t = Thread.currentThread();
while (q.work)
{switch (num)
{case 1: try { q.s11.acquire(); } catch(InterruptedException e) {} ;
try { q.s12.acquire(); } catch(InterruptedException e) {} ; break;
case 2: try { q.s21.acquire(); } catch(InterruptedException e) {} ;
try { q.s22.acquire(); } catch(InterruptedException e) {} ; break;
case 3: try { q.s31.acquire(); } catch(InterruptedException e) {} ;}
System.out.println(t.getName()+" start");
int min=Integer.MAX_VALUE;
switch (num) {
case 1:
int k=0;
for (int i=0; i<100; i++) {
min=q.A[k];
for (int j=k; j<k+10; j++) { if ( (j+1) == 1000 ) break;
if ( min > q.A[j+1] )
min = q.A[j+1]; }
q.B[i]=min;
k+=10; }
break;
case 2:
k=0;
for (int i=0; i<10; i++){
min=q.B[k];
for (int j=k; j<k+10; j++) {
if ( (j+1) == 100 ) break;
if ( min > q.B[j+1] )
min = q.B[j+1]; }
q.C[i]=min;
k+=10;}
break;
case 3:
for (int i=0; i<10; i++)System.out.print(q.C[i] + " ");
System.out.println();
q.count++;
break;}
try { Thread.sleep(100); } catch(InterruptedException e) {} ;
System.out.println(t.getName()+" stop");
switch (num)
{case 1: q.s21.release(); q.s02.release(); break;
case 2: q.s31.release(); q.s12.release(); break;
case 3: q.s22.release(); break;}}
4. Результаты
Generator 0 start
Generator 0 stop
Worker 1 start
Worker 1 stop
Worker 2 start
Generator 0 start
Worker 2 stop
Worker 3 start
20 21 11 14 10 18 28 36 11 20
Generator 0 stop
Worker 1 start
Worker 3 stop
Worker 1 stop
Worker 2 start
Generator 0 start
Worker 2 stop
Worker 3 start
17 16 19 27 14 14 10 12 15 10
Generator 0 stop
Worker 1 start
Worker 3 stop
Worker 1 stop
Worker 2 start
Generator 0 start
Generator 0 stop
Worker 2 stop
Worker 3 start
11 17 12 11 10 32 31 43 13 13
Worker 1 start
Worker 3 stop
Worker 1 stop
Generator 0 start
Worker 2 start
Worker 2 stop
Worker 3 start
17 14 39 19 10 19 16 16 20 33
Generator 0 stop
Worker 1 start
Worker 3 stop
Worker 1 stop
Worker 2 start
Generator 0 start
Generator 0 stop
Worker 2 stop
Worker 3 start
13 11 32 22 15 23 22 12 12 10
Worker 1 start
Worker 3 stop
Worker 1 stop
Worker 2 start
Generator 0 start
Worker 2 stop
Generator 0 stop
Worker 3 start
34 11 10 31 30 15 10 13 30 12
Worker 1 start
Worker 1 stop
Worker 3 stop
Worker 2 start
Generator 0 start
Worker 2 stop
Generator 0 stop
Worker 1 start
Worker 3 start
15 18 18 10 14 14 18 22 20 15
Worker 1 stop
Generator 0 start
Worker 3 stop
Worker 2 start
Generator 0 stop
Worker 2 stop
Worker 3 start
11 13 13 38 10 16 10 10 18 13
Worker 1 start
Worker 1 stop
Generator 0 start
Worker 3 stop
Worker 2 start
Worker 2 stop
Generator 0 stop
Worker 1 start
Worker 3 start
14 18 11 23 46 20 18 17 20 24
Worker 1 stop
Worker 3 stop
Generator 0 start
Worker 2 start
Worker 2 stop
Generator 0 stop
Worker 3 start
11 13 16 10 11 22 26 10 12 41
Worker 1 start
Worker 3 stop
Worker 1 stop
Generator 0 start
Worker 2 start
Worker 2 stop
Generator 0 stop
Worker 1 start
Worker 3 start
27 52 10 40 12 23 20 11 19 53
Worker 1 stop
Generator 0 start
Worker 3 stop
Worker 2 start
Generator 0 stop
Worker 2 stop
Worker 3 start
10 22 22 12 16 22 33 18 18 11
Worker 1 start
Worker 1 stop
Generator 0 start
Worker 3 stop
Worker 2 start
Generator 0 stop
Worker 2 stop
Worker 3 start
16 28 10 17 41 27 16 33 19 14
Worker 1 start
Worker 3 stop
Worker 1 stop
Worker 2 start
Generator 0 start
Worker 2 stop
Worker 3 start
Generator 0 stop
16 10 19 11 12 26 10 10 19 13
Worker 1 start
Worker 3 stop
Worker 1 stop
Generator 0 start
Worker 2 start
Generator 0 stop
Worker 2 stop
Worker 3 start
11 23 19 12 10 16 16 13 22 20
Worker 1 start
Worker 3 stop
Worker 1 stop
Worker 2 start
Generator 0 start
Generator 0 stop
Worker 2 stop
Worker 3 start
15 15 11 19 22 10 14 10 16 12
Worker 1 start
Worker 3 stop
Worker 1 stop
Worker 2 start
Generator 0 start
Generator 0 stop
Worker 2 stop
Worker 3 start
10 13 25 17 10 12 19 15 10 15
Worker 1 start
Worker 3 stop
Worker 1 stop
Worker 2 start
Generator 0 start
Generator 0 stop
Worker 2 stop
Worker 3 start
12 10 23 12 14 22 11 20 20 14
Worker 1 start
Worker 3 stop
Worker 1 stop
Worker 2 start
Generator 0 start
Worker 2 stop
Worker 3 start
12 11 20 13 41 12 14 12 12 24
Generator 0 stop
Worker 1 start
Worker 3 stop
Worker 1 stop
Worker 2 start
Generator 0 start
Worker 2 stop
Worker 3 start
22 14 37 10 10 10 10 10 28 14
Generator 0 stop
Worker 1 start
Worker 1 stop
Worker 3 stop
Worker 2 start
Generator 0 start
Generator 0 stop
Worker 2 stop
Worker 3 start
17 10 18 10 14 17 21 28 18 31
Worker 1 start
Worker 3 stop
Worker 1 stop
Worker 2 start
Generator 0 start
Generator 0 stop
Worker 2 stop
Worker 3 start
10 11 11 13 13 12 12 21 15 22
Worker 1 start
Worker 1 stop
Generator 0 start
Worker 3 stop
Worker 2 start
Generator 0 stop
Worker 2 stop
Worker 3 start
10 60 15 15 12 24 11 17 27 28
Worker 1 start
Worker 1 stop
Generator 0 start
Worker 3 stop
Worker 2 start
Generator 0 stop
Worker 2 stop
Worker 3 start
15 16 20 19 23 17 26 16 16 53
Worker 1 start
Количество полных циклов:24
Worker 3 stop
Worker 1 stop
Generator 0 start
Worker 2 start
Worker 2 stop
Generator 0 stop
Как можно видеть, все числа в последнем массиве являются минимальными. Также тот факт, что Генератор начинает работать после окончания работы первого процесса (так как первому процессу нужен заполненный буфер генератора и собственный чистый буфер), позволяет выиграть в скорости и разумном использовании выделенного времени.
Выполним синхронизацию потоков с помощью событийных переменных. Код модифицированной программы приведен ниже.
import java.util.concurrent.locks.*;
public class SOBITIINIE1 {
static int begin1=0;
static int end1=0;
public static void main(String[]args) {
begin1=10;
end1=1000;
Q q = new Q();
new Process(q,0);
new Process(q,1);
new Process(q,2);
new Process(q,3);
try {Thread.sleep(50);} catch(InterruptedException e) {};
try{q.lock.lock();
q.G.signal(); // запускаем генератор
// try {Thread.sleep(100);} catch(InterruptedException e) {};
q.W1.signal();
q.W2.signal();
// q.W3.signal();
} finally { q.lock.unlock(); }
try {Thread.sleep(5000);} catch(InterruptedException e) {};
q.work = false;}}
class Q {
int A [] = new int[1000];
int B [] = new int[100];
int C [] = new int[10];
boolean work = true;
final ReentrantLock lock = new ReentrantLock();
final Condition G = lock.newCondition();
final Condition W1 = lock.newCondition();
final Condition W2 = lock.newCondition();
final Condition W3 = lock.newCondition();}
class Process implements Runnable{
Q q;
int num;
boolean first=true;
Process(Q q,int num) {
this.q = q;
this.num = num;
if(num==0)new Thread(this, "Generator "+num).start();
else new Thread(this, "Worker "+num).start(); }
public int number(int begin, int end) {return (int)(begin + Math.random()*(end-begin+1));}
public void run() {
Thread t = Thread.currentThread();
while (q.work) {
switch (num) {
case 0: { // Генератор ожидает сигнала
q.lock.lock(); try{
try {q.G.await(); } catch(InterruptedException e) {}
} finally { q.lock.unlock();}
break; }
case 1: { // Worker 1 ожидает сигнала
q.lock.lock(); try{
try {q.W1.await(); q.W1.await();} catch(InterruptedException e) {}
} finally { q.lock.unlock(); }
break; }
case 2: { // Worker 2 ожидает сигнала
q.lock.lock(); try{
try {q.W2.await(); q.W2.await();} catch(InterruptedException e) {}
} finally { q.lock.unlock(); }
break; }
case 3: { // Worker 3 ожидает сигнала
q.lock.lock(); try{
try {q.W3.await(); } catch(InterruptedException e) {}
} finally { q.lock.unlock(); }
break; }}
switch (num) {
case 0: { // Генератор работает
System.out.println(t.getName()+" start");
try { Thread.sleep(number(0,150)); } catch(InterruptedException e) {} ;
for (int i=0; i<1000; i++) {q.A[i]=number(SOBITIINIE1.begin1, SOBITIINIE1.end1); }
System.out.println(t.getName()+" stop");
break;}
case 1: { // Worker 1 работает
System.out.println(t.getName()+" start");
try { Thread.sleep(number(0,150)); } catch(InterruptedException e) {} ;
int k=0; for (int i=0; i<100; i++) { int min=q.A[k];
for (int j=k; j<k+10; j++) { if ((j+1)==1000) break;
if ( min > q.A[j+1] ) min = q.A[j+1]; } q.B[i]=min; k+=10; }
System.out.println(t.getName()+" stop");
break;}
case 2: { // Worker 2 работает
System.out.println(t.getName()+" start");
try { Thread.sleep(number(0,150)); } catch(InterruptedException e) {} ;
int k=0; for (int i=0; i<10; i++){
int min=q.B[k]; for (int j=k; j<k+10; j++) {
if ( (j+1) == 100 ) break;
if ( min > q.B[j+1] )min=q.B[j+1]; }
q.C[i]=min; k+=10;}
System.out.println(t.getName()+" stop");
break;}
case 3: { // Worker 3 работает
System.out.println(t.getName()+" start");
try { Thread.sleep(number(0,150)); } catch(InterruptedException e) {} ;
for (int i=0; i<10; i++)System.out.print(q.C[i] + " ");
System.out.println();
System.out.println(t.getName()+" stop");
break;}}
switch (num) {
case 0: { // Генератор будит следующий поток
q.lock.lock(); try{
q.W1.signal();
} finally { q.lock.unlock();}
break; }
case 1: { // Worker 1 будит следующие потоки
q.lock.lock(); try{
q.W2.signal();
q.G.signal();
} finally { q.lock.unlock(); }
break; }
case 2: { // Worker 2 будит следующие потоки
q.lock.lock(); try{
q.W1.signal();
q.W3.signal();
} finally { q.lock.unlock(); }
break; }
case 3: { // Worker 3 будит следующий поток
q.lock.lock (); try{
q.W2.signal();
} finally { q.lock.unlock(); }
break; }}
Получаем следующие результаты:
Generator 0 start
Generator 0 stop
Worker 1 start
Worker 1 stop
Worker 2 start
Generator 0 start
Generator 0 stop
Worker 2 stop
Worker 1 start
Worker 3 start
15 20 33 11 17 14 10 18 26 24
Worker 3 stop
Worker 1 stop
Worker 2 start
Generator 0 start
Generator 0 stop
Worker 2 stop
Worker 1 start
Worker 3 start
Worker 1 stop
Generator 0 start
Generator 0 stop
14 20 21 21 12 14 15 28 12 11
Worker 3 stop
Worker 2 start
Worker 2 stop
Worker 1 start
Worker 3 start
Worker 1 stop
Generator 0 start
Generator 0 stop
16 16 11 46 24 11 14 25 10 30
Worker 3 stop
Worker 2 start
Worker 2 stop
Worker 1 start
Worker 3 start
23 39 11 11 15 63 51 12 16 13
Worker 3 stop
Worker 1 stop
Worker 2 start
Generator 0 start
Worker 2 stop
Worker 3 start
11 18 35 11 12 41 31 17 18 16
Worker 3 stop
Generator 0 stop
Worker 1 start
Worker 1 stop
Worker 2 start
Generator 0 start
Generator 0 stop
Worker 2 stop
Worker 1 start
Worker 3 start
Worker 1 stop
Generator 0 start
14 15 13 10 15 13 12 12 21 25
Worker 3 stop
Worker 2 start
Generator 0 stop
Worker 2 stop
Worker 1 start
Worker 3 start
Worker 1 stop
Generator 0 start
Generator 0 stop
13 31 16 15 16 21 19 17 10 32
Worker 3 stop
Worker 2 start
Worker 2 stop
Worker 1 start
Worker 3 start
16 16 13 25 38 26 23 13 12 21
Worker 3 stop
Worker 1 stop
Worker 2 start
Generator 0 start
Generator 0 stop
Worker 2 stop
Worker 1 start
Worker 3 start
21 12 13 21 19 27 31 17 26 15
Worker 3 stop
Worker 1 stop
Worker 2 start
Generator 0 start
Worker 2 stop
Worker 3 start
27 22 12 19 12 17 22 11 14 24
Worker 3 stop
Generator 0 stop
Worker 1 start
Worker 1 stop
Worker 2 start
Generator 0 start
Generator 0 stop
Worker 2 stop
Worker 1 start
Worker 3 start
25 11 15 14 19 15 28 11 36 16
Worker 3 stop
Worker 1 stop
Worker 2 start
Generator 0 start
Generator 0 stop
Worker 2 stop
Worker 1 start
Worker 3 start
Worker 1 stop
Generator 0 start
10 13 20 12 22 28 11 10 18 39
Worker 3 stop
Worker 2 start
Worker 2 stop
Worker 3 start
Generator 0 stop
Worker 1 start
Worker 1 stop
Generator 0 start
Generator 0 stop
13 13 39 19 15 14 12 10 31 28
Worker 3 stop
Worker 2 start
Worker 2 stop
Worker 1 start
Worker 3 start
Worker 1 stop
Generator 0 start
Generator 0 stop
16 15 14 11 16 32 19 16 24 16
Worker 3 stop
Worker 2 start
Worker 2 stop
Worker 1 start
Worker 3 start
13 26 15 15 19 13 11 17 17 46
Worker 3 stop
Worker 1 stop
Worker 2 start
Generator 0 start
Worker 2 stop
Worker 3 start
11 12 13 30 14 16 10 23 10 18
Worker 3 stop
Generator 0 stop
Worker 1 start
Worker 1 stop
Worker 2 start
Generator 0 start
Worker 2 stop
Worker 3 start
Generator 0 stop
Worker 1 start
Worker 1 stop
Generator 0 start
21 32 18 18 18 22 10 19 12 13
Worker 3 stop
Worker 2 start
Generator 0 stop
Worker 2 stop
Worker 1 start
Worker 3 start
53 10 16 16 29 13 21 15 17 13
Worker 3 stop
Worker 1 stop
Worker 2 start
Generator 0 start
Worker 2 stop
Worker 3 start
Generator 0 stop
Worker 1 start
Worker 1 stop
Generator 0 start
25 11 10 12 13 15 19 10 16 11
Worker 3 stop
Worker 2 start
Generator 0 stop
Worker 2 stop
Worker 1 start
Worker 3 start
Worker 1 stop
Generator 0 start
16 14 12 18 32 16 12 22 38 16
Worker 3 stop
Worker 2 start
Generator 0 stop
Worker 2 stop
Worker 1 start
Worker 3 start
14 24 13 15 11 11 17 12 12 36
Worker 3 stop
Worker 1 stop
Worker 2 start
Generator 0 start
Worker 2 stop
Worker 3 start
Generator 0 stop
Worker 1 start
18 36 10 17 20 10 26 31 22 12
Worker 3 stop
Worker 1 stop
Worker 2 start
Generator 0 start
Generator 0 stop
Worker 2 stop
Worker 1 start
Worker 3 start
Worker 1 stop
Generator 0 start
Generator 0 stop
17 12 11 11 26 15 27 27 40 22
Worker 3 stop
Worker 2 start
Worker 2 stop
Worker 1 start
Worker 3 start
12 26 19 16 14 11 16 18 19 29
Worker 3 stop
Worker 1 stop
Worker 2 start
Generator 0 start
Generator 0 stop
Worker 2 stop
Worker 3 start
Worker 3 stop
Как можно видеть, все числа в последнем массиве являются минимальными. Генератор начинает работать после окончания работы первого процесса (так как первому процессу нужен заполненный буфер генератора и собственный чистый буфер), что позволяет выиграть в скорости работы. Задача решена.
Выводы
Выполнив работу, я исследовал способы обработки конвейерных процессов. В результате чего была создана программная модель для регулировки 3 процессов и одного генератора, выполняющие вычисления в соответствии с вариантом.
Размещено на Allbest.ru
...Подобные документы
Разработка программы, выполняющей обработку базы данных, элементами которой являются объекты класса Student. Организация пользовательского диалога для ввода информации и просмотра объектов. Определение классов и глобальных имен. Инструкция программиста.
контрольная работа [18,4 K], добавлен 13.10.2013Переменные и операции языка СИ: используемые символы, константы, идентификаторы и ключевые слова. Использование комментариев в тексте программы. Типы данных и их объявление. Приоритеты операций и порядок вычислений. Функции, переменные, макроподстановки.
учебное пособие [135,0 K], добавлен 17.02.2012Создание программы визуализации методов сортировки массива, особенности и направления ее практического применения. Выбор и обоснование среды программирования. Разработка руководства пользователя. Листинг программы и оценка эффективности ее использования.
дипломная работа [1,0 M], добавлен 15.06.2014Проектирование программы "Будильник" с использованием программной среды, позволяющей осуществлять получение и обработку значений времени и воспроизведение звукового файла. Разработка технического и эскизного проектов программы. Спецификация программы.
курсовая работа [84,2 K], добавлен 15.04.2013Особенности разработки программ на языке Turbo Pascal на примере программы обработки массива данных с построением диаграммы. Функции программы и основные требования к ней. Состав входных и выходных данных. Использование предметной области "Садовод".
курсовая работа [789,1 K], добавлен 13.03.2013Определение функции, ее графика и множества. Проблема повышения качества вычислений, как несоответствие между желаемым и действительным. Совершенствование методов организации информационных процессов. Создание программной реализации табуляции функций.
курсовая работа [755,9 K], добавлен 02.02.2010Разработка геометрической модели тепловой системы. Определение физических свойств элементов системы и граничных условий. Расчёт параметров и визуализация результатов расчёта. Картина теплового распределения с изотермами при медной и стальной пластинах.
практическая работа [781,4 K], добавлен 26.06.2015Реализация приложения, которое выполняет считывание, обработку, визуализацию и аппроксимацию экспериментальных данных полиномиальной функции. Блок схема алгоритма аппроксимации методом наименьших квадратов. Разработка интерфейса и листинга программы.
курсовая работа [1,1 M], добавлен 07.07.2013Специфика функционирования Луганского университета имени Владимира Даля, организационная структура и работа различных подразделений. Особенности программной и технической характеристик информационной системы. Проектирование модели системы аналитики.
отчет по практике [65,6 K], добавлен 12.05.2015Анализ эффективности методов сортировки данных в языке Turbo Pascal. Разработка эскизного и технического проекта программы. Сортировка без и с использованием дополнительной памяти, за исключением небольшого стека (массива). Сортировка связанных списков.
курсовая работа [359,0 K], добавлен 23.05.2012Функции программного интерфейса операционной системы Windows, предназначенные для работы с семафорами. Средства синхронизации Win32 АРI, основанные на использовании объектов исполнительной системы с дескрипторами. Проблемы при использовании семафоров.
реферат [67,4 K], добавлен 06.10.2010Общая характеристика организации массива в виде двоичного дерева. Особенности линейного и двоичного поиска заданного элемента массива. Методика упорядочения массива методом сортировки деревом. Инструкции и текст программы для нечисленной обработки данных.
курсовая работа [242,3 K], добавлен 12.11.2010Разработка концептуальной модели данных. Диаграмма потоков данных. Моделирование правил и поведения системы. Разработка структуры базы данных для автоматизации некоторых рутинных процессов налоговой инспекции, в частности заполнение налоговых деклараций.
контрольная работа [453,2 K], добавлен 24.04.2014Исследование методов и средств многопоточного взаимодействия, особенности использования блокирующей и неблокирующей синхронизации. Разработка, программная реализация и тестирование структуры данных и алгоритмов чтения, записи, освобождения памяти.
дипломная работа [2,2 M], добавлен 24.06.2012Изучение возможностей среды статистических вычислений R для классификации многомерных неоднородных ассиметричных данных с помощью Expectation-Maximization (EM) алгоритмов. Использование R для анализа модели смеси вероятностных распределений (FMM).
реферат [1,8 M], добавлен 09.12.2014Определение многомерной модели данных для удовлетворения основных информационных потребностей предприятия. Экстракция, загрузка и перенос данных из различных источников данных. Разработка собственных ETL–систем. Оптимизация работы хранилища данных.
презентация [9,1 M], добавлен 25.09.2013Осуществление анализа предметной области и определение модели базы данных. Реализация базы данных в среде Microsoft Access. Создание и исследование формы ввода информации, запросов с условиями выбора, диаграмм по результатам вычислений и отчетов.
курсовая работа [246,1 K], добавлен 19.10.2013Разработка алгоритма и программы для вычисления функции, заданной интервально на различных промежутках. Алгоритм и программа формирования одномерного массива по условию, заданной интервально на различных промежутках. Решение нелинейного уравнения.
курсовая работа [38,3 K], добавлен 17.11.2010Модели развертывания и облачные модели. Анализ существующих методов информационной безопасности. Обеспечение надежного шифрования данных при передаче их от пользователя к провайдеру услуг по хранению данных. Минимизация нагрузки на облачные сервисы.
дипломная работа [839,1 K], добавлен 17.09.2013Описание разрабатываемой программы с точки зрения пользователя и программиста. Поэтапная разработка программной системы. Создание базы данных в Access. Разработка структуры классов. Создание структуры для хранения данных. Проектирование интерфейса.
курсовая работа [1,4 M], добавлен 07.08.2013