Основни архитектурни принципи на изчислителните системи. Изпълнение на инструкциите.
страницата се нуждае от дописване/преглеждане
Компютрите са много готино нещо, но как работят?
Първо ще кажем как са измислени.
Разбира се, че са военните - те са измислили всичко(от захарта до порното) с цел губене на време.
А сега сериозно. През 40-те години група инженери и математици от Пентагона измислят принципа на работа на мощно изчислително устройство. Дотогава има много опити и регистрирани патенти в тази сфера, но всички те не са разработени добре като проекти. Проектът, който ни интересува, е ENIAC. В него са залегнали принципите на Джон фон Нойман, който се присъединява към екипа на създателите му.
…принципите са залегнали в наследника на ENIAC, EDVAC, а ENIAC е бил модифициран с помощта на фон Нойман, за да може да изпълнява програми от линейна памет програми. А компютърът, който първи е работел с програми от линейна памет, е, буквално, едно бебе.
Но това не го пишете на контролното/изпита.
Това се счита за първата сериозна разработка по създаването на компютър. Фон Нойман предлага принципа на работа на изчислителното устройство, който, с изменения, се използва и до днес.
Преди идеята на фон Нойман се е искало да се създадат крайни автомати с много устойчиви състояния и начин за преминаване между тях. За целта са били необходими много бързи преходи без междинни състояния. Така се въвеждат електронни елементи с две стабилни състояния - "електронни ключове".
Но това не е електронен ключ, а механичен ключ. Електронният ключ си сменя състоянието при подаване на електричен сигнал. Как точно става това, ще разберем малко по-късно.
"Ключът" е елемент с две стабилни състояния - включено и изключено (не го очаквахте, нали?). Много важно е ключът да превключва бързо и недвусмислено (без междинни варианти) между състоянията си. В съвременните компютри ключовете преминават от едното състояние в другото за части от наносекундата и няма да станат по-бързи, защото трябва да движим електрони със скорости, сравними с тази на светлината, а ако не се сещате, (все още) не можем да направим такова нещо.
Малко разяснения какво е наносекунда - наносекундата е една милиардна от секундата, тоест $1nS = 1S10^{-9}$, където S е секунда. Разбира се имаме и мили-, микро- и пико- секунди, както следват:
| мили |
$1 m S = 1S10^{-3}$ |
| микро |
$1 \mu S = 1S10^{-6}$ |
| нано |
$1nS = 1S10^{-9}$ |
| пико |
$1 pS = 1S10^{-12}$ |
В началото за ключове са се използвали триоди - електронни елементи с катод и две състояния - запушено и отпушено. (Така се започва с двоичната аритметика). За недосетилите се - от софтуерна страна електронния ключ изглежда като 1 или 0 и се нарича bit.
Триодът е вид електронна лампа с три извода, като единият е управляващ. В зависимост от подаденото напрежение на управляващия електрод лампата се отпушва или запушва. Чрез триод се реализира логическа функция Отрицание.
През 50-те единственият електрически ключ е била радиолампата.
Транзисторът е полупроводников еквивалент на ламповия триод. Поради малкия си размер, по-голямата надеждност, по ниска цена и т.н. транзисторите изместват електронните лампи почти навсякъде.
Има и по-отдавнашни опити за механични компютри, реализирани чрез механични колела с 10 зъба. Най-сложният такъв инструмент е аналитичната машина на Чарлз Бабидж. Тези устройства разчитат на бавни, механични движения, респективно извършват изчисленията бавно. Доста преди идеята на фон Нойман е имало механични сметачни машини и автомати с перфокарти, но вторите не са изчислителни машини, а просто автомати (за управление на фабрични машини, тъкачни станове), а първите не могат да извършват самостоятелно изчисления.
Механизмът от Антикитера е може би най-старият пример за (доста прецизна) механична изчислителна машина.
Архитектура на фон Нойман

Първата схема е на компютърната архитектура на фон Нойман, според която компютърът е разделен на две основни части - Централен процесор и Оперативна памет. При тази архитектура, програмата представлява поредица
инструкции, които процесорът изпълнява. Инструкциите трябва да са еднозначни. Те определят от къде (кои адреси в паметта) процесорът да вземе операндите и операцията, която ще извърши над тях. През периода 1960-1980 са правени много опити за създаване на друга ефективна архитектура, има интегрални схеми, които стигат до пазара, но не са достатъчно добри, за да се наложат.
Сега малко разяснения по първата картинка:
АЛУ - Аритметично-Логическо Устройство
Преди компютърната ера извършваната операция се задавала външно (чрез жакове). В проекта ENIAC е въведено идеята за АЛУ, което понастоящем е основен елемент на централния процесор.
АЛУ има 2 входа за операнди и изход за резултат от извършената операция над операндите. Операциите на АЛУ-то се кодират като двоични числа (числото се нарича код на операцията), ако е нужно - разширяват се с данни и се получава една машинна инстукция. Операцията, която се изпълнява над операндите, се подава от БУ - блок за управление, познат още като УУ - Управляващо устройство. АЛУ изпълнява всички аритметични и логически функции – събиране, изваждане, умножение, деление и сравняване на две числа (А>В, А≥В, А=В, А≠В, А≤В, А<В). От бързодействието на това устрайство зависи скоростта на изчислителния процес. При по-старите микрокомпютри времето за изпълнение на една инструкция се измерваше в милисекунди, а при новите - в нано- или пикосекунди.
АЛУ е изградено от логически елементи (gates - "порти") с различни функции: изключващо или, или, не, не-или, не-и и други. АЛУ е комбиниран компаратор (сравнител) с пълен суматор. Важна характеристика на АЛУ е разредност - броят на битовете, постъпващи едновременно на входовете му, или колко бита е размерът на един операнд. Обичайните разредности биват от 2 (много отдавна!) до 64 и повече бита, като съществуват и по-екзотични изпълнения. Разрядността на процесора е равна също на размера на шината на входа и на големината на машинната дума (последователност от битове, които машината може да "прочете" наведнъж и да ги подаде на някой вход на АЛУ).
Последователност от инструкции, записани в паметта, представлява програма на машинен език, което всъщност е програма за АЛУ-то.
Възможно е двата операнда да съществуват в самата инструкция чрез своите стойности. Тогава кодът на операцията се отделя, отива в БУ / УУ, а операндите се подават отделно на входовете на АЛУ. Но този вариант не действа особено добре, понеже компютърната програма трябва да може да се изпълнява многократно върху различни данни. Друг начин на задаване е операндите да се разделят от инструкциите. За тази цел се въвежда адресиране на паметта, която дотогава е просто линеен масив. В инструкцията, вместо съдържание на операнда, се подава или адрес на на операнда, или сведения за неговото изчисляване. По този адрес от паметта се прочита стойността на операнда. Така при инструкциите имаме адреси, а не стойности на операндите.
Новото (в сравнение с предшествениците на АЛУ) е, че инструкциите също се записват в оперативната памет. Това решение, което можем да наречем и принцип, наричаме първи основен принцип на фон Нойман. Принципът гласи: данните и операндите се съхраняват в една и съща оперативна памет и няма логическа разлика между записа на данни и инструкции (всичко е поредица от 1 и 0).
БУ - Блок за Управление
Друг основен елемент на ЦП е блокът за управление. Неговите функции са дешифрация , определяне адреса на операндите, адресиране, пресмятане, записване на резултат. В някои архитектури БУ изпълнява и по-сложни задачи.
БР - Блок регистри
С разработката на проектите за изчислителни машини се установява, че за бързодействие на АЛУ-то трябва да има достъп до малка и бързодостъпна памет (блок регистри), която се обособява като част от централния процесор. Регистрите може да се разглеждат като "слотове", в които се записва информация.
За фон Ноймановия процесор задължително трябва да има програмен брояч (наричан още указател на инструкциите), чиято стойност за по-голяма бързина се пази в регистър. Това е регистърът PC(IP) - Program Counter / Instruction Pointer. В този регистър е записан адресът на инструкцията, която предстои да бъде изпълнена от ЦП. В началото в PC външно трябва да се запише адресът, от който процесорът да изпълни първата инструкция (иначе няма как да се "инициализира" компютърът при включването му). Чрез програмния брояч се извличат толкова байтове, колкото дължината на инструкцията, след което броячът се обновява (увеличава се стойността му) с толкова байтове - тоест преместваме се на следващата инструкция. По този начин регистърът се обновява постоянно, докато програмата работи.

ЦП - Централен Процесор
Централният процесор (CPU - Central Processing Unit) обединява АЛУ, УУ, БР и други блокове. Той изпълнява фиксиран краен набор от входови операции и начини на опредляне на адреса на операндите.
Основната характеристика на процесора е ширината на АЛУ-то, горе вече казахме какво е това. Първоначално ширината на шината е била колкото една клетка от паметта (8 бита), но с времето процесорите са се развили, наложило се е за по-голямо бързодействие да четат повече октети (байтове) наведнъж, и вече имаме широко разпространени 64 битови ЦП, та даже и 128 битови ВП (видео процесори, тоест процесорите на видео картите). Съществуват и още по-големоразредни процесори, ама не ни трябват за контролните.
ОП - Оперативна памет
Най-общо казано, паметта е номериран линеен масив от клетки. Големината на клетката е предварително фиксиран брой битове, а номерът й е нейният адрес - цяло положително число.
Основна характеристика на паметта е размерът й. Той се измерва в байтове. За по-големите памети се използват производните единици: KB(килобайт) MB(мегабайт), GB(гигабайт), TB(терабайт). Понятието байт е въведено от IBM (преди това всеки си е взимал колкото бита си иска за основна единица памет). Байтът е основната адресируема единица памет. Един байт е 8 бита. Големините на производните единици са:
| 1 KB |
1024 Bytes |
| 1 MB |
1024 KB |
1 048 576 Bytes |
| 1 GB |
1024 MB |
1 073 741 824 Bytes |
| 1 TB |
1024 GB |
1 099 511 627 776 Bytes |
Забележка: Според системата SI не е точно така. Например KB е точно 10^3 байта. Ако искаме да кажем "210 байта", използваме KiB, което се чете "kibibyte". Това, разбира се, не знам до колко той го знае, така че не рискувайте на контролното. Ето ви допълнително четиво по въпроса.
Характеристика на паметта е адресната дума. Адресната дума е, грубо казано, последователност от битове, в които можем да запишем всеки адрес на клетка от паметта. На картинката по-долу са показани колко големи думи (колко битови думи) са необходими за различните размери памет.

Ако, да речем, адресната дума ни е с големина 32 бита, то в поле (регистър, променлива и др.) можем да запишем всяко число от 0 до $2^{32} - 1$. Когато това число представлява адрес на клетка от паметта, то е ясно, че можем да адресираме $2^{32}$ клетки по 1 байт, или 4GB. Това е нашето адресно пространство. Сами се сещате, че ако физически имаме повече от $2^{32}$ клетки памет, то губим всички останали клетки, тъй като не можем да ги адресираме.
Така големината на паметта е пряко зависима от размера на машинната дума. Не може - не искаме - да съществува адрес, който не може да бъде адресиран. А дали ще може да бъде адресиран, зависи от машинната дума. На кратко - централен процесор с 32 битова дума не може да управлява памет по-голяма от 4 GB. Ако думата е 64 битова, тогава максималната оперативна памет е 16 ЕB. (Това се чете екзабайт и е равно $10 ^ {18}$, a паметта излиза $16 * 10^{18}$ байта, което е МНОГО).
Разяснения по втората схема.
Това е схемата на работа на един фон Нойманов процесор:
- Чрез програмния брояч се извличат толкова на брой байтове, колкото е дължината на инструкцията, и се обновява програмния брояч.
- След като е извлечена инструкцията, тя трябва да се дешифрира и да се пресметнат адресите на операндите. Дешифрирането дава кода на операцията, която трябва да се извърши върху операндите, ако има такива.
- Следва адресирането на операндите. Инструкциите много рядко работят с явно зададен адрес, в тях по-често има начини, по които ЦП да изчисли този адрес. Адресите се пращат на ОП и съдържанието на клетките, чиито адреси са изпратени постъпва като вход на АЛУ.
- АЛУ изпълнява операцията, която трябва над операндите, и
- после резултатът се записва на определено от инструкцията място.
Централният процесор изпълнява инструкциите асинхронно (с изчакване) - изчаква се всяка инструкция да завърши и чак тогава започва следващата. Налага се, понеже инструкциите могат да са с различна дължина.
Освен това, оказва се, че при линейно изпълнение на инструкциите от паметта и при достатъчно дълго време на работа на ЦП, с течение на времето той ще се придвижи през цялата ОП. Това не е никак желателно, тъй като (дано съм разбрал идеята правилно!), за разлика от теоретичните модели, като машина на Тюринг с безкрайна лента, физическата памет е ограничена, и освен това далеч не можем да си позволим да я запълним цялата с инструкции (помислете за операндите!). Решението: въведена е специална инструкция за преход. Тя представлява изчисление на адреса, който след това се записва в програмния брояч. Вкарването на инструкцията за преход нарушава линейността на извършваните операции от ЦП, в известен смисъл програмите се накъсват.
Внимание!
Следващите две секции се различават съществено в зависимост от това, дали слушате лекциите, четете книга или ровите в интернет. Затова давам най-безопасното предложение: запомнете отбелязаното като "първи" и "втори" принцип, запомнете и параграфчето след тях, а накрая погледнете допълнителните материали, и преценете за себе си къде е истината (защото тя е някъде там).
Ако някой знае как стоят нещата в действителност, да се чувства поканен да поправи нашите бъркочи.
Първи принцип на фон Нойман:
Както казахме по-горе, принципът гласи: данните и операндите се съхраняват в една и съща оперативна памет и няма логическа разлика между записа на данни и инструкции (всичко е поредица от 1 и 0). Това е голямата разлика между компютърните архитектури на Джон Атанасов и фон Нойман - при чичо Атанасов инструкциите и операндите са разделени.
Втори принцип на фон Нойман:
Показан (неявно) на втората картинка (тази, която е "зациклила"). Идеята е, че инструкциите се изпълняват принципно последователно, тоест процесорът върви "линейно" напред по инструкциите. Постулатът на фонНойман е фундаментален за компютърните архитектура - всички съвременни компютри са с фон Нойманова архитектура - с определени изменения. Досега няма успешно наложила се друга архитектура.
С развитието на новите технологии от физична (хардуерна) страна не се спазва толкова точно този постулат - съвременните процесори могат да приемат и повече от една команда, но от софтуерна страна нищо не се променя. За програмиста инструкциите се изпълняват последователно. Това е изключително важно, тъй като много често разчитаме на резултата от дадена операция за изпълнението на следващата(-ите): например, нека имаме операция $X$ с операнд с адрес $b$ и резултат с адрес $a$, и операция $Y$ с операнд с адрес $a$ и резултат с адрес $c$ в следната последователност:
Това означава, че
$Y$ използва като операнд резултата от
$X$, и за да се изпълни коректно
$Y$, трябва първо да завърши
$X$;
цялото програмиране се базира на това, че инструкциите се изпълняват последователно.
Работата на компютъра се определя от програмите и наредбата на инструкциите в тях. Правени са опити да се изгради архитектура, при която данните също да имат роля – например, ако някакъв операнд е готов, програмата, използваща този операнд сама да се изпълни. Оказва се, обаче, че е непостижимо за човешката мисъл да използва такива архитектури.
?Трети принцип на фон Нойман?:
Обособяват се два основни блока - централен процесор и оперативна памет. ЦП се управлява от инструкциите в паметта и централният процесор изпълнява инструкциите последователно от оперативната памет. Двата блока са свързани чрез шина.

Допълнителни четива
http://www.informa.hit.bg/urok11-w.htm
http://en.wikipedia.org/wiki/Von_Neumann_architecture
"Бебето" (Manchester Small-Scale Experimental Machine) отблизо, с обяснения относно функциите на отделните блокове