Jak działa komputer (procesor) i skąd wie jak wykonywać kod?

0

Zdałem sobie sprawę, że tak naprawdę to nie wiem jak działa komputer. Brakuje mi w planie studiów strasznie programowania niskopoziomowego, to by mi wiele wyjaśniło. Załóżmy że mam napisany jakiś program, co np. zlicza sumę liczb od 0 do 100. Można to napisać za pomocą pętli, ale przecież procesor chyba tego nie zrozumie, więc kod jest tłumaczony do postaci asemblerowej, mam rację? Jak to jest, że jeden program napisany w danym jezyku, działa na wielu procesorach od starych inteli, do najnowszych, na różnych AMD, i jeszcze innych procesorach?
Czy wszystkie procesory mają takie same instrukcje asemblerowe?
No to teraz idziemy dalej.
Skąd procesor ma wiedzieć jak wykonać taki kod:

Start:
mov        bx, OFFSET Tablica                        
mov        cx, DL_TABLICY
xor        ax, ax

Skąd wie które bramki/tranzystory mają w danej chwili wykonywać operacje?

0

Takiego kodu procesor nie wykonuje.
To jeszcze trzeba skompilować do kodu maszynowego.
Kod maszynowy wykonywany na zasadzie maszyny Turinga.

0

Jak to jest, że jeden program napisany w danym jezyku, działa na wielu procesorach od starych inteli, do najnowszych, na różnych AMD, i jeszcze innych procesorach?
Czy wszystkie procesory mają takie same instrukcje asemblerowe?

Wszystkie procesory nie - procesory z rodziny x86.
Oczywiście dochodzą cały czas nowe instrukcje w nowych modelach, np. SSE, AVX. Początkowo była to architektura 16-bitowa, potem 32, teraz 64, ale kładzie się wysoki nacisk, by zachować zgodność ze starszymi modelami.

Procesor jednak to nie wszystko, dużo zależy pod systemu operacyjnego. Program napisany dla Windows 95 powinien w teorii działać pod Win8, w praktyce bywa różnie.

0

W wielkim skrócie: procesor ma tablicę opcodów i wie że jaką "składnię" mają instrukcje oraz jak należy je wykonać. Jak wczyta sobie "mov" (czy też w praktyce pewną liczbę która reprezentuje mov po kompilacji) to wie że dalej będą dwa parametry które musi zdekodować (bo mogą to być dwa rejestry albo rejestr i wskaźnik do pamieci). Jak już sobie zdekoduje to możesz sobie to wyobrazić tak że procesor w zależności od liczby symbolizującej operacje do wykonania uaktywni sobie odpowiednią ścieżkę w układzie elektronicznym. Stąd też będzie wiedział które bramki mają być użyte ;]

0

"będzie wiedział" to przenośnia raczej wysokopoziomowa...
Tu nie ma nic do wiedzenia... opcode (bajt) taki a taki powoduje aktywację tych a tych obwodów, bramek.
Procesor to BARDZO złożony układ logiczny.

0

To jeszcze mam pytanie jak porównać ze sobą trzy procesory(ich moc obliczeniową) z różnych platform., komputer PC, smartfon, i jeszcze może mikrokontroler AVR. Czy dobrym pomysłem by była napisanie programu, na każdy z nich, np mnożenie dużej macierzy, i zmierzyć czas mnożenia. Czy da to jakąś sensowną odpowiedź?
Czy wydajność procesora we FLOPS'ach podaje producent, czy można to zmierzyć jakimś benchmarkiem?

2

W zależności od problemu, względna wydajność może się zmieniać. Dlatego jeśli chcesz oszacować wydajność procesorów w zastosowaniu X to najlepiej po prostu wybrać jakieś przenośne programy realizujące problem X i odpalić je na wszystkich platformach. Ale nawet wtedy w sumie nie będzie to 100% obiektywne, bo na każdą platformę pisze się inaczej programy i inaczej się projektuje procesory. Na desktopach bardzo ważna jest wydajność jednowątkowa, w smartfonach i kontrolerach ważne jest niskie zapotrzebowanie na prąd, a dodatkowo w kontrolerach ważna jest oszczędność tranzystorów, by kontroler był maksymalnie tani.

Co do tego jak działa procesor to Shalom już mniej więcej to opisał. Ja dorzucę to, że koniec końców wszystko w zasadzie można rozbić na pojedyncze operacje bitowe typu AND, OR, NOT, itd Pojedynczy tranzystor jest generalnie bramką AND. Dodając do tego inwerter (czyli bramkę NOT) otrzymujemy dwuelementowy zestaw klocków do zbudowania dowolnego układu logicznego. Z układów operujących na pojedynczych bitach można zbudować układy operujące na wektorach bitów. Np jak zbudować układ dodający liczby N-bitowe z układów dodających liczby 1-bitowe (dodawanie liczb jednobitowych jest realizowane bramką XOR): http://en.wikipedia.org/wiki/Adder_(electronics) Pamięć w układach logicznych jest realizowana poprzez układ przewodów (to będzie pamięć stała), przerzutniki (w SRAM) bądź tranzystory (w DRAM). Mając pamięć i układy logiczne potrzebna jest nam siła napędowa i synchronizacja. Za obie rzeczy robi zegar, który generuje impulsy elektryczne które docierają do każdego tranzystora w mniej więcej równym czasie. Dzięki temu każdy tranzystor generuje wynik w takim okienku czasowym by kolejne były w stanie ten wynik przetworzyć.

Wspomniane przez Shaloma dekodowanie instrukcji też można rozbić na operacje elementarne jak AND, OR, XOR, NOT, itd
W zasadzie to cały procesor jest tranzystorową zupą, a to że nazywamy go procesorem to pewna "sztuczna" warstwa abstrakcji. Podobnie zresztą my wszyscy jesteśmy atomową zupą i określenie "człowiek" też jest pewną formą abstrakcji :)

0

@Damianek ja bym powiedział że to będzie słabe porównanie, bo bazujące na jakimś konkretnym przypadku. Problem w tym że procesor to nie tylko liczba operacji które jest w stanie wykonać czy taktowanie zegara. Procesory maja dziś dość zaawansowane rozwiązania takie jak: superskalarność, wielopotokowość, out-of-order-execution, branch-prediction, wielopoziomowe cache i od tych mechanizmów zależy bardzo wiele. Może się okazać ze zmieniając rozmiar tablicy na której testujesz "moc obliczeniową" i 1 zmienisz diametralnie wyniki, bo tablica przestanie dla jednego z procesorów mieścić się w cache co wielokrotnie spowolni pracę.
Równie dobrze może się okazać że dodanie /usuniecie z pętli twojego algorytmu testującego jednej operacji matematycznej znów diametrialnie zmieni wyniki, bo jednemu z procesorów braknie jednostek wykonawczych i obliczenia spowolnią wielokrotnie.
Tylko że to są parametry które trudno dobrać "obiektywnie".

1 użytkowników online, w tym zalogowanych: 0, gości: 1