Najważniejszym elementem współczesnego komputera jest mikroprocesor. Łatwo go znaleźć na płycie głównej, gdyż cechuje się sporymi rozmiarami (w stosunku do innych elementów) oraz najczęściej jest zaopatrzony w duży radiator z tzw. coolerem (wiatraczkiem, który go chłodzi). Mimo, iż jest to jeden układ scalony, jego wewnętrzna struktura jest bardzo skomplikowana. Mikroprocesor posiada tzw. listę rozkazów — przez analogię do języka, którym posługują się ludzie można powiedzieć, że lista rozkazów to słownik wyrazów, które rozumie procesor. Z tych słów — rozkazów można zbudować dowolny program. Język mikroprocesora nazywamy językiem maszynowym, a jego bardziej zrozumiały dla ludzi zapis to asembler.
Niezależnie od producenta i typu, każdy procesor składa się z kilku podstawowych elementów:
- jednostki sterującej, której zadaniem jest wykonywanie instrukcji programu i sterowanie przepływem danych
- jednostki arytmetyczno logicznej (ALU – ang. Arithmetic logic unit), która zajmuje się realizowaniem prostych operacji matematycznych (dodawaniem i odejmowaniem liczb całkowitych) oraz porównywaniem prostych formatów danych
- zestawu rejestrów, które przechowują dane do których wymagany jest bardzo szybki dostęp
- interfejsów magistrali zapewniających łączność procesora ze światem zewnętrznym.
Procesor może dodatkowo zawierać pewne dodatkowe elementy:
- pamięć cache, w której przechowywane są poprzednie i następne instrukcje, które wykona jednostka sterująca oraz najczęściej używane przez program dane. Pamięć cache dzielimy na cache rozkazów i cache danych. Zwykle mają one rozmiar 32 — 512 KB. Pamięć ta znacznie przyśpiesza działanie programów (łatwo się o tym przekonać poprzez jej wyłączenie – można to uzyskać wybierając w BIOS-ie komputera odpowiednią opcję). Wykorzystuje się tu fakt, że większość programów składa się z cyklicznie wykonywanych stosunkowo niewielkich procedur operujących na niewielkiej ilości danych. Dzięki temu wystarczy raz przesłać do procesora potrzebne informacje z wolnej pamięci zewnętrznej (znajdującej się na płycie głównej), następnie jednostka sterująca pobiera potrzebne dane z bardzo szybkiej pamięci cache. Pamięć ta może znajdować się zarówno w procesorze jak i na płycie głównej. Wyróżniamy różne poziomy pamięci cache: L1, L2 i L3. Obecnie praktycznie wykorzystywane są poziomy L1 i L2.
- Elementy sterujące poborem mocy procesora. Umożliwiają one wyłączenie części niepotrzebnych układów i spowolnienie zegara procesora, co zmniejsza pobór prądu. Jest to szczególnie ważne w notebookach dzięki czemu można znacznie przedłużyć czas działania komputera bez ładowania baterii.
Szczególnym rodzajem procesora są tzw. mikroprocesory jednoukładowe. Oprócz wymienionych powyżej elementów zawierają one dodatkowo pamięć RAM i ROM z zapisanym programem oraz porty wejścia-wyjścia. Stanowią one jakby kompletny komputer, który może sterować innymi urządzeniami. Najbliższy mikroprocesor jednoukładowy znajduje się ... 2 cm pod twoimi palcami. Klawiatura to w rzeczywistości kompletny mikrokomputer zajmujący się przetwarzaniem sygnałów powstających przy naciskaniu klawiszy na odpowiednie kody, które są następnie transmitowane do właściwego komputera. Oprócz klawiatury mikroprocesory układowe są stosowane do sterowania różnymi urządzeniami w przemyśle oraz w sprzęcie AGD (kuchenki mikrofalowe, pralki, itd.).
W ostatnich latach szeroko rozpowszechniły się tzw. procesory sygnałowe DSP (ang. Digital Signal Processing). Są one podobne do mikroprocesorów jednoukładowych z bardzo uproszczoną listą rozkazów, dodatkowo zawierają przetwornik analogowo-cyfrowy i cyfrowo-analogowy. Dzięki temu mogą pobierać z zewnątrz jakiś analogowy sygnał, który po przetworzeniu na postać cyfrową jest przekształcany przez program mikroprocesora. Następnie jest z powrotem konwertowany na postać analogową. Procesory DSP znajdują zastosowanie w modemach, odtwarzaczach CD i różnych urządzeniach pomiarowych.
Poniżej opiszemy budowę i działanie procesora.
Wydawać by się mogło, że język maszynowy (i jego symboliczny zapis — asembler) jest najprostszym językiem, którym posługuje się mikroprocesor. W rzeczywistości jest on pewnym rodzajem języka interpretowanego, którego interpreter zapisany jest w tzw. mikrokodzie zawartym w pamięci ROM mikroprocesora. Mikrokod składa się z instrukcji bezpośrednio sterujących różnymi cyfrowymi sygnałami w mikroprocesorze. Nie jest on dostępny dla użytkownika, jest umieszczany w mikroprocesorze podczas jego produkcji .
Szybkość działania mikroprocesora zależna jest oprócz jego budowy od sprawności mikrokodu. Im więcej „rozumie” on instrukcji tym łatwiej pisać skomplikowane programy w języku asemblera. Z drugiej strony taki nadmiar niepotrzebnych instrukcji, które można zastąpić sekwencjami kolejno wykonywanych prostszych poleceń znacznie zwalnia prędkość interpretacji przez mikrokod. Stało się to podstawą podziału procesorów na dwa podstawowe typy:
- procesory RISC (ang. Reduced Instruction Set Computer)
- oraz procesory CISC (ang. Complex Instruction Set Computer).
Procesory CISC realizują setki instrukcji, dzięki czemu znacznie łatwiej napisać na nie oprogramowanie. Przykładami tego typu procesorów są procesory Intel Pentium, AMD Athlon, Duron itd. Procesory RISC (np. SPARC, MIPS) realizują kilkadziesiąt podstawowych instrukcji. Dzięki temu działają one znacznie szybciej, chociaż są bardziej kłopotliwe w programowaniu. Niektóre mikroprocesory RISC nie zawierają mikrokodu, a rozkazy są bezpośrednio interpretowane przez logikę procesora.
Tak naprawdę wspomniane procesory Pentium są procesorami RISC, których program emuluje skomplikowaną listę rozkazów procesorów CISC. Umożliwia to zwiększenie szybkości działania procesora, jednocześnie udostępniając zaawansowaną listę rozkazów ułatwiajacą programowanie.
Cechą współczesnych procesorów jest tzw. przetwarzanie potokowe. Ponieważ procesor składa się z kilku niezależnych układów, pewne instrukcje mogą być wykonywane równolegle. Kiedy instrukcja zostanie zdekodowana przez układ kontrolny procesora jej dalszą realizacją zajmuje się inny moduł. W tym czasie jednostka sterująca jest wolna, dzięki przetwarzaniu potokowemu może ona w międzyczasie zająć się interpretacją kolejnej instrukcji. Podobnie w celu zwiększenia mocy obliczeniowej można powielić jednostki ALU. Ponieważ większość operacji matematycznych można przeprowadzać równolegle, w efekcie proces ten zwiększa liniowo moc obliczeniową procesora. Pewnym wyjątkiem są instrukcje warunkowe i skoki. Ponieważ w tym przypadku wykonywanie kolejnych instrukcji zależne jest od wyniku poprzedniej operacji, ich wykonanie jest wstrzymywane do czasu zakończenia realizacji instrukcji warunkowej.
Ponieważ instrukcje warunkowe i skoki stanowią ok. 30% instrukcji programu, aby przyśpieszyć działanie po natrafieniu na takie instrukcje procesor realizuje program tak jakby skok nie miał nastąpić. W momencie kiedy to założenie staje się prawdziwe, kolejnych kilka instrukcji jest już wykonywanych nie generując żadnego opóźnienia. W przypadku konieczności wykonania skoku ich rezultaty są po prostu anulowane, a interpretacja instrukcji odbywa się od początku w nowym miejscu. W niektórych procesorach po natrafieniu na instrukcję warunkową mikroprocesor równolegle realizuje obydwie alternatywy. Wynik operacji porównania decyduje, która alternatywa staje się obowiązującą. Oczywiście ten algorytm znacznie komplikuje budowę procesora, ale dzięki temu szybkość realizacji programu wzrasta wielokrotnie.
W każdym przypadku szybkość procesora jest ograniczana poprzez konieczność pobierania i kolejnego wykonywania instrukcji. Ograniczenie to znane jest jako wąskie gardło von Neumanna. Alternatywą do zwiększania szybkości działania procesora jest łączenie razem wielu procesorów i tworzenie tzw. komputerów równoległych. Ich moc obliczeniowa w pewnych zastosowaniach jest sumą mocy poszczególnych procesorów. Wiele zjawisk fizycznych może być interpretowanych równolegle, np. proces interpretacji obrazu nie wymaga szeregowej analizy poszczególnych pikseli. Tak więc jeśli zastosujemy wiele procesorów, to taka analiza zostanie zakończona o wiele szybciej. Prostszym przykładem może być obliczanie iloczynu kilku zmiennych: y=a1*a2*a3*a4. Jeśli mamy do dyspozycji jeden procesor, to musimy kolejno wykonać 3 mnożenia. W przypadku maszyny dwuprocesorowej wykonujemy co prawda nadal 3 mnożenia, ale dwa z nich możemy wykonywać wównolegle. W pierwszym etapie jednocześnie obliczamy iloczyny b1=a1*a2 i b2=a3*a4, w drugim etapie wykonujemy jedno mnożenie wyników pośrednich b1*b2 uzyskując wynik. W efekcie to samo równanie zostało obliczone o 1/3 szybciej. Jedyną wadą komputerów wieloprocesorowych jest trudność pisania oprogramowania, które mogłoby wykorzystywać ich możliwości.