Planlægning

FONT SIZE:
fontsize_dec
fontsize_inc
Maj 14, 2016 Lotte Teller P 0 15

I computing, planlægning er den metode, som tråde, processer eller datastrømme får adgang til systemressourcer. Dette sker som regel til at indlæse balance og deler systemressourcer effektivt eller nå et mål servicekvalitet. Behovet for en planlægningsalgoritme opstår fra kravet for de fleste moderne systemer til at udføre multitasking og multiplexing.

Planlæggeren er hovedsageligt beskæftiger sig med:

  • Gennemløb - Det samlede antal processer, der fuldender deres udførelse per tidsenhed.
  • Ventetid, specielt:
    • Behandlingstid - samlet tid mellem indgivelsen af ​​en proces og dens afslutning.
    • Responstid - mængden af ​​tid, det tager fra, når en anmodning blev indgivet indtil den første reaktion er produceret.
  • Fairness - Lige CPU-tid til hver proces.
  • Ventetid - Den tid, processen forbliver i klar kø.

I praksis disse mål ofte konflikt, således en scheduler vil gennemføre et passende kompromis. Præference gives til et hvilket som helst af de allerede nævnte afhængigt af brugerens behov og mål.

I realtid miljøer, såsom indlejrede systemer til automatisk styring i industrien, planlæggeren også skal sikre, at processerne kan overholde tidsfrister; det er afgørende for at holde systemet stabilt. Planlagte opgaver kan også blive distribueret til eksterne enheder på tværs af et netværk og styres gennem en administrativ back-end.

Typer af operativsystemet Skedulere

Operativsystemer kan indeholde op til tre forskellige typer af scheduler, en langsigtet scheduler, en midtvejsevaluering eller mellemlang sigt scheduler og en kortsigtet scheduler. Navnene antyder den relative hyppighed, hvormed disse funktioner udføres. Planlæggeren er et operativsystem modul, der udvælger de næste job at blive optaget i systemet, og den næste proces til at køre.

Proces scheduler

Langsigtet planlægning

Den langsigtede, eller optagelse scheduler, beslutter, hvilke job eller processer for at blive optaget på klar kø; det vil sige, når der gøres forsøg på at udføre et program, dets optagelse i sæt i øjeblikket udfører processer enten godkendt eller forsinkes af den langsigtede scheduler. Således er denne scheduler dikterer, hvilke processer der kører på et system, og graden af ​​samtidighed, der skal støttes på en gang - om et højt eller lavt mængde processer skal udføres samtidigt, og hvor opdelingen mellem I / O intensiv og CPU-intensive processer skal håndteres. Den langsigtede scheduler er ansvarlig for at kontrollere graden af ​​multiprogram.

Generelt kan de fleste processer beskrives som enten I / O-bundet eller CPU-bundet. En I / O-bundne proces er en, der bruger mere af sin tid på at gøre I / O, end det bruger laver beregninger. En CPU-bundne proces, derimod genererer I / O-anmodninger sjældent, at bruge mere af sin tid laver beregninger. Det er vigtigt, at en langsigtet scheduler vælger en god proces blanding af I / O-bundne og CPU-bundne processer. Hvis alle processer er I / O-bundet, vil klar kø næsten altid være tom, og den kortsigtede scheduler vil have lidt at gøre. På den anden side, hvis alle processer er CPU-bundne, I / O-køen vil næsten altid være tom, enheder vil gå ubrugt, og igen systemet vil være ubalanceret. Systemet med den bedste ydelse vil således have en kombination af CPU-bundne og I / O-bundne processer. I moderne operativsystemer, dette bruges til at sørge for, at real-time processer får nok CPU-tid til at afslutte deres opgaver.

Langsigtet planlægning er også vigtigt i store systemer såsom batch systemer, edb klynger, supercomputere og gør gårde. I disse tilfælde er særlige formål job scheduler software, der typisk anvendes til at hjælpe disse funktioner, foruden eventuelle underliggende optagelse planlægning støtte i operativsystemet.

Mellemlang sigt planlægning

