Skrypt z WSK
Transkrypt
Skrypt z WSK
Pojęcia podstawowe
2. Pojęcia podstawowe
Przedsięwzięcia zmierzające do maszynowego wspomagania człowieka w dziedzinach nie
tylko fizycznych ale i intelektualnych (chociaż to ostatnie określenie może wydawać się zbyt
obszerne jak dla dominującego ostatnio przetwarzania informacji) mają za sobą długą historię.
Historia ta dotyczy głównie powstawania sprzętu - nazywanego w różnych okresach "mózgami
elektronowymi", maszynami analitycznymi, elektronicznymi maszynami cyfrowymi a ostatnio
komputerami.
Poniżej przedstawiono wybrane daty pozwalające zorientować się w dynamice rozwoju
komputerów w czasie:
1627 Wilhelm Schickald - pierwsze dwa urządzenia do sumowania kilkucyfrowych liczb;
1642 B. Pascal - jeden z pierwszych szeregowych sumatorów/subtraktorów (urządzeń dodających i
odejmujących);
1694 C. W. Leibnitz - pierwszy arytmometr czterodziałaniowy (wcześniej, w 1671 zbudował też
sumator równoległy);
1812 Ch. Babbage - model pierwszej maszyny cyfrowej (maszyna analityczna);
1833 Ch. Babbage - projekt maszyny analitycznej, którą można uznać za pierwowzór późniejszych
komputerów;
1890 H. Hollerith - maszyny analityczne produkowane seryjne;
1920 arytmometr elektryczny;
1937-1944 pod kierunkiem H. Aikena zbudowano przekaźnikowy, całkowicie zautomatyzowany
Mark I (generacja 0);
1945 J. von Neumann określa zasadę obowiązującą we wszystkich powstających później
komputerach (poza ENIAC'em): program maszynowy (komputerowy) realizujący
działania zlecone przez programistę zapisany jest w pamięci komputera;
1946 J. W. Manchly i J. P. Eckert budują ENIAC (Electronic Numerical Integrator and Computer
- generacja 1): zawierał 18000 lamp i 1500 przekaźników, ważył 30 ton, pobierał 150 kW
mocy; czasy wykonywania operacji: dodawanie w 0.2 ms, mnożenie w 2.8 ms dla liczb
dziesiętnych (10 cyfr);
1949 powstaje komputer EDSAC (Electronic Delay Storage Automatic Computer);
1950 powstaje EDVAC (Electronic Discrete Variable Automatic Computer) z pamięcią na
rtęciowych liniach opóźniających;
1951 produkcja seryjna komputera UNIVAC (pamięć na rtęciowych liniach opóźniających,
pomocnicza na taśmach magnetycznych);
1958 pierwsze maszyny 2 generacji (na tranzystorach);
1964 pierwsze maszyny 3 generacji (układy scalone);
1970 pierwsze komputery, które można zaliczyć do 4 generacji, m. in. PDP-11 (układy LSI i
VLSI);
1971 pierwszy mikroprocesor (Intel 4004).
Obecnie oczekuje się na piątą generację, intensywne prace trwają w Japonii i USA. Nie jest jednak
spodziewany wyróżnik technologiczny tej generacji jak w przypadku generacji poprzednich:
generacja 0 - na przekaźnikach;
generacja 1 - na lampach elektronowych;
generacja 2 - na tranzystorach;
generacja 3 - na układach scalonych małej skali integracji;
generacja 4 - na układach scalonych dużej i wielkiej skali integracji;
generacja 5 - oczekiwane są wielkie moce obliczeniowe, przetwarzanie równoległe, zdolność do
realizacji zadań analizy mowy i obrazu, sztuczna inteligencja (?).
5
Wstęp do systemów komputerowych
W Polsce:
początki:
1950 GAM 1 opracowana w Państwowym Instytucie Matematycznym;
1958 XYZ (nazywana też ZAM 1) wzorowana na IBM 701 z 1953 roku, lecz szeregowa (IBM 701
był równoległy);
1959
rozpoczęto organizowanie Wrocławskich Zakładów Elektronicznych ELWRO;
produkcja seryjna komputerów cyfrowych:
1964 ODRA 1003;
1965 ODRA 1013;
1961-1965 ZAM-2, potem ZAM-41 (bardzo krótkie serie w Instytucie Maszyn Matematycznych
PAN); ODRA 1024 (w ELWRO);
1967 seria ODRA 1300 (za ICL 1900), powstają kolejno: ODRA 1304, ODRA 1325 i
ODRA 1305 oraz RODAN 10/79 (1325 w wersji wojskowej) i RODAN 15 (1305 w
wersji wojskowej dla Czechosłowacji);
1968 przyjęcie koncepcji systemu RIAD przez kraje RWPG, w Polsce (ELWRO) produkowano
potem R-32 i R-34 (za IBM /360);
późne lata siedemdziesiąte: początki produkcji różnych wersji komputerów serii SM (za PDP-11),
np. Mera 60 (SM 1633) prod. Meraster w 1979 r.;
mikrokomputery:
ELWRO 800 Junior (odpowiednik ZX Spectrum 48 KB lub TIMEX);
ELWRO 800 (IBM PC/XT) i ELWRO 801 (IBM PC/AT);
analogowe: ELWAT (kooperacja Elwro i WAT);
hybrydowe: WAT 1010 (w WAT).
6
Pojęcia podstawowe
2.1. Reprezentacja informacji
Informacja nie może istnieć bez swego nośnika. W komputerach analogowych
wszelkie wartości przedstawiane są w postaci poziomu napięcia. Teoretycznie jest to
zbiór wartości mocy continuum, w praktyce ograniczony dokładnością rzędu 0.1%.
W zasadzie wszystkie wielkości interpretowane są jako liczbowe - po odpowiednim
przeskalowaniu.
We współczesnych komputerach cyfrowych wszelkiego rodzaju informacje, w
szczególności liczby, reprezentowane są w postaci ciągów zerojedynkowych czyli
ciągów binarnych: łańcuchów zer i jedynek. W interpretacji najpowszechniejszej,
tzw. konwencji TTL, wartość napięcia w dowolnym punkcie sprzętu komputera interpretowana jest:
5 V (zakres 2.4 V - 5.5 V) jako tzw. "logiczna jedynka";
0 V (zakres 0.0 V - 0.4 V) jako tzw. "logiczne zero".
Słowo "logiczne" używane jest dla podkreślenia, że sygnał ten interpretowany
jest samodzielnie, nawet jeśli stanowi fragment większego ciągu zerojedynkowego.
Rejestrem w komputerze nazywa się podzespół (urządzenie) zdolne do
przechowywania (pamiętania) ciągu zerojedynkowego określonej długości.
Długością rejestru nazywa się długość ciągu zerojedynkowego, do którego
pamiętania zdolny jest rejestr. Długość ta wyrażana jest liczbą pozycji ciągu, czyli
zer lub jedynek, z których ciąg może się składać.
Rejestr zdolny do przechowywania n-bitowego ciągu (rejestr o długości n
pozycji), może przechowywać zatem 2n różnych zawartości, bo tyle różnych wartości
może przyjmować n-bitowy ciąg zerojedynkowy.
Zwykle bity tak w rejestrze, jak i ciągu binarnym rozpatrujemy jako kolejno
ponumerowane o zera poczynając. Numery te noszą nazwę numerów pozycji lub
numerów bitów rejestru. W zależności od konwencji bity numerowane są od lewej
strony rejestru (wg ICL – np. w ODRACH) lub od strony prawej (wg IBM – np. R32 lub IBM PC). Skrajna prawa pozycja nosi nazwę pozycji najmniej znaczącej (w
slangu: najmłodszej), zaś skrajna lewa pozycja nosi nazwę pozycji najbardziej
znaczącej (w slangu: najstarszej).
Pojedynczą pozycję ciągu zerojedynkowego nazywa się bitem. Odpowiednio
mówi się o bitach lub pozycjach binarnych rejestru. Należy pamiętać, że bit może
przyjmować wartości 0 lub 1.
Rejestr zdolny do pamiętania stanu pojedynczego bitu zwykle nazywa się
wskaźnikiem. W uproszczeniu mówi się o rejestrach jedno-, dwu- czy
ośmiobitowych.
Należy zawsze pamiętać:
− o różnicy między rejestrem a zawartością rejestru, którą jest aktualnie
pamiętany w rejestrze ciąg zerojedynkowy;
− że rejestr ma zawsze jakąś zawartość, być może zawartość nieokreśloną, czyli
chwilowo nieznaną lub niewyznaczalną;
7
Wstęp do systemów komputerowych
− że wszelkie działania odbywają się w komputerze na zawartościach rejestrów,
z nie na samych rejestrach;
− że często mówiąc o działaniach na ciągach zerojedynkowych w komputerze,
nawet nie wspominamy o rejestrach, których zawartości te ciągi stanowią.
2.2. Operacje logiczne
Na poszczególnych bitach – pojedynczych pozycjach ciągów
zerojedynkowych – można dokonywać operacji zwanych operacjami logicznymi.
Operacje logiczne charakteryzują się tym, że jeśli wykonywane są na pewnych
ciągach zerojedynkowych, to operacji podlega każda pozycja oddzielnie i wynik
operacji na tej pozycji nie zależy w żaden sposób od wyniku na pozostałych
pozycjach. Dalej opisane zostały wybrane, podstawowe operacje logiczne. Opisy
dotyczą poszczególnych bitów (pozycji). W przypadku operacji dwuargumentowych,
tzn. gdy działaniu operacji logicznej podlegają dwa ciągi zerojedynkowe (o tej samej
długości) operacja logiczna wykonywana jest na odpowiadających sobie bitach tych
ciągów. Podlegające operacji ciągi nazywa się argumentami operacji, zaś powstający
skutkiem wykonania operacji nowy ciąg nazywa się wynikiem. Dalej argumenty
oznaczano literami a lub b, zaś wynik literą w.
2.2.1. Negacja - NOT
Negacja jest operacją logiczną jednoargumentową, co oznacza,
a
w
że wynikowy ciąg w tworzony jest na podstawie tylko jednego
ciągu argumentu a. Operator tej operacji w zależności od tego w
jakiej dziedzinie informatyki jest używany, może być
przedstawiany różnym symbolem – np. na rysunku przedstawiono typowe
oznaczenie elementu tzw. negatora (1/4 układu scalonego 7404) na schematach
logicznych sprzętu komputerowego. W języku asemblera IBM PC wykorzystywany
jest rozkaz NOT. W opracowaniach teoretycznych można spotkać oznaczenie
znakiem ¬ lub przez nakreślenie argumentu podlegającego negacji:
w=¬a
lub
w= a
Tak zwana "tablica prawdy" (zawierająca wartość wyniku dla wszystkich wartości
argumentów) dla operacji negacji przedstawia się następująco:
mnemo: "odwrotnie"
8
a
w
0
1
1
0
Pojęcia podstawowe
Przykłady:
gdy a=0, to ¬a=1;
gdy a=0110, to ¬a=1001.
2.2.2. Iloczyn logiczny – AND
Iloczyn logiczny jest operacją logiczną dwuargumentową, co
oznacza, że wynikowy ciąg w tworzony jest na podstawie dwóch
ciągów argumentów a i b. Operator tej operacji w zależności od
tego w jakiej dziedzinie informatyki jest używany może być
przedstawiany różnym symbolem - np. na rysunku przedstawiono
typowe oznaczenie elementu iloczynu logicznego (1/4 układu scalonego 7408) na
schematach logicznych sprzętu komputerowego. W języku assemblera IBM PC
wykorzystywany jest rozkaz AND, w opracowaniach teoretycznych można spotkać
oznaczenia znakiem • lub ∩ :
w=a • b lub w=a ∩ b
Tablica prawdy dla operacji iloczynu logicznego przedstawia się następująco:
a
b w
0
0
0
0
1
0
1
0
0
1
1
1
mnemo: "dowolne 0 daje 0"
Przykłady:
gdy a = 0110 ;
b = 0011 ;
to a b = 0010 .
2.2.3. Suma logiczna - OR
Suma logiczna jest operacją logiczną dwuargumentową, co
oznacza, że wynikowy ciąg w tworzony jest na podstawie
dwóch ciągów argumentów a i b. Operator tej operacji w zależności od tego w jakiej dziedzinie informatyki jest używany
może być przedstawiany różnym symbolem - np. na rysunku
przedstawiono typowe oznaczenie elementu sumy logicznej
(1/4 układu scalonego 7432) na schematach logicznych sprzętu
komputerowego. W języku assemblera IBM PC wykorzystywany jest rozkaz OR, w
opracowaniach teoretycznych można spotkać oznaczenia znakiem ∪ lub + :
w=a∪
∪b
9
Wstęp do systemów komputerowych
Tablica prawdy dla operacji sumy logicznej przedstawia się następująco:
a
b w
0
0
0
0
1
1
1
0
1
1
1
1
mnemo: "dowolne 1 daje 1"
Przykłady:
gdy a = 0110 ;
b = 0011 ;
to a∪
∪b = 0111 .
2.2.4. Różnica symetryczna - XOR
Różnica symetryczna zwana też nierównoważnością jest operacją
logiczną dwuargumentową, co oznacza, że wynikowy ciąg w
tworzony jest na podstawie dwóch ciągów argumentów a i b.
Operator tej operacji w zależności od tego w jakiej dziedzinie
informatyki jest używany może być przedstawiany różnym symbolem - np. na
rysunku przedstawiono typowe oznaczenie elementu różnicy symetrycznej (1/4
układu scalonego 7486) na schematach logicznych sprzętu komputerowego. W
języku assemblera IBM PC wykorzystywany jest rozkaz XOR, w opracowaniach
teoretycznych można spotkać oznaczenia znakiem ⊕ :
w=a⊕
⊕b
Tablica prawdy dla operacji różnicy symetrycznej przedstawia się następująco:
a
b w
0
0
0
0
1
1
1
0
1
1
1
0
mnemo: "gdy różne, to 1"
Przykłady:
gdy a
b
to a⊕
⊕b
10
= 0110 ;
= 0011 ;
= 0101 .
Pojęcia podstawowe
2.3. Pozycyjne systemy zapisu liczb
Na codzień posługujemy się dziesiętnym systemem zapisu liczb, tzw.
dziesiętnym systemem liczbowym. W systemie tym znaczenie każdej cyfry w liczbie
zależy od położenia tej cyfry względem przecinka dziesiętnego, oddzielającego część
całkowitą liczby od części ułamkowej tej liczby. W informatyce przyjęto w miejsce
przecinka dziesiętnego używać przejętej od Anglosasów kropki dziesiętnej. Liczba
zapisywana jest w postaci ciągu cyfr z pojedynczym znakiem kropki. W praktyce
pomija się kropkę w przypadku liczb całkowitych, pomijane są też prowadzące i
nieznaczące zera. Zapis:
<
... cncn-1 ... c1c0.c-1c-2 ... c-nc-n-1 ...
część całkowita . część ułamkowa
>
gdzie:
ci - oznacza cyfrę dziesiętną: ci {0,1,2,3,4,5,6,7,8,9};
. kropka dziesiętna;
oznacza wartość wyliczoną zgodnie ze wzorem:
... +cn*10n+cn-1*10n-1+ ... +c1*10+c0+c-1*10-1+c-2*10-2+ ... .
W ogólnym przypadku pozycyjnym systemem zapisu liczb o podstawie p
nazywa się zapis:
... cncn-1 ... c1c0.c-1c-2 ... c-nc-n-1 ...
< część całkowita.część ułamkowa
>
gdzie:
ci - oznacza cyfrę: ci {0,1,..,p-1};
. - kropka (oddzielająca część całkowitą od ułamkowej);
który oznacza wartość wyliczoną zgodnie ze wzorem:
... +cn*pn+cn-1*pn-1+ ... +c1*p1+c0*p0+c-1*p-1+c-2*p-2+ ...
Należy zauważyć, że liczba cyfr w systemie o podstawie p jest równa wartości
podstawy, lecz największa z cyfr jest o 1 mniejsza od podstawy.
Powszechnie znany system zapisu liczb rzymskich nie jest zapisem
pozycyjnym!
Podstawowym sposobem zapisu liczb w komputerach jest system dwójkowy
inaczej zwany systemem binarnym. Jest to pozycyjny system zapisu liczb o
podstawie 2, którego zbiór cyfr ograniczony jest do dwóch: ci {0,1}. System ten jest
najbliższy rzeczywistemu sposobowi przedstawiania liczb w komputerze.
11
Wstęp do systemów komputerowych
Tylko dla uproszczenia zapisu (człowiekowi) w informatyce dość
rozpowszechnione są dwa inne pozycyjne systemy zapisu liczb: system ósemkowy
zwany też systemem oktalnym - system o podstawie p=8 (zbiór cyfr:
{0,1,2,3,4,5,6,7}), oraz system szesnastkowy tradycyjnie znany pod nazwą systemu
heksadecymalnego,
którego
podstawą
jest
p=16
(zbiór
cyfr:
{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F} podano uporządkowany rosnąco).
W tekstach spotyka się następujące oznaczenia liczb zapisanych w różnych
systemach zapisu:
1. Dla liczb dziesiętnych nie stosuje się dodatkowych oznaczeń, w szczególnych
przypadkach za liczbą umieszcza się skrót dec, np.: 100dec.
2. Dla liczb binarnych stosuje się przyrostek bin lub wielką literę B, np.: 100bin,
11001B. W programowaniu nie używa się liczb binarnych innych niż
całkowite bez znaku!
3. Dla liczb ósemkowych stosuje się przyrostek oct lub przedrostek w postaci
znaku * (gwiazdki), np.: 100oct, *7012. W programowaniu nie używa się
liczb ósemkowych innych niż całkowite bez znaku! Liczby ósemkowe
wykorzystywane są w dokumentach związanych z komputerami ODRA serii
1300 (także PDP-11 i SM).
4. Dla liczb szesnastkowych stosuje się przyrostek hex lub przyrostek w postaci
znaku H (wielkiej litery H), np.: 100hex, 7012H, 0A12H, 1BFDH. W
programowaniu nie używa się liczb szesnastkowych innych niż
całkowite bez znaku; ponadto przyjęto za zasadę, że liczba taka musi
rozpoczynać się od cyfry różnej od znaku litery (nie może rozpoczynać
się od A,..,F) - w razie potrzeby na początku liczby umieszcza się jedno
zero. Liczby szesnastkowe wykorzystywane są w dokumentach związanych
z komputerami IBM oraz RIAD.
2.4. Konwersje
Zabieg "przetłumaczenia" liczby zapisanej w pewnym systemie zapisu na
liczbę tej samej wartości zapisaną w innym systemie nazywa się konwersją. Dalej
opisano konwersje między binarnym a innymi wybranymi systemami liczb. Ze
względu na to, że wynik konwersji zapisu liczby z dowolnego systemu na binarny
jest dłuższy niż pierwotna postać, konwersję do postaci binarnej nazywa się również
znajdowaniem rozwinięcia dwójkowego liczb, zaś jej wynik rozwinięciem
dwójkowym liczby poddawanej konwersji.
12
Pojęcia podstawowe
2.4.1. Konwersja liczb ósemkowych
Dla dokonania konwersji liczb binarnych na ósemkowe i odwrotnie
wykorzystuje się tablicę wartości trzycyfrowych grup binarnych odpowiadających
cyfrom ósemkowym.
grupa cyfr
binarnych
000
001
010
011
100
101
110
111
cyfra
ósemkowa
0
1
2
3
4
5
6
7
Dla dokonania konwersji dwójkowo-ósemkowej, czyli przedstawienia liczby
binarnej w postaci zapisu oktalnego, należy w zapisie binarnym liczby wydzielić
trzycyfrowe grupy poczynając od kropki (w lewo - na części całkowitej liczby oraz w
prawo - na jej części ułamkowej), a następnie dokonać podstawienia za każdą grupę
odpowiadającej jej cyfry ósemkowej zgodnie z tablicą konwersji. Np.:
- dla znalezienia zapisu ósemkowego liczby binarnej:
11110111101.10000101B
- dokonuje się podziału na grupy:
11 110 111 101 .100 001 01
- oraz podstawienia (w razie potrzeby po uzupełnieniu na początku i końcu
liczby odpowiednią ilością zer, aby skrajne grupy były trzycyfrowe):
011 110 111 101 .100 001 010
3 6 7 5
4 1 2
- uzyskany wynik:
11110111101.10000101B=*3675.412
Dla dokonania konwersji ósemkowo-dwójkowej, czyli przedstawienia liczby
oktalnej w postaci zapisu binarnego, należy w zapisie po prostu każdą cyfrę
ósemkową zastąpić odpowiadającą jej grupą trzech cyfr binarnych zgodnie z tablicą
konwersji. Np. dla liczby *2340.5671 konwersję można przedstawić następująco:
2 3 4 0 . 5 6 7 1
010 011 100 000 . 101 110 111 001
wynikiem jest 10011100000.101110111001B.
13
Wstęp do systemów komputerowych
2.4.2. Konwersja liczb szesnastkowych
Dla dokonania konwersji liczb binarnych na heksadecymalne i odwrotnie
wykorzystuje się tablicę wartości czterocyfrowych grup binarnych odpowiadających
cyfrom szesnastkowym.
grupa cyfr
binarnych
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
cyfra
szesnastkowa
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
Dla dokonania konwersji dwójkowo-szesnastkowej, czyli przedstawienia
liczby binarnej w postaci zapisu heksadecymalnego, należy w zapisie binarnym
liczby wydzielić czterocyfrowe grupy poczynając od kropki (w lewo - na części
całkowitej liczby oraz w prawo - na jej części ułamkowej), a następnie dokonać
podstawienia za każdą grupę odpowiadającej jej cyfry szesnastkowej zgodnie z
tablicą konwersji. Np.:
- dla znalezienia zapisu szesnastkowego liczby binarnej:
101001011111.011111001B
- dokonuje się podziału na grupy:
1010 0101 1111 .0111 1100 1
- oraz podstawienia (w razie potrzeby po uzupełnieniu na początku i końcu
liczby odpowiednią ilością zer, aby skrajne grupy były czterocyfrowe):
1010 0101 1111 .0111 1100 1000
A
5
F . 7
C
8
- uzyskany wynik:
0A5F.7C8H
14
Pojęcia podstawowe
Dla dokonania konwersji szesnastkowo-dwójkowej, czyli przedstawienia
liczby heksadecymalnej w postaci zapisu binarnego, należy w zapisie po prostu
każdą cyfrę szesnastkową zastąpić odpowiadającą jej grupą czterech cyfr binarnych
zgodnie z tablicą konwersji. Np. dla liczby 0E6C.7F8H konwersję można
przedstawić następująco:
E 6 C . 7 F 8
1110 0110 1100 . 0111 1111 1000
wynikiem jest 111001101100.011111111B.
2.4.3. Konwersja liczb dziesiętnych
Prostym sposobem znajdowania rozwinięcia dwójkowego liczby dziesiętnej,
czyli przeprowadzenia konwersji dziesiętno-dwójkowej, jest znalezienie:
- dla części całkowitej - ciągu reszt dzielenia przez 2, który w odwrotnym
porządku daje część całkowitą wyniku;
- dla części ułamkowej - ciągu części całkowitych mnożenia przez 2.
Np. dla znalezienia rozwinięcia dwójkowego liczby 23.5625 wykonuje się operacje:
część całkowita
liczby
2
3
1
kolejne
1
wyniki
dzielenia
przez 2
5
2
1
0
-
część ułamkowa
• 5625
liczby
•
1
1
1
0
1
-
kolejne
reszty z
dzielenia
przez 2
kolejne
wyniki
mnożenia
przez 2
L ------->
<-------- H
1 1250 kolejne
reszty z
mnożenia
przez 2
0 2500
0 5000
1 0
- - -
literą H oznaczono najbardziej znaczący bit wyniku, zaś literą L bit najmniej
znaczący. Wynikiem jest 10111.1001B.
Najprostszym sposobem przeprowadzenia konwersji dwójkowo-dziesiętnej jest
dodanie do siebie tych wartości ciągu potęgowego liczby 2, dla których na
odpowiednich pozycjach liczby binarnej występuje wartość 1.
nr
waga
nr
waga
pozycji
pozycji
-9
0.001953125
6
64
-8
0.00390625
7
128
-7
0.0078125
8
256
-6
0.015625
9
512
-5
0.03125
10
1024
15
Wstęp do systemów komputerowych
nr
pozycji
-4
-3
-2
-1
0
1
2
3
4
5
waga
nr
pozycji
11
12
13
14
15
16
17
18
19
20
0.0625
0.125
0.25
0.5
1
2
4
8
16
32
waga
2048
4096
8192
16384
32768
65536
131072
262144
524288
1048576
Np. postać dziesiętna liczby binarnej 1001101.011B, obliczana jest jak następuje:
pozycja waga
-3
0.125
-2
0.25
-1
0.5
0
1
1
2
2
4
3
8
4
16
5
32
6
64
cyfra
1
1
0
1
0
1
1
0
0
1
wartość dodawana
0.125
0.25
0
1
0
4
8
0
0
64
razem 77.375
wynikiem jest wartość dziesiętna 77.375.
2.5. Dodawanie liczb binarnych
Dodawanie liczb binarnych jest operacją arytmetyczną, podobnie jak
odejmowanie, mnożenie i dzielenie. Cechą charakterystyczną tej operacji jest
szeregowa propagacja przeniesień. Dodawanie jest operacją dwuargumentową
(argumenty oznaczono literami a i b), w której wyniku generowany jest wynik
(oznaczony przez w) równy co do długości dłuższemu z argumentów oraz
jednobitowe tzw. przeniesienie globalne c. W przypadku, gdy nie rozważa się
wyniku operacji ograniczonego do długości dłuższego z argumentów, to
przeniesienie globalne powinno być umieszczone przed wynikiem, stając się jego
najbardziej znaczącą cyfrą. W praktyce zwykle wszelkie rozważania dotyczące
działań na ciągach zerojedynkowych w komputerach prowadzone są dla pewnych z
góry ustalonych długości zarówno argumentów, jak i wyników.
Dla pojedynczego bitu wykorzystywana jest następująca tabliczka
dodawania:
16
Pojęcia podstawowe
ai
bi
ci
ci-1
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
0
0
0
1
0
1
1
1
wi
0
1
1
0
1
0
0
1
ai - bit o numerze i pierwszego argumentu;
bi - bit o numerze i drugiego argumentu;
ci - przeniesienie z pozycji i;
ci-1 - przeniesienie na pozycję i
wi - bit o numerze i wyniku.
Dla wielobitowych liczb binarnych w przypadku różnej długości argumentów
zakłada się uzupełnienie krótszego z nich prowadzącymi zerami do uzyskania
argumentów równej długości. Dla n-bitowych argumentów c-1=0 tzn. przeniesienie
na najmniej znaczącą pozycję liczby równe jest zeru, zaś wyznaczone przeniesienie z
najbardziej znaczącej pozycji cn stanowi przeniesienie globalne. Elementarna
operacja dodawania (opisana tabliczką) wykonywana jest na kolejnych pozycjach
argumentów, od najmniej znaczącej poczynając. Wynik na każdej pozycji zależy od
przeniesienia wygenerowanego w wyniku dodawania na sąsiedniej, mniej znaczącej
pozycji.
Przykłady:
1.
Dodawanie liczb 110001011.01101B i 11010.0001B:
** *
a
110001011.01101
b
000011010.00010
----------------------------------w
110100101.01111
(c=0)
znakiem * nad pozycjami oznaczono przeniesienia na te pozycje, a zatem
generowane z sąsiednich, mniej znaczących (prawych) pozycji. Wynikiem
jest 110100101.01111B.
17
Wstęp do systemów komputerowych
2.
Dodawanie liczb 11111111B i 1B:
* *******
a
11111111
b
00000001
-------------------w 1 00000000
(c=1)
znakiem * oznaczono przeniesienia, zaś pionową kreską oznaczono lewą
granicę długości argumentów. Gdy nie rozważa się ograniczenia długości
rezultatu do długości argumentów wynikiem jest wartość 100000000B; gdy
takie ograniczenie jest uwzględniane wynikiem jest wartość 0 i przeniesienie
globalne równe 1.
Drugi z przytoczonych przykładów jest o tyle bardziej pouczający, że dobitnie
ilustruje zjawisko zwane propagacją przeniesień oraz skutki ograniczenia długości
rozpatrywanych ciągów binarnych.
2.6. Reprezentacja liczb binarnych ze znakiem
Dla zapisywania w komputerach cyfrowych liczb ze znakiem (a więc także
wartości ujemnych) stosuje się kilka sposobów.
Należy pamiętać, że jedynym sposobem zapisu jakichkolwiek informacji w
komputerze jest wyrażenie ich w postaci ciągów zerojedynkowych. Przyjętą
konwencję zapisu liczb w komputerze zwykło się nazywać kodem (nie należy
zapominać, że nie jest to jedyne znaczenie słowa "kod"). Najbliższym człowiekowi
jest kod moduł-znak:
n n-1
...
3210
S
rozwinięcie dwójkowe
najbardziej znaczący bit, oznaczony literą S (od signum) interpretowany jest jako
znak liczby, gdzie:
S=0 oznacza + (plus), zaś
S=1 oznacza – (minus).
Takie przyporządkowanie bitu znaku znakom "+" i "-" przyjęte jest powszechnie,
także i w innych kodach, w których występuje jednobitowy zapis znaku. Rozwinięcie
dwójkowe liczby stanowi przedstawienie binarne modułu (wartości bezwzględnej)
liczby.
Istotną wadą kodu moduł-znak jest stosunkowo skomplikowana technika
realizacji operacji dodawania i odejmowania, w której konieczne jest dokonywanie
porównania znaków i modułów liczb - sformułowanie algorytmów dodawania i
odejmowania tak zapisanych liczb jest interesującym ćwiczeniem umysłowym
zalecanym Czytelnikowi. Należy zauważyć, że w przypadku kodu moduł-znak
18
Pojęcia podstawowe
istnieją dwie reprezentacje liczby 0 - dodatkowo występuje tzw. "ujemne zero" z
jedynką na pozycji znaku S i zerami na pozostałych pozycjach.
Wspomnianej wady pozbawiony jest inny sposób zapisu liczb binarnych ze
znakiem zwany kodem uzupełnieniowym:
n n-1
S
...
uzupełnienie
3210
Najbardziej znaczący bit w kodzie uzupełnieniowym stanowi bit znaku, jednak jego
rola nie jest ograniczona tylko do sygnalizacji znaku - bit ten stanowi integralną
część zapisu wartości liczby. Nie wdając się w etymologię słowa uzupełnienie (która
sama w sobie jest dość interesująca i wiąże się z teorią omawianego kodu) można
przyjąć, że jest to po prostu pozostała część zapisu liczby w kodzie uzupełnieniowym.
Postać liczby dodatniej w kodzie uzupełnieniowym jest identyczna jak
standardowa postać w zapisie binarnym, zwana zapisem w kodzie bezpośrednim.
Dla dowolnej liczby binarnej x (tak dodatniej, jak i ujemnej) zapisanej w
kodzie uzupełnieniowym, zapis liczby odwrotnej - o przeciwnym znaku (zwanej stąd
także liczbą przeciwną) - znajduje się dokonując przekształcenia zgodnie z
nieformalnym wzorem:
-x = ¬x + 1
co oznacza, że dokonuje się negacji (operacji logicznej NOT) wszystkich pozycji
zapisu, a następnie do tak uzyskanego ciągu zerojedynkowego dodaje się jedynkę na
najmniej znaczącej pozycji. Wynik ma tyle pozycji, co wartość wyjściowa,
przeniesienie globalne jest ignorowane. Opisany zabieg nosi nazwę znajdowania
uzupełnienia liczby binarnej.
Przykłady:
1.
Liczba przeciwna do liczby 6, czyli -6 (działanie na ciągach
ośmiobitowych):
x = 00000110
¬x = 11111001
-x = 11111010 .
2.
Liczba przeciwna do liczby 1, czyli -1:
x = 00000001
¬x = 11111110
-x = 11111111 .
3.
Liczba przeciwna do liczby -1, czyli 1:
x = 11111111
¬x = 00000000
-x = 00000001 .
Dodatkową zaletą kodu uzupełnieniowego jest to, że do wykonania operacji
dodawania nie jest konieczna analiza znaków argumentów, a ponadto operacja
19
Wstęp do systemów komputerowych
odejmowania jest łatwo realizowana przez dodawanie liczby ujemnej, zgodnie ze
wzorem:
a - b = a + (-b) = a + (¬b + 1) = a + ¬b + 1
Na n-bitowym ciągu zerojedynkowym można zapisać w kodzie uzupełnieniowym 2n
różnych liczb z przedziału [-2n-1,2n-1-1].
Przykłady:
1.
Dodawanie: -6 + 1 = -5
-6 11111010
1 00000001
--------------------5 11111011
2.
Odejmowanie: 1 - 6 = -5
** < c-1
1 00000001
¬6 11111001
--------------------5 11111011
znakiem * oznaczono przeniesienia na odpowiednie pozycje, wykorzystano
przeniesienie na najmniej znaczącą pozycję c-1 równe 1 dla uzyskania efektu
dodawania jedynki do wartości zanegowanej odjemnika (¬6).
2.7. Inne sposoby zapisu informacji
Liczby binarne ze znakiem można zapisać w kodzie odwrotnym - z wyróżnioną
początkową pozycją S znaku podobnie jak np. w kodzie moduł-znak. W kodzie
odwrotnym dla liczb ujemnych (S=1) rolę rozwinięcia dwójkowego liczby pełni
zanegowana postać binarna modułu liczby.
W operacjach arytmetyki dziesiętnej stosowany jest kod dziesiętny kodowany
dwójkowo tzw. kod BCD (binary coded decimal), w którym liczba zapisana jest w
postaci ciągu grup czterobitowych (nazywanych czasem tetradami) zawierających
kod cyfry dziesiętnej każda. Po ciągu grup zawierających cyfry następuje pojedyncza
grupa zawierająca kod znaku (również czterobitowy). Do realizacji arytmetyki
dziesiętnej w komputerach występują specjalne rozkazy. Operacje arytmetyki
dziesiętnej wykonywane są dłużej niż odpowiednie operacje w kodzie
uzupełnieniowym, lecz ograniczenie długości liczb dziesiętnych nie ma
praktycznego znaczenia.
Dla skrócenia zapisu (niestety kosztem dokładności) w komputerach stosuje się
tzw. zapis zmiennoprzecinkowy zwany też zapisem zmiennopozycyjnym i działające
na liczbach w tym zapisie operacje zmiennoprzecinkowe. Istota zapisu zmiennoprzecinkowego polega na zapisaniu liczby w postaci dwóch liczb binarnych,
20
Pojęcia podstawowe
mantysy m, zwanej też ułamkiem, oraz cechy e, zwanej też wykładnikiem. Wartość
w tak zapisanej liczby wyraża się wzorem:
w = m * qe
przez q oznaczono podstawę zapisu zmiennoprzecinkowego (nie mylić z podstawą
systemu liczbowego); podstawa ta ma np. w komputerach ODRA s. 1300 wartość
q=2, zaś w R-32 wartość q=16.
Przykład:
Format liczby zmiennoprzecinkowej (tzw. krótkiej) w komputerze IBM /370:
1 0
S
...
e
4 33
...
m
210
W każdym komputerze stosowany jest również wybrany sposób przedstawiania
informacji w postaci tzw. alfanumerycznej, właściwej dla wymiany informacji z
otoczeniem komputera - urządzeniami względem niego zewnętrznymi. Tak zapisana
informacja składa się z pojedynczych jednostek zawierających ustalone kombinacje
bitów interpretowane zgodnie z tablicą przyjętego kodu. W komputerach ODRA
podstawowym kodem jest sześciobitowa reprezentacja kodu ISO, w komputerach
IBM - rozszerzony kod ASCII (American Standard Code for Information
Interchange - ośmiobitowy) lub kod EBCDIC (Extended Binary Coded Decimal
Interchange Code).
2.8. Jednostki umowne
W każdym komputerze, poza bitami wyróżnia się ciągi zerojedynkowe
wybranych długości, wynikających z konstrukcji sprzętu komputera. W
szczególności w każdym komputerze występuje określona długość słowa stanowiąca
zwykle (chociaż nie zawsze) długość ciągu zerojedynkowego, na którym możliwe
jest równoległe dokonywanie większości operacji. W komputerach ODRA s. 1300
długość słowa wynosi 24 bity, w komputerach IBM /360 i RIAD - 32b, w IBM PC 16b. Do komunikacji z otoczeniem wykorzystywane są zwykle mniejsze długości
ciągów, zależące od jednostki kodu wymiany informacji: w ODRACH tzw. znaki o
długości 6b, zaś w IBM'ach bajty (bytes) o długości 8b.
Stosuje się oznaczenia: b na bit oraz B na bajt; słowa i znaki nie mają
powszechnie przyjętych oznaczeń.
Tradycyjnie w informatyce wykorzystywane są tzw. mnożniki określające
krotność jednostek:
1 K oznacza 210, czyli 1024;
1 M oznacza 220, czyli 1048576;
1 G oznacza 230, czyli 1073741824.
Np. Pamięć RAM komputera IBM PC obejmuje 640 KB, zaś dysk Winchester może
mieć pojemność 20 MB. Należy pamiętać, że podanie mnożnika bez podania
jednostki jest błędem.
21
Wstęp do systemów komputerowych
2.9. Wybrane elementy organizacji komputerów
Architektura komputera i jego organizacja stanowią dwa sposoby opisu
komputera; w uproszczeniu architektura opisuje komputer widziany oczami
programisty, zaś organizacja - sprzętowca. Architektura komputera jest to ta część
opisu jego struktury, która jest widziana dla programisty działającego na poziomie
oprogramowania podstawowego za pomocą języka assemblera (najniższy z
możliwych poziomów), zaś organizacja komputera obejmuje wzajemne powiązania i
współdziałanie jego poszczególnych bloków funkcjonalnych.
Bloki funkcjonalne jednostki centralnej komputera.
System
liczący
PAO
Zespół
wejścia/wyjścia
JAL
Kanały
Sterowanie
Procesor
dane
rozkazy
sterowanie
Pamięcią operacyjną (główną) PAO nazywa się blok funkcjonalny
komputera złożony z rejestrów jednakowej długości; każdy z tych rejestrów
(nazywany też komórką pamięci) opatrzony jest unikalnym numerem nazywanym
adresem. W skład pamięci wchodzi też niezbędny osprzęt umożliwiający
dokonywanie niezbędnych operacji dostępu do pamięci. Dostępem do pamięci
nazywa się operację odczytu lub zapisu z lub do komórek pamięci. Odczyt z pamięci
polega na eksponowaniu na wyjściu danych pamięci zawartości komórki, której
adres został zadany na wejściu adresowym pamięci na początku operacji odczytu.
Zapis do pamięci polega na wpisaniu informacji podanej na wejście danych pamięci
do komórki, określonej adresem podanym na wejście adresowe pamięci. Zawartość
pamięci zmienia się tylko w przypadku zapisów, tylko we wskazanych adresami
komórkach. Pojedynczy dostęp do pamięci może dotyczyć więcej niż jednej komórki
pamięci - maksymalna liczba bitów pamięci (sumaryczna długość komórek) do której
można dokonać zapisu lub odczytu w jednym dostępie nosi nazwę szerokości
22
Pojęcia podstawowe
dostępu do pamięci. Np. w komputerze IBM PC adresowalna komórka pamięci jest
wielkości 1 B (8 b), zaś maksymalna szerokość dostępu wynosi 2 B (16 b).
W komputerze istnieje wiele dróg przesyłania sygnałów, zwykle używa się
następujących nazw:
- linią nazywa się jednobitową drogę przesyłania sygnałów (jej realizacją
techniczną jest zwykle po prostu przewód);
- szyną nazywa się zbiór linii niosących informację funkcjonalnie
rozpatrywaną łącznie i zwykle zsynchronizowaną w czasie - np. szyna
adresowa lub szyna danych;
- w niektórych komputerach można wyróżnić połączenia zwane magistralami,
składające się zwykle z szyny danych, szyny adresowej i szyny sygnałów
sterujących.
Do pamięci doprowadzona jest szyna adresowa, zwykle składająca się z
pewnej liczby k linii. Oznacza to 2k możliwych stanów (adresów) tej szyny. Zbiór
wszystkich możliwych adresów, które mogą zostać wygenerowane do pamięci nosi
nazwę przestrzeni adresowej pamięci. Nie oznacza to, że muszą istnieć fizycznie
wszystkie rejestry (komórki pamięci) odpowiadające tym adresom. Np. IBM PC ma
spójną przestrzeń adresową 1 MB, ale znaczna część pamięci w obszarze powyżej
adresu 0A0000H nie istnieje.
Przechowywane w komórkach pamięci ciągi zerojedynkowe mogą być traktowane
jako:
ciągi logiczne, na których mogą być dokonywane operacje logiczne i
przesunięcia (obroty);
ciągi znaków (np. w kodzie ASCII), nadesłane z urządzeń zewnętrznych lub
przygotowane do wysłania do takich urządzeń;
liczby dziesiętne (zwykle w kodzie BCD), na których mogą być dokonywane
operacje arytmetyki dziesiętnej;
liczby stałoprzecinkowe, na których mogą być dokonywane operacje
arytmetyki stałoprzecinkowej;
liczby zmiennoprzecinkowe, na których mogą być dokonywane operacje
arytmetyki zmiennoprzecinkowej;
rozkazy lub instrukcje stanowiące fragment zapisu pożądanego działania
zwanego programem komputera.
Dalej wyraźnie rozróżniane są rozkazy (pobierane z pamięci komputera) od
instrukcji (w języku programowania) lecz często określenia te stosowane są
zamiennie.
Wspomniane wcześniej operacje różnych arytmetyk są operacjami
arytmetycznymi (co najmniej dodawania i odejmowania, zwykle również mnożenia i
dzielenia) zachowującymi zasadę jednorodności typów argumentów i wyniku, co
oznacza np., że operacja arytmetyki dziesiętnej działa na dwu ciągach
zerojedynkowych traktowanych jako liczby dziesiętne, dostarczając w wyniku ciągu
zerojedynkowego, który odczytywany jako liczba dziesiętna stanowi poprawną sumę
obu argumentów.
23
Wstęp do systemów komputerowych
Ciąg zerojedynkowy w komputerze może być w różnych chwilach różnie
traktowany - mówi się, że ciągi zerojedynkowe mogą być różnie interpretowane w
trakcie działania komputera. W przypadku błędów programisty lub szczególnie
wyrafinowanych konstrukcji programowych to samo słowo w pamięci może być raz
traktowane jako rozkaz, a za chwilę jako dana, czyli argument dowolnej operacji.
Typowym przykładem może być badanie tzw. sumy kontrolnej kodu programu,
często stosowane dla ochrony przed tzw. crackerami, czyli programistami
dokonującymi przeróbek cudzych programów.
Jednostka Arytmetyczno-Logiczna (JAL) jest blokiem funkcjonalnym
komputera zdolnym do wykonywania operacji na ciągach zerojedynkowych:
logicznych, przesunięć, arytmetycznych, konwersji i operacji na adresach. Operacja
konwersji wykonywana przez JAL jest działaniem jednoargumentowym nie
spełniającym zasady jednorodności argumentu i wyniku - służy do przekształcenia
informacji zapisanej w pewnej postaci na równoważny zapis innej postaci. W
szczególności dostępne są w komputerach operacje konwersji informacji między
kodem zewnętrznym (np. ASCII) a kodem arytmetyki dziesiętnej (BCD). Operacje
na adresach są działaniami pomocniczymi wspierającymi wykonywanie rozkazów w
komputerze i nie są bezpośrednio widziane przez programistę. Sformułowanie
"widziane przez programistę" oznacza, że niezależnie od wiedzy programisty, może
on pisząc programy jawnie nakazywać komputerowi dokonywać działań (chociaż
czasem tylko odczytu) na omawianym obiekcie lub posługiwać się nim. W
dokumentacjach starszych komputerów JAL występuje pod nazwą "arytmometr".
Jednostka arytmetyczno-logiczna zawiera zwykle co najmniej jeden rejestr
zwany akumulatorem, służący do krótkotrwałego przechowywania informacji.
Akumulator jest rejestrem widzianym przez programistę.
Zespół wejścia/wyjścia jest blokiem funkcjonalnym komputera
zarządzającym kontaktami z urządzeniami zewnętrznymi. Urządzenia zewnętrzne
komputera stanowią urządzenia służące do wprowadzania i wyprowadzania
informacji do/z komputera (w tym również zewnętrzne urządzenia pamiętające
zwane pamięciami zewnętrznymi). Do urządzeń zewnętrznych zalicza się:
- klawiaturę i monitor ekranowy w większych komputerach stanowiące zespół
nazywany też konsolą operatorską (w starszych wersjach oraz tam, gdzie
występuje potrzeba dokumentowania bieżącej pracy systemu zamiast
monitora występuje urządzenie drukujące);
- drukarki (w programowaniu stosowane jest dla nich tradycyjnie oznaczenie
LP line printers), czytniki taśmy papierowej (TR - tape readers), perforatory
taśmy papierowej (TP - tape punches) i czytniki kart perforowanych
(CR - card readers) należące do wolnych urządzeń zewnętrznych;
- pamięci zewnętrzne: taśmy magnetyczne (MT - magnetic tapes), dyski
magnetyczne wymienne (ED - exchanged discs) i stałe (FD - fixed discs),
stosowane głównie w mikrokomputerach dyskietki (dyski elastyczne floppy
diskettes, floppies) i dyski typu Winchester (dyski twarde hard discs);
- manipulatory,
szczególnie
rozpowszechnione
w
zestawach
mikrokomputerowych: drążkowy (joystick), myszka (mouse), kulowy i
24
Pojęcia podstawowe
potencjometryczny; tzw. pióro świetlne (light pen) i ekran dotykowy
(touch-screen) współpracujące z ekranami monitorów również można
zaliczyć do tej klasy.
W ramach całego zespołu wejścia/wyjścia wyróżnia się zwykle mniejsze
zespoły nazwane kanałami, których działanie może być zarządzane programowo
przez programy oddzielnie. Programista widzi raczej zbiór kanałów niż całość
zespołu wejścia/wyjścia.
Sterowanie jest blokiem funkcjonalnym komputera zarządzającym
wykonywaniem podstawowych działań przez całość sprzętu komputera, zwykle z
wyłączeniem kontaktów z urządzeniami zewnętrznymi (sterowanych przez zespół
wejścia/wyjścia). Do podstawowych działań komputera w wymienionym tu sensie
zalicza się wykonywanie rozkazów (w tym także rozkazów kontaktów z zespołem
wejścia/wyjścia, nazywanych rozkazami wejścia/wyjścia) i tzw. sekwencji przerwań,
które w najprostszym ujęciu są działaniami powodującymi radykalną zmianę stanu
komputera, a zachodzą w wyniku wykonania niektórych rozkazów lub nadejścia
pewnych sygnałów z otoczenia procesora. Sterowanie pobiera z pamięci kolejne
(chronologicznie) rozkazy do wykonania i na ich podstawie oraz na podstawie stanu
komputera generuje sygnały sterujące do pozostałych bloków funkcjonalnych,
wymuszając właściwe ich działania.
Rozkazem nazywa się ciąg zerojedynkowy pobrany z pamięci w celu
określenia na jego podstawie dalszych działań procesora. Takie rozumienie rozkazu
jest właściwe sprzętowcom - z punktu widzenia programistów rozkazem jest ciąg
zerojedynkowy przewidziany do wykonania jako rozkaz. Należy zwrócić uwagę na
subtelną różnicę podejścia: z punktu widzenia sprzętowca nie jest brana pod uwagę
żadna intencja programisty dotycząca rozkazu - w szczególności za rozkazy będą (w
przypadku błędu programowania) uważane również ciągi pobierane i wykonywane
jako rozkazy, chociaż przewidziane przez programistę do wykorzystania jako dane.
Zbiór wszystkich możliwych, jakościowo różnych rozkazów komputera nazywa się
listą rozkazów tego komputera. Lista rozkazów, wraz z tzw. formatami rozkazów i
danych, czyli regułami interpretacji fragmentów rozkazów i danych (co w praktyce
oznacza reguły poprawnego zapisu) tworzą język wewnętrzny komputera (machine
language). W tym sensie można używać wymiennie słowa instrukcja ze słowem
"rozkaz", chociaż w zasadzie pojęcie "instrukcja" zarezerwowane jest dla języków
programowania.
Sterowanie w klasycznym komputerze działa cyklicznie pobierając z pamięci
w pewnym ustalonym porządku ciągi zerojedynkowe, traktując je jako rozkazy i
wykonując. Na wykonanie rozkazu składa się szereg działań nazywanych cyklem
rozkazowym, który w pewnym nieskomplikowanym komputerze dla większości
rozkazów może wyglądać następująco:
* - pobranie z pamięci rozkazu według ustalonego wcześniej adresu
(PAO1);
1W
nawiasach podano, który z pozostałych, poza sterowaniem, bloków funkcjonalnych komputera realizuje omawiane
działanie.
25
Wstęp do systemów komputerowych
- wyznaczenie adresu argumentów i wyniku (JAL);
- odczytanie argumentów z pamięci (PAO);
* - wykonanie operacji właściwej pobranemu rozkazowi, inaczej
mówiąc: właściwej tzw. kodowi operacji rozkazu (zwykle JAL);
- zapisanie wyniku do pamięci (PAO);
* - ustalenie adresu następnego rozkazu.
Niektóre elementy tego cyklu mogą nie występować zawsze - te, które muszą
występować oznaczono powyżej gwiazdką (*). Dla niektórych rozkazów podział na
elementy cyklu nie jest jednoznaczny - np. w rozkazach skoków bezwarunkowych
ustalenie adresu następnego rozkazu jest wykonaniem operacji właściwej rozkazowi.
Jak łatwo się zorientować, w skrajnym przypadku w rozkazie powinny zostać
dostarczone sterowaniu następujące informacje:
- jaką dokładnie operację należy wykonać: informację tę zawiera fragment
ozkazu nazywany kodem operacji;
- skąd wziąć argumenty: informację tę zawierają adresy argumentów;
- gdzie umieścić wynik: informację tę zawiera adres wyniku;
- który rozkaz wykonać jako następny: tę informację stanowi adres następnego
rozkazu.
Sytuacja taka występuje w komputerach czteroadresowych, gdzie słowo
rozkazowe może mieć następującą postać:
kod operacji
adres 1 argumentu
adres 2 argumentu
adres wyniku
adres następnego rozkazu
Dopuszczenie rozkazów czteroadresowych ma tę podstawową wadę, że
programy złożone z takich rozkazów zajmują wiele cennego miejsca w pamięci.
Dla ograniczenia długości rozkazu można przyjąć następujące założenia:
- jeden z argumentów znajduje się w akumulatorze (a zatem podawanie jego
adresu jest niepotrzebne);
- wynik jest umieszczany w miejscu jednego z argumentów (a zatem zbędny
się staje adres wyniku);
- jako kolejny rozkaz do wykonania, z pamięci pobierany jest ciąg
zerojedynkowy leżący w przestrzeni adresowej pamięci bezpośrednio za (w
porządku rosnących adresów) rozkazem aktualnie wykonywanym (a zatem
zbędny staje się adres następnego rozkazu);
uzyskując rozkazy jednoadresowe:
kod operacji
adres argumentu/wyniku
Ostatnie z wymienionych założeń stanowi, że naturalnym sposobem
pobierania rozkazów jest pobieranie ich "szeregowe" w porządku rosnących adresów
w pamięci operacyjnej. Pobranie kolejnego rozkazu do wykonania według tej reguły
nosi nazwę sekwencyjnego przeniesienia sterowania. Sekwencyjne przenoszenie
26
Pojęcia podstawowe
sterowania wymaga pamiętania adresu każdego kolejno wykonywanego rozkazu w
pewnym rejestrze bloku sterowania, rejestr ten we wszystkich klasycznych
komputerach nosi nazwę licznika rozkazów. Dla umożliwienia programiście
niesekwencyjnego przenoszenia sterowania (innego niż zgodne ze wspomnianą
regułą) w komputerach wprowadzono pewne rozkazy przeznaczone właśnie do
pełnienia tej funkcji - noszą one nazwę rozkazów skokowych. Rozkazy skoku
bezwarunkowego powodują zawsze wykonanie jako kolejnego chronologicznie
rozkazu spod adresu wskazanego w rozkazie skoku. Rozkazy skoku warunkowego
poddają badaniu pewien warunek dotyczący stanu komputera i w zależności od
wyniku badania (prawda/fałsz) dokonują przeniesienia niesekwencyjnego (gdy
warunek jest spełniony - mówi się wówczas o efektywnym rozkazie skoku) lub
sekwencyjnego (gdy warunek nie jest spełniony - mówi się wówczas o
nieefektywnym rozkazie skoku). Oczywiście ujmując rzecz w tych kategoriach
rozkaz skoku bezwarunkowego jest zawsze efektywny.
Istnieją współczesne komputery zarówno o stałej, jak i zmiennej długości
rozkazów. W przypadku komputerów o stałej długości rozkazu (np. ODRA s. 1300)
wszystkie rozkazy mają jednakową długość; chociaż sposób interpretacji słowa
rozkazowego może być różny dla rozkazów różnych typów, zawsze jednak ustalone
jest położenie w rozkazie kodu operacji. W przypadku komputerów o zmiennej
długości rozkazu zarówno długość rozkazu, jak i sposób interpretacji
poszczególnych jego fragmentów są zmienne (np. komputery produkowane przez
IBM), również jednak położenie kodu operacji jest ustalone (w IBM'ach - zawsze na
początku rozkazu). Zaletą rozkazów zmiennej długości jest możliwość elastycznego
stosowania rozkazów różnej długości według potrzeb. Dopuszczalne są zwykle różne
formaty rozkazów: bez-, jedno-, dwu- i trzyadresowe.
W latach 40-tych amerykański matematyk pochodzenia węgierskiego John
von Neumann sformułował podstawowe cechy komputerów cyfrowych, dalej podano
je w znacznym skrócie (za S. Jarosińskim2:):
1. Wspólna pamięć do przechowywania zarówno rozkazów jak i danych.
Pierwszym komputerem pracującym według tej zasady był EDVAC
(wcześniejszy ENIAC z 1946 r nie był komputerem z zapamiętywanym
programem).
2. Pamięć jednowymiarowa, złożona z kolejno ponumerowanych komórek o
jednakowej wielkości.
3. Brak jawnego rozróżniania rozkazów i danych.
4. Brak jawnej specyfikacji typów danych.
5. Praca sekwencyjna - przed rozpoczęciem wykonywania kolejnego rozkazu
musi zostać zakończone wykonywanie rozkazu chronologicznie
poprzedniego. Każdy rozkaz określa jednoznacznie adres następnego.
Współczesne komputery w dużej mierze mają właśnie te cechy.
2Stanisław Jarosiński
"Organizacja komputerów", skrypt WAT wewn. 1988/89.
27
Wstęp do systemów komputerowych
Procesor wraz z pamięcią i zespołem wejścia/wyjścia stanowi jednostkę
centralną komputera, zwykle montowaną w samodzielnej obudowie. Jednostka
centralna z dołączonymi urządzeniami zewnętrznymi nazywana jest zestawem
komputera. Konkretny zestaw komputera określonego typu nazywany jest też
konfiguracją tego komputera. Systemem komputerowym nazywa się zestaw jedno
lub wielokomputerowy wraz z odpowiednim oprogramowaniem przeznaczony do
wykonywania określonych zadań. Oprogramowanie jest integralną częścią systemu
komputerowego.
28
Pojęcia podstawowe
3. Pamięci
W komputerze cyfrowym można wyróżnić cały szereg wbudowanych w
różnych miejscach zespołów pamiętających. W przypadku, gdy mówi się o tego
rodzaju fizycznych konstrukcjach traktując je jako fragment systemu
komputerowego pełniący w tym systemie pewną funkcję, używa się określenia
pamięć, w przypadku rozważania takich konstrukcji oddzielnie, mówi się raczej o
urządzeniach pamiętających. Przyjmując jako regułę porządkującą intuicyjnie
określoną "odległość funkcjonalną" od procesora można stwierdzić, że zespoły
funkcjonalne zdolne do pamiętania informacji tworzą pewną hierarchię pamięci, na
którą składają się coraz pojemniejsze, ale i powolniejsze (w konsekwencji tańsze)
urządzenia pamiętające. Pojemność pamięci (lub urządzenia pamięciowego) określa
się liczbą jednostek informacji (najczęściej bajtów lub słów o określonej długości),
do których jednoczesnego pamiętania zdolna jest pamięć. Szybkość pamięci określa
się przez podanie jej parametrów czasowych. Powszechnie używane są dwa
parametry:
czas_dostępu - czas od chwili pojawienia się sygnału (sterującego) żądania dostępu
(zwykle odczytu) na wejściu pamięci gotowej do jego obsługi, do chwili
ekspozycji informacji na wyjściu pamięci;
czas_cyklu - czas od chwili pojawienia się sygnału żądania dostępu na wejściu
pamięci gotowej do jego obsługi, do chwili gotowości na przyjęcie
następnego żądania.
Zawsze czas cyklu jest większy lub równy czasowi dostępu.
Na wspomnianą wcześniej hierarchię składają się:
1. Rejestry procesora: zarówno niewidoczne (rejestry robocze procesora), jak i
widoczne dla programisty (rejestry programowe, m. in. akumulatory), w
liczbie ok. 8-64, o czasach dostępu ok. 5 ns;
2. Szybkie pamięci buforowe (caches): urządzenia pamiętające niedostrzegalne
dla programisty, przyspieszające współpracę procesora z pamięcią
operacyjną; pojemność szybkich pamięci buforowych wynosi 0.5-64 KB, zaś
czas dostępu ok. 100 ns.
3. Pamięci operacyjne (główne) o pojemnościach od 64 KB do wielu MB w
dużych komputerach, o czasach dostępu 0.2 - 0.5 µs;
4. Pamięci o dużej pojemności (Large Capacity Storage - LCS) rzadko obecnie
stosowane, o pojemności kilkakrotnie większej niż pojemność pamięci
operacyjnej i czasie dostępu równym ok. 2 - 5 µs;
5. Pamięci dyskowe o pojemności od 360 KB do 4 GB i czasie dostępu ok.
40 ms;
6. Pamięci taśmowe o czasie dostępu ok. 2 s.
Pamięci 1.-4. zaliczane są do tzw. pamięci wewnętrznej komputera, pozostałe zaś
nazywane są pamięciami zewnętrznymi. Kryterium rozdziału na pamięć zewnętrzną i
wewnętrzną jest to, czy dostęp do przechowywanej przez nie informacji wymaga, czy
też nie, współdziałania zespołu wejścia/wyjścia. Należy zwrócić uwagę na to, że
pamięci zewnętrzne nie muszą być fizycznie umieszczone za zewnątrz komputera 29
Wstęp do systemów komputerowych
w mikrokomputerach powszechne jest wbudowywanie stacji pamięci dyskowych we
wspólną obudowę z jednostką centralną. Urządzenia pamiętające 1.-4. zaliczane są
do tej samej klasy pamięci o dostępie swobodnym, wyróżniających się stałymi wartościami parametrów czasowych - czas dostępu i cyklu takich pamięci są stałe, zaś
dostęp do dowolnej komórki nie podlega ograniczeniom. Ten rodzaj pamięci
nazywany jest też pamięciami typu RAM (Random Access Memory). Pamięci
dyskowe (5.) należą do klasy pamięci o dostępie przypadkowym, tzn. takich, dla
których w dowolnej chwili czas dostępu do wybranej komórki pamięci zależy od
chwilowego, niezdeterminowanego położenia nośnika informacji. Dla tego typu
pamięci podaje się średnie wartości parametrów czasowych. Pamięci taśmowe
zalicza się do pamięci o dostępie sekwencyjnym, które charakteryzują się tym, że w
dowolnej chwili ich czas dostępu zależy w sposób zdeterminowany od położenia
nośnika informacji. Odstęp zarówno przestrzenny, jak i czasowy między dwiema
dowolnie wybranymi komórkami pamięci jest stały. Należy zastrzec się, że
określenie "komórka pamięci" w odniesieniu do pamięci o dostępie przypadkowym i
sekwencyjnym nie jest stosowane, mówi się raczej o jednostkach informacji. Dla
pamięci o dostępie przypadkowym i sekwencyjnym podaje się średnie wartości
czasów dostępu i cyklu. W przypadku pamięci o dostępie przypadkowym z
wirującym nośnikiem informacji (np. dysków) używa się określenia pamięci o
dostępie cyklicznym.
Uwaga: w informatyce występują struktury danych o podobnym do użytego
powyżej nazewnictwie; należy pamiętać, że mogą one występować w pamięciach o
innym rodzaju dostępu, np. zbiory o organizacji sekwencyjnej mogą zostać
zorganizowane na dysku.
Własności pamięci zależą przede wszystkim od technologii wykonania
urządzenia pamiętającego. Starsze komputery wykorzystywały pamięć operacyjną na
tzw. rdzeniach magnetycznych, których zaletą jest to, że nie tracą przechowywanej
informacji po wyłączeniu zasilania. Obecnie powszechne jest wykorzystywanie
pamięci półprzewodnikowych, pozbawionych tej zalety. Półprzewodnikowe pamięci
mogą być zbudowane z układów pamięciowych statycznych lub dynamicznych.
Pamięci dynamiczne mają tę wadę, że wymagają co stosunkowo niewielki czas
(rzędu kilkudziesięciu milisekund) dodatkowego zabiegu tzw. odświeżania
realizowanego jako dodatkowy, specjalny rodzaj dostępu. Powoduje to pewne straty
czasu. Urządzenia pamiętające, w których wykonanie operacji zapisu nie jest
możliwe lub nie daje efektu w postaci zmiany zawartości komórki pamięci,
nazywane są pamięciami typu ROM (Read Only Memory). Np. część pamięci
operacyjnej IBM PC jest zrealizowana w tej technologii; należą do niej również tzw.
dyski optyczne.
30
Pojęcia podstawowe
4. Procesory
Procesorem nazywa się połączone razem: jednostkę arytmetyczno-logiczną i
sterowanie komputera. Zespół wejścia/wyjścia oraz pamięć operacyjna (cała
hierarchia pamięci od szybkiej pamięci buforowej poczynając) mieści się jednostce
centralnej komputera lecz poza procesorem (por. rys. na str.).
4.1. Jednostka Arytmetyczno-Logiczna
Jednostką Arytmetyczno-Logiczną (JAL) nazywa się blok funkcjonalny
komputera, stanowiący część procesora, zdolny do wykonywania operacji
logicznych, przesunięć, arytmetycznych (w różnych arytmetykach), konwersji i
działań na adresach. Operacje wykonywane są na ciągach zerojedynkowych o
ustalonej długości maksymalnej, których długość tradycyjnie decyduje o tym, co w
komputerze nazywa się słowem - np. w IBM PC słowo ma 16b, zaś w ODRZE 1305
24b, w R-34 32b. Na potrzeby wykonywania operacji arytmetyki stałoprzecinkowej
w JAL wbudowane są dwa jednobitowe rejestry:
wskaźnik przeniesienia zapamiętujący
po
każdej
operacji
arytmetycznej
przeniesienie globalne, czyli przeniesienie z najbardziej
znaczącego bitu, zwykle oznaczany jako C (od carry, w IBM
PC wskaźnik CF carry flag); wskaźnik ten w innych
operacjach może być również wykorzystywany lecz wówczas
jego zawartość jest inaczej interpretowana;
wskaźnik nadmiaru
zapamiętujący wystąpienie nadmiaru w wyniku operacji
arytmetycznej (oznaczany jako V lub O od overflow, w IBM
PC wskaźnik OF overflow flag); W przypadku dodawania
uważa się, że wystąpił nadmiar, gdy przeniesienie na
najbardziej znaczący bit różni się od przeniesienia z tego
bitu:
v=cn-1 ⊕ cn
co w praktyce oznacza, że wynik operacji przekroczył
dopuszczalny zakres liczb: cyfry znaczące "weszły" na
pozycję znaku.
Na potrzeby arytmetyki dziesiętnej wykorzystywany jest wskaźnik przeniesienia
pomocniczego (w IBM PC wskaźnik AF auxiliary carry flag) zapamiętujący stan
przeniesienia z pozycji 3 na 4 w bajcie. Na potrzeby arytmetyki wielokrotnej
długości tzn. takiej w której zarówno argumenty jak i wyniki mogą być
wielokrotnościami słowa, komputery udostępniają rozkazy dodawania dwu
argumentów i wskaźnika przeniesienia w ramach jednej operacji.
Wymienione wskaźniki nie wyczerpują wszystkich możliwości. W
niektórych komputerach występują specjalne rozkazy testujące wybrane słowo i
ustawiające w wyniku badania odpowiednie wskaźniki. W innych, np. IBM'ach,
każdy rozkaz ustawia wybrane (właściwe mu) wskaźniki. Jako przykłady
wskaźników można wymienić: wskaźnik zera wyniku (w IBM PC - ZF zero flag),
ujemnego wyniku (SF sign flag), wyniku parzystego (PF parity flag) itd.
31
Wstęp do systemów komputerowych
Istnieją w liście rozkazów rozkazy skoków warunkowych w zależności od
stanu wybranych wskaźników - np. "skok gdy ZF=1".
Jak wspomniano wcześniej JAL zdolna jest m. in. do wykonywania operacji
przesunięć, które są operacjami jednoargumentowymi, a charakteryzują się tym, że
stan każdego bitu wyniku zależy wyłącznie od stanu sąsiedniego bitu argumentu. I
tak, dla n-bitowych przesunięć:
przesunięcie logiczne można opisać zależnością i-tego bitu wyniku w od argumentu
a:
w lewo:
w0=0; dla i0: wi=ai-1;
w prawo:
wn=0; dla in: wi=ai+1;
przesunięcie arytmetyczne:
w lewo: jak przesunięcie logiczne, lecz wskaźniki przeniesienia i nadmiaru
ustawiane są zgodnie z obowiązującymi je regułami (jako
przeniesienie traktowana jest przenoszona wartość bitu); gdy
argument traktowany jest jako liczba przesunięcie arytmetyczne w
lewo odpowiada mnożeniu przez 2;
w prawo: wn=an;
dla in: wi=ai+1;
gdy argument traktowany jest jako liczba przesunięcie arytmetyczne
w prawo odpowiada dzieleniu całkowitemu przez 2;
przesunięcie cykliczne, zwane też obrotem:
w lewo: wj=aj-1, gdzie działanie j-1 wykonywane jest modulo n;
w prawo: wj=aj+1, gdzie działanie j+1 wykonywane jest modulo n;
możliwe są "obroty przez wskaźnik", gdy wybrany wskaźnik (zwykle
przeniesienia) traktowany jest jako n+1 bit argumentu i wyniku.
Zwykle z JAL związany jest więcej niż jeden akumulator, mówi się wówczas
o zestawie akumulatorów komputera. W nowszych komputerach programiście
udostępniane są nie tylko akumulatory - może on używać w swych programach
szeregu rejestrów procesora mających specjalne przeznaczenie - w takich
przypadkach zwykle nie używa się nazwy "akumulator". ODRA 1305 ma 8
akumulatorów sprzętowych (w przypadku tego komputera "zestaw akumulatorów"
jest również pojęciem programowym oznaczającym swego rodzaju strukturę
danych); w IBM PC występują 4 rejestry ogólnego przeznaczenia, do których można
użyć nazwy "akumulatory" oraz 13 innych, specjalizowanych rejestrów dostępnych
dla programisty.
4.2. Sterowanie
Sterowanie jest blokiem funkcjonalnym wysyłającym
rozmieszczone w czasie sygnały, stanowiące polecenie wykonania
działań przez zespoły funkcjonalne komputera. Głównym zadaniem
zarządzanie wykonywaniem rozkazów i sekwencji przerwań.
sterowania są:
deszyfrator stanu - urządzenie zbierające sygnały o tym co
komputerze;
32
odpowiednio
podstawowych
sterowania jest
Podzespołami
się dzieje w
Pojęcia podstawowe
generator impulsów synchronizujących (pętla sterująca w większych komputerach,
tzw. zegar z rezonatorem kwarcowym w mikrokomputerach) - urządzenie
generujące precyzyjnie rozmieszczone w czasie ciągi impulsów;
konstrukcja zawierająca mikroprogramy działania (pamięć stała, sieć logiczna lub
rozdzielacz sterujący);
układy synchronizacji generujące właściwe sygnały sterujące na podstawie
mikroprogramów, zsynchronizowane w czasie na podstawie sygnałów z
generatora.
Mikrooperacją nazywa się podstawowe działanie, do którego zdolny jest dowolny
zespół funkcjonalny komputera. Mikrorozkazem nazywa się pewną liczbę
mikrooperacji wzajemnie się nie wykluczających, tzn. takich, które np. mogą być
wykonane w tym samym czasie. Mikroprogramem nazywa się ciąg mikrorozkazów.
W
komputerach
mikroprogramowanych
do
zapamiętywania
opisów
mikroprogramów różnych działań w komputerze (w szczególności rozkazów)
przeznaczona jest pamięć typu ROM nazywana Pamięcią Stałą PAS. Należy zwrócić
uwagę, że w PAS mieszczą się opisy, a nie mikroprogramy (przyjmując za podstawę
przyjęte wcześniej określenie mikroprogramów), jednak w tego typu komputerach
zwykle mikrorozkazem nazywa się pojedyncze słowo pamięci stałej i w
konsekwencji mówi się o "mikroprogramach w PAS". Mikrorozkazy składające się
na mikroprogram nie są zwykle w PAS rozmieszczone sekwencyjnie.
Mikroprogramy są skutecznym narzędziem abstrakcyjnego opisu działania
komputerów, nie tylko mikroprogramowanych. W komputerach ze sterowaniem
układowym (tzw. full-automat lub hard-wired) nie występuje PAS, lecz konstrukcja
zawierająca mikroprogramy działania traktowana jako "czarna skrzynka" zachowuje
się identycznie jak PAS.
Ze względu na to, że wykonanie rozkazu lub zmiana stanu komputera jest
zwykle ciągiem czynności (mikrorozkazów) realizowanych według ustalonych
algorytmów, dalej używane będą określenia sekwencja rozkazu lub sekwencja
przerwania na określenie ciągu czynności realizowanych przez zespoły komputera
składających się na wykonanie rozkazu lub przerwania odpowiednio.
Istnieją też tzw. komputery nanoprogramowane (np. polski UMJS), w
których nie tylko rozkazy wykonywane są jako ciąg mikrorozkazów, ale z kolei
mikrorozkazy wykonywane są jako ciągi tzw. nanorozkazów.
Sterowanie w komputerach rzadko występuje jako zwarta konstrukcja
fizyczna - zwykle jego fragmenty "rozsiane są" po całym komputerze i arbitralnie
kwalifikowane przez konstruktorów jako części sterowania centralnego, lub tzw.
sterowań lokalnych pozostałych bloków funkcjonalnych komputera.
Do sterowania zalicza się pewne rejestry, z których większość nie jest
dostępna bezpośrednio programiście. Takim rejestrem jest wspomniany wcześniej
licznik rozkazów - rejestr jednoznacznie określający adres kolejnego rozkazu do
wykonania. Do rejestrów sterowania zalicza się rejestry (głównie wskaźniki),
których stan może mieć wpływ na sposób wykonywania rozkazów. W niektórych
przypadkach sposób kwalifikacji tych rejestrów może być trudny, np. o ile w IBM
PC wskaźniki przeniesienia i nadmiaru zaliczane są przez ekspertów bez większych
33
Wstęp do systemów komputerowych
oporów do JAL, to co do pozostałych elementów tzw. rejestru flag zdania są podzielone. Stanem sterowania nazywa się bieżącą wartość części spośród rejestrów
sterowania. Stan sterowania definiowany jest dla każdego komputera indywidualnie,
zawsze jednak w jego skład wchodzi zawartość licznika rozkazów.
Sterowanie musi zawierać rejestry zdolne do pamiętania pewnych wielkości
związanych z aktualnie wykonywanym rozkazem, stąd zwykle zawiera rejestr kodu
operacji i rejestr adresu rozkazu. W tym ostatnim przechowywany jest wyznaczony
adres argumentu lub wyniku rozkazu. W dużych komputerach sterowanie ma
wbudowane mechanizmy pozwalające na samodzielne (bez udziału JAL)
wykonywanie operacji na adresach.
4.3. Przerwania
W komputerach sygnałem żądania przerwania nazywa się dowolny z sygnałów
powodujący (w sprzyjających warunkach - tzn. gdy nie istnieje wyraźny zakaz)
wykonanie tzw. sekwencji przerwania. Sekwencją przerwania nazywa się szereg
działań sprzętowych, radykalnie zmieniających stan sterowania komputera. Na
sekwencję przerwania składa się:
- zapamiętanie w ściśle określonym miejscu (zwykle pamięci) aktualnego
stanu sterowania;
- wymuszenie nowego stanu procesora (sterowania).
Sekwencja przerwania, jeśli jest dozwolona, wykonywana jest zawsze "między"
rozkazami (aktualnie wykonywany rozkaz musi być zakończony). Należy
zwrócić uwagę, że sekwencja przerwania jest działaniem sprzętowym. Wśród
rozkazów występuje zawsze rozkaz noszący nazwę "powrotu z przerwania", którego
częścią jest tzw. sekwencja powrotu wymuszająca nowy stan procesora według
informacji zapamiętanej w miejscu przewidzianym na zapamiętywanie stanu w
trakcie sekwencji przerwania. Rozkaz ten umożliwia więc powrót do miejsca, w
którym wykonywanie pewnego programu zostało przerwane. Sekwencja powrotu
jest zatem działaniem programowym. Zwykle fragment programu przeznaczony
do wykonania bezpośrednio po sekwencji przerwania nazywany jest podprogramem
obsługi przerwania.
W zależności od przyczyny przerwania dzielą się na przerwania zewnętrzne gdy sygnał żądania przerwania generowany jest w wyniku przyczyny zewnętrznej
względem procesu wykonywania rozkazów w procesorze, oraz przerwania
wewnętrzne - gdy sygnał żądania przerwania generowany jest na polecenie
programisty w wyniku wykonania odpowiedniego rozkazu. Jeśli jednocześnie
występują sygnały żądań przerwań oby rodzajów, to sekwencje przerwań
wewnętrznych wykonywane są zawsze przed sekwencjami przerwań zewnętrznych.
Przerwania zewnętrzne zwykle podzielone są na pewne podzbiory (noszące
czasem nazwę klas przerwań lub poziomów przerwań). Przerwania należące do
każdej z tych klas mogą zostać zablokowane w wyniku wpisania odpowiedniej
wartości zwanej maską przerwania do specjalnego rejestru maski przerwań. Sygnał
żądania przerwania jest iloczynowany logicznie z przydzielonym mu bitem maski jeśli wynik jest zerem, to sygnał jest ignorowany. Zwykle z każdym przerwaniem
34
Pojęcia podstawowe
związany jest też tzw. priorytet przerwania czyli liczba decydująca o kolejności
wykonania sekwencji przerwania przy jednoczesnej obecności kilku sygnałów
żądania przerwania.
Systemem przerwań komputera nazywa się zespół wszystkich ustaleń
związanych z przerwaniami obowiązujący w komputerze. W jednopoziomowych
systemach przerwań istnieją dwa wyróżnione stany sterowania: w jednym z nich
przerwania są dozwolone, w drugim - zabronione. W wielopoziomowych systemach
przerwań istnieje kilka stanów, w których dozwolone są różne przerwania.
4.4. Zespół wejścia/wyjścia - kanały
Zespół wejścia/wyjścia składa się z tzw. koordynatora kanałów
(stanowiącego w rzeczywistości sterowanie lokalne zespołu) oraz kanałów. Kanałem
nazywa się zespół zarządzający komunikacją z jednym lub wybraną grupą urządzeń.
Kanał po zainicjowaniu pracy (transmisji) kontaktuje się z urządzeniem i pamięcią
organizując przesyłanie informacji między nimi bez angażowania procesora3. Dla
najprostszych konstrukcji służących do komunikacji z urządzeniami zewnętrznymi
nie stosuje się nazwy "kanał".
Pojedynczy akt przesłania jednostki informacji między urządzeniem a
pamięcią nazywa się przesłaniem, zaś ciąg przesłań inicjowany programowo
pojedynczym rozkazem nazywa się transmisją. Przygotowanie transmisji może
wymagać więcej niż jednego rozkazu, lecz tylko jeden inicjuje transmisję - powoduje
rozpoczęcie przesyłania przez kanał. Transmisję z urządzenia zewnętrznego do
pamięci nazywa się transmisją wejściową, zaś z pamięci do urządzenia - transmisją
wyjściową. Transmisja dotyczy spójnego obszaru pamięci.
Najprostszymi konstrukcjami umożliwiającymi komunikację z urządzeniami
zewnętrznymi są porty przeglądane programowo składające się z rejestrów, przy
czym na wybranych pozycjach odnotowywany jest fakt kontaktu z urządzeniem (czy
urządzenie odczytało lub zapisało informację). Porty nie mają kontaktu z pamięcią
operacyjną i muszą być odczytywane programowo - za pomocą odpowiednich
rozkazów, tzw. rozkazów wejścia/wyjścia.
Najprostszymi z konstrukcji zasługujących na nazwę kanałów są tzw. kanały
znakowe, zawierające niezbędny sprzęt dla wykorzystania trzech konstrukcji
logicznych:
adresu transmisji określającego miejsce w pamięci, z którym ma nastąpić
kontakt w kolejnym przesłaniu w ramach transmisji (adres ten jest
zwiększany co przesłanie);
licznika transmisji określającego liczbę przesłań pozostałych do zakończenia
transmisji (zmniejszany co przesłanie);
3Tak wygląda sytuacja z punktu widzenia programisty, w wielu przypadkach sprzęt procesora w rzeczywistości
niejawnie wspomaga kanały.
35
Wstęp do systemów komputerowych
-
stanu (kanału) określającego bliżej w jakim stanie znajdują się podzespoły
zaangażowane w transmisję (dla kanałów znakowych stan dotyczy tylko
urządzenia zewnętrznego);
składających się na tzw. słowa sterujące kanałów.
Opisane tu konstrukcje logiczne umieszczone są w przypadku kanałów
znakowych poza sprzętem kanału: adres transmisji i licznik transmisji
przechowywane są w ściśle określonych dla każdego kanału komórkach pamięci
operacyjnej, zaś rejestr stanu mieści się w urządzeniu zewnętrznym. Szerokością
przesyłania nazywa się długość ciągu zerojedynkowego zapisywanego lub
odczytywanego do/z pamięci przez kanał - należy ją odróżniać od szerokości tzw.
interface'u tzn. długości ciągu przesyłanego między kanałem a urządzeniem. Dla
kanału znakowego szerokość transmisji jest równa szerokości przesyłania
interface'u i wynosi 1 znak (np. ODRY) lub 1 bajt (np. IBM'y). Ciąg elementarnych
działań składających się na przesłanie nazywa się sekwencją przesłania i może być w
razie potrzeby zapisany w postaci mikroprogramu. Na sekwencję przesłania
transmisji wejściowej w kanale znakowym mogą składać się następujące czynności
(po sygnalizacji przez urządzenie gotowości do przesłania znaku):
1 - odbiór jednostki informacji (danych) z urządzenia;
2 - odczytanie adresu transmisji z PAO;
3 - zapisanie danych do pamięci (w razie potrzeby odczyt-modyfikacja-zapis);
4 - zwiększenie adresu +1;
5 - zapisanie adresu transmisji do PAO;
6 - odczytanie licznika transmisji z PAO;
7 - zmniejszenie licznika -1;
8 - zapisanie licznika transmisji do PAO;
9 - jeśli licznik się wyzerował - wygenerowanie sygnału żądania przerwania.
Kanały buforowane (ODRA 1325) są kanałami znakowymi wyposażonymi w
tzw. bufor danych tzn. rejestr o szerokości dostępu do pamięci (większej od
szerokości przesyłania interface'u), w którym dane z urządzenia kompletowane są w
większe grupy, lub z którego mniejsze porcje wysyłane są do urządzenia. Sekwencja
przesłania opisana dla kanału znakowego wykonywana jest dla kanałów
buforowanych co kilka kontaktów z urządzeniem.
Kanały autonomiczne (ODRA 1305) zawierają (zwykle obok bufora)
sprzętowe rejestry zawierające adres i licznik transmisji. Dzięki temu opisane w
sekwencji przesłania działania o numerach 2, 5, 6 i 8 nie wymagają odwołań do
pamięci. Przesłanie powoduje ingerencję w pracę systemu liczącego tylko raz - dla
pobrania lub zapisania danych z/do pamięci - na kilka kontaktów z urządzeniem.
Z punktu widzenia zespołu wejścia/wyjścia urządzenie zewnętrzne składa się
z jednostki sterującej z którą komunikuje się kanał oraz jednego lub większej liczby
mechanizmów wykonawczych. Do każdego z kanałów buforowanych lub autonomicznych może być podłączone tylko jedno urządzenie zewnętrzne, tzn. jedna
jednostka sterująca mechanizmami urządzeń zewnętrznych.
Kanały selektorowe (R-32) są zespołami zbudowanymi podobnie jak kanał
autonomiczny z tą różnicą, że do kanału może być dołączona większa liczba
36
Pojęcia podstawowe
urządzeń zewnętrznych (zwykle do 256). W dowolnej chwili kanał może prowadzić
transmisję tylko z jednym z tych urządzeń (posiada tylko jeden zestaw rejestrów
koniecznych do realizacji transmisji).
Kanały multiplekserowe są to kanały znakowe zdolne do współpracy ze
specjalnym urządzeniem zewnętrznym nazywanym multiplekserem, do którego
można z kolei dołączyć większą liczbę typowych urządzeń zewnętrznych. Kanał
multipleksera widziany jest przez programistę jako cały zbiór kanałów znakowych
(mówi się o podkanałach kanału multipleksera). Sprzęt multipleksera i kanału
multiplekserowego pozwala na prowadzenie jednoczesnych transmisji ze wszystkimi
dołączonymi urządzeniami, dzięki temu, że każdy podkanał ma przydzielone w
pamięci miejsca na własne słowa sterujące. Do multipleksera dołącza się tzw. wolne
urządzenia zewnętrzne, tzn. takie, które po zgłoszeniu gotowości transmisji mogą
oczekiwać na podjęcie sekwencji przesłania przez kanał. Zwykle tylko jeden kanał
multiplekserowy może występować w instalacji komputera.
Zespoły wejścia/wyjścia większych komputerów są zdolne do odczytywania
z pamięci informacji i interpretowania jej jako ciągów kolejnych poleceń do
wykonania: rozkazów kanałowych składających się na programy kanałowe. Każdy z
rozkazów kanałowych może zainicjować kolejną transmisję, różną od poprzedniej,
lecz dotyczącą tego samego kanału (lub podkanału w przypadku kanału
multiplekserowego). Jeśli zespół wejścia/wyjścia komputera ma omawiane
własności, to jego kanały noszą nazwę kanałów procesorowych. Jedną z istotnych
różnic między programem procesora a programem kanałowym jest to, że naturalnym
stanem programu kanałowego jest stan "niedziałania" - jego wykonywanie
rozpoczyna się na rozkaz, a kończy po wykonaniu wszystkich zadanych transmisji.
Wśród urządzeń zewnętrznych dużych komputerów można wyróżnić
procesory kanałowe lub procesory wejścia/wyjścia - są to oddzielne procesory
dołączone do wspólnej pamięci ("pracujące na wspólną pamięć") z procesorem
głównym, lecz mające inną listę rozkazów dostosowaną specjalnie do współpracy z
rozbudowanym zespołem wejścia/wyjścia.
Wielkie komputery dla odciążenia od prac związanych z wejściem/wyjściem
sprzęgane są ze specjalnie do tych celów wykonanymi komputerami wejścia/wyjścia
(front-end computer np. w zestawach CRAY'a).
W mikrokomputerach występują kanały bezpośredniego dostępu – DMA
(direct memory access), które co do własności odpowiadają kanałom
autonomicznym, lecz ich główną cechą jest żądanie zablokowania przez procesor
odwołań do pamięci na czas przesyłania danych przez magistralę między kanałem a
pamięcią. W praktyce oznacza to zablokowanie pracy procesora. DMA jest tanim
rozwiązaniem kanałów autonomicznych dla komputerów bez wyrafinowanych
urządzeń synchronizacji dostępu do pamięci.
37