HTG forklarer, hvordan virker en CPU faktisk?
De fleste ting i en computer er relativt enkle at forstå: RAM, lagerplads, periferiudstyr og softwaren arbejder sammen for at lave en computerfunktion. Men hjertet i dit system, CPU'en, virker som magi selv for mange techfolk. Her vil vi gøre vores bedste for at bryde det ned.
Det meste af forskningen til denne artikel kommer fra "But How Do It Know?" Af J. Clark Scott. Det er en fantastisk læsning, går i langt mere dybde end denne artikel vil, og er værd at parret bucks på Amazon.
En note før vi begynder: Moderne CPU'er er størrelsesordener mere komplekse end det vi beskriver her. Det er næsten umuligt for en person at forstå enhver nuance af en chip med over en milliard transistorer. De grundlæggende principper for hvordan det hele passer sammen forbliver det samme, og forståelse af det grundlæggende vil give dig en bedre forståelse af moderne systemer.
Starter Lille
Computere opererer i binære. De forstår kun to stater: til og fra. For at udføre beregninger i binær, bruger de, hvad der hedder en transistor. Transistoren tillader kun kildestrømmen at strømme gennem den til drænet, hvis der er strøm over porten. I det væsentlige danner dette en binærkontakt, som skærer ledningen af afhængigt af et andet indgangssignal.
Moderne computere bruger milliarder transistorer til at udføre beregninger, men på de laveste niveauer behøver du kun en håndfuld til at danne de mest grundlæggende komponenter, kendt som porte.
Logiske Gates
Stak nogle transistorer korrekt, og du har hvad der er kendt som en logisk gate. Logiske porte tager to binære indgange, udfører en operation på dem og returnerer et output. ELLER-porten returnerer f.eks. Sandt, hvis en af indgangene er sande. AND-porten kontrollerer, om begge input er sande, XOR kontrollerer, om kun en af indgangene er sande, og N-varianterne (NOR, NAND og XNOR) er inverterede versioner af deres basisporte.
Gør mat med porte
Med kun to porte kan du gøre grundlæggende binær tilsætning. Dette diagram ovenfor viser en halv adder, skabt ved hjælp af Logicly, en gratis online legeplads til logiske porte. XOR-porten her tænder, hvis kun en af indgangene er tændt, men ikke begge dele. AND-porten tændes, hvis begge indgange er tændt, men forbliver slukket, hvis der ikke er input. Så hvis begge er på, forbliver XOR slukket, og AND-porten tænder og kommer til det rigtige svar på to:
Dette giver os et simpelt setup med tre forskellige udgange: nul, en og to. Men en bit kan ikke gemme noget højere end 1, og denne maskine er ikke for nyttig, da den kun løser en af de enkleste matematiske problemer. Men det er kun en halv adder, og hvis du forbinder to af dem med et andet input, får du en fuld adder:
Den fulde adder har tre indgange - de to tal, der skal tilføjes, og en "carry". Bæren bruges, når det endelige tal overstiger det, der kan gemmes i en enkelt bit. Fuld adders vil være forbundet i en kæde, og bærebogen er gået fra den ene adder til den næste. Bæren tilføjes til resultatet af XOR-porten i den første halvdel, og der er en ekstra ELLER-port til at håndtere begge tilfælde, når den så der skal være på.
Når begge indgange er tændt, tændes bærebølgen og sender den til næste fulde addere i kæden:
Og det handler om så kompleks som tilføjelsen får. At flytte op til flere bits betyder stort set bare flere fulde adders i en længere kæde.
De fleste andre matematiske operationer kan gøres med tilføjelse; multiplikation er bare gentaget tilføjelse, subtraktion kan gøres med nogle fancy bit inversion, og division er bare gentaget subtraktion. Og mens alle moderne computere har hardwarebaserede løsninger til at fremskynde mere komplicerede operationer, kan du teknisk set gøre det hele med den fulde adder.
Bussen og hukommelsen
Lige nu er vores computer ikke mere end en dårlig regnemaskine. Dette er fordi det ikke kan huske noget, og gør ikke noget med sine udgange. Vist ovenstående er en hukommelsescelle, som kan gøre alt det. Under emhætten bruger den mange NAND-porte, og i virkeligheden kan det være helt anderledes afhængigt af lagringsteknikken, men dens funktion er den samme. Du giver det nogle input, tænd 'skrive', og det gemmer indgangene inde i cellen. Dette er ikke kun en hukommelsescelle, da vi også har brug for en måde at læse informationer fra. Dette gøres med en enabler, som er en samling af AND-porte for hver bit i hukommelsen, alle bundet til en anden indgang, "læs" -biten. Skriv- og læsebitene kaldes også "sæt" og "aktiver" også.
Hele denne pakke er pakket ind i det såkaldte register. Disse registre er forbundet til bussen, som er et bundt af ledninger, der kører rundt i hele systemet, forbundet med hver komponent. Selv moderne computere har en bus, selv om de måske har flere busser til at forbedre multitaskingsydelsen.
Hvert register har stadig en skrive- og læsebit, men i denne opsætning er input og output det samme. Dette er faktisk godt. For eksempel. Hvis du ønskede at kopiere indholdet af R1 til R2, ville du tænde læsebiten for R1, som ville skubbe indholdet af R1 på bussen. Mens læsebitten er tændt, vil du tænde skrivebiten for R2, som ville kopiere busindholdet til R2.
Registre bruges til at lave RAM også. RAM er ofte lagt i et gitter, med ledninger i to retninger:
Dekoderne tager en binær indgang og tænder den tilsvarende nummererede ledning. For eksempel er "11" 3 i binært, det højeste 2-bit nummer, så dekoderen vil tænde den højeste ledning. Ved hvert kryds er der et register. Alle disse er forbundet med centralbussen og til en central skrive- og læseindgang. Både læsnings- og skriveindtastningen tændes kun, hvis de to ledninger krydser over registret også er aktiveret, hvilket giver dig mulighed for at vælge registeret, hvorfra du kan skrive og læse. Igen er moderne RAM langt mere kompliceret, men denne opsætning virker stadig.
Uret, Stepper og dekoderen
Registre bruges overalt og er det grundlæggende værktøj til at flytte data rundt og lagre oplysninger i CPU'en. Så hvad fortæller dem at flytte tingene rundt?
Uret er den første komponent i kernen i CPU'en og vil slukke og tænde ved et bestemt interval målt i hertz eller cykler pr. Sekund. Dette er den hastighed, du ser annonceret sammen med CPU'er; en 5 GHz chip kan udføre 5 milliarder cykler per sekund. Urhastighed er ofte en meget god måling for, hvor hurtigt en CPU er.
Uret har tre forskellige tilstande: baseklokke, aktiveringsuret og det indstillede ur. Baseklokket vil være tændt i en halv cyklus og ud for den anden halvdel. Aktiverklokken bruges til at tænde registre og skal være tændt for at sikre, at dataene er aktiverede. Det indstillede ur skal altid være tændt samtidig med aktiveringsklokken, ellers kan der indtastes forkerte data.
Uret er forbundet til stepper, som vil tælle fra et til det maksimale trin, og nulstille sig tilbage til en, når den er færdig. Uret er også forbundet til OG porte for hvert register, som CPU'en kan skrive til:
Disse OG-porte er også forbundet med output fra en anden komponent, instruktion dekoderen. Instruktionsdekoderen tager en instruktion som "SET R2 TO R1" og dekoder den til noget, som CPU'en kan forstå. Den har sit eget interne register, kaldet "Instruktionsregister", hvor den aktuelle operation er gemt. Hvor præcis det sker, kommer det ned til det system, du kører på, men når det er afkodet, vil det tænde det korrekte sæt og aktivere bits til de korrekte registre, som vil slukke i overensstemmelse med uret.
Programinstruktioner opbevares i RAM (eller L1-cache på moderne systemer, tættere på CPU'en). Da programdata er gemt i registre, kan det ligesom alle andre variabler manipuleres på flugt for at hoppe rundt i programmet. Dette er hvordan programmer får deres struktur, med sløjfer og hvis udsagn. En springinstruktion angiver den aktuelle placering i hukommelsen, at instruktionsdekoderen læser fra til en anden placering.
Hvordan det hele kommer sammen
Nu er vores brutale overforenkling af, hvordan en CPU fungerer, komplet. Hovedbussen spænder hele systemet og forbinder til alle registre. De fulde adders sammen med en masse andre operationer pakkes ind i den aritmetiske logiske enhed eller ALU. Denne ALU vil have forbindelser til bussen og vil også have sine egne registre til opbevaring af det andet nummer, den opererer på.
For at udføre en beregning lægges programdata fra system-RAM til kontrolafsnittet. Kontrolsektionen læser to tal fra RAM, lægger den første i ALUs instruktionsregister, og lægger derefter den anden på bussen. I mellemtiden sender den ALU en instruktionskode, der fortæller hvad der skal gøres. ALU udfører derefter alle beregningerne og lagrer resultatet i et andet register, som CPU'en kan læse fra og derefter fortsætte processen.
Billedkredit: Rost9 / Shutterstock