Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Приєднання потоків у Win32 АРІ

Читайте также:
  1. Графический интерфейс пользователя (GUI). Типы данных Win32.
  2. Класифікація грошових потоків корпорації, їх склад та особливості формування
  3. Нарощування та дисконтування грошових потоків
  4. Особливості виконання потоків
  5. Особливості програмного інтерфейсу потоків
  6. Приєднання до Росії Причорномор’я, Криму і Правобережної України
  7. Стаття 29. Угода про злиття або приєднання
  8. Функції API WIN32 для роботи з файлами
  9. Функції API WIN32 для управління процесами

Приєднання потоків у Win32 АРІ, подібно до очікування завершення процесів,

здійснюється за допомогою функції WaitForSingleObject (). Базовий синтаксис її

використання з потоками такий:

HANDLE th = (HANDLE) _beginthreadex (...);
if (WaitForSingleObject(th, INFINITE) != WAIT_FAILED) {

// потік завершений успішно

}

CloseHandle(th);

Висновки

♦ Процеси і потоки є активними ресурсами обчислювальних систем, які реалізують виконання програмного коду. Потоком називають набір послідовно виконуваних команд процесора. Процес є сукупністю одного або декількох потоків і захищеного адресного простору, в якому вони виконуються. Потоки
одного процесу можуть разом використовувати спільні дані, для потоків різних
процесів без використання спеціальних засобів це неможливо. У традиційних
системах кожний процес міг виконувати тільки один потік, виконання програмного коду пов’язували із процесами. Сучасні ОС підтримують концепцію
багатопотоковості.

♦ Використання потоків у застосуванні означає внесення в нього паралелізму —
можливості одночасного виконання дій різними фрагментами коду. Паралелізм у програмах відображає асинхронний характер навколишнього світу, його
джерелами є виконання коду на декількох процесорах, операції введення-виведення, взаємодія з користувачем, запити застосувань-клієнтів. Багатопотоковість у застосуваннях дає змогу природно реалізувати цей паралелізм
і домогтися високої ефективності. З іншого боку, використання багатопотоковості досить складне і вимагає високої кваліфікації розробника.

♦ Розрізняють потоки користувача, які виконуються в режимі користувача в адресному просторі процесу, і потоки ядра, з якими працює ядро ОС. Взаємовідношення між ними визначають схему реалізації моделі потоків. На практиці
найчастіше використовують схему 1:1, коли кожному потоку користувача відповідає один потік ядра, і саме ядро відповідає за керування потоками користувача.

♦ Потік може перебувати в різних станах (виконання, очікування, готовності
тощо). Принципи переходу з одного стану в інший залежать від принципів планування потоків і планування процесорного часу. Перехід процесу зі стану виконання у будь-який інший стан зводиться до перемикання контексту — передачі керування від одного потоку до іншого зі збереженням стану процесора.

♦ Кожному процесу і потоку в системі відповідає його керуючий блок — структура даних, що містить усю необхідну інформацію. Під час створення процесу
(зазвичай за допомогою системного виклику fork()) створюють його керуючий блок, виділяють пам’ять і запускають основний потік. Створення потоку
простіше і виконується швидше, оскільки не потрібно виділяти пам’ять під новий адресний простір.

 

Контрольні запитання та завдання

Усі практичні завдання вимагають розробки консольних застосувань, які отримують вихідні дані зі стандартного пристрою введення та подають результат на
стандартний пристрій виведення з використанням засобів бібліотеки відповідної
мови програмування. Для мови С такі засоби описані у заголовному файлі stdio.h,
для мови C++ - у файлі iostream.

1.У чому основна перевага схеми підтримки потоків 1:1 порівняно з іншими схемами? Чому розробники ОС не відразу змогли її оцінити?

2.У яких ситуаціях під час розробки програмного забезпечення доцільніше використовувати модель процесів, а не модель потоків?

3.Для трьох станів потоків - виконання, готовності й очікування — перелічіть усі
можливі переходи зі стану в стан і назвіть причини таких переходів. Скажіть
також, які переходи неможливі, та поясніть чому. У якому зі станів потоки перебувають найдовше?

4.У чому полягає головний недолік реалізації таблиці процесів у вигляді маси-
ву? Які альтернативні варіанти її реалізації можна запропонувати?

5.Скільки копій змінної var буде створено у разі виконання цього фрагмента коду? Яких значень буде надано цим копіям?

int main () {

int pid = fork();
int var = 5;
if (pid == 0) var += 5;
else {

pid = fork ();
var += 10;
if (pid) var += 5;

6.Якими будуть результати виконання таких двох програм?


 


int main () { // (1)
int var = 5;

if( fork()) wait(&var);
var++;

printf("%d\n", var);
return var;

int main () { // (2)
int var = 5;

if ( fork () ) wait(&var);
else exit(var);
var++;

printf("%d\n", var);
return var;



7. Після одержання від браузера запиту веб-сервер створює новий процес для його
обслуговування і продовжує очікувати наступних запитів. Розробник сервера
виявив, що після обробки кожного запиту в системі залишається процес-зомбі.
Дайте відповіді на такі запитання:

а) у чому причина появи такого процесу і наскільки серйозна ця проблема
з погляду витрат пам'яті?

б) як виправити код сервера, щоб процеси-зомбі не виникали?

8. Напишіть функцію, виклик якої призведе до знищення всіх процесів-зомбі,
створених поточним процесом.

9. Розробіть простий командний інтерпретатор для Linux і Windows ХР. Він повинен видавати підказку (наприклад, «>»), обробляти введений користувачем
командний рядок (що містить ім'я виконуваного файлу програми та її аргументи) і запускати задану програму. Асинхронний запуск здійснюють уведенням «&» як останнього символу командного рядка. У разі завершення командного рядка будь-яким іншим символом програма запускається синхронно.
Інтерпретатор завершує роботу після введення рядка «exit». Виконання програм, запущених інтерпретатором, може бути перерване натисканням клавіш
Ctrl+C, однак воно не повинне переривати виконання інтерпретатора. Для запуску програмного коду в Linux рекомендовано використовувати функцію
execvp (), що приймає два параметри prog і args, аналогічні до перших двох
параметрів функції execve (), і використовує змінну оточення PATH для пошуку
шляху до виконуваних файлів.

10. Розробіть застосування для Linux і Windows ХР, що реалізує паралельне вико-
нання коду двома потоками. Основний потік застосування Т створює потік t
Далі кожен із потоків виконує цикл (наприклад, до 30). На кожній ітерації
циклу він збільшує значення локального лічильника на одиницю, відображає
це значення з нового рядка і призупиняється на деякий час (потік Т- на час wT,
потік t — wt). Після завершення циклу потік Т приєднує t Як залежать результати виконання цього застосування від значень wT і wt? Як зміняться ці результати, якщо потік t не буде приєднано?


Дата добавления: 2014-12-20; просмотров: 20 | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2021 год. (0.01 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав