Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2.docx
Скачиваний:
11
Добавлен:
12.02.2016
Размер:
1.41 Mб
Скачать

Класична модель потоків

Модель процесу заснована на двох незалежних поняттях: групуванню ресурсів і виконанні. Іноді їх корисно відокремити один від одного, і тут на перший план виходять потоки. Процес є способом групування в єдине ціле взаємозалежних ресурсів. У процесу є адресний простір, що містить текст програми і дані, а також інші ресурси. Ці ресурси можуть включати відкриті файли, необроблені аварійні сигнали, обробники сигналів, облікову інформацію і т. д. Управління цими ресурсами можна значно полегшити, якщо зібрати їх в одне ціле у вигляді процесу.

Інше властиве процесу поняття - потік виконання – або просто потік. У потоку є лічильник команд, що відслідковує, яку чергову інструкцію потрібно виконувати. У нього є регістри, в яких містяться поточні робочі змінні. У нього є стек з протоколом виконання, що містить по одному фрейму для кожної викликаної процедури, яка ще не повернула управління. Хоча потік може бути виконаний в рамках якого-небудь процесу, сам потік і його процес є різними поняттями і повинні розглядатися окремо. Процеси використовуються для групування ресурсів в єдине ціле, а потоки є «сутністю», що розподіляється для виконання на центральному процесорі.

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

У всіх потоків процесу один адресний простір, отже, вони також спільно використовують одні й ті ж глобальні змінні та деякі інші елементи притаманні процесу. У таблиці показано, які елементи є спільними для всіх потоків, а які ні.

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

Слід врахувати, що кожен потік має свій власний стек, що і показано на рис. Стек кожного потоку містить по одному фрейму для кожної уже викликаної, але ще не завершеної процедури. Такий фрейм містить локальні змінні процедури та адресу повернення управління по завершенні її виклику. Кожен потік буде, як правило, викликати різні процедури тому кожному потоку потрібен свій власний стек.

Коли використовується багатопоточність, процес зазвичай починається з використання одного потоку. Цей потік може створювати нові потоки, викликавши бібліотечну процедуру, наприклад thread_create. В стандарті POSIX визначено наступні найважливіші процедури призначені для здійснення управління потоками.

У параметрі thread_create зазвичай вказується ім'я процедури, що запускається в новому потоці. Іноді потоки мають ієрархічну структуру, при якій у них встановлюються взаємовідносини між батьківськими і дочірніми потоками, але найчастіше такі взаємини відсутні і всі потоки вважаються рівнозначними. Незалежно від наявності або відсутності ієрархічних взаємин створюваний потік зазвичай повертає ідентифікатор потоку, який дає ім'я новому потоку.

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

Дві останні функції, пов'язані з потоками, стосуються роботи з атрибутами. Функція pthread_attr_init створює структуру атрибутів, пов'язану з потоком, і ініціалізує її значеннями за замовчуванням. pthread_attr_destroy знищує структуру атрибутів. Атрибути включають розмір стеку, параметри планування та інші елементи, необхідні при використанні потоку.

Деякі складнощі які виникають при роботі з потоками:

  1. Якщо у батьківського процесу є кілька потоків, чи повинні вони бути у дочірнього процесу?

  2. Що станеться, якщо який-небудь з потоків батьківського процесу був заблокований системним викликом read, використовуваним, наприклад, для читання з клавіатури? Чи будуть тепер два потоки, в батьківському і в дочірньому процесах, заблоковані на введенні з клавіатури? Якщо буде введений рядок, чи отримають обидва потоки його копію?

  3. Інший клас проблем пов'язаний з тим, що потоки спільно використовують багато структури даних. Що відбувається в тому випадку, якщо один потік закриває файл в той момент, коли інший потік ще не зчитав з нього дані?

  4. Припустимо, що один потік зауважив дефіцит вільної пам'яті і приступив до виділення додаткового об’єму. На півдорозі відбувається перемикання потоків, і новий потік теж помічає дефіцит вільної пам'яті і приступає до виділення додаткового об’єму. Цілком можливо, що додаткова пам'ять буде виділена двічі.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]