Kan man jämföra en thread med en while loop som ligger och kör hela tiden eller hur fungerar det. Hur beter sig en loop inuti en therad. Kör den klart innan threaden kör sitt andra "varv"? Som ni hör så vet jag inget om threads så all info är jag tacksam. Hej... Lite småsaker bara, Använde nog fel ord i mitt samanhang. Vad jag menade med Process var typ sitt enga flöde, använding. inte för att vara sådan, men en process är en process på en dator. Jo jag vet. Men nu pratade jag inte om en dator utan om en hantering. Som det står i min förklaring där uppe, en tråd är en bit av processorns tid. Det var typ det man utför i tråden som jag syftade på då jag sa att det kan ta kräm av datorn. Inte själva tråden i sig. Följdfråga: >Det för att de inte ska störa varandra, dels ur ett minnes perspektiv, varje process får vanligtvis 2gb virtuellt minne tilldelat sig (för CLR'n är det 3gb) Jo, men den skapas väl under appdomainens context? Vad jag vet så skapas tråden under den appdomän du befinner dig i. Sedan kan du komma åt den via andra appdomäner. Vaddå knytas? den skapas ju under samma appdomän som du befinner dig i, en tråd skapar ju inte direkt en ny varje gång. Skulle ju bli lite krävande då. Det kanske klarnar om du läser Har alltid fått för mig att trådarna skapas under AppDomänen man är i. >Har alltid fått för mig att trådarna skapas under AppDomänen man är i. Visst kan jag göra det, nu har jag text som jag klistrar in då detta inte är det enda ställe jag är på. Jag vill även se till så det misnas med luft snack här i forumen då det ställs dumma frågor om kod som man klistrat in då de själva bara klistrar in den rakt av. Säger man då till dem lite innan att innehållet inte måste vara helt korrekt så lugnar många ner sig. Plus att det var en kul grej. Och alltid är det någon som skall reta sig i detta land :-) Men jag skall slänga in svenskt text nästa gång. Bara en ren vana att ta med foten o kasta in den. En amatör thread fråga
MVH Göran PSv: En amatör thread fråga
Nja en trådning kan inte jämföras med en whileloop. :-)
En trådning har sin egna process. När du programmerar så blir allt du gör synkront.
Du går rad för rad etc... Om du vill göra två saker samtidigt går inte detta då du alltid måste vänta på att operationen innan är utförd.
Om du slänger upp en tråd slänger du upp en egen process som går vid sidan om fast under samma AppDomain. Här kan du utföra precis vad du vill precis som i din vanliga Single tråd. (Applikatione du startar går alltid under en tråd.)
Det är detta som då kallas asynkron programmering.
Tänk dig att du öppnar en exe fil. Denna går oftast under en tråd, trycker du på knappen Save kan du inget göra förrän alla operationer under save är utförda, Applikationen är typ fryst. Om du däremot slänger upp en tråd när man trycker på save och utför sparandet under den nya tråden så kan du fortsätta att göra andra saker i din applikation. Man kan ha hur många trådar öppna som helst, det är typ minne och datorns prestanda som sätter stopp för detta. När du ex kör Kazaa så kör varje nerladdning under sin egna tråd med sina hanteringar.
Är du med? Man kan förklara trådning på många sätt, men jag hoppas detta gav dig den bild du var ute efter.
//Johan NSv: En amatör thread fråga
1) Du skapar inte en process.. det hade varit katastrof om du gjort det. Relationenerna är:
OS
|
Process (CLR)
|
Appdomain(Default) Appdomain(created)
| | |
Thread(Main) Thread(created) Thread(Appdomain main)
En process tilldelas vanligtvis från operativssytemet och är en låda där du för köra kod. Lådan isolerar din kod från operativsystemets och andra applikationers kod i minnet. Det för att de inte ska störa varandra, dels ur ett minnes perspektiv, varje process får vanligtvis 2gb virtuellt minne tilldelat sig (för CLR'n är det 3gb) vilket är totalt isolerat från minnet som andra applikationer använder. Dels kan en process gå ner utan att störa andra, osv.
En appdomain är en lättviktsprocess (egentligen ganska tung men mindre tung än en process) Det vill säga den har samma drag som en OS process, men skapas och hanteras av din instans av CLR'n som din applikation dragit igång.
En Tråd är en del av processorns tid. En x86 processor jan igentligen bara hantera en tråd åt gången men använder något som heter Thread Scheduling (TS) för att få det att verka som den arbetar med flera trådar åt gången. Varje tråd får ett id som TS¨n håller reda på och varje tråd får en "time slice" tilldelad sig. När processorn sedan arbetar, så frågar den TS efter nästa jobb, TSn ger den en tråds instruktioner låter den tråden exekvera så länge som den har tillåtelse, sedan söver den tråden (Sleep state) och låter nästa tråd exekvera sin fulla tid. Att byta tråd som exekverar på det här sättet kallas Thread Switching.
En thread switch är dyr och passar man sig inte kan den kosta mer än vad den smakar, dvs skapar man en massa trådar så skapar du också för varje tråd en thread switch och på det viset overhead för din exekvering. Vilket faktiskt i slutändan kan leda till att applikationen blir dramatiskt mycket långsammare. Det kan ju hända att det krävs ett antal cyklar och thread switches innan din tråd är klar med sitt arbete.
2) Varje appdomains tråd använder samma minnes area som resten av appdomainen, men har också ngt som heter thread local storage, det är minne som den tilldeleas när den skapas, runt 2mb. Där finns den trådspecifika stacken och liknande. Att minnet på din dator skulle ha betydelse när det gäller hur många trådar du kan skapa stämmer inte riktigt. Däremot kan man säga att om man anvädner väldigt m¨ånga trådar och har lite minne, så kommer swap filen att användas flitigt och du döddar effektivt din maskins prestanda. Man kan i princip spawna hur många trådar som helst, men ju fler trådar, desot mer thread swtich och Thread Local storage, desto mer last på din maskin och slutligen kommer den att knappt svara.
3) Försök undvika att skapa trådar om du inte verkligen behvöer dem. Titta istället på asyncrona delegater, thread pools och asyncorna metoder (bal IO klasserna har sådana). De använder sig av två st tråd poolar nämligen, och på det viset blir din trådhantering effektivare. De två trådpoolarna heter I/O Threads (avänds för IO operationer mot skärm, disk, nätverk osv) och Worker thread pool (används för andra jobb). Båda två har en max pool på 25 trådar by default.
Bara om du skickar iväg ett jobb som kommer att ta lång tid att exekvera, är det vettigt att skapa sina egna trådar, annars är det ovan metoder som ger bästa prestanda och skalbarhet.
Sv: En amatör thread fråga
Inte det process du syftar på. Kanske var fel ord att säga Process, då vi syftar på två olika saker.
//Johan NSv: En amatör thread fråga
För UML/OOD är det en annan sak och för en affärsutvecklare en tredje.Sv: En amatör thread fråga
Du får gärna ge mig ett mer passande ord, då det skulle uppskattas.
Kallar mkt för just "processer" då det utför något.
"Att minnet på din dator skulle ha betydelse när det gäller hur många trådar du kan skapa stämmer inte riktigt. Däremot kan man säga att om man anvädner väldigt många trådar och har lite minne, så kommer swap filen att användas flitigt och du döddar effektivt din maskins prestanda."
1... För mig är SWP filen till för minneshanteringen och används i olika fall. Och ju mer data du fyller ju större kan Swap filen bli och skada prestandan. Ville inte i min förklaring gå ner för djupt i alla detaljer, hur minnet hanteras och när/var saker lagras och när swapfilen kommer in. För lite minne är ju oxå en teknisk fråga på vad man utför på sin dator. 512 MB kan ju faktiskt oxå vara för lite minne beroende på vad man kör för processer på sin dator.
2... Sedan kan faktiskt två trådar slöa ner datorn beroende på vad du utför. Självklar tar inte själva tråden upp en massa minne, utan det som händer i själva tråden.
Mvh Johan NSv: En amatör thread fråga
1) klart swap filen är för minneshantering. Det är ju där data skrivs ner när det "verkliga minnet" är fullt eller saker där inte använts på väldigt lång tid. Den tar ju det som inte används just nu och skirver temporärt ner den i swapfilen, och läser sedan upp den igen om ngn skulle fråga efter det.
2) En tråd kan slöa ner dator, om du skriver tunga loopar osv. Men det beror ju inte på overheaden som en tråd ger utan ngt helt annat. Då är det thread schedulern som tilldelar din tråd mer tid så fort det finns tid ledigt för att du skall kunna utföra ditt arbete snabbare, vilket gör att en tråd kan få 99% av processorns tid och inte mycket annat skulle fungera.Sv: En amatör thread fråga
Nu skall jag ut o parta.
Vi hörs.
Mvh Johan NSv: En amatör thread fråga
När bör man skapa en ny AppDomain (och en ny thread i den) i stället för att skapa en ny tråd i default-appdomainen?Sv: En amatör thread fråga
CLR processer har också 2 GB som default. 3 GB finns det stöd för fr.o.m. v1.1 av ramverket, men det kräver at OS startas med /3GB alternativet och att EXE filen som startar processen har flaggan IMAGE_FILE_LARGE_ADDRESS_AWARE satt i PE huvudet.
>2) Varje appdomains tråd använder samma minnes area som resten av appdomainen
Det här (och figuren ovan) antyder att en tråd tillhör en (och endast en) appdomain. Så är inte fallet, en tråd kan anropa över appdoman gränser inom samma OS process. Och att skapa en ny appdomain innebär inte automatiskt att man även drar igång en ny tråd.
MSSv: En amatör thread fråga
Så även om den kan anropas över appdomain gränserna så har den väl tillhörighet i den appdomainen den skapades i?Sv: En amatör thread fråga
Precis som du skriver.
//Johan NSv: En amatör thread fråga
>Så även om den kan anropas över appdomain gränserna så har den väl tillhörighet i den appdomainen den skapades i?
Hur skulle den tillhörigheten avspeglas i så fall? Vad vore vitsen med att knyta en tråd till den appdomain den skapas i?
MSSv: En amatör thread fråga
//Johan N
"This posting is provided "AS IS" with no warranties, and confers no
rights."Sv: En amatör thread fråga
http://blogs.gotdotnet.com/cbrumme/permalink.aspx/56dd7611-a199-4a1f-adae-6fac4019f11b
Som du ser där hanteras instanser av System.Threading.Thread speciellt av runtimen och tillåts delas av olika appdomains utan att gå via en proxy e.dyl. (det som Brumme kallar "marshal-by-bleed"). Om samma objekt delas i hela processen torde det bli irrelevant vilken appdomain det ursprungligen skapades i, för en referens kan inte som för andra objekt antingen referera till ett lokalt eller ett "remote" objekt.
Och själva den "fysiska" tråden (alltså stacken och allt det där, inte det logiska Thread objektet) kan ju, som jag sa tidigare, löpa över appdomain gränserna, och har därför ingen appdomaintillhörighet.
>"This posting is provided "AS IS" with no warranties, and confers no rights."
Gulligt. Var det någon som trodde något annat?
MSSv: En amatör thread fråga
Att det är där ThreadStart utförs.
Och detta ser ju ut att förklara för mig att det är så... Men att de(trådarna) sedan hamnar i processen är ju en annan sak, det har inte jag argumenterat något om. Syftade mer på att de skapades under AppDomänen man var i. (Sedan om de då hamnar i processen är en annan sak.)
Formulerade mig nog lite dåligt i mitt senaste inlägg, då jag var på väg ut, det är mänskligt att göra fel. :-)
"App Domains are not the same as threads nor are they mutually exclusive.
Threads are light-weight processes responsible for multitasking within a
single application. A Thread exists in one app domain at a time, and a
thread can access (and report) which app domain it is executing in. App
domains are used to isolate applications; within an app domain there may be
multiple threads operating at any given moment."
...
"The .NET Framework further subdivides an operating system process into lightweight managed subprocesses, called application domains, represented by System.AppDomain. One or more managed threads (represented by System.Threading.Thread) can run in one or any number of application domains within the same unmanaged process. Although each application domain is started with a single thread, code in that
application domain can create additional application domains and additional threads. The result is that a managed thread can move freely between application domains inside the same unmanaged process; you might have only one thread moving among several application domains."
..
"Gulligt. Var det någon som trodde något annat?"
Skall jag tolka detta stötande? I så fall ber jag dig direkt att lägga av då det
absolut inte är passande här. TACk!
Det är många som klagar på att kodexempel inte fungerar då de gör copy and paste, och det är störande att alltid behöva förklara detta för dem.
//Johan NSv: En amatör thread fråga
Ja naturligtvis skapas de i någon appdomain, men det jag försökte komma fram till var att det för trådar, till skillnad från vanliga objekt, inte har någon egentlig betydelse i vilken.
Men jag tror inte vi kommer längre, så det kanske är dags att släppa det här. :-)
>"Gulligt. Var det någon som trodde något annat?"
>Skall jag tolka detta stötande?
Du får tolka det som du vill, men det var inte tänkt att vara stötande, utan en enkel fråga. Det är ju inte varje dag man ser såna disclaimers i meddelanden här på Pellesoft, och jag undrade bara om du hade nån speciell anledning att ha den där.
Jag kan förstå att Microsoft folk har det. De tillhör trots allt ett hiskeligt stort företag baserat i USA där folk stämmer varandra hit och dit för minsta skitsak. Men för en svensk privatperson ser jag ingen anledning att inkludera sånt juridiksnack.
>Det är många som klagar på att kodexempel inte fungerar då de gör copy and paste, >och det är störande att alltid behöva förklara detta för dem.
Okej, det har jag missat. Men i så fall undrar jag om det inte vore mer effektivt att skriva något på svenska så folk förstår innebörden av det. Kanske något i stil med "skyll inte på mig om koden inte fungerar". :-)
MSSv: En amatör thread fråga
//Johan N