Net, o prezentare generală a multithreading

Pentru aplicarea multi-threading, există mai multe motive. Să presupunem că, în cererea este luată recurge la orice server din rețea, care poate dura ceva timp. N-aș vrea să UI pentru că a fost blocat, iar utilizatorul a trebuit să aștepte doar pentru momentul în care serverul returnează un răspuns. Utilizatorul poate efectua la acel moment o altă acțiune sau chiar pentru a anula solicitarea trimisă la server. În astfel de situații, utilizarea beneficiilor multi-threading.







Pentru toate tipurile de activități care necesită de așteptare, de exemplu, ca urmare a avea acces la un fișier, baze de date sau de rețea, poate rula un nou fir, care să permită să efectueze în același timp, alte sarcini. Multithreading poate ajuta, chiar dacă există doar un singur saturate în termeni de sarcini de procesare. fluxuri multiple ale aceluiași proces poate fi realizată simultan de diferite procesoare sau, mai frecvente în aceste zile, diferite nuclee ale unui CPU multi-core.

Desigur, este necesar să se cunoască caracteristicile de care să execute simultan mai multe fire. Datorită faptului că acestea sunt efectuate în același timp, atunci când primesc acces la aceleași date pot fi probleme. Pentru a preveni acest lucru, să fie puse în aplicare mecanisme de sincronizare.

Într-o aplicație care funcționează pe server, un fir așteaptă întotdeauna pentru o solicitare din partea clientului, și, prin urmare, este numit un flux-ascultător (fir ascultător). La primirea cererii, aceasta îl transmite imediat la un fir lucrător separat (filet muncitor). pe care continuă să interacționeze în continuare cu clientul. Ascultătorul flux apoi imediat a revenit la îndatoririle sale până la sosirea următoarea cerere de la un alt client.

Fiecare proces constă dintr-o resursă, cum ar fi descriptorii de ferestre, mânere de fișiere și alte obiecte ale nucleului este evidențiat în zona de memorie virtuală și cuprinde cel puțin un fir. Fluxurile sunt planificate pentru a efectua sistemul de operare. Orice flux are prioritate, contorul de program care indică locația în program în cazul în care există o procesare și o stivă în care sunt stocate flux variabile locale. Stivui fiecare fir arata diferit, dar memoria de cod de program și o mulțime de partajat între toate firele, care funcționează în cadrul aceluiași proces.

Acest lucru permite ca fluxurile din interiorul unui singur proces rapid interacționează unele cu altele, din moment ce toate fluxurile de proces se referă la aceeași memorie virtuală. Cu toate acestea, se complică, de asemenea, probleme, deoarece permite mai multe fire modificați aceeași zonă de memorie.

Bazele multithreading

Există două tipuri de multitasking: pe bază de fire pe bază de proces și. În acest sens, este important să se înțeleagă diferențele dintre ele. Procesul este responsabil pentru gestionarea resurselor, care includ memoria virtuală și mânere pentru Windows, și conține cel puțin un fir. Prezența a cel puțin un flux este necesar pentru executarea oricărui program. Prin urmare, pe baza proceselor multi-tasking - este mijlocul prin care un program de calculator poate fi două paralele efectuate și mai mult.

Diferențele de multitasking bazate pe procese și fire pot fi rezumate după cum urmează: multitasking procese pe bază organizate pentru executarea în paralel a programelor și multitasking bazată pe flux - pentru executarea în paralel a pieselor individuale ale unui singur program.







Principalul avantaj al multithreading este că vă permite să scrie programe care funcționează foarte eficient cu capacitatea de a pârghie timpii morți care apar în mod inevitabil, în timpul executării majoritatea programelor. După cum se știe, cele mai multe dintre dispozitivele de intrare-ieșire, dacă dispozitivele conectate la porturile de rețea, unități de disc, sau o tastatură, sunt mult mai lent decât unitatea centrală de procesare (CPU). Prin urmare, cea mai mare parte a timpului programul trebuie să aștepte pentru a trimite date la dispozitivul de intrare-ieșire sau de a primi informații de la ea. Și, datorită programului de procesare multi-thread poate rezolva alte probleme în timpul de nefuncționare.

De exemplu, în timp ce o parte a programului trimite fișierul prin intermediul unei conexiuni la Internet, pe de altă parte se poate efectua citirea informațiilor de text de la tastatură, iar al treilea - pentru a efectua tamponare a următorul bloc de date transmise.

două tipuri de fluxuri sunt definite în .NET Framework: prim-plan și de fundal. În mod implicit, fluxul creat devine automat o prioritate, dar este posibil să se facă fundal. Singura diferență față de prioritatea firului de fond este faptul că firul de fond se termină în mod automat în cazul în care a oprit toate fluxurile prioritare în procesul său.

În legătură cu organizarea multi-tasking, pe baza fluxului este nevoie într-un tip special de modul, care se numește sincronizare și vă permite să coordoneze executia firului mod destul de specific. Pentru această sincronizare, C # într-un subsistem separat.

Toate procesele constau din cel puțin un fir, care este denumit în mod obișnuit ca primar, deoarece este aici începe programul. Din fluxul principal poate crea alte fire.

În limbajul C # și .NET Framework sunt acceptate ambele tipuri de multitasking: și pe bază de fire pe bază de proces. Prin urmare, C # înseamnă că puteți crea procesele și fluxurile, precum și cele Gestiona și, și altele. Pentru a începe un nou proces de programare este nevoie de destul de un pic de efort, deoarece fiecare proces anterior este complet separat de altul.

Mult mai important este sprijinul în procesarea C # multifir, prin care simplifică scrierea de înaltă performanță, de programare multithreaded în C # în comparație cu alte limbi.

Clasele care sprijină de programare multi-threaded, în spațiul definit numele System.Threading. Prin urmare, orice C # program multi-threaded include următoarea linie de cod:

System.Threading spațiu de nume conține diferite tipuri, care să permită crearea unor aplicații multi-threaded. Poate mai important dintre ele este clasa fir. deoarece este un fir separat. Pentru a obține programatic o referire la fluxul, se efectuează o anumită instanță, pur și simplu apel static Thread.CurrentThread de proprietate:

Pe platforma .NET, nu există nici o corespondență directă „unu la unu“ între domeniile de aplicare (AppDomain) și fluxurile. De fapt, unele AppDomain pot avea mai multe fire care rulează la un moment dat. Mai mult decât atât, firul particular nu este legat de un singur domeniu de aplicație în timpul vieții sale. Curente pot traversa granițele domeniului de aplicare, în cazul în care place și CRJ programatorul de Windows.

Deși fluxurile active pot trece granițele AppDomain, fiecare flux în fiecare moment special, poate fi realizată într-un singur domeniu de aplicare (cu alte cuvinte, este imposibil ca un fir lucrat în mai mult de un domeniu de aplicare imediat). Pentru a accesa programatic AppDomain, care trece firul de curent, apelați metoda Thread.GetDomain statică ():

Singurul flux, de asemenea, poate fi mutat în orice moment, într-un context specific, și poate fi mutat în noul context al CRJ capriciu. Pentru contextul actual, în care firul este de executare, utilizați proprietatea Thread.CurrentContext statică (care returnează System.Runtime.Remoting.Contexts.Context obiect):

Încă o dată, pentru circulația fluxurilor între domenii de aplicare și contexte se întâlnește CLR. Ca .NET vei rămâne mereu în ignoranță când completat fiecare flux special (sau exact în cazul în care acesta este plasat după mutare). Cu toate acestea, este util să știți despre diferitele modalități de obținere a primitivilor care stau la baza.