Scheduler midlertidigt fjerner processer fra hovedhukommelsen og placerer dem på sekundær hukommelse eller omvendt. Dette er almindeligvis omtales som "bytte ud" eller "bytte i". Den mellemfristede scheduler kan beslutte at udskifte en proces, som ikke har været aktiv i et stykke tid, eller en proces, der har en lav prioritet, eller en proces, som er side faulting ofte, eller en proces, der tager en stor mængde af hukommelse for at frigøre vigtigste hukommelse til andre processer, bytte processen tilbage senere, når mere hukommelse der er tilgængelig, eller når processen er blevet frigivet og er ikke længere vente på en ressource.

I mange systemer i dag, kan på mellemlang sigt scheduler rent faktisk udfører den rolle, den langsigtede scheduler, ved at behandle binære filer som "swappet ud processer" fra deres henrettelse. På denne måde, når et segment af den binære kræves det kan byttes ind på efterspørgsel, eller "dovne loaded".

Kortsigtet planlægning

Den kortsigtede scheduler afgør, hvilken af ​​klar, in-memory processer skal udføres efter et ur afbryde, en I / O interrupt, et operativsystem opkald eller en anden form for signal. Således den kortsigtede scheduler gør planlægning beslutninger langt hyppigere end de langsigtede eller midtvejsevalueringer planlæggere - en planlægning beslutning vil som et minimum skal foretages efter hver gang skive, og disse er meget kort. Dette scheduler kan være forebyggende, hvilket indebærer, at det er i stand til med magt at fjerne processer fra en CPU når den beslutter at tildele den CPU til en anden proces, eller ikke-forebyggende, i hvilket tilfælde planlæggeren ikke er i stand til at "tvinge" processer off CPU'en.

En forebyggende scheduler er afhængig af en programmerbar interval timer, der påberåber sig en interrupt handleren, der kører i kernel mode og implementerer planlægning funktion.

Dispatcher

En anden komponent, der er involveret i CPU-planlægning funktion er afsenderen, som er det modul, der giver kontrol over CPU'en til den valgte af kortsigtede scheduler proces. Den modtager kontrol i kernel-mode som følge af en interrupt eller systemet opkald. Funktionerne af en afsender indebærer følgende:

  • Kontekst afbrydere, hvor afsenderen gemmer tilstanden af ​​processen eller tråd, der tidligere var kører; afsenderen så indlæser oprindelige eller tidligere gemte tilstand af den nye proces.
  • Skift til bruger-tilstand.
  • Hoppe til den korrekte placering i brugerens program til at genstarte programmet angivet af sin nye tilstand.

Afsenderen skal være så hurtigt som muligt, idet den påberåbes under enhver proces switch. I løbet af kontekst switche, processoren er næsten inaktiv i en brøkdel af tid, bør derfor unødvendige sammenhæng switche undgås. Den tid det tager for afsenderen at stoppe en proces, og starte en anden er kendt som forsendelse latenstid.

Planlægning discipliner

Planlægning discipliner er algoritmer, der anvendes til distribution af ressourcer blandt partier, der samtidigt og asynkront anmoder herom. Planlægning discipliner anvendes i routere samt i operativsystemer, diskdrev, printere, mest indlejrede systemer mv

De vigtigste formål med planlægning algoritmer er at minimere ressource sult og for at sikre retfærdighed mellem parterne udnytter ressourcerne. Planlægning omhandler problemet med at beslutte, hvilken af ​​de udestående anmodninger skal afsættes ressourcer. Der er mange forskellige algoritmer planlægning. I dette afsnit introducerer vi flere af dem.

I pakkekoblede computernetværk og andre statistiske multiplexing, er begrebet en planlægning algoritme, der anvendes som alternativ til første mølle-kø af datapakker.

Den enkleste bedst-indsatsgrupper planlægning algoritmer er round-robin, fair kø, forholdsmæssigt rimelig planlægning og maksimal gennemstrømning. Hvis differentieret eller garanteret kvalitet af service tilbydes, i modsætning til bedst-indsats kommunikation, kan vægtet retfærdig kø udnyttes.

I avancerede pakkeradiounderstøtningsknuder trådløse netværk såsom HSDPA 3.5G cellulært system, kan kanal-afhængig planlægning anvendes til at drage fordel af kanal tilstandsinformation. Hvis kanalen er gunstige, kan gennemløb og systemet spektrale effektivitet øges. I endnu mere avancerede systemer såsom LTE, er planlægningen kombineres med kanal-afhængige dynamiske kanalallokering pakke-for-pakke, eller ved at tildele OFDMA multi-bærere eller andre frekvens-domænet udligning komponenter til brugerne, der bedst kan udnytte dem.

