Планування потоків (ниток) — це системний алгоритм керування послідовністю виконання потоків виконання та розподілу процесорного часу між ними.
Витісняюче планування
У Windows реалізовано підсистему витісняючого планування ниток на основі рівнів пріоритету, у якій завжди виконується готова до виконання нитка з найбільшим пріоритетом. Але вибір нитки для виконання може бути обмежений набором процесорів, на яких вона може виконуватися. Це явище називають прив'язкою до процесорів (processor affinity). За замовчуванням нить виконується на будь-якому доступному процесорі, але можна змінити прив'язку до процесорів через функції планування.
Обрана для виконання нитка працює протягом певного періоду, який називають квантом. Квант визначає, скільки часу буде виконуватися нитка, поки не настане черга іншої нитки з тим же пріоритетом (або вищим). Тривалість квантів залежить від трьох факторів: конфігураційних параметрів системи (довгі або короткі кванти), статусу процесу (активний або фоновий) і використання об'єкта "завдання" для зміни тривалості квантів. Однак нитка може не повністю використати свій квант. Оскільки у Windows реалізовано витісняючий планувальник, то як тільки інша нитка з вищим пріоритетом готова до виконання, поточна нитка витісняється, навіть якщо її квант ще не минув. Тому нитка може бути обрана для виконання і тут же витіснена, не скориставшись своїм квантом. Код Windows, відповідальний за планування, реалізований у ядрі. Оскільки цей код розосереджений по ядру, єдиного модуля або процедури з назвою "планувальник" немає. Сукупність процедур, що виконують ці обов'язки, називають диспетчером ядра (kernel's dispatcher).
Сценарії планування ниток у Windows
Самостійне перемикання
Нитка може самостійно звільнити процесор, перейшовши в стан очікування на якому-небудь об'єкті (наприклад, , м'ютексі, семафорі, процесі, потоці, віконному повідомленні тощо) шляхом виклику однієї із функцій очікування (наприклад, WaitForSingieObject або WaitForMultipleObjects).
При цьому нитка входить у стан очікування, а Windows вибирає нову нитку для виконання. Активна нитка (верхній кружок на рисунку) самостійно звільняє процесор, у результаті чого до процесора під'єднується інша нитка із черги (відзначена зірочкою у стовпчику Running). При цьому пріоритет нитки, що звільняє процесор, не знижується — він просто переводиться в чергу очікування обраних ним об'єктів. Коли нитка входить у стан очікування, залишкова доля кванта не втрачається. Після успішного завершення очікування квант нитки зменшується на одну одиницю, що еквівалентно третині інтервалу таймера (виняток становлять нитки із пріоритетом від 14 і вище, у яких після очікування квант скидається).
Витіснення
У цьому сценарії нитка з нижчим пріоритетом витісняється готовою до виконання ниткою з вищим пріоритетом. Така ситуація може бути наслідком двох обставин:
- завершилося очікування нитки з вищим пріоритетом (тобто відбулася подія, якої вона чекала);
- пріоритет нитки збільшився або зменшився.
У кожному із цих випадків Windows вирішує, продовжити виконання поточної нитки або витіснити її ниткою з вищим пріоритетом.
Нитки користувацького режиму можуть витісняти нитки режиму ядра. Тобто режим виконання нитки значення не має — визначальним фактором є її пріоритет.
Коли нитка витісняється, вона розміщується в початок черги готових ниток відповідного рівня пріоритету. На рисунку нитка із пріоритетом 18 виходить зі стану очікування й знову захоплює процесор, витісняючи активну у цей момент нитку (із пріоритетом 16) у чергу готових ниток. При цьому витиснена нитка розміщується не в кінець, а в початок черги. Після завершення нової нитки витиснена зможе відробити залишок свого кванта.
Завершення кванта
Коли нитка витратить свій квант процесорного часу, Windows повинна вирішити, чи знижувати її пріоритет і під’єднати до процесора іншу нитку. Знизивши пріоритет нитки, Windows шукає доречну для виконання нитку (такою є будь-яка нитка із черги готових, пріоритет якої вищий нового пріоритету поточної нитки). Якщо Windows не змінює пріоритет нитки і в черзі готових ниток є інші з тим же пріоритетом, вона вибирає із черги наступну нитку з таким же пріоритетом, а нитку, що виконувалася до цього, переміщає у хвіст черги (задаючи їй нову величину кванта й переводячи її зі стану Running у стан Ready). Якщо жодна нитка з тим же пріоритетом не готова до виконання, активній нитці виділяється ще один квант процесорного часу.
Завершення нитки
Завершуючись (після повернення з основної процедури й виклику ExitThread або через знищення викликом TerminateThread), нитка переходить у стан Terminated. Якщо в цей момент жоден дескриптор його об'єкта "нитка" не відкритий, нитка знищується зі списку ниток процесу, і відповідні структури даних вивільняються.
Перемикання контексту
Контекст нитки й процедура його перемикання залежать від архітектури процесора. У типовому випадку перемикання контексту вимагає збереження й відновлення наступних даних:
- вказівника команд;
- вказівників на стек ядра і стек користувача;
- вказівника на адресний простір, у якому виконується нитка (каталог таблиць сторінок пам’яті процесу).
Ядро зберігає цю інформацію, розміщуючи її в поточному стеку ядра. Далі вказівник стеку ядра встановлюється на стек ядра нової нитки й завантажується контекст цієї нитки. Якщо нова нитка належить іншому процесу, у спеціальний регістр процесора завантажується адреса його каталогу таблиць сторінок пам’яті, у результаті чого стає доступним адресний простір цього процесу. Потім керування передається завантаженому для нової нитки вказівнику команд, і виконання нитки відновлюється.
Динамічне підвищення пріоритету
Windows може динамічно підвищувати значення поточного пріоритету ниті в одному з таких випадків:
- після завершення операцій вводу-виводу;
- після закінчення очікування на події або семафорі виконавчої системи;
- після закінчення операції очікування нитями активного процесу;
- при пробудженні GUI-нитей через операції з вікнами;
- якщо нить, готова до виконання, затримується через нестачу процесорного часу.
Динамічне підвищення пріоритету призначене для оптимізації загальної пропускної здатності й чутливості системи, а також для усунення потенційно "несправедливих" сценаріїв планування, при яких одній ниті виділяється значно більше процесорного часу, ніж іншим. Але, як і будь-який інший алгоритм планування, динамічне підвищення пріоритету не завжди може вирішити всі проблеми планування, і від нього виграють не всі програми.
Windows ніколи не збільшує пріоритет нитей у діапазоні реального часу (16-31). Тому планування таких нитей стосовно інших завжди передбачуване.
Джерела
- Руссинович М. Внутреннее устройство Microsoft Windows : Windows Server 2003, Windows XP и Windows 2000. Мастер-класс / М.Руссинович, Д.Соломон ; пер. с англ. – 4-е изд. – М : Издательско-торговый дом "Русская редакция" ; СПб : Питер, 2005.
- Коноваленко І.В., Федорів П.С. Системне програмування у Windows з прикладами на Delphi, Т:ТНТУ.- 2012.
Див. також
- Планувальник операційної системи
- Багатонитковість
- Багатозадачність
- Процес
- Нитки у Windows
- Процесорний час
Це незавершена стаття про операційні системи. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Planuvannya potokiv nitok ce sistemnij algoritm keruvannya poslidovnistyu vikonannya potokiv vikonannya ta rozpodilu procesornogo chasu mizh nimi Vitisnyayuche planuvannyaU Windows realizovano pidsistemu vitisnyayuchogo planuvannya nitok na osnovi rivniv prioritetu u yakij zavzhdi vikonuyetsya gotova do vikonannya nitka z najbilshim prioritetom Ale vibir nitki dlya vikonannya mozhe buti obmezhenij naborom procesoriv na yakih vona mozhe vikonuvatisya Ce yavishe nazivayut priv yazkoyu do procesoriv processor affinity Za zamovchuvannyam nit vikonuyetsya na bud yakomu dostupnomu procesori ale mozhna zminiti priv yazku do procesoriv cherez funkciyi planuvannya Obrana dlya vikonannya nitka pracyuye protyagom pevnogo periodu yakij nazivayut kvantom Kvant viznachaye skilki chasu bude vikonuvatisya nitka poki ne nastane cherga inshoyi nitki z tim zhe prioritetom abo vishim Trivalist kvantiv zalezhit vid troh faktoriv konfiguracijnih parametriv sistemi dovgi abo korotki kvanti statusu procesu aktivnij abo fonovij i vikoristannya ob yekta zavdannya dlya zmini trivalosti kvantiv Odnak nitka mozhe ne povnistyu vikoristati svij kvant Oskilki u Windows realizovano vitisnyayuchij planuvalnik to yak tilki insha nitka z vishim prioritetom gotova do vikonannya potochna nitka vitisnyayetsya navit yaksho yiyi kvant she ne minuv Tomu nitka mozhe buti obrana dlya vikonannya i tut zhe vitisnena ne skoristavshis svoyim kvantom Kod Windows vidpovidalnij za planuvannya realizovanij u yadri Oskilki cej kod rozoseredzhenij po yadru yedinogo modulya abo proceduri z nazvoyu planuvalnik nemaye Sukupnist procedur sho vikonuyut ci obov yazki nazivayut dispetcherom yadra kernel s dispatcher Scenariyi planuvannya nitok u WindowsSamostijne peremikannya Samostijne peremikannya nitok Nitka mozhe samostijno zvilniti procesor perejshovshi v stan ochikuvannya na yakomu nebud ob yekti napriklad m yuteksi semafori procesi potoci vikonnomu povidomlenni tosho shlyahom vikliku odniyeyi iz funkcij ochikuvannya napriklad WaitForSingieObject abo WaitForMultipleObjects Pri comu nitka vhodit u stan ochikuvannya a Windows vibiraye novu nitku dlya vikonannya Aktivna nitka verhnij kruzhok na risunku samostijno zvilnyaye procesor u rezultati chogo do procesora pid yednuyetsya insha nitka iz chergi vidznachena zirochkoyu u stovpchiku Running Pri comu prioritet nitki sho zvilnyaye procesor ne znizhuyetsya vin prosto perevoditsya v chergu ochikuvannya obranih nim ob yektiv Koli nitka vhodit u stan ochikuvannya zalishkova dolya kvanta ne vtrachayetsya Pislya uspishnogo zavershennya ochikuvannya kvant nitki zmenshuyetsya na odnu odinicyu sho ekvivalentno tretini intervalu tajmera vinyatok stanovlyat nitki iz prioritetom vid 14 i vishe u yakih pislya ochikuvannya kvant skidayetsya Vitisnennya Planuvannya nitok z vitisnennyam U comu scenariyi nitka z nizhchim prioritetom vitisnyayetsya gotovoyu do vikonannya nitkoyu z vishim prioritetom Taka situaciya mozhe buti naslidkom dvoh obstavin zavershilosya ochikuvannya nitki z vishim prioritetom tobto vidbulasya podiya yakoyi vona chekala prioritet nitki zbilshivsya abo zmenshivsya U kozhnomu iz cih vipadkiv Windows virishuye prodovzhiti vikonannya potochnoyi nitki abo vitisniti yiyi nitkoyu z vishim prioritetom Nitki koristuvackogo rezhimu mozhut vitisnyati nitki rezhimu yadra Tobto rezhim vikonannya nitki znachennya ne maye viznachalnim faktorom ye yiyi prioritet Koli nitka vitisnyayetsya vona rozmishuyetsya v pochatok chergi gotovih nitok vidpovidnogo rivnya prioritetu Na risunku nitka iz prioritetom 18 vihodit zi stanu ochikuvannya j znovu zahoplyuye procesor vitisnyayuchi aktivnu u cej moment nitku iz prioritetom 16 u chergu gotovih nitok Pri comu vitisnena nitka rozmishuyetsya ne v kinec a v pochatok chergi Pislya zavershennya novoyi nitki vitisnena zmozhe vidrobiti zalishok svogo kvanta Zavershennya kvanta Planuvannya nitok u moment zavershennya kvanta potochnoyi nitki Koli nitka vitratit svij kvant procesornogo chasu Windows povinna virishiti chi znizhuvati yiyi prioritet i pid yednati do procesora inshu nitku Znizivshi prioritet nitki Windows shukaye dorechnu dlya vikonannya nitku takoyu ye bud yaka nitka iz chergi gotovih prioritet yakoyi vishij novogo prioritetu potochnoyi nitki Yaksho Windows ne zminyuye prioritet nitki i v cherzi gotovih nitok ye inshi z tim zhe prioritetom vona vibiraye iz chergi nastupnu nitku z takim zhe prioritetom a nitku sho vikonuvalasya do cogo peremishaye u hvist chergi zadayuchi yij novu velichinu kvanta j perevodyachi yiyi zi stanu Running u stan Ready Yaksho zhodna nitka z tim zhe prioritetom ne gotova do vikonannya aktivnij nitci vidilyayetsya she odin kvant procesornogo chasu Zavershennya nitki Zavershuyuchis pislya povernennya z osnovnoyi proceduri j vikliku ExitThread abo cherez znishennya viklikom TerminateThread nitka perehodit u stan Terminated Yaksho v cej moment zhoden deskriptor jogo ob yekta nitka ne vidkritij nitka znishuyetsya zi spisku nitok procesu i vidpovidni strukturi danih vivilnyayutsya Peremikannya kontekstu Kontekst nitki j procedura jogo peremikannya zalezhat vid arhitekturi procesora U tipovomu vipadku peremikannya kontekstu vimagaye zberezhennya j vidnovlennya nastupnih danih vkazivnika komand vkazivnikiv na stek yadra i stek koristuvacha vkazivnika na adresnij prostir u yakomu vikonuyetsya nitka katalog tablic storinok pam yati procesu Yadro zberigaye cyu informaciyu rozmishuyuchi yiyi v potochnomu steku yadra Dali vkazivnik steku yadra vstanovlyuyetsya na stek yadra novoyi nitki j zavantazhuyetsya kontekst ciyeyi nitki Yaksho nova nitka nalezhit inshomu procesu u specialnij registr procesora zavantazhuyetsya adresa jogo katalogu tablic storinok pam yati u rezultati chogo staye dostupnim adresnij prostir cogo procesu Potim keruvannya peredayetsya zavantazhenomu dlya novoyi nitki vkazivniku komand i vikonannya nitki vidnovlyuyetsya Dinamichne pidvishennya prioritetuWindows mozhe dinamichno pidvishuvati znachennya potochnogo prioritetu niti v odnomu z takih vipadkiv pislya zavershennya operacij vvodu vivodu pislya zakinchennya ochikuvannya na podiyi abo semafori vikonavchoyi sistemi pislya zakinchennya operaciyi ochikuvannya nityami aktivnogo procesu pri probudzhenni GUI nitej cherez operaciyi z viknami yaksho nit gotova do vikonannya zatrimuyetsya cherez nestachu procesornogo chasu Dinamichne pidvishennya prioritetu priznachene dlya optimizaciyi zagalnoyi propusknoyi zdatnosti j chutlivosti sistemi a takozh dlya usunennya potencijno nespravedlivih scenariyiv planuvannya pri yakih odnij niti vidilyayetsya znachno bilshe procesornogo chasu nizh inshim Ale yak i bud yakij inshij algoritm planuvannya dinamichne pidvishennya prioritetu ne zavzhdi mozhe virishiti vsi problemi planuvannya i vid nogo vigrayut ne vsi programi Windows nikoli ne zbilshuye prioritet nitej u diapazoni realnogo chasu 16 31 Tomu planuvannya takih nitej stosovno inshih zavzhdi peredbachuvane DzherelaRussinovich M Vnutrennee ustrojstvo Microsoft Windows Windows Server 2003 Windows XP i Windows 2000 Master klass M Russinovich D Solomon per s angl 4 e izd M Izdatelsko torgovyj dom Russkaya redakciya SPb Piter 2005 Konovalenko I V Fedoriv P S Sistemne programuvannya u Windows z prikladami na Delphi T TNTU 2012 Div takozhPlanuvalnik operacijnoyi sistemi Bagatonitkovist Bagatozadachnist Proces Nitki u Windows Procesornij chas Ce nezavershena stattya pro operacijni sistemi Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi