Parallell programmering

Parallell programmering er et programmeringsparadigme . Den omfatter på den ene siden metoder for å dele et dataprogram i individuelle seksjoner som kan utføres samtidig , og på den annen side metoder for å synkronisere samtidige programdeler . Dette er i motsetning til klassisk, sekvensiell (eller seriell) programmering. En fordel med parallell programmering, i tillegg til muligheten for raskere programgjennomføring (f.eks. Ved bruk av flere prosessorkjerner ), er muligheten for å kartlegge det typiske hverdagsfenomenet samtidighet direkte i programmer, noe som kan føre til enklere, mer forståelig kildetekst . En ulempe er at kjøretidsoppførselen til parallelle algoritmer kan være vanskeligere å forstå enn for en tilsvarende sekvensiell algoritme.

gjennomføring

For parallellisering er det teoretisk uaktuelt om de enkelte programdelene faktisk behandles samtidig av uavhengige utførelsesenheter , eller om de bare utføres kvasi-parallelle (se tidsdeling , multitasking ).

I parallell programmering brukes den mindre strenge begrepet samtidighet , der programkoden ikke utføres strengt etter hverandre, men parallelt. To programdeler kan parallelliseres hvis parallell, sammenlåst eller vridd utførelse fører til samme resultat som den sekvensielle utførelsen ( parallellisering ). Hvis dette ikke er tilfelle, kan henrettelsen føre til et løpstilstand .

Samtidigheten til flere uavhengige prosesser kalles multitasking ; Samtidighet i en prosess som multitrading . I de tidlige dagene av datamaskinutvikling var også rene tidsdelingssystemer utbredt, noe som muliggjorde samtidighet på brukernivå.

Støtter maskinvare

I de fleste tilfeller støttes den parallelle kjøringen av et program av maskinvaren; programmeringsspråkene blir deretter generelt tilpasset deretter. For eksempel kan parallell programmering gjøres eksplisitt ved at programmereren utfører programdeler i separate prosesser eller tråder , eller det kan gjøres automatisk slik at kausalt uavhengige ( parallelliserbare ) instruksjonssekvenser utføres "ved siden av hverandre". Denne automatiske parallelliseringen kan utføres av kompilatoren hvis en datamaskin med en multikjerneprosessor eller en parallell datamaskin er tilgjengelig som målplattform , men noen moderne CPUer kan også gjenkjenne slik uavhengighet (i maskinkoden eller mikrokoden til et program) og instruksjonene kan overføres til forskjellige deler av prosessorene, slik at de blir utført samtidig ( utføring av ordre ).

Konflikter

Så snart de enkelte prosessene eller trådene kommuniserer med hverandre, er de strengt tatt ikke lenger som en helhet samtidig (de påvirker hverandre) - bare individuelle delprosesser er samtidig med hverandre. Nå, hvis rekkefølgen for utførelse av kontaktpunktene (eller kommunikasjonspunktene ) ikke er spesifisert tilsvarende, kommer mulige implikasjoner i konflikt, spesielt en såkalt deadlock ( deadlock ) når to prosesser venter på hverandre (eller for å blokkere hverandre) . Forskjellige teknikker brukes for å løse dette problemet:

Den forbindelse med hver del av programmet må beskyttes mot uventede endringer av andre deler ( synkronisering ). Hvis felles tilgang til data skal implementeres, med minst en part som ønsker å skrive / endre tilgang, må tilgangen synkroniseres, for eksempel ved gjensidig ekskludering ( mutex ) ved hjelp av skjermer eller semaforer . Alternativt kan det også kreves at visse handlinger utføres i fellesskap av to prosesser , med såkalt rendezvous . En annen sikker måte å kommunisere på er gjennom køer . Disse teknikkene løser problemet med samtidig tilgang til ressurser , men forhindrer ikke låsing (tvert imot).

Slike teknikker er spesielt viktige i distribuerte systemer , spesielt for å sikre integriteten til distribuerte transaksjoner .

Parallelle programmeringsspråk

De fleste programmeringsspråk tilbyr muligheter for parallellisering av prosesser. Noen språk er imidlertid designet fra grunnen av for, eller har denne iboende evnen, parallell programmering:

Effektivitet

Samtidig behandling av beregningene forkorter vanligvis gjennomføringstiden for et program. Når det gjelder CPU-tiden som brukes, er imidlertid en parallell algoritme nesten alltid verre enn en seriell, siden synkroniseringen av prosessene skaper ekstra administrativ overhead.

På et enkeltkjernersystem er det derfor bare parallelliseringer som er nyttige der en utførelsestråd kan "fortsette å jobbe" mens en annen må / bør vente - uten parallellisering vil denne tvungne ventetiden blokkere "bakgrunnsbehandling". I de fleste tilfeller er det nødvendig å vente på at operativsystemet skal fullføre en jobb fra programmet, ellers skal kjøringstråden vente på ytterligere brukerinngang mens behandlingen (f.eks. Tidligere utløste brukerjobber) blir beregnet i bakgrunnen.

Flere utførelsesenheter kreves for å dra full nytte av parallell programmering. Teknikker for dette er samtidig multithreading (SMT), f.eks. B. Hyper-Threading Technology (HTT), Symmetrical Multiprocessing (SMP), f.eks. B. ved hjelp av en multicore-prosessor eller flere CPUer . Det ekstreme tilfellet er massiv parallellbehandling (MPP) med noen ganger flere tusen prosessorer. Det er også vanlig å bruke hele nettverk av individuelle datamaskiner til parallell databehandling ( dataklynger ).

På den annen side bør det være så lite kontrollkode som mulig for å koordinere trådene, hvis denne bare kan utføres sekvensielt. Dette faktum er resultatet av Amdahls lov om parallelliseringsegenskaper til programmer.

Se også

litteratur