Først i først ud

Også kendt som First Come First Served, er den enkleste planlægning algoritme, FIFO simpelthen kø processer i den rækkefølge, de ankommer i klar kø.

  • Da kontekst kun afbrydere forekomme ved proces opsigelse, og ingen omlægning af processen køen er påkrævet, planlægning overliggende er minimal.
  • Gennemløb kan være lav, da lange processer kan holde CPU
  • Behandlingstid, kan ventetid og responstiden være høj for de samme grunde ovenfor
  • Ingen prioritering sker, således dette system har problemer møde proces deadlines.
  • Den manglende prioritering betyder, at så længe hver proces fuldfører vinder, er der ingen sult. I et miljø, hvor nogle processer muligvis ikke afsluttet, kan der være sult.
  • Den er baseret på kø
  • Her er C-koden til FCFS

Kortest resterende tid

Svarende til Korteste Job First. Med denne strategi planlæggeren arrangerer processer med den mindste anslåede behandlingstid resterende at være næste i køen. Dette kræver avanceret viden eller skøn over den tid, der kræves til en fremgangsmåde til at fuldføre.

  • Hvis en kortere proces ankommer under en anden proces 'udførelse, kan den aktuelt kørende proces afbrydes, opdele denne proces i to separate computing blokke. Dette skaber overskydende overliggende gennem yderligere kontekst skift. Planlæggeren skal også placere hver indgående proces til et bestemt sted i køen, skabe yderligere overhead.
  • Denne algoritme er designet til maksimal overførselshastighed i de fleste scenarier.
  • Ventetid og responstid stigning som den proces s beregningsmæssige krav stige. Da behandlingstid er baseret på ventetid plus behandlingstid, er længere processer væsentligt påvirket af dette. Samlet ventetid er mindre end FIFO, men da ingen proces til at vente på afslutningen af ​​den længste proces.
  • Ingen særlig opmærksomhed er givet til deadlines, kan programmøren kun forsøge at gøre processer med deadlines så korte som muligt.
  • Starvation er muligt, især i en travl system med mange små processer køres.
  • Denne politik bruges sjældent som af 2014.
  • For at bruge denne politik, vi skal have mindst to processer af forskellig prioritet

Fast prioritet forebyggende planlægning

Den OS tildeler en fast prioritet rang til enhver proces, og planlæggeren arrangerer processerne i klar kø i rækkefølge efter deres prioritet. Lavere prioritet processer bliver forstyrret af indgående højere prioritet processer.

  • Overhead er ikke minimal, det er heller ikke signifikant.
  • FPPs har ingen særlig fordel med hensyn til throughput end FIFO planlægning.
  • Hvis antallet af placeringer er begrænset det kan karakteriseres som en samling af FIFO køer, en for hvert prioriteret rangordning. Processer i lavere prioritet køer vælges kun, når alle de højere prioriterede køer er tomme.
  • Ventetid og responstid afhænger prioriteringen af ​​processen. Højere prioritet processer har mindre vente- og svartider.
  • Frister kan opfyldes ved at give processer med deadlines en højere prioritet.
  • Udsultning af lavere prioriterede processer er muligt med store mængder af høj prioritet processer kø for CPU-tid.

Round-robin planlægning

Planlæggeren tildeler en fast tidsenhed pr processen, og cykler gennem dem.

  • RR planlægning indebærer omfattende overhead, især med en lille tidsenhed.
  • Balanceret gennemløb mellem FCFS og SJF, er kortere job afsluttet hurtigere end i FCFS og længere processer er afsluttet hurtigere end i SJF.
  • God gennemsnitlige svartid, ventetid er afhængig af antallet af processer, og ikke gennemsnitlige proces længde.
  • På grund af høje ventetider, der frister sjældent mødtes i en ren RR-system.
  • Sult kan aldrig forekomme, da ingen prioritet. Rækkefølge af tidsenhed tildelingen er baseret på processen ankomsttidspunkt, svarende til FCFS.

Multilevel kø planlægning

