ЗНАЕТЕ ЛИ ВЫ?

Користувальницькі потоки й потоки ядра



Моделі багатопоточности. Реалізація багатопоточности в ОС, як і багатьох інших можливостей, має кілька рівнів абстракції. Найвищий з них – користувальницький рівень. З погляду користувача і його програм, керування потоками реалізовано через бібліотеку потоків користувальницького рівня (user threads). Існує кілька моделей потоків користувальницького рівня, серед яких:

· POSIX Pthreads –потоки, специфіковані стандартом POSIX і використовувані в POSIX-додатках (розглянуті пізніше в даній лекції);

· Mac C-threads– користувальницькі потоки в системі MacOS;

· Solaris threads– користувальницькі потоки в ОС Solaris.

Низькорівневі потоки, у які відображаються користувальницькі потоки, називаються потоками ядра (kernel threads). Вони підтримані й використовуються на рівні ядра операційної системи. Як і підходи до користувальницьких потоків, підходи до архітектури й реалізації системних потоків і до відображення користувальницьких потоків у системні в різних ОС різні. Наприклад, власні моделі потоків ядра зі своєю специфікою реалізовані в наступних ОС:

· Windows 95/98/NT/2000/XP/2003/2008/7;

· Solaris;

· Tru64 UNIX;

· BeOS;

· Linux.

Існують різні моделі багатопоточності– способи відображення користувальницьких потоків у потоки ядра. Теоретично можливі (і на практиці реалізовані) наступні моделі багатопоточности:

