HTG forklarer hvordan fungerer en CPU egentlig?
De fleste ting i en datamaskin er relativt enkle å forstå: RAM, lagring, periferiutstyr og programvaren fungerer sammen for å lage en datamaskinfunksjon. Men hjertet i systemet ditt, CPU, virker som magi, selv til mange tech folk. Her vil vi gjøre vårt beste for å bryte det ned.
Det meste av forskningen for denne artikkelen kommer fra "Men hvordan vet det?" Av J. Clark Scott. Det er en fantastisk lese, går inn i mye mer dybde enn denne artikkelen vil, og er vel verdt parpengene på Amazon.
Ett notat før vi begynner: Moderne CPUer er størrelsesordener mer komplekse enn det vi beskriver her. Det er nesten umulig for en person å forstå alle nyanser av en brikke med over en milliard transistorer. De grunnleggende prinsippene for hvordan det hele passer sammen forblir det samme, og forståelse av det grunnleggende vil gi deg en bedre forståelse av moderne systemer.
Starter liten
Datamaskiner opererer i binær. De forstår bare to stater: på og av. For å utføre beregninger i binær, bruker de det som kalles en transistor. Transistoren tillater bare at kildestrømmen strømmer gjennom den til avløpet hvis det er strøm over porten. I hovedsak danner dette en binær bryter som kutter av ledningen avhengig av et andre inngangssignal.
Moderne datamaskiner bruker milliarder transistorer til å utføre beregninger, men på de laveste nivåene trenger du bare en håndfull til å danne de mest grunnleggende komponentene, kjent som porter.
Logic Gates
Stakk noen transistorer riktig, og du har det som er kjent som en logisk gate. Logiske porter tar to binære innganger, utfører en operasjon på dem, og returnerer en utgang. ELLER-porten, for eksempel, returnerer sann hvis en av inngangene er ekte. AND-porten kontrollerer om begge innganger er sanne, XOR kontrollerer om bare en av inngangene er sanne, og N-varianter (NOR, NAND og XNOR) er inverterte versjoner av deres baseporter.
Å gjøre matte med porter
Med bare to porter kan du gjøre grunnleggende binær tillegg. Dette diagrammet ovenfor viser en halv adder, opprettet ved hjelp av Logicly, en gratis online lekeplass for logiske porter. XOR-porten her vil slå på hvis bare en av inngangene er på, men ikke begge deler. AND-porten slås på hvis begge innganger er på, men forblir av hvis det ikke er inngang. Så hvis begge er på, holder XOR seg av, og AND-porten slås på, og kommer til riktig svar på to:
Dette gir oss et enkelt oppsett med tre forskjellige utganger: null, en og to. Men en bit kan ikke lagre noe høyere enn 1, og denne maskinen er ikke så nyttig som den bare løser en av de enkleste matteproblemer som er mulig. Men dette er bare en halv adder, og hvis du kobler to av dem med et annet innspill, får du en full adder:
Full adder har tre innganger - de to tallene som skal legges til, og en "bære". Bæren brukes når sluttnummeret overskrider det som kan lagres i en enkeltbit. Fulle adders vil bli koblet i en kjede, og bærebiten går fra en adder til den neste. Bæren legges til resultatet av XOR-porten i den første halvdelen, og det er en ekstra ELLER-port for å håndtere begge tilfeller når det som måtte være på.
Når begge innganger er på, slår bære på og sender den til neste fulladder i kjeden:
Og dette handler om så komplisert som tillegg blir. Å flytte opp til flere biter betyr egentlig bare flere fulle adders i en lengre kjede.
De fleste andre matematiske operasjoner kan gjøres med tillegg; Multiplikasjon er bare gjentatt tillegg, subtraksjon kan gjøres med litt fancy bit inversjon, og divisjon er bare gjentatt subtraksjon. Og mens alle moderne datamaskiner har maskinvarebaserte løsninger for å øke hastigheten på mer kompliserte operasjoner, kan du teknisk sett gjøre alt sammen med full adder.
Bussen og minnet
Akkurat nå er datamaskinen vår ikke noe mer enn en dårlig kalkulator. Dette er fordi det ikke kan huske noe, og gjør ingenting med sine utganger. Vist over er en minnecelle, som kan gjøre alt dette. Under hetten bruker den mange NAND-porter, og i virkeligheten kan det være ganske forskjellig avhengig av lagringsteknikken, men funksjonen er den samme. Du gir det noen innganger, slår på "skrive" -biten, og den lagrer inngangene inne i cellen. Dette er ikke bare en minnecelle, da vi også trenger en måte å lese informasjon fra den. Dette er gjort med en enabler, som er en samling av AND-porter for hver bit i minnet, alle knyttet til en annen inngang, "les" -biten. Skrive- og lesebiter kalles også "set" og "enable" også.
Hele denne pakken er pakket inn i det som er kjent som et register. Disse registre er koblet til bussen, som er et bunt av ledninger som kjører rundt hele systemet, koblet til hver komponent. Selv moderne datamaskiner har en buss, selv om de kan ha flere busser for å forbedre multitaskingsytelsen.
Hvert register har fortsatt en skrive- og lesebit, men i dette oppsettet er inngang og utgang det samme. Dette er faktisk bra. For eksempel. Hvis du ønsket å kopiere innholdet av R1 til R2, ville du slå på lesebiten for R1, som ville skyve innholdet av R1 på bussen. Mens lesebiten er på, slår du på skrivebiten for R2, som vil kopiere bussinnholdet til R2.
Registerene brukes til å lage RAM også. RAM legges ofte ut i et rutenettet, med ledninger som går i to retninger:
Dekodene tar en binærinngang og slår på den tilsvarende nummererte ledningen. For eksempel er "11" 3 i binært, det høyeste 2-bits nummeret, slik at dekoderen slår på den høyeste ledningen. Ved hvert skjæringspunkt er det et register. Alle disse er koblet til sentralbussen, og til en sentral skrive- og leseinngang. Både lese- og skriveinngangen vil bare slås på hvis de to ledningene krysser over registret, er også på, slik at du kan velge registeret for å skrive og lese. Igjen, moderne RAM er langt mer komplisert, men dette oppsettet virker fortsatt.
Klokken, Stepper og dekoderen
Registerene brukes overalt og er det grunnleggende verktøyet for å flytte data rundt og lagre informasjon i CPU. Så hva forteller dem å flytte ting rundt?
Klokken er den første komponenten i kjernen til CPUen og vil slå av og på med et bestemt intervall målt i hertz eller sykluser per sekund. Dette er hastigheten du ser annonsert sammen med CPUer; en 5 GHz-chip kan utføre 5 milliarder sykluser per sekund. Klokkehastighet er ofte en veldig god beregning for hvor raskt en CPU er.
Klokken har tre forskjellige tilstander: baseklokke, aktiveringsklokke og innstilt klokke. Baseklokken vil være på for en halv syklus, og av for den andre halvdelen. Aktiver klokken brukes til å slå på registre og må være på for lenger for å sikre at dataene er aktivert. Den angitte klokken må alltid være på samtidig med aktiveringsklokke, ellers kan feilaktige data skrives.
Klokken er koblet til steppen, som vil telle fra et til det maksimale trinnet, og tilbakestille seg tilbake til en når den er ferdig. Klokken er også koblet til OG-portene for hvert register som CPU kan skrive til:
Disse OG-portene er også koblet til utgangen av en annen komponent, instruksjonsdekoderen. Instruksjonsdekoderen tar en instruksjon som "SET R2 TO R1" og dekoder den til noe som CPUen kan forstå. Den har sitt eget interne register, kalt "Instruksjonsregister", som er der den gjeldende operasjonen er lagret. Hvor nøyaktig det kommer, kommer dette ned til systemet du kjører på, men når det er avkodd, vil det slå på riktig sett og aktivere biter for de riktige registre som vil avfyres i henhold til klokken.
Programinstruksjonene lagres i RAM (eller L1-cache på moderne systemer, nærmere CPU). Siden programdata lagres i registre, kan det, akkurat som alle andre variabler, manipuleres på flyet for å hoppe rundt programmet. Dette er hvordan programmer får sin struktur, med sløyfer og om setninger. En hoppinstruksjon angir gjeldende plassering i minnet om at instruksjonsdekoderen leser fra til et annet sted.
Hvordan det kommer sammen
Nå er vår brutale overforenkling av hvordan en CPU fungerer, fullført. Hovedbussen spenner over hele systemet og kobler seg til alle registre. Den fulle adders, sammen med en rekke andre operasjoner, er pakket inn i den aritmetiske logiske enheten, eller ALU. Denne ALU vil ha tilkoblinger til bussen, og vil også ha egne registre for lagring av det andre nummeret den opererer på.
For å utføre en beregning lastes programdata fra system-RAM til kontrollseksjonen. Kontrollseksjonen leser to tall fra RAM, laster den første inn i ALUs instruksjonsregister, og laster deretter den andre på bussen. I mellomtiden sender den ALU en instruksjonskode som forteller hva som skal gjøres. ALU utfører da alle beregningene og lagrer resultatet i et annet register, som CPU kan lese fra og deretter fortsette prosessen.
Bilde Kreditt: Rost9 / Shutterstock