Dette bruges til situationer, hvor processer er let inddelt i forskellige grupper. For eksempel er en almindelig opdeling mellem forgrunds- processer og baggrundsprocesser. Disse to typer af processer har forskellige respons-tid krav og så kan have forskellige planlægning behov. Det er meget nyttigt for delt hukommelse problemer.

Planlægning optimeringsproblemer

  • Open-shop planlægning
  • Job Shop Scheduling
  • Flow Shop Planlægning Problem

Manuel planlægning

En meget almindelig metode i indlejrede systemer er at manuelt at planlægge job. Dette kan for eksempel ske i en tidsmultiplekset måde. Undertiden kernen er opdelt i tre eller flere dele: Manuel planlægning, forebyggende og afbryde niveau. Nøjagtige metoder til planlægning job er ofte proprietære.

  • Ingen ressource sult problemer.
  • Meget høj forudsigelighed; tillader implementering af hårde realtidssystemer.
  • Næsten ingen overhead.
  • Må ikke være optimalt for alle programmer.
  • Effektivitet er helt afhængig af gennemførelsen.

Hvordan til at vælge en planlægning algoritme

Ved udformningen et operativsystem, skal en programmør overveje, hvilken planlægning algoritme vil udføre bedst for brugen af ​​systemet kommer til at se. Der er ingen universel "bedste" planlægning algoritme, og mange operativsystemer bruger forlænges eller kombinationer af de planlægning algoritmer ovenfor. For eksempel bruger Windows NT / XP / Vista en multilevel feedback-kø, en kombination af fast prioritet forebyggende planlægning, round-robin, og først i først ud. I dette system, kan tråde dynamisk øge eller mindske i prioriteret afhængigt af om den er blevet repareret allerede, eller hvis den har ventet udstrækning. Hver prioritetsniveau repræsenteres af sin egen kø, med round-robin planlægning blandt de højt prioriterede tråde og FIFO blandt de lavere. I denne forstand svartid er en forkortelse for de fleste tråde, og korte, men kritiske systemer tråde bliver gennemført meget hurtigt. Da tråde kan kun bruge én tidsenhed af round robin i højeste prioritet køen, kan sult være et problem for længere høj prioritet tråde.

Operativsystem proces scheduler implementeringer

Den anvendte algoritme kan være så simpelt som round-robin, hvor hver proces er givet lige gang i en cykel listen. Så proces A udfører for 1 ms, så proces B, så proces C, derefter tilbage til processen A.

Mere avancerede algoritmer tage hensyn proces prioritet eller betydningen af ​​processen. Dette giver nogle processer til at bruge mere tid end andre processer. Kernen bruger altid uanset ressourcer den har brug for for at sikre korrekt funktion af systemet, og så kan siges at have uendelig prioritet. I SMP systemer, er processor affinitet anses for at øge den samlede systemets ydeevne, selv om det kan medføre en proces i sig selv til at køre langsommere. Dette forbedrer generelt ydeevnen ved at reducere cache prygl.

OS / 360 og efterfølgere

IBM OS / 360 var til rådighed med tre forskellige opgavestyringsprogrammer. Forskellene var sådan, at varianterne ofte blev betragtet tre forskellige operativsystemer:

  • Det indre Sekventiel Scheduler mulighed, også kendt som den primære Kontrolprogram forudsat sekventiel udførelse af en enkelt strøm af arbejdspladser.
  • Multiple Sekventiel Scheduler mulighed, kendt som multiprogrammering med et fast antal opgaver, udførelse af flere samtidige arbejdspladser. Udførelse blev styret af en prioritet, som havde en standard for hver strøm eller kunne blive anmodet separat for hvert job. MFT-version II tilføjede delopgaver, som udføres. ved en prioritet baseret på det af moderselskabet jobbet. Hvert job stream definerede den maksimale mængde hukommelse, som kan anvendes af en hvilken som helst job i denne strøm.
  • Multiple Priority opgavestyringsprogrammer option, eller multiprogrammering med et variabelt antal Opgaver, figurerede delopgaver fra starten; hvert job anmodede prioritet og hukommelse det påkrævet, inden udførelsen.

Senere virtuelle storage-versioner af MVS tilføjet en Arbejdsbyrde manager funktion til planlæggeren, hvilket tidsplaner processor ressourcer i henhold til en omfattende ordning, defineret af installationen.

Vinduer

