Процеси і потоки багатозадачні і многопотчние системи, відміну процесу від потоку, переваги та

Процеси і потоки

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

Кожен процес має власну пам'яттю. Потоки ж, які запущені всередині процесу, поділяють пам'ять між собою. Процес всередині операційної системи має власний ідентифікатором. Потоки існують всередині процесу і мають ідентифікатором всередині ефектів у програмному забезпеченні. Кожен з потоків має свій власний стек (він не ділить його з іншими потоками і інші потоки не можуть в нього залізти) і власний набір регістрів (потік не змінить значення регістра іншого потоку під час роботи). Часто потоки називають «легкими» процесами, так як вони вимагають набагато менше ресурсів для роботи, ніж новий процес. Залежно від реалізації, звичайний настільний комп'ютер може ефективно використовувати від одиниць, до десятків тисяч потоків.

  • ідентифікатор процесу
  • оточення
  • Робоча папка
  • регістри
  • стек
  • купа
  • файловий дескриптор
  • Загальні бібліотеки (dll, so)
  • Інструменти межпроцессорного взаємодії (пайпи, черги повідомлень, семафори або узагальнена пам'ять)
  • Специфічні для операційної системи ресурси
  • Stack Pointer (покажчик на вершину стека, насправді «свого» стека, як у процесу, при потоці немає)
  • регістри
  • Властивості (необхідні для планувальника, такі як пріоритет або політики)
  • Специфічні для потоку дані
  • Специфічні для операційної системи ресурси

Багатозадачність і паралелізм

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

Багатозадачні системи на однопоточном процесорі створюють ілюзію синхронного виконання декількох процесів. Нехай у нас є три процесу. Якщо кожен з них працює час t1, t2 і t3, то загальний час виконання дорівнюватиме t1 + t2 + t3.

Послідовне виконання трьох процесів на однопоточном процесорі

Якщо тепер ми розіб'ємо кожну із завдань на N частин, то загальний час виконання буде dt1 * N + dt2 * N + dt3 * N + dts * N * N, де dts - це час, що витрачається на відновлення контексту виконання завдання (на роботу планувальника ).

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

З одного боку, послідовне виконання трьох завдань без накладних витрат на переключення між завданнями повинно бути набагато швидше. Однак на практиці часто буває інакше. Якщо процес виконує багато операція введення-виведення або працює з зовнішніми ресурсами, то більшу частину часу він простоює, чекаючи дані. Це час простою займає інша задача. Таким чином, загальний час виконання стає менше.

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

Якщо у нас є одна «чіслодробітельная» завдання, то ніякої переваги не буде. Але варто пам'ятати, що в ряді випадків навіть на одноядерному процесорі така штучна параллелизация може істотно прискорити виконання.

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

По-перше, прискорення роботи зі збільшенням числа процесорів і ядер зростає нелінійно і має для даної задачі якийсь стелю (див. Закон Амдала). А по-друге, завдання сильно ускладнюється при наявності загальних ресурсів.

Спільний доступ до ресурсів

До оли кілька потоків роблять кожен свою справу, не розділяючи пам'ять, то вони можуть сильно прискорити роботу. Додаткові витрати будуть потрібні тільки для виділення ресурсів під ці потоки і для передачі їм необхідних даних. Коли кілька потоків повинні спілкуватися один з одним, передавати дані, обробляти один об'єкт, тобто спільно звертатися до одного ресурсу (зазвичай це загальний ділянку пам'яті), то виникають так звані race conditions - стану гонки - коли результат роботи залежить від порядку доступу до ресурсів .

Наприклад, нам потрібно скласти два масиви a і b однакової довжини і помістити результат в масив c. Кожне значення c [i] залежить від a [i] і b [i] і не залежить від інших. Ми можемо розділити масиви на кілька ділянок, і кожен з потоків буде займатися складанням тільки цих ділянок, які не перетинаючись з іншими потоками. У них усіх будуть загальні змінні a, b і c, але вони будуть завжди незалежно звертатися тільки до окремих областей пам'яті.

POSIX threads

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

В даний час більшість виробників спільно зі своїми власними інтерфейсами для роботи з потоками пропонують Pthreads. Pthreads зазвичай являє собою набір типів і функцій на мові Сі, описаних у файлі pthread.h і реалізованих в .h. lib. dll і т.д. файлах, що поставляються з бібліотекою. Іноді pthread входить до складу іншої бібліотеки (наприклад, libc).

ru-Cyrl 18- tutorial Sypachev S.S. 1989-04-14 [email protected] Stepan Sypachev students

Все ще не зрозуміло? - пиши питання на ящик