Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

БІЛЕТ № 27





№1

Детермiнованi методи доступу

 

Метод вставляння регiстра. Цей метод застосовується в кiльцевих мережах. Принцип його роботи полягає в тому, що коли деяка станцiя має iнформацiю, яку треба вiдправити, вона вмiщує її у зсувовий регiстр. Цей регiстр може бути послiдовно ввімкнений у канал. Тодi данi з одного кiнця будуть надходити до регiстра i, рухаючись через нього, виходити з протилежного кiнця регiстра. Регiстр пiдмикається послiдовно до решти кiльця, якщо створиться придатний для цього промiжок мiж iншими пакетами, що циркулюють кiльцем. Регiстр лишається ввімкненим у кiльце, i усi пакети рухаються через нього. Коли пакет, який був спершу переданий цим пристроєм, повертається до нього i повнiстю завантажується до регiстра, регiстр вiдмикається вiд кiльця. Принцип роботи регiстра досить простий, проте практично реалiзувати цей метод складно. Адже потiк даних, що рухаються кiльцем, не можна зупиняти, i потрiбна адекватна та висока швидкiсть, з якою регiстр вмикається в кiльце i вимикається з нього, тобто потрiбний високий рiвень синхронiзацiї. Станцiя, яка є приймачем пакета, має прочитати данi та виставити прапорець — сигнал, що данi прийнято. Реальніший варiант вставляння регiстра грунтується на тому, що використовуються два регiстри: один для передавання, другий — для приймання. Якщо станцiя має пакет даних, призначений для передавання, вона розмiщує цей пакет у передавальний регiстр Т. Тiльки-но з’являється придатний промiжок мiж двома пакетами, що проходять кiльцем один за одним, перемикач пiдмикає передавальний регiстр i його вмiст передається в кiльце. Оскiльки потiк даних, що йде вiд попереднього пристрою, не можна зупинити, то вони заносяться у зсувовий приймальний регiстр R. Тiльки-но зсувовий передавальний регiстр Т буде порожнiм, перемикач перекидається на приймальний регiстр R, а сам пристрiй чекає повернення щойно переданого пакета. Можливо, цей пакет повернеться i буде розмiщений у зсувовий приймальний регiстр R, який пiсля цього вимикається з кiльця.

 

У наведених схемах пакет здiйснює повний цикл кiльцем, перш нiж його буде виведено з нього. Розглянемо iнше розв’язання. У запропонованiй схемi пакет вилучається з кiльця станцiєю, для якої вiн призначений. У

попереднiй схемi це здiйснити важко, бо там передавальна станцiя має

регiстр, що послiдовно вставлений у кiльце, i для його відімкнення

необхiдно, щоб надiсланий пакет повернувся назад. А в останнiй системi використовуються три регiстри (передавальний, приймальний та буферний), два перемикачi (припустимо, A та B) та один генератор, який утворює «холостi» символи, що не несуть жодної iнформацiї. Система працює так. У кiльце вмикається послiдовно буферний регiстр iз затримкою. Цей регiстр має рухомий вказiвник. На початку робочого циклу буферний

регiстр порожнiй, а вказiвник перебуває у крайньому лiвому положеннi (на нульовiй позначці). Данi, що циркулюють кiльцем, обминають буферний регiстр. Коли станцiя має пакет даних для передавання, вона завантажує цей пакет у передавальний регiстр. При появi промiжку мiж пакетами, що проходять кiльцем, перемикач В перекидається на передавальний регiстр, пiсля чого його вмiст передається кiльцем. У цей момент данi, що з’являються на входi, заносяться у буферний регiстр iз затримкою (зсувовий регiстр), а вказiвник проходить до позначки кiнця даних. Коли данi складаються з «холостих» символiв, що не несуть жодної iнформацiї, то вони в буферному регiстрi не зберiгаються, а вказiвник знову змiщується до нульової позначки. Якщо передавальний регiстр порожнiй, перемикач перекидається на буферний регiстр iз затримкою, а вказiвник припиняє

перемiщення. Станцiя, якiй призначено iнформацiю, розпiзнає пакет за заголовком та перекидає перемикач A на приймальний регiстр. Данi, що

надiйшли до входу, зчитуються в цей регiстр, а наприкiнцi пакета перемикач A знову пiдмикається до входу буферного регiстра iз затримкою. Доки пакет зчитується у приймальний регiстр, кiльце продовжує працювати за рахунок буферного регiстра iз затримкою або генератора «холостих»

символiв, який продовжує їх надсилати. Поки покажчик у буферному