Meget tidlige MS-DOS og Microsoft Windows-systemer var ikke-multitasking, og som sådan ikke har et scheduler. Windows 3.1x brugte en ikke-forebyggende scheduler, hvilket betyder, at det ikke afbryde programmer. Det har påberåbt sig det program for at afslutte eller fortælle OS, at det ikke behøver processoren, så det kunne gå videre til en anden proces. Dette er normalt kaldes kooperativ multitasking. Windows 95 introducerede en rudimentær forebyggende scheduler; men for bagudkompatibel understøttelse valgt at lade 16 bit programmer kører uden fortegningsret.

Windows NT-baserede operativsystemer bruger en multilevel feedback-kø. 32 prioriterede niveauer er defineret, 0 til 31, med prioritering 0 gennem 15 bliver "normale" prioriteringer og prioriteringer 16 gennem 31 bliver bløde prioriteter realtid, kræver privilegier tildele. 0 er reserveret til operativsystemet. Brugerne kan vælge 5 af disse prioriteter at tildele til en kørende program fra Task Manager, eller via tråd management API'er. Kernen kan ændre prioriteten niveau af en tråd afhængigt af dens I / O og CPU-forbrug og om det er interaktivt, hæve prioriteringen af ​​interaktiv og I / O afgrænset processer og sænke den for CPU bundet processer, for at øge lydhørhed interaktiv anvendelser. Planlæggeren blev ændret i Windows Vista til at bruge cyklen tæller register over moderne processorer til at holde styr på, præcis hvor mange CPU-cyklusser en tråd har udført, i stedet for bare at bruge et interval-timer interrupt rutine. Vista bruger også en prioriteret scheduler for I / O-kø, så den disk defragmenters og andre sådanne programmer ikke interfererer med forgrunden operationer.

Mac OS

Mac OS 9 bruger kooperativ planlægning for tråde, hvor den ene proces styrer flere kooperative tråde, og giver også forebyggende planlægning for MP opgaver. Kernen tidsplaner MP opgaver ved hjælp af en forebyggende planlægning algoritme. Alle Process Manager processer kører inden for en særlig MP opgave, kaldes "blå opgave". Disse processer er planlagt samvirkende anvendelse af en round-robin planlægningsalgoritme; en proces giver styring af processoren til en anden proces ved eksplicit at kalde en blokeringsfunktion såsom. Hver proces har sin egen kopi af Thread Manager, tidsplaner, der processens tråde kooperativt; en tråd giver kontrol af processoren til en anden tråd ved at ringe eller.

Mac OS X bruger en multilevel feedback-kø, med fire prioriterede bånd til tråde - normal, system, høj prioritet, kun kernel-mode, og real-time. Tråde er planlagt forebyggende; Mac OS X understøtter også samvirkende planlagte tråde i gennemførelsen af ​​tråden manager i Carbon.

AIX

I AIX Version 4 er der tre mulige værdier for tråd planlægning politik:

  • First In, First Out: Når en tråd med denne politik er planlagt, det kører til afslutning, medmindre det er blokeret, er det frivilligt giver kontrol af CPU, eller en højere prioritet tråd bliver dispatchable. Kun fast prioriterede tråde kan have en FIFO planlægning politik.
  • Round Robin: Dette svarer til AIX Version 3 scheduler round-robin der er baseret på 10ms tidsafsnit. Når en RR tråd har kontrol ved slutningen af ​​tidsafsnittet, flytter det til halen af ​​køen af ​​Afsendte tråde af dens prioritet. Kun fast prioriterede tråde kan have en Round Robin planlægning politik.
  • ANDRE: Denne politik er defineret ved POSIX1003.4a som implementering-defineret. I AIX version 4, er denne politik defineres for at svare til RR, bortset fra, at det gælder for tråde med løstsiddende prioritet. Den nye beregning af den kørende tråd prioritet ved hvert ur interrupt betyder, at en tråd kan miste kontrollen, fordi dens prioritet værdi er steget over en anden dispatchable tråd. Dette er AIX Version 3 adfærd.

Tråde er primært af interesse for applikationer, der i øjeblikket består af flere asynkrone processer. Disse programmer kan pålægge en lettere belastning på systemet, hvis konverteret til en flertrådet struktur.

