Реалізація багатозадачності в Windows Vista
ЗАТВЕРДЖЕНО
Наказ Міністерства освіти і науки,
Молоді та спорту України
29 березня 2012 року № 384
Форма № Н-6.01
Відокремлений структурний підрозділ Золочівський коледж
Національного університету «Львіррвська політехніка»
Методична комісія природничо-
КУРСОВА РОБОТА
з Операційних систем
на тему:
«Реалізація багатозадачності в Windows Vista»
Студента ІІ курсу РПЗ групи
напряму підготовки 6.030501 «Програмна інженерія»
спеціальності 5.05010301 Розробка програмного забезпечення
Гринчишина Я.П.
Керівник викладач Повх Тетяна Володимирівна
Національна шкала ___________________
Кількість балів: __________Оцінка: ECTS _____
Члени комісії
________________ __________________________
(підпис) (прізвище та ініціали)
________________ ___________________________
(підпис) (прізвище та ініціали)
________________ ___________________________
(підпис) (прізвище та ініціали)
м. Золочів – 2013 рік
Зміст
Вступ 3
Розділ 1. Теоретична частина 4
1.1.Суть багатозадачності 4
1.1.1. Властивості багатозадачного середовища 4
1.1.2.Типи псевдопаралельної багатозадачності 6
1.2. Моделювання режиму багатозадачності 12
1.2.1.Процеси і потоки 12
1.2.2.Стан процесу 15
1.3. Реалізяція багатозадачності в Windows Vista 21
1.3.1.Фундаментальні концепції 21
1.3.2. Реалізація процесів і потоків в Windows Vista 27
1.3.3. Планування 30
Розділ 2. Практична частина 38
Висновки 43
Список використаної літератури 44
Вступ
Windows Vista - це версія Microsoft
Windows, із серії графічних
Одним з найбільш актуальних питань, які вирішує будь багатозадачна операційна система, в тому числі і система Windows Vista, полягає в організації можливості простого, але ефективного способу надання процесорного часу різним паралельно виконуючим програмам. Іншими словами, мова йде про диспетчеризацію задач.
Багатозадачність, в загальному, означає здатність операційної системи забезпечувати спільне використання процесора декількома програмами.
Таким чином, метою даної роботи є розгляд реалізації багатозадачності в Windows Vista. Для досягнення поставленої мети необхідно вирішити наступні завдання:
- Висвітлити сутність багатозадачності.
- Вивчити модель режиму багатозадачності.
- Приділити особливу увагу розгляду реалізації багатозадачності в Windows Vista.
Об'єктом дослідження в даній роботі є операційна система Windows Vista. Предметом дослідження - реалізація багатозадачності в Windows Vista.
Розділ 1. Теоретична частина
1.1.Суть багатозадачності
1.1.1. Властивості багатозадачного середовища
Багатозадачність (англ. multitasking) - властивість операційної системи або середовища програмування, забезпечувати можливість паралельної (або псевдопараллельної) обробки декількох.
Істинна багатозадачність операційної системи можлива тільки в розподілених обчислювальних системах.
Примітивні багатозадачні середовища забезпечують чисте «розділення ресурсів», коли за кожною задачею закріплюється певна ділянка пам'яті, і завдання активізується в строго певні інтервали часу.
Більш розвинені багатозадачні системи проводять розподіл ресурсів динамічно, коли завдання стартує в пам'яті або покидає пам'ять залежно від її пріоритету і від стратегії системи. Така багатозадачна система володіє наступними особливостями:
- Кожне завдання має свій пріоритет, відповідно до якого отримує час і пам'ять.
- Система організовує черги завдань так, щоб всі завдання отримали ресурси, в залежності від пріоритетів та стратегії системи.
- Система організовує обробку переривань, по яких завдання можуть активуватися, деактивуватися і віддалятися.
- По закінченні відведеного часу завдання може тимчасово викидатися з пам'яті, віддаючи ресурси іншим завданням, а потім через певний системою час, відновлюватися в пам'яті.
- Система забезпечує захист пам'яті від несанкціонованого втручання інших завдань.
- Система вирішує конфлікти доступу до ресурсів і пристроям, не допускаючи тупикових ситуацій загального зависання від очікування заблокованих ресурсів.
- Система розпізнає збої і зависання окремих завдань і припиняє їх.
- Система гарантує кожному завданню, що рано чи пізно вона буде активована.
- Система обробляє запити реального часу.
- Система забезпечує комунікацію між процесами.
1.1.2.Типи псевдопаралельної багатозадачності
Розподіл процесів між наявними ресурсами має назву «планування процесів». Існує два основних типи процедур планування процесів - витісняючий (preemptive) і невитісняючий (non-preemptive).
Невитісняюча багатозадачність (non-preemptive multitasking) - це спосіб планування процесів, при якому активний процес виконується до тих пір, поки він сам, за власною ініціативою, не віддасть керування планувальнику ОС для того, щоб той вибрав з черги інший, готовий до виконання процес.
Витісняюча багатозадачність (preemptive multitasking) - це такий спосіб, при якому рішення про переключення процесора з виконання одного процесу на виконання іншого процесу приймається планувальником ОС, а не самою активною задачею.
Основною відмінністю між невитісняючим і витісняючим варіантами багатозадачності є степінь централізації механізму планування задач. При витісняючій багатозадачності механізм планування задач цілком зосереджений в операційній системі, а програміст пише свій додаток, не піклуючись про те, що воно буде виконуватися «паралельно» з іншими завданнями. При цьому ОС виконує такі функції: визначає момент зняття з виконання активної задачі, запам'ятовує її контекст, вибирає з черги готових задач наступну і запускає її на виконання, завантажуючи її контекст. При невитісняючій багатозадачності механізм планування розподілений між ОС і прикладними програмами. Прикладна програма, отримавши керування від ОС, сама визначає момент завершення своєї чергової ітерації і передає керування ОС за допомогою будь-якого системного виклику, а ОС формує черги задач і вибирає відповідно до деякого алгоритму (наприклад, з урахуванням пріоритетів) наступну задачу на виконання . Такий механізм створює проблеми, як для користувачів, так і для розробників. Для користувачів це означає, що управління системою губиться на довільний період часу, який визначається додатком (а не користувачем). Якщо додаток витрачає занадто багато часу на виконання будь-якої роботи, наприклад, на форматування диска, користувач не може переключитися з цього завдання на інше завдання, наприклад, на текстовий редактор, в той час як форматування могло б продовжуватися у фоновому режимі.
Тому розробники додатків для невитісняючого операційного середовища, покладаючи на себе функції планувальника, повинні створювати додатки так, щоб вони виконували свої завдання невеликими частинами. Наприклад, програма форматування може відформатувати одну доріжку дискети і повернути управління системою. Після виконання інших завдань система поверне управління програмі форматування, щоб та відформатувати наступну доріжку. Подібний метод поділу часу між завданнями працює, але він істотно ускладнює розробку програм і висуває підвищені вимоги до кваліфікації програміста. Програміст повинен забезпечити «дружнє» ставлення своєї програми до інших виконуваним «одночасно» з нею програмам, достатньо часто віддаючи їм керування. Крайнім проявом «недружнє» ставлення додатка є його «зависання», яке призводить до загального краху системи. У системах із витісняючою багатозадачністю такі ситуації, як правило, виключені, так як центральний плануючий механізм зніме «зависле» завдання з виконання.
Однак розподіл функцій планувальника між ОС і додатками не завжди є недоліком, а за певних умов може бути і перевагою, тому що дає можливість розробнику додатків самому проектувати алгоритм планування, найбільш підходящий для даного фіксованого набору завдань. Так як розробник сам визначає в програмі момент часу передачі управління, то при цьому виключаються нераціональні переривання програм у "незручні" для них моменти часу. Крім того, легко дозволяються проблеми спільного використання даних: задача під час кожної ітерації використовує їх монопольно й упевнена, що протягом цього періоду ніхто інший не змінить ці дані. Значною перевагою невитісняючих систем є більш висока швидкість переключення з задачі на .
1.1.3. Історія розвитку багатозадачних операційних систем
Основною ознакою
Системи з розподілом часу з'явилися на початку 60-х. Вони управлялися mainframe-комп'ютерами, обслуговуючими багаточисельні видалені термінали. В якості терміналів спочатку використовувалися звичайні телетайпи, які уміли лише вводити або виводити інформацію. Завдяки величезній різниці в швидкості роботи таких пристроїв, як телетайп і процесор, системи з розділенням часу встигали перемикатися між багатьма терміналами і вводити або виводити інформацію так, що кожному користувачеві здавалося, що він одноосібно керує віддаленим процесором.
Потім з'явилися персональні комп'ютери, які стали використовуватися в якості віддалених терміналів. У зв'язку з цим для операційної системи головного процесора (наприклад, IBM-370) відпала необхідність займатися посимвольним введенням-виводом. Тепер акцент в розробці операційних систем був перенесений на управління виконуваними програмними модулями, що належать різним користувачам і одночасно знаходяться в пам'яті головного комп'ютера. З'явилися такі поняття, як черга завдань, черга на обслуговування яким-небудь пристроєм: принтером, плоттером, накопичувачем на магнітному носії, пріоритет завдання, очікуваний час завершення завдання і т. д.
В даний час, коли кожен користувач має досить потужний персональний комп'ютер, акценти в розвитку ОС знову змінилися. Тепер велике значення набуває розвиток мережевих, багатозадачних ОС. По суті, тепер користувач має можливість встановити на окремому персональному комп'ютері багатозадачну ОС і розробляти додатки, що поєднують виконання декількох процесів. Кожен процес, у свою чергу, може складатися з декількох потоків, що виконуються в адресному просторі процесу.
Перші операційні системи, реалізовані
на персональних комп'ютерах, сильно поступалися
в концептуальному плані і
по своїм реальним можливостям системам
з розділенням часу, давно реалізованим
в mainframe-комп'ютерах. У Win16, наприклад, теж
існує поняття
Якщо при такому підході обробка повідомлення затягується, то користувач побачить реакцію системи лише після завершення обробки поточним додатком поточного повідомлення. Зазвичай при виконанні тривалих операцій програміст змінює форму курсора (пісочний годинник), викликавши API-функцію BeginWaitCursor. Іноді, якщо це передбачив розробник програми, в таких випадках застрягле застосування навіть викликає функцію PeekMessage, повідомляючи системі, що вона може обробити чергове повідомлення, а поточне застосування здатне і почекати. Але головна неприємність при такому підході полягає в тому, що в разі нескінченного циклу, викликаного помилкою в програмі, ОС не має шансів одержати управління і також зависне. Користувачеві доведеться перезавантажувати систему.
У Windows починаючи з Windows 95 реалізований принципово інший вид багатозадачності, в якому операційна система дійсно контролює і керує процесами, потоками і їх перемиканням. Здатність операційної системи перервати виконуваний потік практично в будь-який момент часу і передати управління іншому чекаючому потоку визначається терміном preemptive multitasking - переважна, або витісняюча, багатозадачність. Реалізація її виглядає так: усі існуючі в даний момент потоки, частина з яких може належати одному і тому ж процесу, претендують на процесорний час і, з точки зору користувача повинні виконуватися одночасно. Для створення цієї ілюзії система через певні проміжки часу забирає управління, аналізує свою чергу повідомлень, розподіляє повідомлення по інших чергах в просторі процесів і, якщо вважає за потрібне, перемикає потоки (рис.1.1.3.1.)
Рис.1.1.3.1. Перемикання потоків в системі з витісняючою багатозадачністю
Реалізація витісняючої багатозадачності в Windows 2000 дає не тільки можливість плавного перемикання завдань, але і стійкість середовища до зависань, так як ні один додаток не може отримати необмежені права на процесорний час і інші ресурси. Так система створює ефект одночасного виконання декількох застосувань.
Якщо комп'ютер має декілька процесорів, то системи Windows NT/2000 можуть дійсно поєднувати виконання декількох додатків. Якщо процесор один, то поєднання залишається ілюзією. Коли закінчується квант часу, відведений поточній програмі, система її перериває, зберігає контекст і віддає управління іншій програмі, яка чекає своєї черги. Величина кванта часу (time slice) залежить від ОС і типу процесора, в Windows NT вона в середньому дорівнює 20 мс. Слід зазначити, що домогтися дійсно одночасного виконання потоків можна тільки на машині з декількома процесорами і лише під управлінням Windows, ядра яких підтримують розподіл потоків між процесорами і процесорного часу між потоками на кожному процесорі. Наприклад, Windows 95 працювала тільки з одним процесором. Навіть якщо у комп'ютера декілька процесорів, під управлінням Windows 95 міг бути задіяний лише один з них, а інші повинні .
1.2. Моделювання режиму багатозадачності
1.2.1.Процеси і потоки
Розрізняють два способи реалізації багатозадачності:
- Створити один процес,
що має кілька потоків
- Створити декілька процесів, кожен з яких має один або декілька потоків виконання.
Багатозадачна (multi-process) система дозволяє двом або більше програмам виконуватися одночасно.
Багатопотокова (multi-threaded) система дозволяє одній програмі виконувати відразу декілька потоків одночасно.
Сучасні операційні системи поєднують в собі обидві ці властивості. Додаток Win32 може складатися з одного або більше процесів. Наприклад, додаток за розрахунком параметрів турбогенератора може складатися з зручної оболонки, написаної на мові C++ (головний процес), і обчислювальних модулів, написаних на мові FORTRAN і запускаються у вигляді окремих (породжених) процесів. При цьому можливий варіант, коли один процес (модуль програми) зайнятий виведенням геометрії розрахункової області, а інший одночасно виробляє розрахунок електромагнітного поля.
Процес - це поняття, що відноситься до операційної системи. Кожного разу, як ви запускаєте додаток, система створює і запускає новий процес. Процес можна грубо ототожнити з ехе-кодом, що виконуються в окремому процесорі.
З кожним процесом система пов'язує такі ресурси, як: віртуальний адресний простір; виконані код і дані; базовий пріоритет; описувачі об'єктів; змінні оточення.
Кожен процес обов'язково створює первинний потік (primary thread) виконання. Він робить це автоматично і, якщо програміст не робить якихось спеціальних зусиль по створенню другого потоку, то первинний потік і породивший його процес зазвичай ототожнюються в свідомості користувача, а, часто і в свідомості програміста. Але останній може створити ще один або декілька потоків, які розміщуються в одному і тому ж адресному просторі, що належить процесові. Коли вони створюються, батьківський процес починає виконуватися не послідовно, а паралельно. Так реалізується потокова багатозадачність. Кажуть, що потоки виконуються в контексті процесу.
Потік (thread) - це основний елемент системи, якому ОС виділяє машинний час. Потік може виконувати якусь частину загального коду процесу, в тому числі і ту частину, яка в цей час вже виконується іншим потоком. Наприклад, код функції, що відображає на екрані ступінь просування процесу передачі інформації, може одночасно виконуватися двома потоками, які обслуговують двох клієнтів одного сервера.
Всі потоки (threads) одного процесу користуються ресурсами породжувача їх процесу. Крім того, кожному потоку система і / або програміст приписує пріоритет виконання і набір структур мови С, що описують контекст потоку. Система використовує їх для запам'ятовування контексту потоку, коли його виконання уривається. У контекст входять:
- Стан регістрів;
- Системний стек ядра ОС (kernel stack);
- Стек користувача розташований в адресному просторі процесу;
- Блок змінних оточення потоку.
Потоки подібні процесам, але вимагають менших витрат при своєму створенні. Вони у меншій мірі, ніж процеси, захищені один від одного, але дозволяють поєднати виконання операцій і виграти в загальній продуктивності процесу.
Перерахуємо найбільш типові
випадки, коли слід застосовувати
- Керування вводом в різні документи МШ-інтерфейсу. Введення даних кожного документа додатка організований у вигляді окремого потоку;
- Управління введенням даних з декількох пристроїв телекомунікації;
- Розмежування пріоритетів виконання завдань. Потокам, що вимагає високої швидкості реакції, присвоюється високий пріоритет, а іншим потокам більш низький;
- Зниження часу реакції на дії користувача по вводу даних при одночасному виконанні фонових обчислень.
Зазвичай більш ефективною є реалізація багатозадачності у вигляді одного процесу з декількома потоками, ніж у вигляді багатьох процесів з одним потоком, так як:
- Контексти потоків займають менший об'єм, ніж контексти процесів і система перемикає їх швидше;
- Взаємодія потоків простіша, так як вони можуть користуватися глобальними змінними в загальному для них адресному просторі процесу;
- Потоки одного процесу легше синхронізувати, так як їм доступні описувачі об'єктів ядра із загального контексту .
1.2.2.Стан процесу
Будь-який процес у багатозадачній ОС багаторазово відчуває перехід з одного стану в інший.
Основних станів всього три.
- Робота (running) - в цьому стані знаходиться процес, програму якого в даний момент виконує процесор. Працюючий процес іноді зручно називати також поточним процесом.
- Готовність (ready) - стан, процес якого може бути переведений в стан роботи, як тільки це визнає потрібним зробити ОС.
- Блокування або, що те ж саме, сон (sleeping, waiting) - стан, в якому процес не може продовжувати виконання, поки не відбудеться деяка зовнішня по відношенню до процесу подія.
Перші два стани часто об'єднують поняттям активного стану процесу.
Для станів готовності і сну спільне те, що процес не працює. У чому різниця між цими двома «способами не працювати»?
Готовий до виконання процес не виконується тільки тому, що є інші не менш готові процеси, які на думку системи більш гідні займати зараз процесорний час. У кожен момент часу вибір одного з готових процесів на роль працюючого визначається логікою роботи ОС. Цей вибір повинен забезпечувати ефективну квазіпараллельну роботу готових процесів. Як вирішується це завдання - буде розглянуто нижче.
На відміну від цього, сплячий процес - це завжди процес, що очікує деякої конкретної події. Сплячий процес не зможе заробити, навіть якщо процесор раптом виявиться вільним. Такий процес, у відповідності зі своєю власною логікою, чекає чогось, що має статися.
Чого він може чекати? Ну, наприклад:
- Завершення розпочатої операції синхронного вводу / виводу (тобто, наприклад, процес чекає натискання клавіші Enter або закінчення запису на диск);
- Звільнення запитаного у системи ресурсу (наприклад, додаткової області пам'яті або відкритого файлу);
- Закінчення заданого інтервалу часу («посплю-но я хвилин десять!») Або досягнення заданого моменту часу («розбудіть мене рівно опівночі!») (В обох випадках процес чекає сигналу від запрограмованого таймера);
- Сигналу на продовження дій від іншого, взаємопов'язаного процесу;
- Повідомлення від системи про необхідність виконати певні дії (наприклад, перемалювати вміст вікна).
У будь-якому з названих (і багатьох неназваних) випадків має статися деяка подія, джерело якої лежить поза даним процесом.
Умовно можна сказати, що якщо б в обчислювальну систему раптом було додано ще кілька процесорів, то «готові» процеси могли б відразу перейти в стан «роботи», але «сплячі» продовжили б свій сон.
Зрозуміло, що процес може виконувати очікування шляхом циклічної перевірки очікуваної умови. При цьому він формально залишатиметься активним, розтрачуючи дорогоцінний процесорний час на активне очікування. Однак таке рішення буде говорити лише про кричущу не кваліфікованість програміста. Будь-яка багатозадачна ОС надає в розпорядження прикладних програм набір функцій, що переводять процес в стан сну, в якому процес не намагається використовувати процесорний час (іншими словами, стан сну є стан пасивного очікування). Такі системні функції називаються блокуючими. До їх числа відносяться функції синхронного вводу / виводу, запиту ресурсів, призупинення до заданого часу, отримання повідомлень і багато інших.
Оскільки ОС бере на себе блокування, «усипляння» процесу, вона повинна забезпечити і його розблокування, «пробудження». Щоб це стало можливим, система повинна для кожного сплячого процесу пам'ятати, «чого він чекає», тобто пам'ятати умови пробудження процесу. Система відслідковує всі події, здатні розблокувати який-небудь процес (у багатьох випадках використовуючи для цього апаратні переривання) і, коли для одного або відразу декількох процесів настає очікувана подія, переводить ці події зі стану сну в стан готовності.
1.2.3. Модель режиму багатозадачності
Режим багатозадачності дозволяє використовувати центральний процесор більш раціонально. При грубій прикидці, якщо для середньостатистичного процесу обчислення займають лише 20% часу його перебування в пам'яті, то при п'яти одночасно знаходяться в пам'яті процесах центральний процесор буде завантажений постійно. Але в цієї моделі закладено абсолютно нереальний оптимізм, оскільки в ній свідомо передбачається, що всі п'ять процесів ніколи не будуть одночасно перебувати в очікуванні закінчення якого-небудь процесу вводу-виводу.
Краще вибудовувати модель на основі імовірнісного погляду на використання центрального процесора. Припустимо, що процес проводить частину свого часу p в очікуванні завершення операцій введення-виведення. При одночасній присутності в пам'яті n процесів ймовірність того, що всі n процеси очікують завершення вводу-виводу (в разі чого процесор простоює), дорівнює рn. Тоді час задіяння процесора обчислюється за формулою:
Час задіяння ЦП = 1 - рn.
Рис. 1.2.3.1. Час задіяння ЦП у вигляді функції від кількості процесів
На рис.1.2.3.1. показано час задіяння центрального процесора у вигляді функції від аргументу n, який називається ступенем багатозадачності.
Судячи по малюнку, якщо процес
витрачає 80% свого часу на очікування
завершення вводу-виводу, то для зниження
простою процесора до рівня не
більше 10% в пам'яті можуть одночасно
перебувати принаймні 10 процесів. Коли
ви зрозумієте, що до очікування введення-виведення
відноситься і очікування інтерактивного
процесу користувальницького
Заради справедливості слід
зауважити, що розглянута нами імовірнісна
модель носить дуже приблизний характер.
У ній безумовно
Припустимо, наприклад, що пам'ять комп'ютера становить 512 Мбайт, операційна система займає 128 Мбайт, а кожна програма користувача також займає до 128 Мбайт. Цей об'єм дозволяє одночасно розмістити в пам'яті три користувацькі програми. При середньому очікуванні введення-виведення в 80% ми маємо завантаженість центрального процесора (якщо ігнорувати витрати на роботу операційної системи), рівну 1 - 0,83, або близько 49%. Збільшення обсягу пам'яті ще на 512 Мбайт дозволить системі перейти від трикратної багатозадачності до семикратної, що підвищить завантаженість центрального процесора до 79%. Іншими словами, додаткові 512 Мбайт пам'яті збільшать його продуктивність на 30%.
Збільшення пам'яті ще на 512 Мбайт підніме рівень продуктивності всього лише з 79 до 91%, тобто додатковий приріст продуктивності складе тільки 12%. Використовуючи цю модель, власники комп'ютерів можуть прийти до висновку, що перше нарощування обсягу пам'яті стане, на відміну від другого, непоганим внеском у підвищення продуктивності процесора.