рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Розбиття програми на задачі

Розбиття програми на задачі - раздел Образование, Лекція 4 5 Створення процесу Аналізуючи Розбиття Програми На Декілька Задач, Ми Робимо Перший Крок До Реал...

Аналізуючи розбиття програми на декілька задач, ми робимо перший крок до реалізації паралелізму в свою програму. В одно процесорному середо­вищі паралелізм реалізується засобами багатозадачності. Це досягається шля­хом перемикання процесів. Кожен процес виконується на протязі деякого коро­ткого інтервалу часу, після чого процесор ²передається² іншому процесу. Це відбувається настільки швидко, що створюється ілюзія одночасного виконання процесів. В багатопроцесорному середовищі процеси, що належать одній прог­рамі, можуть бути призначені одному або різним процесорам. Процеси, призна­чені різним процесорам, виконуються паралельно.

В додатку або системі розрізняють два рівня паралельної обробки: рі­вень процесів і рівень потоків. Паралельна обробка на рівні потоків має назву багато поточність (будемо розглядати пізніше). щоб розумно розділити програ­му на паралельні задачі, необхідно визначити, де ²міститься² паралелізм і де мо­жемо скористатися перевагами від його реалізації. Інколи немає суттєвої нео­бхідності в паралелізмі. Програма може подаватися з врахуванням паралелізму, але і при послідовному виконанні дій вона прекрасно працює. Безумовно, вне­сення паралелізму може підвищити її швидкодію і зменшити рівень складності. Одні програми володіють природнім паралелізмом, а інші більше підходить по­слідовне виконання дій. Програми можуть мати подвійну інтерпретацію.

При декомпозиції програми на функції як правило використовують низ­хідний принцип, а при розділі на об’єкти – висхідний. При цьому необхідно ви­з­начити, які функції або об’єкти краще реалізувати у вигляді окремих програм або підпрограм, а які – у вигляді потоків. Підпрограми повинні виконуватися операційною системою як процеси. Окремі підпрограми, або процеси, викону­ють задачі, доручені проектувальником ПЗ.

Задачі, на які буде розділена програма, можуть виконуватися паралель­но, при чому можемо виділити наступні три способи реалізації паралелізму.

1. Виділення в програмі одної основної задачі, яка створює деяку кіль­кість підзадач.

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

3. Розділ програми на декілька задач різного типу, що відповідають за створення підзадач тільки визначеного типу.

Дані способи реалізації паралелізму подано на рис. 5.

Наприклад, ці методи реалізації паралелізму можемо застосувати до про­г­рами візуалізації. Під візуалізацією будемо розуміти процес переходу від подання тривимірного об’єкту у формі записів бази даних в двовимірну тіньову графічну проекцію на поверхню відображення (дисплей).Зображення подається у вигляді тіньових багатокутників, що повторюють форму об’єкту. Етапи візуа­лізації подано на рис 6. Візуалізацію розділимо на колекцію окремих задач.

1. Встановити структуру даних для сіткових моделей багатокутників.

2. Застосувати лінійні перетворення.

3. Забракувати багатокутники, що належать поверхням, яких невидне.

4. Виконати растерізацію.

5. Ретушувати окремі пік селі.

Перша задача полягає в поданні об’єкта у вигляді масиву багатокутни­ків, в якому кожна вершина багатокутника описується в тривимірній світовій системі координат. Друга задача – застосувати лінійні перетворення до сіткової моделі багатокутників. Ці перетворення використовуються для позиціонування об’єктів на сцені і створення точки огляду або поверхні відображення. (область, яка видима спостерігачу з його точки огляду). Третя задача – відкинути поверх­ні об’єктів, яких не видно на сцені. Це означає видалення ліній, які належать тим частинам об’єктів, які невидимі з точки зору огляду. Четверта задача – пе­ретворити модель вершин в набір координат пік селів. П’ята задача – видалити всі приховані поверхні. Якщо сцена містить взаємодіючі об’єкти, наприклад, коли одні об’єкти заступають інші, то приховані (передніми об’єктами) поверх­
ні повинні бути видалені. Шоста задача – нанести на поверхні зображення тінь.

Рішення кожної задачі подається у вигляді окремого файлу, який вико­ну­ється. Перші три задачі (Task1,Task2 та Task3) виконуються послідовно, а ре­шта три (Task1,Task2 та Task3) – паралельно. Реалізація першого способу ство­рення програми візуалізації подано в лістінгу 4.

// Лістінг 4. Використання способу 1 для створення процесів

# include < spawn.h >

# include < stdlib.h >

# include < stdio.h >

# include < sys/wait.h >

# include < errno.h >

# include < unistd.h >

