Багаторівнева обробка в Visual C # (Sharp)

Наш мозок влаштований таким чином, що ми можемо виконувати кілька завдань однременно, тобто працювати в режимі багатозадачності, наприклад, пити каву, читати газету і розмовляти в один і той же час Але наша багатозадачність обмежена досить простими операціями і те невеликою їх кількістю, двома або трьома Але припустимо, що ми могли б відкласти поточне завдання, розпочати виконання дрой, а потім відкласти цю задачу і відновити виконання першого завдання, все це в межах часток секунди Скільки завдань, ви думаєте, ми б змогли робити однременно Можливо, кілька сотень, т к зараз ми, по суті, виконуємо завдання не в режимі багатозадачності, а в режимі сериализации

Тепер припустимо, що ви допомагаєте вашій дружині або чоловіку з приготуванням вечері на кухні, але при цьому не спілкуєтеся один з одним Які шанси, що ви будете постійно стикатися один з одним, намагатися використовувати одні і ті ж речі одночасно і т п? Швидше за все, досить високі Я хочу сказати, що між багатозадачністю, виконуваної одним мозком, і багатозадачністю, виконують кілька мізками, мається різниця Таким чином, багатозадачність ІМТ свою ціну, якої є організація взаємодії як між завданнями, так і виконавцями Іноді підвищення рівня багатозадачності замість прискорити виконання може навпаки уповільнити його Іншими словами, існує зопрівав, скільки людина може ефективно працювати над приготуванням вечері в оой кухні

Основна увага в цій главі приділяється тому, як писати код, здатний раба в режимі багатозадачності Операційна система працює в режимі многадачності за замовчуванням, але чи буде ваша програма багатозадачною, залежить від того, як ви її напишете Припустимо, що контролер управління освітленням, рамотренний в чолі 8, повинен контролювати освітлення в 3000 кімнатах Щоб управляти такою великою кількістю кімнат, нам потрібно було б виконувати паллельно один і той же код І ось в цьому і полягає проблема коду, який повинен виконуватись в режимі багатозадачності: змусити код працювати ефектами паралельно – завдання не з легких Поширеною проблемою многозадаих додатків є взаімоблокіровка Взаімоблокіровка відбувається, КДА для продовження роботи два завдання потребують даних один від одного Це означає, що жодна з них не може продовжувати виконання

Щоб написати код для паралельного виконання, програміст повинен соблать певну дисципліну кодування, як буде показано в цій главі Для цього нам буде достатньо тільки одного проекту JuggiingTasks Проект претавляет собою консольний додаток, в якому реалізуються методи, рассмаіваемие в цьому розділі

Одним з найбільш великих стрибків в історії компютерних обчислень був скок, коли компютер з машини, здатної виконувати одну задачу, став Машою, здатної виконувати декілька завдань одночасно Такі компютери, як Commodore 64 і Vic20, були однозадачних машинами При роботі з однозадаимі машинами ви вмикаєте компютер, і він очікує від вас вказівки робити що-небудь Скажімо, якщо ви вирішили, щоб компютер виконав цикл в мільйон ітерацій, виводячи на екран слово привіт, то це все, що однозадачний компьер буде робити, рн не здатний почати якусь завдання і, чекаючи відповідь від цієї завдання, почати робити щось інше Зараз ми можемо тільки дивуватися, як Чи примудрялися щось робити на таких компютерах (Але, з іншого боку, можна сперечатися, що, може бути, люди були більш продуктивними, працюючи з однією програмою, а не коли їм потрібно перевіряти електронну пошту, завантажувати Web-сторінку і друкувати звіт одночасно)

З придбанням компютерами можливості багатозадачності ситуація в облав інформаційних технологій змінилася разюче Але серверні компьери під управлінням таких операційних систем, як UNIX, були многозадаимі з самого початку А багатозадачність операційних системи, таких як Windows, не була повністю витісняє до тих пір, поки не були випущені Windows NT і Windows 95 Зверніть увагу на термін Витісняє многадачность, який означає щось значно інше, ніж проста многозачность

При простій багатозадачності окремі завдання кооперують між собою і велячи ресурси колективно По суті, проста багатозадачність є тикової гілкою в еволюції операційних систем Кращим її прикладом були Windows 30 і Windows 31 (та й в тих багатозадачність працювала лише завдяки безлічі ручних рішень індивідуальних проблем) Тепер розглянемо, що ж таке витісняє багатозадачність