регiстрi перебуває на нульовiй позначці, через перемикач B проходять «холостi» символи генератора. Коли повернувся пакет, який станцiя передала ранiше, це означає, що пакет з якоїсь причини не був прочитаний станцiєю-приймачем. Якщо пакет вилучено з кiльця, це означає: станцiя, для якої його було призначено, зчитала його у приймальний регiстр. Для обробки пакетiв, в яких при передаваннi можуть виникнути помилки, потрiбнi додатковi, вищі рiвнi протоколiв. Цей метод було використано у ранньому варiантi ЛОМ Cambrige Ring.

 

Метод тактованого доступу. Метод використовується в кiльцевiй топологiї. Робота кiльця з тактованим доступом не потребує використання зсувових регiстрiв та високошвидкiсних перемикачiв у повторювачах і станцiях, якi пiдімкнено до кiльця. Один чи кiлька контейнерних пакетiв або тактiв безперервно курсують кiльцем. Їх кiлькiсть нiколи не змiнюється i визначається довжиною такту, загальною довжиною кiльця та процедурою початкового запуску кiльця. Якщо кiльце дуже коротке, то використовуванi такти мають бути також короткими, а їх кiлькiсть не може бути великою, оскільки доведеться вставляти в кiльце буфер iз затримкою. Це пояснюється тим, що початок такту може повернутися до передавача ранiше, нiж той закінчить передавання кiнця даного пакета. З цiєї причини у багатьох практичних реалiзацiях розглянутого методу застосовується лише один короткий такт та буфер iз затримкою. У момент запуску кiльця один з повторювачiв або одна зi станцiй формує такт i вiдправляє його кiльцем. Коли вiн повернеться до передавача, це означатиме, що кiльце замкнене i можна розпочинати роботу. Структура такту:

 

 

Якщо станцiя має iнформацiю, яку потрібно передати, то вона завантажує цю iнформацiю до регiстра й чекає, коли повторювач, що їй передає, спрямує до неї порожнiй такт. Порожнiй такт легко розпiзнається за контрольним полем у заголовку. Станцiя (або повторювач) не намагається зберегти такт (це призвело б до значного сповiльнення передавання iнформацiї вздовж кiльця), а лише зсуває пакет даних зi свого передавального регiстра в поля даних такту вiдповiдно до проходження такту через повторювач. При цьому прапорець, що вiдображує стан такту, переходить до стану «зайнято», i в заголовку розмiщується адреса тiєї станцiї, для якої призначено пакет. Потiм такт далі передається вздовж кiльця, доки вiн не дiстанеться до станцiї-приймача, яка зчитує iнформацiю, що мiститься в тактi, але не вилучає її з нього. Знищення iнформацiї не вiдбувається тому, що прапорець стану «порожньо/зайнято» міститься в заголовку такту i вже проходить повз повторювача в той момент, коли вiн починає читати адресне поле. Можливе й iнше технiчне вирiшення, при якому станцiя, що одержала вiдправлений їй пакет, виставить у кiнцi такту прапорець на знак того, що пакет одержано. Такт (прапорець якого все ще вказує на стан «зайнято») потiм прямує вiд станцiї до станцiї, поки не досягне станцiї-передавача. Станцiя-передавач, полічивши кiлькiсть тактiв у кiльцi, розпiзнає вiдправлений до неї такт i переведе прапорець такту до стану «порожньо», дозволивши якiйсь iншiй станцiї використати цей такт. Якщо в тактi є поле пiдтвердження, то станцiя-передавач перевiрить його вмiст, щоб упевнитися в тому, що станцiя-приймач справді отримала вiдправлений їй пакет.

 

В одному з рiзновидiв цього методу станцiї-передавачеві не потрiбно позначати такт прапорцем «порожньо», якщо та сама станцiя має намір ще раз скористатися цим тактом. Це може, проте, спричинитися до того, що якась iз станцiй утримуватиме такт у себе стiльки часу, скiльки вона вважатиме за потрібне. У тих кiльцях, де використовується лише один такт, такий стан є, очевидно, неприйнятним. Тому в бiльшостi реалiзацiй такт звiльняється пiсля кожного зробленого ним оберту в кiльцi. У цьому разі лишається можливiсть по черзi використовувати такт при передаваннi його вiд станцiї до станцiї. Якщо станцiю приймача вiдімкнено i вона не змогла зчитати пакет або знайшла помилку в тактi, то передавача сповiщають про це з допомогою вiдповiдного прапорця в полi пiдтвердження. Тодi передавач зможе ще раз передати той самий пакет, помiстивши його в наступному вiльному тактi. Отже, незважаючи на явнi втрати часу через те, що заповнений такт змушений виконувати повний оберт, вiн використовується як для передавання даних на прямому шляху до приймача, так i для пiдтвердження доставки при зворотному русi. Якщо використовуваний такт не був звiльнений станцiєю-передавачем (наприклад, через збiй на цiй станцiї пiсля передавання), то такт iз мiткою «зайнято» циркулюватиме кiльцем. На практицi однiй зi станцiй надається право звiльняти такти, що проходять повз неї у незмiнному станi бiльш як один раз. Це завдання покладається на спецiальну станцiю, яка також вiдповiдає за запуск мережі в роботу та стежить за помилками. Цей метод використований у комерцiйнiй мережi Cambrige Ring.

 

Передавання маркера кiльцем. При застосуваннi методу тактованого доступу керування кiльцем воно стає неявно пов’язаним з порожнiм тактом. Альтернативним вирiшенням є доступ з передаванням маркера. Маркер то є специфiчна комбiнацiя бiтiв, що передається вiд станцiї до станцiї у певнiй послiдовностi. Якщо у станцiї є данi, які пiдлягають передаванню, вона змушена чекати, доки попередня станцiя надiшле їй маркер. Коли станцiя отримує маркер, вона на деякий час вилучає його з кiльця та розмiщує одразу ж за пакетом даних, який зберiгається у зсувовому регiстрi для передавання. Потiм передавальний зсувовий регiстр послiдовно пiдмикається до кiльця i його вмiст (разом iз маркером наприкiнцi пакета) передається кiльцем. Далi регiстр вилучається з кiльця, а станцiя чекає на повернення вiдправленого нею пакета. Перший же пакет, отриманий приймальною стороною, має бути за нормальних умов цим пакетом. Тому перший же отриманий пакет зчитується у приймальний регiстр для аналiзу. Пiсля цього вiдновлюється звичайний ланцюг кiльця, що нагадує метод вставляння регiстра. Станцiя переходить до стану очікування наступного маркера, якщо в неї лишилася iнформацiя, яку необхiдно передати. Отже, потiк iнформацiї, що надходить до деякої станцiї, завжди починається з пакета, який вiдправлено даною станцiєю. Кожний передавач вiдповiдає за вилучення своїх пакетiв з кiльця. Кожний пакет, що передається, завжди стає останнiм у послiдовностi пакетiв, що передують маркеру. У цiй схемi не доводиться вiдводити вхiдний потiк у буферний регiстр iз затримкою при потребі передати якийсь пакет. Станцiя-приймач звичайно працює аналогiчно повторювачу при тактованому доступi. Вона читає пакет в мiру його проходження та може виставити прапорець пiдтвердження наприкiнцi пакета, не змiнюючи при цьому самого пакета. Основнi складностi в кiльцi з курсуючим маркером виникають, якщо маркер губиться або передавач не вилучає свого пакета. Перша ситуацiя може виникнути в тому разі, коли маркер, вилучений якоюсь станцiєю, що передає iнформацiю, потiм не вiдроджується через апаратний збiй або маркер, пошкоджений при передаваннi, не можна розпiзнати. Пакет може лишитися невилученим тому, що виникла помилка у станцiї-передавачi, а потiк iнформацiї, яка надходить, не був вiдведений у приймальний буфер. З обома ситуацiями допомагає успішно впоратися спецiальний слiдкуючий пристрій, який розпiзнає вiдсутнiсть маркера в кiнцi потоку даних або факт циркулювання якогось пакета кiльцем. У першому випадку генерується новий маркер, у другому — знищується пакет.

 

За вiдсутностi спецiальної станцiї, що стежить за роботою кiльця, проблему загублення маркера легко вирiшити, дозволивши якiйсь станцiї або повторювачу виробити новий маркер, якщо протягом деякого довiльного промiжку часу ця станцiя не прийняла такий маркер. Можливе дублювання маркера, якщо якiсь двi станцiї генерують новi маркери одночасно. Проте цього можна уникнути, коли кожна зі станцiй, що генерують маркер, завжди розмiщує перед ним контрольний пакет та стежить за тим, аби вiн повернувся першим. Кожний пакет, який з’являється на виходi, перевiряється та скидається, якщо вiн вiдрiзняється вiд переданого пакета. Якщо двi станцiї роблять це одночасно, то вони знищують маркери та пакети один одного. Пiсля довiльного промiжку часу в деякій точцi кiльця знову генерується маркер. Якщо кожна зі станцiй, яка вже передала пакет, завжди знищує першi пакети, що надiйшли до неї з кiльця, поки не дiйде до свого пакета, то проблему невилучених пакетiв буде вирiшено. Метод передавання маркера дуже ефективний, і до того ж не потрібний такий складний слiдкуючий пристрій, як для тактованого доступу. Але для реалізацiї перемикання регiстрiв та керування маркером вiн потребує значно складніших повторювачiв і програмного забезпечення для кожної зі станцiй. Метод передавання маркера застосовано в комерцiйнiй мережi RingNet.

 