AIX 5 implementerer følgende planlægning politikker: FIFO, round robin, og en retfærdig round robin. FIFO politik har tre forskellige implementeringer: FIFO, FIFO2 og FIFO3. Round robin politik er opkaldt SCHED_RR i AIX, og messen round robin kaldes SCHED_OTHER.

Linux

Linux 2.4

I Linux 2.4, en O scheduler med en multilevel feedback-kø med prioriterede niveauer lige 0-140 blev anvendt; 0-99 er reserveret til realtid opgaver og 100-140 betragtes pæne opgave niveauer. For real-time opgaver, den tid kvante til at skifte processer var ca. 200 ms, og for nice opgaver ca. 10 ms. Planlæggeren løb gennem flugt køen af ​​alle færdige processer, lade den højeste prioritet processer gå først og køre gennem deres tid skiver, hvorefter de vil blive placeret i en udløbet kø. Når den aktive køen er tom den udløbne køen bliver den aktive køen og vice versa.

Men nogle Enterprise Linux distributioner såsom SUSE Linux Enterprise Server erstattet denne scheduler med en tilbageføre af O scheduler til Linux 2.4-kernen, der anvendes af distributionen.

Linux 2.6.0 til Linux 2.6.22

Fra version 2.6 til 2.6.22, kernen bruges en O scheduler udviklet af Ingo Molnar og mange andre kerne udviklere under Linux 2.5 udvikling. For mange kerne i tidsramme, Con Kolivas udviklet patch sæt, som forbedrede interaktivitet med denne scheduler eller endda erstattet det med hans egne opgavestyringsprogrammer.

Siden Linux 2.6.23

Con Kolivas arbejde, mest markant hans implementering af "fair planlægning" med navnet "Roterende Staircase Deadline", inspireret Ingo Molnár at udvikle Helt fair Scheduler som en erstatning for den tidligere O scheduler, kreditering Kolivas i hans meddelelse.

Den Helt fair Scheduler bruger en godt undersøgt, klassiske planlægning algoritme kaldet retfærdig kø oprindeligt opfundet til pakke-netværk. Fair kø havde været tidligere anvendt på CPU planlægning under navnet skridtlængde planlægning.

Messen kø CFS scheduler har en planlægning kompleksitet O, hvor N er antallet af opgaver i runqueue. Valg af en opgave kan gøres i konstant tid, men genindførte en opgave, efter at den har kørt kræver O operationer, fordi kørslen køen er implementeret som en rød-sort træ.

CFS er den første gennemførelse af en retfærdig kø proces scheduler meget udbredt i et generelt formål operativsystem.

The Brain fuck Scheduler er et alternativ til CFS.

FreeBSD

FreeBSD bruger en multilevel feedback-kø med prioriteringer spænder 0-255. 0-63 er reserveret til interrupts, 64-127 til den øverste halvdel af kernen, 128-159 for real-time bruger tråde, 160-223 for tid-delt bruger tråde, og 224-255 til tomgang bruger tråde. Også, som Linux, bruger den aktive kø opsætning, men det har også en inaktiv kø.

NetBSD

NetBSD bruger en multilevel feedback-kø med prioriteringer spænder 0-223. 0-63 er reserveret til tid-delt tråde, 64-95 for bruger tråde, der trådte kerne plads, 96-128 til kernel tråde, 128-191 for bruger real-time tråde, og 192-223 for software interrupts.

Solaris

Solaris bruger en multilevel feedback-kø med prioriteringer på mellem 0 og 169. Prioriteter 0-59 er reserveret til tid-delt tråde, 60-99 for system tråde, 100-159 for real-time tråde, og 160-169 for lav prioritet interrupts . I modsætning til Linux, når en proces er færdig ved hjælp af sin tid kvante, er det givet en ny prioritet og sat tilbage i køen. Solaris 9 indført to nye planlægning klasser, nemlig fast prioritet klasse og rimelig andel klasse. Trådene med fast prioritet har samme prioritet område som den for tiden deling klasse, men deres prioriteter er ikke dynamisk justeret. Messen planlægning klasse bruger CPU-aktier til at prioritere tråde til planlægning beslutninger. CPU aktier angiver retten til at CPU-ressourcer. De er allokeret til en række processer, som er kollektivt kendt som et projekt.

Resumé

  0   0

Kommentarer - 0

Ingen kommentar

Tilføj en kommentar

smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile
Tegn tilbage: 3000
captcha