Multithreading
Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den
version , der blev gennemgået den 16. marts 2016; checks kræver
43 redigeringer .
Multithreading ( eng. Multithreading ) er en egenskab ved en platform (for eksempel et operativsystem , en virtuel maskine osv.) eller en applikation , der består i, at en proces genereret i operativsystemet kan bestå af flere tråde , der kører " sideløbende ", og spis derefter uden en ordineret rækkefølge i tide . For nogle opgaver kan denne adskillelse opnå en mere effektiv brug af computerressourcer .
Sådanne tråde kaldes også threads of execution (fra engelsk thread of execution ); nogle gange kaldet "tråde" (bogstavelig oversættelse af engelsk tråd ) eller uformelt "tråde".
Beskrivelse
Essensen af multithreading er quasi-multitasking på niveauet af én eksekverbar proces, det vil sige, at alle tråde udføres i processens adresserum . Derudover deler alle tråde i en proces ikke kun et fælles adresseområde, men også fælles filbeskrivelser . En kørende proces har mindst én (master) tråd.
Multithreading (som en programmeringsdoktrin ) bør ikke forveksles med hverken multitasking eller multiprocessing , selvom operativsystemer, der implementerer multitasking , har tendens til også at implementere multithreading.
Fordelene ved en multithreaded implementering af et bestemt system frem for en multitasking inkluderer følgende:
- Forenkling af programmet i nogle tilfælde ved at bruge et fælles adresseområde.
- Mindre tid brugt på at oprette en tråd i forhold til processen.
Fordelene ved en multi-threaded implementering af et bestemt system frem for en enkelt-threaded inkluderer følgende:
- Forenkling af programmet i nogle tilfælde på grund af fjernelse af mekanismerne til at sammenflette udførelsen af forskellige svagt sammenkoblede underopgaver, der kræver samtidig udførelse, i et separat multithreading-undersystem.
- Forbedring af procesydelse ved at parallelisere processorberegninger og I/O-operationer.
I tilfælde af at udførelsestråde kræver relativt kompleks interaktion med hinanden, kan multitasking-problemer som f.eks. dødvande opstå.
Hardwareimplementering
På en konventionel processor håndteres trådhåndtering af operativsystemet. Tråden udføres, indtil der opstår en hardwareafbrydelse, et systemkald forekommer, eller indtil den tid, som styresystemet har tildelt den, udløber. Derefter skifter processoren til operativsystemkoden, som gemmer trådens tilstand (dens kontekst) eller skifter til tilstanden for en anden tråd, som også er tildelt tid til udførelse. Med en sådan multithreading bruges et tilstrækkeligt stort antal processorcyklusser på operativsystemkoden, der skifter kontekst. Hvis trådunderstøttelse er implementeret i hardware, så vil processoren selv være i stand til at skifte mellem tråde og i det ideelle tilfælde udføre flere tråde samtidigt for hver clock-cyklus. For operativsystemet og brugeren vil en sådan fysisk processor blive set som flere logiske processorer.
Der er to former for multithreading, der kan implementeres i processorer i hardware:
Trådimplementeringstyper
- En tråd i brugerrummet. Hver proces har en trådtabel, der ligner kerneprocestabellen. Ulemperne omfatter:
- Ingen timerafbrydelse inden for samme proces
- Når du bruger en blokeringssystemanmodning på en proces, blokeres alle dens tråde.
- Implementeringens kompleksitet
- Flow i kernerummet. Sammen med procestabellen er der en trådtabel i kernerummet.
- "Fibre" ( eng. fibers ). Flere brugertilstandstråde, der udføres på en enkelt kernetilstandstråd. En kernerumstråd bruger bemærkelsesværdige ressourcer, primært fysisk hukommelse og et kernetilstandsadresseområde for kernetilstandsstakken. Derfor blev konceptet "fiber" introduceret - en letvægtstråd, der udelukkende kører i brugertilstand. Hver tråd kan have flere "fibre".
Trådinteraktion
I et multithreaded miljø er der ofte opgaver, der kræver suspension og genoptagelse af nogle tråde afhængigt af andres arbejde. Disse er især opgaver relateret til forebyggelse af adgangskonflikter ved brug af de samme data eller enheder fra parallelle eksekverbare tråde. For at løse sådanne problemer bruges specielle objekter til trådinteraktion, såsom gensidige udelukkelser (mutexes), semaforer, kritiske sektioner, begivenheder osv. Mange af disse objekter er kerneobjekter og kan bruges ikke kun mellem tråde i den samme proces, men også til interaktion mellem tråde i forskellige processer.
- En mutex er et synkroniseringsobjekt, der er indstillet til en speciel signaleret tilstand, når den ikke er optaget af nogen tråd. Kun én tråd ejer dette objekt til enhver tid, derfor er navnet på sådanne objekter (fra engelsk mutually exclusive access - mutually exclusive access) - samtidig adgang til en delt ressource er udelukket. Efter alle nødvendige handlinger frigives mutex, hvilket giver andre tråde adgang til den delte ressource. Et objekt kan understøtte rekursiv optagelse en anden gang af den samme tråd, øge tælleren uden at blokere tråden og derefter kræve flere frigivelser. Sådan er for eksempel det kritiske afsnit i Win32 . Der er dog nogle implementeringer, der ikke understøtter dette og får tråden til at gå i lås , når man forsøger en rekursiv indfangning. For eksempel er dette FAST_MUTEX i Windows-kernen.
- Kritiske sektioner giver synkronisering svarende til mutexes, bortset fra at de objekter, der repræsenterer kritiske sektioner, kun er tilgængelige inden for en enkelt proces. Hændelser, mutexes og semaforer kan også bruges i enkelt-proces applikationstråde, men implementeringer af kritiske sektioner i nogle operativsystemer (for eksempel Windows NT) giver en hurtigere og mere effektiv [1] [2] mekanisme til gensidigt udelukkelse synkronisering - "get" og "frigivelse" på den kritiske sektion er optimeret til tilfældet med en enkelt tråd (ingen strid) for at undgå systemkald, der fører til OS-kernen.
- Semaforer er tilgængelige ressourcer, der kan erhverves af flere tråde på samme tid, indtil ressourcepuljen er tom. Derefter skal yderligere tråde vente, indtil den nødvendige mængde ressourcer er tilgængelig igen.
- Udviklinger. Et objekt, der gemmer 1 bit information "signaleret eller ej", hvorpå operationerne "signal", "nulstille til en usignaleret tilstand" og "vent" er defineret. At vente på en signaleret hændelse er fraværet af en operation med en øjeblikkelig fortsættelse af udførelsen af tråden. At vente på en usignaleret hændelse får udførelsen af en tråd til at blive suspenderet, indtil en anden tråd (eller anden fase af en interrupt-handler i OS-kernen) signalerer hændelsen. Det er muligt at vente på flere begivenheder i "enhver" eller "alle" tilstande. Det er også muligt at oprette en hændelse, der automatisk nulstilles til en usignaleret tilstand efter vækning af den første - og eneste - ventende tråd (et sådant objekt bruges som grundlag for implementering af objektet "kritisk sektion"). Anvendes aktivt i MS Windows, både i brugertilstand og i kernetilstand. Der er et lignende objekt i Linux-kernen kaldet kwait_queue.
- Betingede variabler (condvars). Svarende til hændelser, men de er ikke objekter, der optager hukommelse - kun adressen på variablen bruges, begrebet "variablens indhold" eksisterer ikke, adressen på et vilkårligt objekt kan bruges som en betingelsesvariabel. I modsætning til hændelser har det ingen konsekvenser at sætte en tilstandsvariabel til en signaleret tilstand, hvis der i øjeblikket ikke er nogen tråde, der venter på variablen. Indstilling af en hændelse i et lignende tilfælde indebærer lagring af den "signalerede" tilstand i selve hændelsen, hvorefter efterfølgende tråde, der ønsker at vente på hændelsen, fortsætter eksekveringen med det samme uden at stoppe. For at gøre fuld brug af et sådant objekt er operationen "slip mutexen og vent på tilstandsvariablen atomisk" også nødvendig. Anvendes aktivt i UNIX -lignende operativsystemer. Diskussioner om fordele og ulemper ved hændelser og tilstandsvariable er en fremtrædende del af diskussionerne om fordele og ulemper ved Windows og UNIX.
- IO-afslutningsport (IOCP). Implementeret i OS-kernen og tilgængeligt via systemkald, "kø"-objektet med operationerne "sætter strukturen til køens ende" og "tag den næste struktur fra hovedet af køen" - det sidste kald suspenderer eksekveringen af tråden, hvis køen er tom, og indtil ingen anden tråd vil foretage put-kaldet. Den vigtigste egenskab ved IOCP er, at strukturer kan placeres i den ikke kun ved et eksplicit systemkald fra brugertilstand, men også implicit inde i OS-kernen som et resultat af fuldførelsen af en asynkron I/O-operation på en af filerne beskrivelser. For at opnå denne effekt skal du bruge systemkaldet "tilknytte en filbeskrivelse til IOCP". I dette tilfælde indeholder strukturen placeret i køen fejlkoden for I/O-operationen, og også, i tilfælde af succes med denne operation, antallet af faktisk indtastede eller outputbytes. Implementeringen af færdiggørelsesporten begrænser også antallet af tråde, der udføres på en enkelt processor/kerne, efter at en struktur er modtaget fra køen. Objektet er specifikt for MS Windows og tillader behandling af indgående forbindelsesanmodninger og datastykker i serversoftware i en arkitektur, hvor antallet af tråde kan være mindre end antallet af klienter (der er intet krav om at oprette en separat tråd med ressourceomkostninger for hver ny kunde).
- ERESOURCE. En mutex, der understøtter rekursiv optagelse, med delt eller eksklusiv optagelsessemantik. Semantik: Et objekt kan enten være frit eller fanget af et vilkårligt antal tråde på en delt måde, eller erhvervet af kun én tråd på en eksklusiv måde. Ethvert forsøg på at foretage optagelser, der overtræder denne regel, vil få tråden til at blokere, indtil objektet er frigivet for at gøre optagelsen tilladt. Der er også operationer af typen TryToAcquire - den blokerer aldrig tråden, hverken fanger den eller (hvis blokering er nødvendig) returnerer FALSK uden at gøre noget. Det bruges i Windows-kernen, især i filsystemer - for eksempel svarer enhver åben diskfil af nogen til FCB-strukturen, hvor der er 2 sådanne objekter til at synkronisere adgang til filstørrelsen. En af dem - paging IO-ressource - fanges udelukkende i filbeskæringsstien og sikrer, at filen på tidspunktet for beskæring ikke har aktiv I/O fra cachen og hukommelseskortlægning.
- nedslidningsbeskyttelse . Et semi-dokumenteret (kald er i header-filerne, men ikke i dokumentationen) objekt i Windows-kernen. Tæller med operationerne "øge", "sænke" og "vente". Ventetiden blokerer tråden, indtil dekrementeringsoperationerne reducerer tælleren til nul. Derudover kan inkrementoperationen mislykkes, og tilstedeværelsen af en aktuelt aktiv ventetid får alle inkrementoperationer til at mislykkes.
Kritik af terminologi
Oversættelsen af det engelske udtryk tråd som "tråd" i en kontekst relateret til programmering modsiger dets oversættelse "tråd" i en generel sprogkontekst og skaber også kollisioner med termen Datastrøm .
Udtrykket "strøm" er dog forbundet med oversættelser af udenlandsk teknisk litteratur lavet i 1970'erne af forlaget Mir. I øjeblikket betragtes det i "akademiske kredse" (det vil sige i lærebøger, læremidler, universitetskurser, afhandlinger osv.) som en reference. Udtrykkene "tråd", "tråd" osv. betragtes som teknisk jargon .
Se også
Litteratur
- Kunle Olukotun. Chip Multiprocessor Architecture - Teknikker til at forbedre gennemløb og latens. - Morgan og Claypool Publishers, 2007. - 154 s. — ISBN 159829122X . (Engelsk)
- Mario Nemirovsky, dekan M. Tullsen. multithreading arkitektur. - Morgan og Claypool Publishers, 2013. - 1608458555 s. — ISBN 1608458555 . (Engelsk)
Noter
- ↑ Jeffrey Richter . "Jeffrey Richter. Vinduer til professionelle. Opbygning af effektive WIN32-applikationer skræddersyet til specifikationerne for 64-bit Windows. 2001
- ↑ MSDN http://msdn.microsoft.com/en-us/library/ms682530%28VS.85%29.aspx Arkiveret 23. december 2011 på Wayback Machine
Links