Передавання маркера в шинi. Сутність методу полягає в тому, що шиною вiд одного пристрою до iншого передається маркер, тобто спецiальний пакет з легко розпiзнаваною послiдовнiстю бiтiв.

 

Кадр типу маркер має такий вигляд:

 

 

 

Сам маркер не дає нiякої iнформацiї, вiн для станцiй править за дозвiл на передавання кадрiв. У кожний момент часу в мережi може iснувати лише один маркер. Спочатку маркер створюється спецiальною станцiєю або однiєю з поєднаних станцiй. З’явившись у мережi, маркер передається вiд станцiї до станцiї за ранiше встановленим порядком. Якщо якась зі станцiй готова передавати iнформацiю, вона чекає на появу маркера. Перш нiж вiдправити маркер до наступної станцiї, дана станцiя спочатку передає свiй пакет. Станцiя-приймач прочитає пакет звичайним способом. Потiм передавач надсилає маркер, в адресному полi якого записано адресу наступної станцiї. Завдяки цьому нiякi двi станцiї не почнуть передавання в один i той самий час, а тому жодний пакет не буде пошкоджений через зiткнення з iншим пакетом.

 

Слiд вказати на двi проблеми, що виникають при реалiзацiї цього методу. Перша стосується самого маркера. Якщо вiн надсилається якомусь одному пристрою і цей пристрiй не може його прочитати (можливо, через те, що сам не працює), то маркер зникає з мережі. Жодна станцiя не може передати iнформацiю, доки вона не отримає маркер. Тому потрібна деяка процедура, що гарантувала б генерацiю маркера через деякий промiжок часу, за який жодний пакет не був би переданий. Маркер може генеруватися однiєю станцiєю, спецiально призначеною для цього, або будь-якою іншою станцiєю. В останньому разі не виключена можливiсть одночасної появи у мережi бiльш як одного маркера. Для знищення дублiката маркера також необхiдна певна процедура. Щоб мiнiмiзувати ймовiрнiсть появи дублiкатiв, iнтервал часу генерацiї маркера, що вiдлічується вiд моменту останнього передавання, обирається для кожної станцiї випадково. Друга проблема пов’язана з додаванням нових станцiй до мережі та вилученням з неї деяких станцiй. Якщо вiдмикається одна зi станцiй, що належать логiчнiй послiдовностi передавання маркера, то маркер не повинен надсилатися цiй станцiї. Iнакше його буде загублено. Таку станцiю треба виключити з логiчної послiдовностi. Виключення станцiй — проста процедура. Для її виконання досить надiслати попереднiй у послiдовностi станцiї повiдомлення, яке змiнить адресу приймача маркера. При додаваннi до мережі нової станцiї потрiбно, щоб вона передала широкомовне повiдомлення, яке запрошує надiслати маркер за його адресою. Разом iз маркером має надсилатися адреса наступного пристрою з логiчної послiдовностi.

 

Основний принцип маркерного доступу не є складним у реалiзацiї, але через загрозу втратити маркер у разі додавання чи виключення пристроїв вiн значно ускладнюється. Реалiзацiю можна спростити, якщо покласти на одну зі станцiй виконання функцiї мережного контролера. Існують ще кiлька методiв детермiнованого доступу, якi полягають, зокрема, у видiленнi кожнiй станцiї часових тактiв. Проте вони вважаються малоефективними для ЛОМ iз шинною топологiєю i рiдко застосовуються на практицi. Найбільшою з мереж, що використовують шину з передаванням маркера, є комерцiйна ЛОМ ARCNET.

№2

Hyper-threading (англ. Hyper-threading — гіпер-нитевість, офіційна назва Hyper-Threading Technology (HTT)) — торгова марка компанії Intel для реалізації технології «одночасної багатонитевості» (англ. Simultaneous multithreading) на мікроархітектурі Pentium 4.

 

Розширена форма супер-нитевості (англ. Super-threading), що вперше з'явилася у процесорах Intel Xeon і пізніше додана в процесори Pentium 4. Ця технологія збільшує продуктивність процесора при певних робочих навантаженнях шляхом надання «корисної роботи» (англ. useful work) виконавчим блокам (англ. execution units), які без цієї функції не будуть використовуватись (наприклад, у випадках кеш-промаху). Процесори Pentium 4 з увімкненим Hyper-threading операційна система визначає як два різних процесора замість одного.

 

Основні переваги Hyper-threading представлені як: покращена підтримка багатонитевого коду, що дозволяє запускати ниті одночасно; поліпшена реакція і час відгуку; збільшена кількість користувачів, що може підтримувати сервер.

 

Компанія Intel стверджує що перша реалізація призвела до 5-відсоткового збільшення площі кристала але натомість дозволяла збільшити продуктивність на 15 — 30%.

 

Intel стверджує, що надбавка до швидкості становить 30% в порівнянні з ідентичними процесорами Pentium 4 без технології «Simultaneous multithreading». Однак надбавка до продуктивності змінюється від застосунку до застосунка: деякі програми взагалі дещо сповільнюються при включеній технології Hyper-threading. Це, в першу чергу, пов'язано з «системою повторення» процесорів Pentium 4, що займає необхідні обчислювальні ресурси, від чого і починають «голодувати» інші ниті.

Сучасний стан

 

Технологія Hyper-threading не була успадкована в сімействі процесорів Intel Core.

 

Intel в листопаді 2008 випустив процесор Core i7 (кодова назва Nehalem), в якому технологія hyper-threading була відроджена. Nehalem містить 4 ядра і ефективно маштабується до 8 нитей в пікових режимах.[2]

 

Черговим процесором, де інкарнувалася технологія hyper-threading, став Intel Atom, який використовується для енергоефективних мобільних пристроїв і дешевих настільних комп'ютерів.

 

Також Hyper-Threading підримують процесори з ядром Sandy Bridge: Core i3, Core i5, Core i7.

Как задействовать в приложении мощь новой технологии

 

Технология Hyper-Threading (поддержка логических процессоров физическим процессором) повышает эффективность процессора, позволяя выполнять два потока инструкций параллельно. Эта возможность появилась в сравнительно новых процессорах Intel Pentium 4; она позволяет увеличить производительность некоторых приложений на 20-30%, в отдельных случаях до 40%.

 

К сожалению, производительность остальных приложений не повышается, а иногда и уменьшается (мне попадались приложения, производительность которых снижалась на 20%), особенно если нарушаются рекомендации, такие как обсуждаемые в этой статье. Более того, вместе с преимуществами, получаемыми на однопроцессорных компьютерах с поддержкой Hyper-Threading, проявляют себя и некоторые ошибки в приложениях, которые ранее могли возникать только в многопроцессорных системах.

 

В этой статье я исследую технологию Hyper-Threading и продемонстрирую, как дополнить свой код поддержкой параллелизма, способной помочь увеличить производительность на компьютерах с Hyper-Threading. Я расскажу о тонкостях оптимизации для Hyper-Threading и покажу несколько полезных примеров. Мои примеры написаны на C#, но основные принципы применимы как к управляемым, так и к неуправляемым приложениям.

Важность Hyper-Threading

 

Технология Hyper-Threading доступна на сравнительно новых процессорах Pentium 4, обычно с тактовой частотой от 2, 4 ГГц, а также на всех процессорах Xeon от 2, 2 ГГц.

 

До появления Hyper-Threading процессор Pentium 4 мог исполнять лишь один поток инструкций одновременно. Процессор поддерживал единственный указатель команд (instruction pointer, IP), и вся многозадачность на однопроцессорных компьютерах базировалась на способности операционной системы распределять процессорное время между потоками. Hyper-Threading позволяет Pentium 4 выполнять два потока инструкций одновременно; процессор поддерживает два указателя команд и состояний машины (machine states) и незаметно для пользовательского кода переключается между ними.

 

Для выполнения машинной инструкции программы нужен один или более слотов исполнения (execution slots). Слот исполнения соответствует внутреннему ресурсу процессора, например блоку вычислений с плавающей точкой (floating point unit, FPU), и отражает способность процессора выполнить какую-либо операцию, скажем, вычисление значения с плавающей точкой.

 

Процессор Pentium 4 всегда знает, какие слоты исполнения доступны. Такая функциональность, как Out-Of-Order Execution (когда процессор пытается выполнять инструкции в порядке, отличном от того, в котором они появляются в потоке инструкций), повышает производительность, так как это позволяет обеспечить работой больше слотов исполнения, а не ждать, пока какой-то слот освободится. В результате того, что процессор получил свободу переключения между двумя потоками, можно задействовать еще больше слотов исполнения. Пока один поток инструкций ожидает доступа к блокированному участку оперативной памяти или занятому слоту исполнения, процессор может обрабатывать команды из второго потока инструкций.

 

В процессорах с поддержкой Hyper-Threading два потока инструкций выполняются одновременно. Точнее, процессор выполняет несколько команд из первого потока, потом несколько команд из второго и т. д. Переключение между ними определяется алгоритмом, который пытается оптимизировать нагрузку между слотами исполнения и свести к минимуму возможность простоев; этот алгоритм также стремится равномерно распределять ресурсы между потоками инструкций. Контекст выполнения (например значения регистров) хранится в потоке инструкций. В итоге один процессор с поддержкой Hyper-Threading эмулирует два физических процессора, каждый из которых на самом деле является логическим.

 

Hyper-Threading позволяет лучше использовать ресурсы процессора, а следовательно, увеличивает производительность. Обратная сторона вопроса заключается в том, что на самом деле ресурсы процессора разделяются и, когда оба потока инструкций запрашивают один и тот же общий ресурс, производительность может падать.

 

Помимо общих ресурсов вроде FPU, модуля арифметической логики (ALU), разделяется и пространство внутри кэша процессора (оно делится на кэши уровней 1 и 2, также называемые L1 и L2), где кэшируются недавно использовавшиеся области оперативной памяти. Совместное использование пространства кэша может и повышать, и снижать производительность, но об этом я расскажу позже.В процессорах с поддержкой Hyper-Threading два потока инструкций выполняются одновременно. Точнее, процессор выполняет несколько команд из первого потока, потом несколько команд из второго и т. д.

 

 

Если второго потока инструкций нет, тогда все пространство кэша и другие ресурсы передаются первому потоку. Поскольку многопоточный режим выполнения инструкций приводит к некоторым издержкам, процессор использует его, только если инструкции запланированы к выполнению на обоих логических процессорах. Кроме того, компьютер с одним процессором, но с включенной поддержкой Hyper-Threading использует многопроцессорную версию ядра операционной системы, которое обеспечивает более качественную синхронизацию, но за счет небольшой потери производительности.

 

В идеальном случае каждый поток инструкций выполняется почти так же быстро, как и на процессоре, обрабатывающем только один поток. Но в действительности ситуация, в которой два потока инструкций могли бы выполняться без частого обращения к разделяемым ресурсам, наблюдается весьма редко. В результате каждый поток выполняется несколько медленнее, чем в идеале. Однако, если работа приложения разделяется на две части в соответствии с рекомендациями, Hyper-Threading может все равно повысить общую производительность этого приложения.

Hyper-Threading в Windows

 

В последних версиях Windows каждый поток инструкций представляется как логический процессор, поэтому операционная система планирует выполнение потоков на каждом логическом процессоре. Это означает, что на компьютере с одним физическим процессором, но двумя логическими, два потока будут работать одновременно — каждый на своем логическом процессоре. Пользователь увидит на таком компьютере два логических процессора, и, когда будут выполняться два потока, они будут выполняться на обоих логических процессорах одновременно.

 

В Windows NT и более поздних версиях Windows планировщик поддерживает Hyper-Threading. Когда несколько потоков выполняются параллельно, им выделяется процессорное время на обоих логических процессорах, а не просто кванты времени, как в случае единственного процессора без поддержки Hyper-Threading. Это может заметно повысить производительность и «отзывчивость» систем с поддержкой Hyper-Threading.

 

Планирование потоков в двухпроцессорной системе с поддержкой Hyper-Threading сложнее; операционная система сначала планирует потоки для физических процессоров, затем для логических, поддерживаемых этими физическими процессорами. То есть при наличии всего двух потоков каждый из них закрепляется за своим физическим, а не логическим процессором. Далее я буду рассматривать лишь однопроцессорные системы с поддержкой Hyper-Threading.

Клиентские и серверные приложения

 

Ключ к оптимизации приложений для Hyper-Threading — добиться того, чтобы оба логических процессора делали что-нибудь полезное. Я расскажу, как для большей производительности оптимизировать разделение труда между потоками.

 

Обсуждаемый здесь материал относится как к клиентским, так и к серверным приложениям. На серверах иногда больший смысл имеет прямолинейное разделение труда. Так, если вы разрабатываете ASP.NET-приложение или Web-сервис, ежесекундно обрабатывающий массу запросов, то здесь эффективна традиционная многопоточная архитектура, гарантирующая одновременное выполнение множества потоков. По этой причине существующие серверные приложения показывают большее увеличение производительности при включении Hyper-Threading.

 

Приложения, которым нужен быстрый ввод-вывод (сетевой или дисковый), выигрывают при распределении операций между несколькими потоками при использовании асинхронной модели. Для клиентских или серверных приложений, где каждый запрос требует интенсивной процессорной обработки, дополнительные преимущества могут быть достигнуты путем распределения работы между несколькими потоками (такой способ почти ничего не дает или даже вредит на однопроцессорных компьютерах без Hyper-Threading из-за слишком частого переключения контекстов). Клиентские приложения, в которых работа передается потоку, отделенному от UI-потока (такой вариант почти всегда оправдывает себя даже просто по соображениям удобства в использовании), на компьютерах с поддержкой Hyper-Threading реагируют на команды пользователя заметно быстрее.

Как задействовать преимущества Hyper-Threading

 

Hyper-Threading повышает производительность и «отзывчивость» многопоточных приложений. Я расскажу о нескольких подходах, которые позволят максимально повысить производительность. У каждого подхода свои недостатки, поэтому для оценки измеряйте показатели производительности.

 