int main (void) {

posix_spwnattr_t Attr;

posix_spwn_file_actions_t FilrActions;

 

int main (void) {

posix_spawnattr_t Attr;

posix_spawn_file_actions_t FileActions;

char *cons argv4[ ] = {“Task4”, . . . , NULL};

char *cons argv5[ ] = {“Task5”, . . . , NULL};

char *cons argv6[ ] = {“Task6”, . . . , NULL};

pid_t Pid;

int stat;

// . . .

 

// Виконуємо перші три точки синхронно.

system (“Task1 . . .”);

system (“Task2 . . .”);

system (“Task3 . . .”);

 

// Ініціюємо структури.

psix_spwnattr_init ( &Attr);

psix_spwn_file_actions_init ( &FileActions);

 

// Виконуємо останні три точки асинхронно.

posix_spwn (&Pid, “Task4”, &FileActions, &Attr, argv4, NULL);

posix_spwn (&Pid, “Task5”, &FileActions, &Attr, argv4, NULL);

posix_spwn (&Pid, “Task6”, &FileActions, &Attr, argv4, NULL);

 

// Очікуємо повернення до батьківського процесу.

wait (&stat);

wait (&stat);

wait (&stat);

return (0);

}

В лістінгу 4 із функції main () за допомогою функції system () виклика­ю­ться на виконання задачі Task1, Task2 та Task3. Кожна з них виконується синх­ронно з батьківським процесом. Задачі Task4, Task5 та Task6 виконуються аси­н­хронно батьківському процесу завдяки використанню функцій psix_spwn (). Три крапки використовуються для позначення файлів, які необхідні задачам. Батьківський процес викликає три функції wait (), і кожна з них очікує завер­ше­ння однієї із задач (Task4, Task5 та Task6).

Використовуючи другій спосіб, програму візуалізації можемо запустити із сценарію командної оболонки. Переваги даного сценарію полягають в тому, що він дозволяє використовувати всі команди і оператори оболонки. В нашій програмі візуалізація для управління виконанням задач використовуються мета символи & та &&.

Task1 . . . && Task2 . . . && Task3

Task1 . . . & Task2 . . . & Task3

Тут завдяки використанню метасимволів && задачі Task1, Task2 та Task3 виконуються послідовно при умові успішного виконання попередньої за­дачі. А задачі Task4, Task5 та Task6 виконуються одночасно, оскільки викорис­тано мета символ &. Наведемо деякі мета символи, що застосовуються в сере­до­вищі UNIX/LINUX, та способи виконання цих команд.

&& Кожна наступна команда буде виконуватися тільки у випадку успішного виконання попередньої команди
½½ Кожна наступна команда буде виконуватися тільки у випадку невдалого виконання попередньої команди
; Команди повинні виконуватися послідовно
& Всі команди повинні виконуватися одночасно

При використанні третього способу задачі діляться за категоріями. При декомпозиції програми необхідно розібратися, чи можливо в ній виділити різні категорії задач. Наприклад, одні задачі можуть ²відповідати² за інтерфейс кори­стувача, тобто його створення, ввід даних, вивід даних та інше. Іншим задачам доручається обчислення, управління даними та інше. Такий підхід дуже корис­ний не тільки при проектуванні програми, але і при її реалізації. В нашій прог­рамі візуалізації ми можемо розділити задачі за наступними категоріями:

· задачі, які виконують лінійні перетворення:

перетворення зображення на екрані при зміні точки огляду; зміни сцени;

· задачі, які виконують растерізацію:

рисування ліній;

растерізацію багатокутників;

· задачі, які виконують видалення поверхонь:

видалення прихованих поверхонь;

видалення невидимих поверхонь;

· задачі, які виконують накладання тіней:

затінення окремих пік селів;

затінення зображення вцілому.

Розбиття задачі за категоріями дозволяє нашій програмі набути більш загального характеру. Процеси при необхідності створюють інші процеси, при­значені для виконання дій тільки визначеної категорії. Наприклад, якщо нашій програмі необхідна візуалізація лише одного об’єкту, а не всю сцену, то немає ніякої необхідності породжувати процес, який виконує видалення прихованих поверхонь; Цілком достатньо буде видалення поверхонь, які не видно (одного об’єкту). Якщо об’єкт непотрібно затінювати, то немає необхідності породжу­вати задачу, яка виконує накладання тіні; обов’язковим лишається лише лінійне перетворення при рішення задачі растерізації. Для запуску програми з викори­станням третього способу можемо використовувати батьківський процес або сценарій оболонки. Батьківський процес може визначити, який тип візуалізації необхідно, і передати відповідну інформацію кожному із спеціалізованих про­цесів, щоб вони ²знали², які процеси їм необхідно породжувати. Дана ін форма­ція може бути пере направлена кожному із спеціалізованих процесів зі сцена­рію оболонки. Реалізація третього способу подана в лістінгу 5.

// Лістінг 5. Використання способу 3 для створення процесів.

// Задачі запускаються з батьківського процесу.

# include < spawn.h >

# include < stdlib.h >

# include < stdio.h >

# include < sys/wait.h >

# include < errno.h >

# include < unistd.h >

int main (void) {

posix_spwnattr_t Attr;

posix_spwn_file_actions_t FilrActions;

pid_t;

ins stat;

 

// . . .

 

system (“Task1 . . . ”);

 

// Виконується безвідносно до типу візуалізації, яка використовується

// Визначаємо, який тип візуалізації необхідно. Це можемо реалізувати, от-

// римавши від користувача або виконав спеціальний аналіз. В наступно­­му

// повідомляємо про результати іншим задачам за допомогою аргументів.

char *cons argv4[ ] = {“TaskType4”, . . . , NULL};

char *cons argv5[ ] = {“TaskType5”, . . . , NULL};

char *cons argv6[ ] = {“TaskType6”, . . . , NULL};

 

system (“Task2 . . .”);

system (“Task3 . . .”);

 

// Ініціюємо структури

posix_spwnattr_init ( &Attr);

posix_spwn_file_actions_init ( &FileActions);

posix_spwn (&Pid, “TaskType4”, &FileActions, &Attr, argv4, NULL);

posix_spwn (&Pid, “TaskType5”, &FileActions, &Attr, argv5, NULL);

if (Y) {

psix_spwn (&Pid, “TaskType6”, &FileActions, &Attr, argv6, NULL);

 

// Очікуємо повернення до батьківського процесу.

wait (&stat);

wait (&stat);

wait (&stat);

return (0);

}

 

// Всі TaskType-задачі повинні бути аналогічними

 

// . . .

int main ( int argc, char *argv [ ]) {

int Rt;

// . . .

int (argv [1] = =

// Ініціюємо структури.

// . . .

posix_spwn (&Pid, “TaskType5”, &FileActions, &Attr, argv5, NULL);

}

wait (&stat);

exit (0); }

– Конец работы –

Эта тема принадлежит разделу:

Лекція 4 5 Створення процесу

Синопсис... pstree a c h frac Hpid l n p u G frac U... pid frac user...

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Розбиття програми на задачі

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

Створення процесу
Відношення між батьківським і дочірнім процесами;

Відношення між батьківським та дочірніми процесами
Процес, який створює, або породжує, інший процес, є батьківським (parent) процесом по відношенню до породженого, або дочірнього (child) проце­су. Процес init – батьківський (або предок) всіх

Використання системних функцій
2.1. Системна функція fork () Системна функція (або системний виклик) fork () створює новий процес, який є дублікатом процесу який його викликав, тобто його батька. При успіш­ному виконанн

Синопсис
# include <unistd> pid_t fork (void); Невдале виконання функції fork () можливе у випадку, коли система не володіє ресурсами для створення ще одного процесу. Це відбувається

Синопсис
# include <unistd.h int execl (const char *path, const char *arg0, . . ./*, (char *)0 */); int execle (const char *path, const char *arg0, . . ./*, (char *)0 *, char * const en

Синопсис
# include < unistd.h > long sysconf (int name); Ще одним обмеженням при використанні функцій сімейства exec та інших функцій, які застосовуються для створення процесів, є ма

Синопсис
# include < stdlib.h > char *getenv ( const char *name ); int setenv (const char *name, const char *value, int overwrite ); void unsetenv ( const char *name );

Синопсис
# include < stdlib.h > int system (const char *string); В якості параметру string можемо передати системну команду або ім'я файлу, який виконується. При вдалому виконанні фу

Використання POSIX-функцій для породження процесів
Подібно створенню процесів за допомогою функцій system () і fork- exec, функцій posix_spawn () створюють нові дочірні процеси із заданих образів про­цесів. Однак функції posix_spawn () дозволяють п

Синопсис
# include < stdlib.h > int posix_spawn (pid_t *restrict pid, const char *restrict path, const posix_spawn_file_actions_t * file_actions, const posix_spawnattr_t *restrict attrp, char

Завершення процесу
Коли процес завершується, його блок БУП руйнується, а адресний прос­тір, який він займав і ресурси звільняються. Код завершення розміщується в головну таблицю процесів. Як тільки батьківський проце

Синопсис
# include < stdlib.h > void exit (int status); void abort (void); Функцію kill () можемо використати для примусового завершення іншо­го процесу. Дана функція відпра

Ресурси процесу
При виконанні призначених на процес задач часто приходиться запису­вати дані у файл, відправляти їх на принтер або відображати отримані результа­ти на екран. Процесу можуть знадобитися дані, що вво

Синопсис
# include < sys/resource.h > int setrlimit (int resource, const struct rlimit *rlp); int getrlimit (int resource, struct rlimit *rlp); int getrusage (int who, struc

Синопсис
# include < sys/wait/h > pid_t wait (int *status); pid_t waitpid (pid_t pid, int *status, int oрtions); Функція waitpid () аналогічна функції wait () за виключенням

Лінії видимого контуру
Породження процесі, як подано в лістінгу 6, можливе за допомогою фу­нкцій, які викликаються із функції mane (). // Лістінг 6. Основна гілка програми, з якої викликається функція,

Висновки
Паралелізм в С++ програмі досягається за рахунок поділу на декілька процесів або декілька потоків. Процес – це ²одиниця роботи², що реалізується операційною системою. Якщо програма – це а

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги