Первая страница
Наша команда
Контакты
О нас

    Головна сторінка



“Інформаційні управляючі системи та технології” 080402 “Інформаційні технології проектування” Одеса 2010

“Інформаційні управляючі системи та технології” 080402 “Інформаційні технології проектування” Одеса 2010




Сторінка11/24
Дата конвертації10.03.2017
Розмір1.41 Mb.
1   ...   7   8   9   10   11   12   13   14   ...   24

3.6 Керування потоками в Linux

3. 6. 1 Базова підтримка багатопотоковості


Донедавна єдиним засобом підтримки багатопотоковості в Linux був системний виклик clone(), який дає можливість створити новий процес на базі наявного. Цей виклик багато в чому схожій на виклик fork(), але має кілька особливостей.

  • Для нового процесу потрібно задати спеціальний набір прапорців, що визначають, як будуть розподілятися ресурси між предком і нащадком. До ресурсів, які можна розділяти, належать алресний простір, інформація про відкриті файли, оброблювачі сигналів. Зазаначимо, що у традиційній реалізації clone() відсутнє спеціальне використання ідентифікатора процесу (pid), ідентифікатора предка та деяких інших важливих атрибутів.

  • Для нового процесу порібно задати новий стек (оскільки в наслідок виклику clone() два процеси можуть спільно використовувати загальну пам'’ть, для них неприпустиме використання загального стека).

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

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



Недоліки традиційної підтримки багатопоковості в Linux

Основи підтримки багатопотоковості в ядрі Linux не зазнали принципових змін від появи системного виклику clone(). За цей час Linux із експериментальної системи перетворився на систему промислового рівня, в якій виконують корпоративні застосування в цілодобовоу режимі з великим навантаженням.

Промисло́вість - технічно найдосконаліша галузь матеріального виробництва, основа індустріалізації економіки, яка має вирішальний вплив на розвиток продуктивних сил; сукупність підприємств з виробництва електроенергії, знарядь праці для галузей економіки, видобутку сировини, палива, заготівлі лісу, переробки продукції, випущеної промисловістю або виробленої сільським господарством, видобуток і переробка сировини, виробництво товарів і послуг.
Експериме́нт (англ. experiment) - сукупність дослідів, об’єднаних однією системою їх постановки, взаємозв’язком результатів і способом їх обробки. В результаті експерименту отримують сукупність результатів, які допускають їхню сумісну обробку і зіставлення.

Таке використання системи висунуло до реалізації багатопотоковості вимого високої надійності та масштабованості. Стало очевидно, що реалізація , заснована на системному виклику clone(), цим вимогам не відповідає. Потрібне було повне перероблення засобів реалізації багатопотоковості в ядрі.

Керування потоками є частиною стандарту POSIX з 1996 року, відповідний програмний інтерфейс дістав назву потоки POSIX.


3. 6. 2 Потоки ядра Linux


Крім процесів і потоків користувача, Linux також підтримує спеціальний вид планованих об’єктів, яки мають уже знайому назву – потоки ядра. Такі потоки планують як звичайні процеси і потоки, кожен з яких має свій ідентифікатор (pid). Відмінності потоків ядра від процесів і потоків користувача полягають у тому, що:

  • для них недоступні ділянки пам’яті, виділені в режимі користувача.

3. 6. 2 Програмний інтерфейс керування потоками

Створення потоків


Щоб додати новий потік у поточний процес, у POSIX використовують функцію pthread_create() із таким синтаксисом:

#include

int pthread_create(pthread_t *th, pthread_attr *attr,
void *(*thread_fun)(void *).

Си́нтаксис (дав.-гр. σύνταξις - "побудова, порядок, складання", від σύν - "з, разом" і ταξις - "впорядкування") - розділ граматики, що вивчає граматичну будову словосполучень та речень у мові.
void *arg);

Розглянемо параметри цієї функції:



  • th – покажчик на заздалегідь визначену структуру типу pthread_t, яка далі буде передана в інші функції роботи з потоками; далі називатимемо ії дескриптором потоку(thread handle).

  • Attr – покажчик на структуру з атрибутами потоку (для використання атрибутів за замовченням потрібно передавати нульовий покажчик, деякі атрибути розглянемо пізніше);

  • thread_fun – покажчик на функцію потоку, що має описуватися як
    void *mythread_fun(void *value)
    {
    //виконання коду потоку
    }

  • arg – дані, що передаютьсяу функцію потоку (туди вони потраплять як параметр value).

Приклад створення потоку POSIX:

#include

// функція потоку

void *thread_fun(void *num)

{

printf(“потік номер %d\n”,(int)num);



}

//……………………………

pthread_t th;

// створюємо другий потік

pthread_create(&th, NULL,thread_fun,(void *) thread_num);

// тут паралельно виконуються два потоки

Новий потік починає виконуватися паралельно із потоком, що його створив. Наприклад, якщо всередині функції main() був створений потік, то виконання продовжать два потоки: початкової програми, що виконує код main(), і новий.

Завершення потоків POSIX

Для завершення потоку достатньо дійти до кінця його функції потоку еркthread_fun() або викликати з неї pthread_exit():

#include

void pthread_exit(void *retval);

Параметр retval задає код повернення. Наведемо приклад завершення потоку:

void *turead_fun(void *num)

{

printf(“потік номер %d\n”,(int)num);



pthread_exit(0);

}

Для коду початкового потоку програми є дві різні ситуації:



  • виконання оператора return або виконання всіх операторів до кінця main() завершує весь процес, при цьому всі потоки теж завершують своє виконання;

  • виконання функції pthread_exit() усередині функціїmain() завершує тільки початковий потік, ця дія не впливає на інші потоки у програмі – вони продовжуватимуть виконання , поки самі не завершаться.

Виклик функції pthread_exit() використовують тільки для приєднуваних потоків, оскільки він не звільняє ресурси потоку – за це відповідає той, хто приєднає потік.

1   ...   7   8   9   10   11   12   13   14   ...   24



  • 3. 6. 2 Потоки ядра Linux
  • 3. 6. 2 Програмний інтерфейс керування потоками