Хорошая отправная точка — замерить производительность вашего кода на процессоре с поддержкой Hyper-Threading и без нее (тестировать можно на одном компьютере, если его BIOS позволяет выключать Hyper-Threading). Дополнительный эффект от программирования с учетом Hyper-Threading заключается в том, что это позволит повысить производительность вашего приложения и при выполнении на двухпроцессорной машине. Я поясню, какие подходы специфичны для Hyper-Threading и не будут работать на компьютерах с двумя и более процессорами. Однако приложения, хорошо масштабируемые в многопроцессорных системах, всегда будут чувствовать себя хорошо и в среде с Hyper-Threading.

Прежде всего стоит обратить внимание на операции, интенсивно использующие процессор. Это блоки кода, отвечающие за рендеринг и вывод графики, кодирование и декодирование музыки или видео, сжатие или шифрование данных, а также выполняющие много циклов. Чтобы выявить такие операции, можно начать с профилирования приложения.

Здесь полезен такой инструмент, как диспетчер задач (TaskMgr.exe), показанный на рис. 1. На вкладке Performance (Быстродействие) отображаются графики использования логических процессоров. Убедитесь, что диспетчер задач настроен на вывод отдельного графика для каждого процессора (View | Select Colums | CPU Usage).

Аналогичная информация доступна через счетчик производительности «Processor: % Processor Time» либо для всех процессоров вместе или отдельно для каждого логического процессора. Получить эту информацию удобнее всего через PerfMon.exe (оснастка Performance).

Иногда измерение только загруженности процессора не позволяет определить все операции, интенсивно использующие процессор, так как можно пропустить короткие всплески активности процессора, но такие всплески поможет выявить средство профилирования. В частности, для идентификации функций, сильно нагружающих процессор, удобно средство профилирования в CLR, а также другие средства профилирования, например VTune или поставляемые с Visual Studio 2005 Team System.

 

Важно отметить, что измерение загруженности процессора через Task Manager или Perfmon может вводить в заблуждение. Операция, нагружающая процессор лишь из одного потока, будет давать загрузку процессора только на 50%. Но, поскольку логические процессоры тесно взаимосвязаны, крайне маловероятно, что полная нагрузка обоих процессоров приведет к удвоению производительности.

 

В остальной части статьи я исхожу из того, что два потока (T1 и T2) выполняются на двух логических процессорах (LC1 и LC2) на одном физическом процессоре.

 

№3

Швидкий розвиток нових технологій програмування безпосередньо пов’язаний з бурхливим розвитком науково-технічного прогресу і комп’ютерної техніки зокрема. Щоб розібратись в деяких існуючих технологіях програмування, звернімось всього на декілька десятиліть назад і спробуємо визначити основні етапи розвитку програмування як науки.

 

Програми для перших обчислювальних машин створювались, як правило, в машинних кодах або на асемблері і були схожі на витвір мистецтва, бо повинні були поміститись у мініатюрному за сучасними поняттями об’ємі пам’яті. Пошуки помилки в програмі можна було, мабуть, порівняти з муками Тантала. Програмісти були схожі на “вищу касту” серед нормальних людей, бо вони єдині були здатні на спілкування з обчислювальною технікою. Цей етап програмування називають “стихійним програмуванням”. Створення нових алгоритмічних мов програмування, таких як FORTRAN та ALGOL, дещо покращило, але не змінило в корені ситуацію. Революційний винахід засобів, що підтримували можливість використання підпрограм, привів до підвищення складності програм. Були створені цілі бібліотеки службових та розрахункових програм, які можна було використовувати в різних програмних системах. Дані в програмах зберігались, як правило, в глобальних областях, які спільно використовувались різними підпрограмами. В 60-х роках минулого вже століття вибухнув так званий кризис програмування. Вираженням його стали програмні проекти, які встигали морально застаріти ще на рівні розробки, і перевищували всі можливі терміни в часі та вартості. Бідою більшості програмних проектів ставали численні помилки, пошуки та виправлення яких займали до 90% часу, відведеного на розробку. Багато з них так і не були завершені. Причиною такого положення речей стала відсутність ретельно продуманих технологій або методів програмування.

 

Глибокий та ретельний аналіз причин даного кризису привів до створення робочої групи з методології програмування при Міжнародній федерації по обробці інформації. До її складу увійшло багато відомих програмістів, наприклад, Н. Вірт, П. Наур, Ч.Хоар, У. Дал, Е. Дейкстра. Їх спільні зусилля привели до оформлення нової технології (інколи кажуть – парадігми) програмування – структурного програмування [3, 4, 9, 12, 15]. Завдяки принципам структурного програмування вдалося подолати фактор складності та зрозуміти причини невдач програмних проектів великого масштабу. Ці принципи детально будуть розглянуті нижче, тут лише зазначимо, що вони спрямовані на створення програмних проектів з прозорою логікою функціонування. Цього вдається досягти завдяки правильному структуруванню проекту в цілому і кожного його модуля зокрема.

 

Сучасні технології програмування базуються на принципах об’єктно-орієнтованого програмування, завдяки якому складні програмні проекти реалізуються у вигляді сукупності об’єктів певної ієрархії. Їх взаємодія встановлюється шляхом передачі повідомлень між об’єктами. На підтримку нової технології програмування були створені нові мови, наприклад C++, Java, Modula. Організація програм на засадах інкапсуляції, успадкування, поліморфізму дозволила значно підвищити рівень програмних проектів.

 

Перспективи подальшого розвитку програмування вбачаються у так званому компонентному підході [8].

 

 

2. Життєвий цикл програмного забезпечення

 

Процес створення та використання програмної системи включає декілька стадій: від початкової ідеї до остаточного морального застаріння. Цей процес називається життєвим циклом програмного забезпечення [6, 8, 11]. Він складається з наступних 6 етапів.

 

1. Специфікація вимог:

 

а) підготовка повного і чіткого визначення задачі;

 

б) представлення документів з вимогами до задачі користувачам і аналітикам для погодження (ухвалення).

 

2. Аналіз:

 

а) вивчення задачі, визначення специфікацій (тобто структури вхідних та вихідних даних);

 

б) оцінка альтернативних методів розв’язання (алгоритмів);

 

в) вибір оптимального метода (алгоритма).

 

3. Проектування:

 

а) визначення структури програмної системи та її проектування;

 

б) розбиття програмної системи на окремі компоненти та їх проектування з визначенням ключових елементів структури даних.

 

4. Реалізація:

 

а) створення алгоритмів і кодів окремих модулів вибраною мовою програмування;

 

б) створення вихідного текста програми;

 

в) налагодження вихідного текста.

 

5. Тестування і верифікація:

 

а) тестування вихідного текста;

 

б) участь користувачів і спеціальних колективів (тестерів) у всіх перевірках системи.

 

6. Експлуатація і супроводження:

 

а) використання готової програмної системи;

 

б) оцінка її ефективності;

 

в) усунення знайдених в процесі експлуатації помилок;

 

г) внесення необхідних змін для підтримки актуальності програмної системи;

 

д) перевірка коректності внесених змін (вони не повинні негативно впливати на функціонування системи).

 

Життєвий цикл програмного забезпечення є ітеративним, тобто допускає багатократне повторення своїх етапів. В ході розробки (етап 3) можуть виникнути проблеми, які будуть вимагати змін вимог до системи (етап 1); під час реалізації (етап 4) може виникнути необхідність переглянути результати, отримані під час розробки (на етапі 3); під час тестування (етап 5) можуть бути виявлені помилки і так далі.

 

Розглянемо детальніше деякі аспекти програмування згідно хронології життєвого циклу програмного продукту.


 







Дата добавления: 2014-12-06; просмотров: 770. Нарушение авторских прав; Мы поможем в написании вашей работы!




Вычисление основной дактилоскопической формулы Вычислением основной дактоформулы обычно занимается следователь. Для этого все десять пальцев разбиваются на пять пар...


Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...


Кардиналистский и ординалистский подходы Кардиналистский (количественный подход) к анализу полезности основан на представлении о возможности измерения различных благ в условных единицах полезности...


Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

Характерные черты немецкой классической философии 1. Особое понимание роли философии в истории человечества, в развитии мировой культуры. Классические немецкие философы полагали, что философия призвана быть критической совестью культуры, «душой» культуры. 2. Исследовались не только человеческая...

Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит...

Кран машиниста усл. № 394 – назначение и устройство Кран машиниста условный номер 394 предназначен для управления тормозами поезда...

Типовые примеры и методы их решения. Пример 2.5.1. На вклад начисляются сложные проценты: а) ежегодно; б) ежеквартально; в) ежемесячно Пример 2.5.1. На вклад начисляются сложные проценты: а) ежегодно; б) ежеквартально; в) ежемесячно. Какова должна быть годовая номинальная процентная ставка...

Выработка навыка зеркального письма (динамический стереотип) Цель работы: Проследить особенности образования любого навыка (динамического стереотипа) на примере выработки навыка зеркального письма...

Словарная работа в детском саду Словарная работа в детском саду — это планомерное расширение активного словаря детей за счет незнакомых или трудных слов, которое идет одновременно с ознакомлением с окружающей действительностью, воспитанием правильного отношения к окружающему...

Studopedia.info - Студопедия - 2014-2024 год . (0.01 сек.) русская версия | украинская версия