Ján Hanák. Vývoj paralelnej WCF-služby v jazyku C# Technický dokument z cyklu Visual Studio 2015: Hotové riešenia - PDF

Description
Ján Hanák Vývoj paralelnej WCF-služby v jazyku C# Technický dokument z cyklu Visual Studio 2015: Hotové riešenia Vývoj paralelnej WCF-služby v jazyku C# Autor: Ing. Ján Hanák, PhD., MVP. Rok vydania: 2015.

Please download to get full document.

View again

of 48
All materials on our website are shared by users. If you have any questions about copyright issues, please report us to resolve them. We are always happy to assist you.
Information
Category:

Self Improvement

Publish on:

Views: 15 | Pages: 48

Extension: PDF | Download: 0

Share
Transcript
Ján Hanák Vývoj paralelnej WCF-služby v jazyku C# Technický dokument z cyklu Visual Studio 2015: Hotové riešenia Vývoj paralelnej WCF-služby v jazyku C# Autor: Ing. Ján Hanák, PhD., MVP. Rok vydania: Cieľové publikum: študenti informatiky, softvéroví vývojári, programátori a IT-experti. Vedomostná náročnosť: 3/5. Časová náročnosť: 3 hodiny a 30 minút. Použité vývojové prostredie: Microsoft Visual Studio 2015 Community Edition. Použité programovacie jazyky: C# 6.0. Použité hardvérové a softvérové technológie: Microsoft.NET Framework 4.6, Windows Communication Foundation (WCF), Task Parallel Library (TPL). Abstrakt Technický dokument prezentuje vývoj distribuovanej WCF-služby v jazyku C#. Jadrová funkcionalita vytvorenej WCF-služby bude implementovaná sekvenčne a paralelne s dôrazom na metodologicky správne určenie nárastu výkonnosti paralelnej funkcionality WCF-služby voči sekvenčnej implementácii tejto služby. Do WCF-služby bude zavedený riadený paralelizmus, a to s využitím objektov a programových konštrukcií knižnice Task Parallel Library (TPL). Kľúčové slová paradigma distribuovaného a servisne orientovaného (SOA) programovania, distribuovaná WCF-služba, princípy fungovania WCF-služby, životný cyklus WCF-služby, riadený paralelizmus, paralelné úlohy, iteratívne paralelné konštrukcie, programovací jazyk C#, vývojové prostredie Microsoft Visual Studio 2015 Community Edition Obsah technického dokumentu 1 Moderné paradigmy vývoja počítačových programov Paradigma procedurálneho programovania Paradigma objektového programovania Paradigma komponentového programovania Paradigma sekvenčného programovania Paradigma paralelného programovania Paradigma synchrónneho programovania Paradigma asynchrónneho programovania Paradigma distribuovaného a servisne orientovaného (SOA) programovania s technológiou WCF Kategorizácia WCF-služieb Životný cyklus WCF-služby Viacvrstvové komunikačné modely medzi WCF-službou a jej klientmi Komunikačný model 1: WCF-služba, proxy-server a klient v lokálnom fyzickom procese Komunikačný model 2: WCF-služba, proxy-servery a klienti v lokálnych fyzických procesoch Komunikačný model 3: WCF-služba, proxy-servery a klienti v distribuovaných fyzických procesoch Praktický vývoj WCF-služieb v jazyku C# 6.0 na platforme.net 3.1 Vývoj sekvenčnej WCF-služby v jazyku C# Vytvorenie nového prázdneho riešenia v produkte Visual Studio 2015 Community Edition Vytvorenie nového projektu sekvenčnej WCF-služby Programovanie rozhrania sekvenčnej WCF-služby Programovanie triedy sekvenčnej WCF-služby Konfiguračný súbor sekvenčnej WCF-služby Testovanie sekvenčnej WCF-služby Vývoj paralelnej WCF-služby v jazyku C# Vytvorenie nového projektu paralelnej WCF-služby Programovanie rozhrania paralelnej WCF-služby Programovanie triedy paralelnej WCF-služby Konfiguračný súbor paralelnej WCF-služby Testovanie paralelnej WCF-služby Softvérové metriky sekvenčnej WCF-služby a paralelnej WCF-služby Záver Príloha A: Priložené hotové riešenie WCF-služieb Moderné paradigmy vývoja počítačových programov Teoretická informatika definuje celú súpravu paradigiem vývoja počítačového softvéru. Keď sa zameriame na evolučný reťazec, tak zistíme, že medzi najviac používané patrili v praxi nasledujúce softvérové paradigmy: Paradigma procedurálneho programovania. Paradigma objektového programovania. Paradigma komponentového programovania. Paradigma sekvenčného programovania. Paradigma paralelného programovania. Paradigma synchrónneho programovania. Paradigma asynchrónneho programovania. Paradigma distribuovaného a servisne orientovaného programovania. Všetky spomenuté programovacie paradigmy budeme bližšie charakterizovať v nasledujúcich podkapitolách tejto publikácie. 1.1 Paradigma procedurálneho programovania Výstupom aplikovania paradigmy procedurálneho programovania je procedurálny program, ktorý tvorí kolekcia funkcií. Každá funkcia implementuje algoritmus riešenia problému z danej aplikačnej domény. Funkcie medzi sebou komunikujú na báze výmeny duplikátov lokálnych dátových objektov, odkazov na lokálne dátové objekty alebo zdieľaním globálnych dátových objektov. Funkcia je atomicky vykonateľná jednotka funkcionality so schopnosťou prijímať vstupné dáta a produkovať výstupné dáta. Je zrejmé, že práve opísaná dátová transformácia v najväčšej miere akcentuje algoritmický základ každej funkcie procedurálneho programu. 2 Na obr. 1.1 je znázornený diagram komunikačného mechanizmu medzi používateľom a procedurálnym programom. Logiku procedurálneho programu tvoria 3 funkcie (F 1...F 3). Každá z uvedených funkcií reaguje na akcie, ktoré generuje používateľ (A 1...A 3). Komunikačné spojnice s plnou výplňou reprezentujú vstupy používateľských akcií. Na druhej strane, komunikačné spojnice s prerušovanou výplňou determinujú výstupy akcií používateľa. Obr. 1.1: Komunikačný mechanizmus medzi používateľom a procedurálnym programom Používateľ vedie s procedurálnym programom sekvenčnú duálnu komunikáciu. Sekvenčnosť znamená nasledujúcu postupnosť: zadanie vstupu, vygenerovanie akcie, spracovanie funkcie (a jej algoritmu), zhotovenie výstupu a jeho spracovanie. Všetky spomínané aktivity sú realizované sériovo, bez akéhokoľvek paralelizmu s väčším počtom konkurenčných tokov. Dualitu v tomto kontexte chápeme ako obojsmernú komunikáciu: najskôr používateľ komunikuje s procedurálnym programom, a potom procedurálny program komunikuje s používateľom. 1.2 Paradigma objektového programovania Prostredníctvom paradigmy objektového programovania vzniká objektový program, ktorý sa skladá z množiny objektov. Objekt vystupuje ako inteligentná logická pracovná jednotka, ktorá zapuzdruje dáta a metódy. Objekty programu medzi sebou komunikujú spracúvaním správ. Príjem správy generuje udalosť, na ktorú objekt reaguje vopred naprogramovaným spôsobom. Technicky presne, objekt reaguje automatickou aktiváciou metódy a vykonaním algoritmu, ktorý metóda implementuje. Diagram, dokumentujúci komunikačný mechanizmus medzi používateľom a objektovým programom, uvádzame na obr Obr. 1.2: Komunikačný mechanizmus medzi používateľom a objektovým programom Modelovaný objektový program je súpravou troch objektov (O 1...O 3). Logika objektov je definovaná metódami, ktoré daný objekt implementuje. Poznámka: V terminológii teórie objektovej paradigmy je metóda definovaná ako akákoľvek výkonná jednotka, ktorá dokáže spracovať algoritmus rôzneho stupňa zložitosti. V kontexte programovacieho jazyka C# je metóda programová konštrukcia, ktorá má syntaktické rysy funkcie. Aby mohla metóda objektu komunikovať s používateľom (alebo s inými externými entitami) musí disponovať signatúrou a schopnosťou generovania a propagovania výstupných dát. Ako vidíme, každá akcia zo strany používateľa súvisí s jedným objektom. Štruktúru objektu tvorí aj jeho rozhranie, ktoré zabezpečuje všetky komunikačné toky. Na obr. 1.3 vidíme bližší pohľad na rozhrania objektov objektového programu. Medzi objektmi O 1...O 3 a ich metódami musí existovať aspoň relácia typu 1:1. V praxi sa však častejšie stretávame s existenciou tejto relácie v ráde 1:N. Tieto formálne znaky ozrejmujú dve skutočnosti. Po prvé, každý objekt musí vlastniť aspoň jednu metódu. Existencia objektu bez metódy nemá zmysel, pretože v takomto prípade objektu chýba jeho behaviorálna zložka. Objekt nedisponuje žiadnym správaním, keďže mu zostala len dátová zložka. V skutočnosti je príslušný objekt len dátovým objektom, pričom spektrum jeho použitia je limitované podobne, ako je to pri štandardnej premennej primitívneho typu. Po druhé, funkcionalita objektov vyskytujúcich sa v praxi je takmer vždy rozptýlená do väčšieho počtu metód. 4 Obr. 1.3: Rozhrania objektov objektového programu Objekty O 1...O 3 vlastnia tri rozhrania I 1...I 3. Implicitne predpokladáme, že rozhrania sú silne afinné. Povedané menej formálne, očakávame, že rozhrania I 1, I 2 a I 3 patria exkluzívne a v tomto poradí objektom O 1, O 2 a O 3. Dôležité: V evolučnom reťazci paradigiem sa neustále uplatňuje princíp opätovnej použiteľnosti vybratých čŕt staršej paradigmy vo vzťahu k novšej paradigme. Tento princíp generuje rýdzo pozitívne efekty, a to vtedy, keď novšia paradigma implementuje rysy staršej paradigmy. Preto vravíme, že objektová paradigma parciálne implementuje procedurálnu paradigmu. Samozrejme, podáme aj príslušný dôkaz: Ak má metóda objektu objektového programu rovnaké schopnosti ako funkcia procedurálneho programu, potom môžeme takúto metódu vyrobiť pomocou funkcie. To sa, koniec koncov, deje aj v skutočnosti. Podobne, ako pri procedurálnom programe, aj komunikačný model medzi používateľom a objektovým programom je implicitne sekvenčný a duálny. Používateľ zasiela objektu vstupné správy, ktoré objekt vyhodnocuje a spracúva. Proces pokračuje uskutočnením správnej selekcie cieľovej metódy, jej exekúciou a generovaním výstupnej správy, ktorá bude doručená používateľovi. 1.3 Paradigma komponentového programovania Komponentový program, ako finálny produkt paradigmy komponentového programovania, obsahuje súpravu komponentov, interne poskladaných z funkčne a dátovo prepojených objektov s naprogramovanou funkcionalitou. Komponenty prinášajú vyššiu úroveň abstrakcie, vyššiu mieru zapuzdrenia a väčšiu odolnosť voči pracovnej záťaži. Pracovná záťaž je obvykle kvantifikovaná ako počet pracovných úloh za fixnú jednotku času, ktoré sú dodané komponentu na spracovanie. Komunikácia 5 komponentov je, rovnako ako to bolo pri objektoch, riadená mechanizmom správ. Komunikačný model medzi používateľom a komponentovým programom ilustruje obr Obr. 1.4: Komunikačný mechanizmus medzi používateľom a komponentovým programom 1.4 Paradigma sekvenčného programovania Upotrebením paradigmy sekvenčného programovania skonštruujeme sekvenčný program, ktorý v danom časovom profile realizuje práve jeden tok dát a inštrukcií. Poznámka: Termínom časový profil máme na mysli pevný časový interval vyznačený na časovej osi spracovania sekvenčného programu. Na prvý pohľad sa zdá celkom jasné, že vývojári budú chcieť časový profil svojho sekvenčného programu kvantifikovať v časových jednotkách, napríklad v milisekundách (ms). Áno, tento predpoklad môžeme prijať a aj ho v praxi s výhodou používať. No, na druhej strane, považujeme za dôležité podotknúť, že základnou metrikou časového profilu sekvenčného programu je početnosť elementárnych operácií, ktoré tento program vykoná v sledovanom časovom intervale. Tok inštrukcií a asociovaných dátových objektov determinuje programové vlákno. Sekvenčný program je jednovláknový, pričom algoritmy a ich príkazy uskutočňuje v sériovej postupnosti. Paradigmu sekvenčného programovania možno uplatniť v kombinácii s paradigmami procedurálneho, objektového a komponentového programovania. Ak tak urobíme, získame (v tomto poradí) sekvenčný procedurálny program, sekvenčný objektový program a sekvenčný komponentový program. Keď algoritmickú štruktúru sekvenčného programu premietneme na časovú os, získame stĺpcový graf, ktorý uvádzame na obr Obr. 1.5: Algoritmická štruktúra sekvenčného programu v časovej analýze Ako vidíme, sekvenčný program tvorí päť algoritmov (A1...A5). Zatiaľ čo na horizontálnej osi je zaznamenaný čas (t), na vertikále je zaznačená maximálna početnosť operácií (MOp(A)), ktoré príslušný algoritmus vykonáva. Vďaka opísanému rozloženiu vieme pohotovo charakterizovať tak časový, ako aj operačný profil vybratého algoritmu sekvenčného programu. Napríklad, prvý algoritmus (A1) je spracovaný v časovom intervale t 1, t 2), pričom jeho operačný profil je daný parametrom MOp(A1). Analogicky, štvrtý algoritmus (A4) spracúva najviac MOp(A4) operácií v časovom rámci t 4, t 5). Hoci maximálna početnosť operácií zvoleného algoritmu sekvenčného programu je nepochybne užitočný kvantifikátor, je dôležité poznamenať, že pri vedeckom skúmaní musíme takmer vždy zísť až na úroveň jednotlivého algoritmu a sledovať reálnu početnosť (ROp(A)) jeho operácií v danom časovom profile. Túto skutočnosť dokumentuje obr Z obrázka je badateľné, že sme našu pozornosť zamerali výhradne len na jeden algoritmus sekvenčného programu (A1). Ako vieme z predchádzajúceho obrázka (obr. 1.5), výkon algoritmu A1 trvá od bodu t 1 do bodu t 2. Pri skúmaní kvantifikátora ROp(A1) si pomáhame rozdelením pôvodne monolitného časového intervalu t 1, t 2) na nasledujúce parciálne časové intervaly: t 1, t 1-1), t 1-1, t 1-2)..., t 1-4, t 2). Pokračujeme vyznačením operačných bodov, ktoré sú potrebné pre dôkladnejší prieskum algoritmu A1. Na obrázku vidíme 4 takéto body (P, Q, R, S). Na jeden z nich (Q) sa zacielime a vypočítame reálnu početnosť operácií tohto bodu, teda ROp(Q). 7 Obr. 1.6: Analýza reálnej početnosti operácií vybratého algoritmu sekvenčného programu Riadenie životného cyklu sekvenčného programu začína analýzou problémovej domény a používateľských požiadaviek, ktoré spravidla bývajú funkčného a nefunkčného charakteru. Pokračuje sa návrhom architektonickej štruktúry sekvenčného programu s využitím modelovacích techník zvolenej paradigmy. Výsledkom návrhovej etapy je súbor modulov, ktoré zavádzajú dátové typy a štruktúry s požadovanou funkcionalitou. Nasleduje implementačná fáza, v ktorej dochádza k naprogramovaniu jednotlivých modulov sekvenčného programu. Verifikáciu správnej funkcionality sekvenčného programu zabezpečuje testovacie štádium. V ňom je kvalita programu testovaná rôznymi metodikami s variabilne mohutnými dátovými súpravami. Odporúčame, aby súčasťou testovacích plánov, aplikovaných na sekvenčný program, boli vždy aj scenáre sústreďujúce sa na analýzu jeho jadrovej výkonnosti. Týmto spôsobom dokážu vývojári získať relevantné výkonnostné metriky, poskytujúce cenné vstupy do optimalizačnej etapy životného cyklu sekvenčného programu. Prijmime dohovor, že inherentne polymorfný termín optimalizácia budeme v tejto publikácii chápať práve v jednom význame, a síce ako maximalizáciu výkonu kritických algoritmov daného programu. Softvérová optimalizácia je vskutku široká téma, ktorej sa budeme venovať v inom hotovom riešení. V tejto súvislosti uvedieme len jeden príklad. Povedzme, že programátor Boris vytvoril sekvenčný objektový program, ktorého kritický algoritmus Alg(A) vykonáva pixeláciu zdrojovej bitovej mapy. Po prvotnej analýze Boris skonštatoval, že jeho kritický algoritmus Alg(A) má kvadratickú zložitosť: O(n 2 ). Poznámka: O(n 2 ) je matematický zápis O-notácie, teda aparátu používaného pri analýze asymptotického odhadu horného ohraničenia zložitosti algoritmu príslušnej (v tomto prípade kvadratickej) triedy. Premenná n determinuje objem vstupných dát. Implicitne sa očakáva, že premenná n bude nadobúdať racionálne veľké hodnoty. Po dôkladnom rozbore algoritmu grafickej transformácie Borisa napadlo navrhnúť ekvivalentný kritický algoritmus Alg(B), ktorého zložitosť bude lineárne-logaritmická: O(n*lg(n)). 8 Poznámka: O(n*lg(n)) je matematický zápis O-notácie s určenou množinou funkcií, pričom lg(n) je binárny logaritmus a n je premenná špecifikujúca objem dátových vstupov. Otázka znie, či bude táto algoritmická substitúcia generovať žiadaný optimalizačný efekt. Riešenie: áno, táto optimalizačná akcia bude mať pozitívne účinky na výkonnosť kritického algoritmu, a preto odporúčame substitúciu Alg(A) za Alg(B). Dôkaz: každé zníženie stupňa polynómu analyzovanej množiny funkcií predstavuje zníženie zložitosti skúmaného algoritmu, a teda zvýšenie jeho výkonnosti. Po optimalizácii sekvenčného programu sa vývojári koncentrujú na jeho nasadenie a distribúciu. Súčasťou distribučného (inštalačného) balíčka sú okrem všetkých súčastí programu aj nevyhnutné knižnice a komponenty behového prostredia, potrebné na správnu exekúciu programu na počítačovej stanici cieľového používateľa. Dosiaľ sme sekvenčný program jednoznačne prezentovali ako jednovláknový program, ktorý všetky svoje algoritmy (a rovnako aj elementárne operácie týchto algoritmov) realizuje v sériovej postupnosti. Táto charakteristika je typická pre sekvenčný program zo softvérového pohľadu, respektíve z pohľadu softvérového vývojára. Avšak, existuje aj ďalší pohľad, hardvérový (alebo tiež pohľad hardvérového vývojára). A ten vraví, že ak je to len trochu možné, tak aj ten najtriviálnejší sekvenčný program obsahuje časové profily, v ktorých sa správa paralelne. Dôležité: Každý moderný 64-bitový mikroprocesor realizuje automatické paralelné spracovanie mikroinštrukcií v jednom hodinovom cykle. Vďaka tomuto paralelizmu na úrovni mikroinštrukcií možno vykonať viacero mikroinštrukcií súbežne. Mikroprocesory dokážu bežne pracovať podľa modelu MIMD (angl. Multiple-Instruction Multiple-Data), čo znamená, že paralelne uskutočňované inštrukčné toky sú aplikované na (ideálne) diskrétne dátové objekty. Vo všeobecnosti sú stroje architektúry MIMD považované za najviac naklonené paralelnému spracovaniu inštrukčných a dátových tokov. Ak nebude vyslovene uvedené inak, budeme v tejto publikácii brať ako prvoradý softvérový pohľad na priebeh sekvenčného programu. 1.5 Paradigma paralelného programovania Základy paradigmy paralelného programovania spočívajú na paralelizme, ktorý multiplikuje počet tokov dát a inštrukcií v počítačovom programe. Paralelný program vykonáva v analyzovanom časovom profile viacero inštrukčných tokov operujúcich s dátovými objektmi. Správne zavedený paralelizmus transformuje sekvenčný program na paralelný program. V súčinnosti s touto transformáciou dochádza aj k zvýšeniu počtu programových vlákien v programe. Zatiaľ čo sekvenčný program vlastní jedno programové vlákno, paralelný program je vždy viacvláknový (obr. 1.7). Výpočty, ktoré realizuje sekvenčný program, sa počítajú na primárnom vlákne, a to v sériovej postupnosti. Pritom implicitne očakávame, že medzi jednotlivými výpočtami neexistujú žiadne funkčné ani dátové presahy. Ak prijmeme túto premisu, potom môžeme pri analýze reťazca výpočtov v primárnom vlákne uviesť tento výrok: každý nasledujúci výpočet smie byť naštartovaný až v momente skončenia predchádzajúceho výpočtu. Nech už je konkrétny výpočtový reťazec akokoľvek dlhý, žiadne 9 dva výpočty nebudú spracované v prekrytom čase. Model sekvenčného programu, ktorý uvádza obr. 1.7, presne manifestuje vyložené postuláty. Obr. 1.7: Sekvenčný a paralelný program z pohľadu početnosti programových vlákien Na druhej strane, paralelný program disponuje okrem primárneho vlákna aj kolekciou pracovných vlákien. Na obr. 1.7 vidíme, že stavbu modelovaného paralelného programu tvorí 1 primárne vlákno a 2 pracovné vlákna. V modeli preto pracujeme s 3-vláknovým paralelným programom. Pre praktické nasadenie radíme, aby pracovné vlákna boli čo najviac zaťažené realizáciou výpočtových procesov. Pritom je vhodné, keď sú pracovné vlákna samostatné: len čo dostanú na začiatku vstupné objekty, použijú ich pri výkone jadrových algoritmov a na výstupe poskytnú výstupné objekty. Zberačom výstupných objektov pracovných vlákien je zvyčajne primárne vlákno, ktoré tak plní aj rolu manažéra všetkých pracovných vlákien. Primárnym cieľom implementácie paralelizmu do sekvenčného kódu (a tým získanie ekvivalentného paralelného kódu) je nárast jeho výkonnosti. Združením paradigmy paralelného programovania s vyššie uvedenými paradigmami získame paralelný procedurálny program, paralelný objektový program a paralelný komponentový program. Napriek tomu, že teoretická informatika rozpracovala metodológiu paralelného programovania už pred piatimi dekádami, skutočný rozmach paralelizmu nastal až po tom, ako sa do počítačov finálnych používateľov dostali mikroprocesory s viacerými výpočtovými jadrami. Keďže vieme, že jednovláknový sekvenčný program je schopný alokovať práve jedno výpočtové jadro mikroprocesora, jeho možnosti využitia ďalších dostupných výpočtových jadier sú veľmi obmedzené. Preto potrebujeme viac než len jednu exekučnú cestu programom. Naša snaha o zvýšenie počtu kanálov spracovania programu je logická a okrem iného nás privádza od sekvenčného programu k paralelnému programu. Ak je každé vlákno programu mapované na práve jedno výpočtové jadro mikroprocesora, poľahky dôjd
Related Search
Similar documents
View more...
We Need Your Support
Thank you for visiting our website and your interest in our free products and services. We are nonprofit website to share and download documents. To the running of this website, we need your help to support us.

Thanks to everyone for your continued support.

No, Thanks
SAVE OUR EARTH

We need your sign to support Project to invent "SMART AND CONTROLLABLE REFLECTIVE BALLOONS" to cover the Sun and Save Our Earth.

More details...

Sign Now!

We are very appreciated for your Prompt Action!

x