- Модель багато / один (many-to-one)– відображення декількох користувальницьких потоків у той самий потік ядра. Використається в операційних системах, що не підтримують множинні системні потоки (наприклад, з метою економії пам'яті). Дана модель зображена на рис. 10.2.

 

Рис. 10.2. Схема моделі багатопоточности "багато / один".

- Модель один / один (one-to-one)– взаємо-однозначне відображення кожного користувальницького потоку в певний потік ядра. Приклади ОС, що використають дану модель, - Windows 95/98/NT/2000/XP/2003/2008/7; OS/2. Дана модель зображена на рис. 10.3.

 

Рис. 10.3. Схема моделі багатопоточности "один / один".

- Модель багато / багато (many-to-many)– модель, що допускає відображення декількох користувальницьких потоків у кілька системних потоків. Така модель дозволяє ОС створювати велику кількість системних потоків. Характерним прикладом ОС, що використає подібну модель, є ОС Solaris, а також Windows NT / 2000 / XP / 2003 / 2008 / 7 з пакетом ThreadFiber. Дана модель зображена на рис. 10.4.

 

Рис. 10.4. Схема моделі багатопоточности "багато / багато".

Проблеми багатопоточності

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

Семантика системних викликів fork() і exec().Як ми вже відзначали, у класичної ОС UNIX системний виклик forkстворює новий "великоваговий" процес зі своїм адресним простором, що значно "дорожче", чим створення потоку. Однак, з метою підтримки сполучності програм знизу нагору, доводиться зберігати цю семантику, а багатопоточність уводити за допомогою нових системних викликів.

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

Обробка сигналів. Сигналив UNIX – низькорівневий механізм обробки помилкових ситуацій. Приклади сигналів: SIGSEGV -порушення сегментації (обіг по невірній адресі, найчастіше по нульовому); SIGKILL –сигнал процесу про виконання команди killйого знищення. Користувач може визначити свою процедура-оброблювач сигналу системним викликом signal. Проблема в наступному: як поширюються сигнали в багатопоточних програмах й якому потоці вони повинні оброблятися? У більшості випадків це питання вирішується в такий спосіб: сигнал обробляється потоком, у якому він згенерирований, і впливає на виконання тільки цього потоку. У більше сучасних ОС (наприклад, Windows 2000 і більше пізніх версіях Windows), заснованих на обєктно-орієнтированій методології, концепція сигналу замінена більше високорівневою концепцією виключення (exception). Виключення поширюється по стеку потоку в порядку, зворотному порядку викликів методів, і обробляється першим з тих, у якому система знаходить підходящий оброблювач. Аналогічна схема обробки виключень реалізована в Java і в. NET.

Групи потоків.

У складних завданнях, наприклад, задачах моделювання, при великій кількості різнорідних потоків, виникає потреба в їхньому структуруванні за допомогою концепції групи потоків– сукупності потоків, що мають своє власне ім'я, над потоками якої визначені групові операції. Найбільше вдало, на наш погляд, групи потоків реалізовані в Java (за допомогою класу ThreadGroup ). Слід зазначити також ефективну реалізацію пулів потоків (ThreadPool)в. NET.

Локальні дані потоку (thread-local storage - TLS)– даному, приналежному тільки певному потоку й використовувані тільки цим потоком. Необхідність у таких даних очевидна, тому що багатопоточність - досить важливий метод розпаралелювання рішення великого завдання, при якому кожен потік працює над рішенням дорученої йому частини. Всі сучасні операційні системи й платформи розробки програм підтримують концепцію локальних даних потоку.

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

Тупики (deadlocks) і їхнє запобігання. Як і процеси, потоки можуть взаємно блокувати один одного (тобто може створитися ситуація deadlock ), при їхньому неакуратному програмуванні.

Потоки POSIX (Pthreads)

Як конкретна модель багатопоточності потоки POSIX (нагадаємо, що дана абревіатура розшифровується як Portable Operating Systems Interface of uni kind– стандарти для переносимих ОС типу UNIX). Багатопоточність в POSIX специфікована стандартом IEEE 1003.1c, що описує API для створення й синхронізації потоків. Відзначимо, що POSIX-стандарт API визначає лише необхідне поводження бібліотеки потоків. Реалізація потоків залишається на розсуд авторів конкретної POSIX-сумісної бібліотеки. POSIX-потоки поширені в ОС типу UNIX, а також, а также підтримуються, с метою сумісності програм, в багатьох других ОС, наприклад, Solaris і Windows NT.

Потоки й процеси в Solaris

В ОС Solaris, як уже було відзначено, використається модель потоків багато / багато. Крім того, у системі використоується також полегшений процес (lightweight process) проміжне між концепцією користувальницького потоку й систебагато потоку. Таким чином, в ОС Solaris кожен користувальницький потік відображається у свій полегшений процес, що, у свою чергу, відображається в потік ядра; останній може виконуватися на будь-якому процесорі (або ядрі процесора) комп'ютерної системи. Схема організації потоків в Solaris зображена на рис. 10.5.

 

Рис. 10.5. Потоки в Solaris.

На рис. 10.6 зображено схему організації процесу в ОС Solaris

 

Рис. 10.6. Процеси в Solaris.

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

Потоки в Windows 2000

Як ми вже відзначали, у системі Windows реалізована модель багатопоточности "один / один". Кожен потік містить:

· ідентифікатор потоку (thread id);

· набір регістрів

· окремі стеки для користувальницьких і системних процедур;

· область пам'яті для локальних даних потоку (thread-local storage - TLS).

Потоки в Linux

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

Потоки в Java

Як ми вже відзначали, Java - перша платформа для розробки програм, у якій багатопоточность підтримана на рівні мови й базових бібліотек. Потоки в Java можуть бути створені такими способами:

· Як розширення класу Thread

· Як класи, що реалізують інтерфейс Runnable, що містить єдиний метод run– тіло потоку що виконується

Потоки в Java управляються JVM. Можливе створення груп потоків й ієрархії таких груп.

Можливі стани потоків в Java зображені на рис. 10.7. Подібно потокам в ОС, потік в Java створюється й перебуває в стані новий, потім – виконуваний ; при виклику методів типу wait, sleepй ін. потік переходить у стан очікування; при завершенні методу runпотік завершується.

 

Рис. 10.7. Стану потоків в Java





Последнее изменение этой страницы: 2016-07-11; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.219.31.204 (0.007 с.)