Термін Витісняє багатозадачність (Preemptive multitasking) означає, що запуск і робота додатків контролюються операційною системою Необхідно усвідомлювати, що операційна система сама є додатком, а інші проженія можна виконувати, тому що вони розглядаються, як компоненти операційної системи Щоб перевірити це, створіть консольний додаток,

перейменуйте метод Main () в Mains () і подивіться, що буде Насправді метод Main про є інтерфейсом API, застосовуваним операційною системою для виконання вашого компонента, який маскується у вигляді програми

Таким чином, ми маємо програму, що називається операційною системою, Корая виконує компоненти, що називаються програмами Наступне питання – як кілька програм можуть виконуватися одночасно Відповідь полягає в тому, що операційна система не є простою програмою, а підставою, на якому запускаються і управляються додатки Операційна система полючается до спеціальних можливостей мікропроцесора, за допомогою котих кожній програмі виділяється її часовий інтервал або квант часу Так як програми NET є компонентами, їм ніколи не потрібен прямий доступ до мікропроцесора Більш того, операційна система не дозволить цього, тому що це може порушити її цілісність і стабільність роботи

Термін Квантування часу (Time slicing) означає, що операційна система виділяє кожній програмі інтервал часу для виконання Час виділення і тривалість цього інтервалу визначаються операційною системою повністю по свій розсуд Поза межами свого інтервалу часу програма знаходиться в стані глибокого заморожування і не робить абсолютно нічого Але пользовелю ці періодичні випадки клінічної смерті програми непомітні, т к вони тривають мікросекунди, що створює видимість безперервного виконання пррамми Подивитися квантування часу у дії можна за допомогою Windows Task Manager (Диспетчер завдань Windows)

На рис 131 показаний приклад цього вікна, в якому можна бачити, що програма explorerexe займає 6% часу центрального процесора Можна сказати, що загальний обсяг квантів часу, що виділяється операційної системою додатком explorerexe, дорівнює 6% усього часу центрального процесора Яким чином центральний процесор розбиває ці 6% свого часу, виділеного докладе explorerexe, є частностью операційної системи

Квантування часу і супутні питання не становлять нічого складного на одноядерних процесорах Але на багатоядерних процесорах квантування Вренна стає проблемою

Скажімо, що наша програма виконує на одноядерному процесорі два завдання: завдання 1 і завдання 2 Для кожного завдання процесор виділить окремий квант час (рис 132) На малюнку весь цикл обробки представлений у вигляді секторної дірамми, а кожен квант – у вигляді окремого сектора

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

щоб деякі операції додатка виконувалися в тлі, не впливаючи при цьому на завдання, виконувані на передньому плані, тоді розбиття завдання програми на кілька підзадач має сенс Прикладом такої ситуації може бути виконаний в тлі перевірки правопису в текстовому редакторі, в той час як пользовель працює з текстом У даному випадку небажано, щоб фонове завдання зедляла основну задачу

Рис 131 Квантування часу в Windows в дії

Рис 132 Виконання двох завдань на одноядерному процесорі

Рис 133 Виконання двох завдань на багатоядерному процесорі

Тепер подивимося на рис 133, де показано те ж саме додаток, але випояющееся на багатоядерному процесорі

Бачите різницю З метою більш ефективного використання мікропроцесора операційна система призначила виконання одного завдання одному ядру, а втой – іншому Ось тепер обидва завдання дійсно виконуються паралельно Також тепер можливо, що обидва завдання захочуть працювати з одними і тими ж даимі одночасно На одноядерних процесорах така ситуація фізично нозможна з причини їх однозадачной природи

Але з багатоядерними процесорами необхідно бути дуже уважним, яким чином глобальний стан маніпулюється багатозадачними додатками В іншому випадку ймовірно спотворення стану програми Така ситуація неможлива на одноядерних процесорах, т к на них справжнє паралельне іолненіе неможливо

ПРИМІТКА

Так як виробники мікропроцесорів, такі як Intel і AMD, випускають процеси все з бопьшім копічеством ядер, то перед розробниками програмного обеспенія стоїть завдання створення програм, які б іспопьзовапі можливості, проставпяемие цими ядрами Це завдання не завжди з пегкіх і вимагає опредепенного ппанірованія, щоб розробити погіку програми Наприклад, при обробці даих, які зберігаються в файп, файп непьзя зчитувати до тих пір, поки не буде завершено обробку даних і дані записані в файп

Джерело: Гросс К С # 2008: Пер з англ – СПб: БХВ-Петербург, 2009 – 576 е: ил – (Самовчитель)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*