вівторок, 10 жовтня 2017 р.

Література до принципів організації комп'ютера -- книги

Взято тут.
Один із курсів, що викладаю в УКУ -- "Принципи організації комп'ютера". Він складається із двох частин. Перша присвячена елементарним блокам комп'ютера, від способів представлення даних -- чисел та тексту, до простих логічних елементів, мультиплексорів, тригерів та защібок, з яких будуються блоки пам'яті, арифметичні та арифметично-логічні (ALU) модулі тощо. Друга -- програмуванню простих обчислювальних систем без допомоги операційної системи -- так-би мовити, bare metal. 
На жаль, через обмеження часу, в цьому курсі доводиться користуватися такою собі логарифмічною шкалою -- стрибати між рівнями абстракцій, не заповнюючи проміжки щільно. Після арифметичних модулів, мінімалістичних блоків пам'яті та оглядом функціонування ALU зразу слідує bare-metal програмуванням сучасних систем.

В ролі bare metal системи обрано демоплату на базі мікроконтролера STM32 -- з одного боку, це цілком серйозний 32-бітний процесор, із 4Гб адресним простором, перериваннями із підтримкою пріоритету, DMA, MPU (але, на жаль, без MMU) і все таке (на противагу крихітним і простеньким AVR8), мікропроцесори. З іншого боку, у них немає великої і плутаної стандартної периферії машин на базі x86 та складнощів із кешем, суперскалярністю, перевпорядкуванням команд і т.д. "великих процесорів". (Про них говоримо в наступному курсі, але це -- окрема історія. :-). Взагалі, про STM32 в цьому блозі написано багато.
Почнемо із доволі давньої класики:

Roger Tokheim, «Digital Electronics: Principles and Applications»

Є переклад російською, 1988 року, із книги виданої в 1984:  Токхейм Р. «Основы цифровой электроники». (Доволі легко знаходиться в Інеті).

Її похилив вік не повинен вводити в оману! В рамках своїх задач книга залишається актуальною. Кому дуже потрібно, є й новіші видання, скажімо Roger Tokheim, «Digital Electronics: Principles and Applications», 8th edition, 2013.

Отож, чим вона може допомогти студенту чи просто зацікавленому? 

Сучасні комп'ютери -- цифрові, працюють із нулями та одиницями. Насправді, звичайно, ці нулі та одиниці -- якісь значення напруги та  струми, що протікають електричними схемами. Однак, зручним є трішки вищий рівень абстракції -- цифрові, логічні, схеми. Дана книга розповідає - що це таке, цифрові схеми. Як вони працюють і все таке.

Описано прості логічні елементи -- NOT, AND, OR, NAND, NOR, способи синтезу логічних схем (зокрема -- карти Карно), на тій чи іншій елементній базі (із AND-NOT-OR будуємо чи у нас одні NAND) тощо. Далі автор переходить до більш складних комбінаційних схем -- мультиплексорів та демультиплексорів, шифраторів, дешифраторів тощо. 

Наступним кроком розповідає про секвенційну логіку -- схеми із пам'яттю. Тригери різних видів, як синхронні так і асинхронні. Лічильники, зсувні регістри.

Потім переходить до арифметичних пристроїв -- суматорів, півсуматорів і того, як за їх допомогою виконувати всілякі можливі обчислення -- віднімання, множення, ділення, і т.д. Далі розповідає про побудову пам'яті. Загальні принципи залишилися тими ж -- і їх потрібно засвоїти, хоча елементна база, згадана автором, все ж вже древня.

J-K тригер. Зображення із книги, що розглядається.
Всі ці елементи залишаються актуальним і зараз. Звичайно, конкретні описані пристрої, в основному, застаріли, але серії мікросхем 74хх та 4000 -- цілком собі актуальні.

Завершується книга прикладами цифрових пристроїв,  зокрема -- процесорів, їх взаємодією із навколишнім світом (АЦП) і оглядом ряду мікросхем. Цінність цих глав для сучасного читача менше, хоча чисто для загального розвитку, витрачений на прочитання час того вартує. (Про цінність історичної інформації в ІТ -- див. наступний пост.)

Додатково слід сказати, що в книзі багато завдань та задач для засвоєння і закріплення. Рекомендую не нехтувати ними. :-)

Щодо нового, восьмого видання (доступного на "Амазоні", зокрема і в електронній, хоча, на жаль -- лише сканованій, формі), воно справді оновлене. Хоча певна "вінтажність" відчувається твердо. На додачу до описаного вище -- багато розповідається про різні сімейства мікросхем (TTL, CMOS), їх електричні особливості, способи використання та суміщення.

Додано більше задач та відступів. Згадується навчальна демоплата на PIC-мікроконтролері (із інтерпретатором PBASIC), але ця частина, як на мене, повністю неактуальна для нас. 

Підсумовуючи:
  • В своїй сфері книга залишається одним із найкращих підручників. (Хоча й, через вік, робиться безпомічною за межами цієї сфери).
  • Нове видання достатньо цікаве, але особливої потреби в ньому немає. Чесно кажучи, з педагогічної точки зору мені старе подобається більше.

Andrew S. Tanenbaum, Todd Austin  «Structured computer organization»

Попередній автор, по великому рахунку, завершує  на арифметичних пристроях, краєчком дотягуючись до арифметично-логічних пристроїв (ALU) та пам'яті. А від цього до повноцінного, навіть зовсім простенького, комп'ютера, ще далеко. 

Наступною книгою може стати Andrew S. Tanenbaum, Todd Austin  «Structured computer organization», останнє видання на момент написання -- шосте. Існує російський переклад: Таненбаум Э. С., Остин Т. "Архитектура компьютера" 6-е изд. (І англійський і російський варіант легко знайти в Інтернеті.) 

Починає автор, традиційно, із історичного огляду. Дещо вільного, скажімо так, але не позбавленого привабливості. Далі, в загальних рисах -- із низькою деталізацією, описує, що таке комп'ютер. Нарешті, третя глава розповідає про комбінаційну та секвенційну логіку, (те ж, про що ціла книга Токхейма :-), пам'ять -- постійна, оперативна, всіляка інша, процесори, шини та ввід-вивід.

Наступною темою є мікроархітектура -- спосіб реалізації систем команд. В ролі "жертви" обрано спрощену систему команд віртуальної машини Java (IJVM), яка потім реалізуватиметься із використанням все більш просунутих підходів. Спочатку найбільш прямолінійна реалізація -- Mic-1 (див. зображення нижче), потім  вона доповнюється попередньою вибіркою (prefetching) -- Mic-2, конвеєром -- Mic-3 та Mic-4.

Блок-схема мікроархітектури MIC-1, із книги, що розглядається. Подробиці див. у тексті.
Поверхнево розглядаються більш просунуті технології пришвидшення процесорів -- кеші, перевпорядкування інструкцій, суперскалярність, передбачення переходів, спекулятивне виконання. Описано, теж поверхнево, кілька популярних мікроархітектур -- x86 Core i7 Sandy Bridge, ARM Cortex A9  OMAP4430, AVR ATmega168. 

Все це було в 4-ї главі. :-) 5-та розповідає про видиму програмістам архітектуру згаданих трьох процесорів. Відносно поверхнево (хоча, може то мені, після чверті століття інтиму із x86 так здається...), але цілком читабельно. Моделі пам'яті (віртуалізація, захист), адресація, стеки, виклик підпрограм, формати даних та інструкцій, і т.д. і т.п.  

Наступна глава трішки менш цікава -- коротко переказує його ж книжку про операційні системи. З іншого боку, хто не читав... Вона переходить у доволі, як на мене, жахливу главу про асемблер x86.

Зате завершальна -- де мова про паралельні архітектури, знову достатньо цікава.

Хоча, в цій книзі простежується та ж закономірність, що я відчув і для його "Сучасних операційних систем", часто, чим краще я знаю тему, тим менше мені подобається глава. Але, однозначно, четвертої глави -- про мікроархітектури Mic-X, це не стосується. Як на мене -- ідеальний баланс загальності, ілюстративності та деталізації для потреб оглядового курсу.

В кінці кожної глави -- запитання для самоперевірки. Часто -- нетривіальні. 

Мушу зауважити, що ця книга мені видалася слабшою за іншу класичну роботу автора, "Сучасні операційні системи". Однак, перш ніж критикувати, слід наголосити, що її задачі зовсім інші, ніж в класики, типу John Hennessy, David Patterson "Computer Organization and Design. The Hardware, Software interface", про яку буде далі, не говорячи вже про її "нащадків" для більш просунутих читачів -- John Hennessy, David Patterson "Computer Architecture : A Quantitative Approach" чи David M. Harris, Sarah L. Harris "Digital Design and Computer Architecture". Вона не є вступом до розробки власного мікропроцесора (хай і навчального) а максимально спрощеним викладом принципів функціювання.


Бойко В.І., Гуржій А.М. та інші, «Схемотехніка електронних систем. Книга 2. Цифрова схемотехніка»  та "Книга 3. Мікропроцесори та мікроконтролери"

Трохи із патріотизму, а трохи через її популярність у багатьох ВУЗах України, згадаю ще й цю книгу. Взагалі, автори опублікували серію із трьох книг "Схемотехніка електронних систем":
  1. В. І. Бойко, А. М. Гуржій, В. Я. Жуйков та ін. "Аналогова схемотехніка та імпульсні пристрої", 2-ге вид., 2004.
  2. В. І. Бойко, А. М. Гуржій, В. Я. Жуйков та ін. "Цифрова схемотехніка", 2-ге вид., 2004.
  3. В. І. Бойко, А. М. Гуржій, В. Я. Жуйков та ін. "Мікропроцесори та мікроконтролери", 2-ге вид., 2004. 
Почну із критики -- книжки, як у нас прийнято,  написані складно. Суворі, майже (місцями - не майже) канцеляритські формулювання, і т.д. і т.п. Виникає враження сурйозного труда, не те що казочки Токхейма з Таненбаумом. :-) Ну, хто радянські підручники читав -- знає, про що мова. Плюс, заради систематичності, трохи жертвується педагогічна складова -- кожна тема розглядається глибоко і детально, але без наступних тем не зрозуміло, навіщо це все взагалі. Каюся, сам грішний... Борюся із такою звичкою. Та й, згадати класичний, визнаний підручник по Python Марка Лутца -- там про if автор починає говорити на 370-х сторінках...  


І фрагмент супровідного тексту:
Але у всьому решта -- цілком достойні підручники. Ніколи не приховував свій скептицизм щодо "наших" підручників (див. метаправило-1 тут: "Книги по C++ -- загальні міркування "), однак ці видаються вартими уваги.

Згаданий другий том розповідає, як і Токхейм, про цифрову електроніку, булеві алгебри і т.д. і т.п.

Слід зауважити, що використано прийняту в СРСР систему позначень елементів схеми (IEC), на противагу "американській" (ANSI) у решті згаданих тут книг. Знати обидві системи -- корисно. На жаль, описана елементна база -- теж радянська. А вони, хоч і передерті в своїй масі, із згаданих 74-х і 40-х серій, маркуються абсолютно самобутньо...

Третій том, присвячений мікропроцесорам і мікроконтролерам, напевне, найвразливіший до критики. (Цю книгу слід порівнювати із "Архітектурою" Таненбаума, а не древнім Токхеймом, який, як і другий том цієї книги, актуальний не зважаючи на давність). Цей том демонстурє явне відставання у часі.

Розглянуто i8080, i8051, PIC, AVR в ролі восьмибітних, i8086 (1979-й) та i80286 (1982-й), MCS 196/296 в ролі 16-бітних, i386 (1985), i486 (1989) перші Pentium-и (формально -- по III-й), яким присвячено 20 сторінок, на противагу 70-ти сторінкам про 86 і 286. А якщо всі 8-бітні підсумувати.. Навіть згадано про IA-64 і x86-64 -- 3 сторінки на всіх. Трішки про архаїчні DSP, трішки про нейропроцесори.

Приблизно ті ж пропорції стосуються і архітектури систем на цих процесорах -- пам'яті, контролерам переривань, тощо...

Однак, мушу сказати, ця інформація -- якщо взяти її на додачу до сучасних архітектур, а не замість, дуже корисна! З одного боку, на таких простих процесорах багато які особливості що можна детальніше показати, з іншого -- історія їх розвитку сама по собі повчальна.

В наступному пості ще буде багато історичних посилань! Проблема, що книжка претендує на навчання студентів актуальним знанням... І в такому статусі -- це трагічно, бо в середині 90-х її наповнення виглядало б в міру вінтажним.


John Hennessy, David Patterson "Computer Organization and Design. The Hardware, Software interface"

Ця книга вже виходить за межі курсу -- вона помітно складніша та ґрунтовніша. Але включаю в список у ролі такого собі апексу, точки подальшого росту. На момент написання, останнє англомовне видання -- 5-те: "Computer Organization and Design MIPS Edition, Fifth Edition: The Hardware/Software Interface" (2013). Російською перекладене четверте, Дэвид А. Паттерсон, Джон Л. Хеннесси, "Архитектура компьютера и проектирование компьютерных систем" (2011, переклад -- 2012). Розповідатиму саме про це видання - 5-го поки не тримав в руках.
Увага, не плутайте із їхньою іншою книгою, "Computer Architecture A Quantitative Approach" -- вона буде в іншому списку. :-)
Загальна структура книги нагадує "Архітектуру" Таннбаума, але є багато фундаментальнішою.  Починається вона із загального огляду комп'ютерів -- з чого складаються і навіщо воно. Також, розглядається тема продуктивності, способи її вимірювання та збільшення. Взагалі, тема продуктивності протягується через всю книгу. Зокрема, багато говориться про популярні штучні метрики (типу тактової частоти).

Як виявляється, люблять в академічному середовищі MIPS-архітектуру... Книга присвячена розробці процесора саме цієї архітектури та системи команд. Тому детально розглянуто систему команд, адресацію пам'яті, виклик підпрограм, кодування команд і т.д. і т.п. певного узагальненого і трохи спрощеного MIPS (про конкретні мікропроцесори цієї архітектури згадується мало). Однак, регулярно розглядаються і інші -- будемо чесні, популярніші, архітектури -- x86, ARM. Правда, твердження про них, іноді, скажімо так, дещо дивні.

Далі йде розгляд реалістичної (хоча -- все ще дуже спрощеної) будови ALU, включаючи навіть (трішки) floating point-числа. Після чого переходять до побудови (на рівні блок-схем, але значно детальніше, ніж в Таненбаума) центрального процесора, зокрема із вибіркою команд. Дано детальні схеми, що і як має взаємодіяти, щоб процесор міг добути команду із пам'яті, підготуватися добути наступну команду (сильно допомагає, що це RISC-архітектура :-), декодувати, виконати та зберегти результат. Такі теми як реалізація умовних та безумовних переходів аж ніяк не нехтуються! Реалізації починають із однотактової (а значить -- повільної в цілому), через різної складності конвеєри (із детальним розглядом конфліктів, які виникають при роботі конвеєра та способів із ними боротися), передачу даних між етапами конвеєра, прогнозування переходів, оброку виключень. Решта технологій прискорення процесора описуються більш поверхнево.

Детально розглянуто підсистему пам'яті, із кешами, віртуальною пам'яттю, TLB, віртуалізацією і віртуальними машинами і все таке. Мені постійно перегукувалося із класичною статтею "What every programmer should know about memory" by Ulrich Drepper -- аж до думки, хто на кого більше вплинув. :-) Детальніше у реалізацію автори не заглиблюються, щоправда. Про дискову пам'ять теж трохи розказано, місцями більш поверхнево. От глава про паралельні обчислювальні системи справила неоднозначне враження. Ніби й помилок немає, але коли читав, не залишало відчуття -- якби не знав, про що мова, точно б не зрозумів...

Книга містить величезну кількість як кількісних так і якісних задач. Просто неймовірну кількість їх, враховуючи тематику. :-) Крім них є багато прикладів та ілюстрацій. 

Із зауважень згадаю хіба, що, хоча мені книга дуже сподобалася, підозрюю, новачку вона буде зовсім незрозумілою -- читаючи кожен логічно зв'язний фрагмент, постійно себе ловив, скільки "попередніх знань" використовується, щоб розуміти -- про що мова. (Читачі на Амазоні також дуже скаржаться на опечатки і неузгодженості. Не знаю чого, але мені вони особливо не заважали...)

Підсумовуючи

Для студентів, яким лінь читати весь текст вище, а потім ще думати, що він означає, даю послідовність ознайомлення:
  1. В припущенні, що слова "булева функція" та "ДНФ" не лякають -- починаєте із Токхейма, глави про прості логічні елементи, комбінаторну логіку, (де)шифратори, (де)мультиплексори, тригери (та секвенційну логіку взагалі), аж по пам'ять.
  2. Далі переключаєтеся на  Таненбаума (мова, звичайно, про його "Архітектуру").
  3. Якщо відчуваєте себе надміру розумними -- заглядуєте в процесі до Бойка і Ко.
  4. Коли закінчили -- починаєте читати Хеннесі та Паттерсона, плавно готуючись до початку наступного семестру із курсом "Архітектура комп'ютерних систем" та Таненбаума "Сучасні операційні системи" -- до курсу, як можна запідозрити, "Операційні системи". 
Різноманітні тексти із Інтернету буде описано окремим  постом -- вирішив не роздувати цей, і так немаленький, текст ще більше.

Додатково

Кілька книг,  які мають відношення до теми, хоч і не є обов'язковими.

Дискретна математика

Не берусь нав'язувати -- підозрюю, є багато кращі підручники, але сам вивчав дискретну математику по: Яблонский С.В. "Введение в дискретную математику" та Новиков Ф.А. "Дискретная математика для программистов".

Про Яблонського скажу, що особливо привабив мене детальний, але доступний, розгляд k-значних логік (тернарних і т.д.).  

Книга Новікова -- складна. Як художня (мною) не читається -- вимагає зосередження. Але, при тому, не виглядає ускладненою лише заради складності. Автор не соромиться писати із використанням математичного формалізму і не розжовує, але й не "умнічає". 

Давні архітектури

З приводу історії архітектури процесорів, систематичного огляду літератури не робитиму, але сходу на полицях знайшлися чотири книги. Не скажу, що вони особливо хороші -- мені важко судити по ряду причин, але між кн. 3 Бойка та інших і ними, вибираю однозначно їх.

Михаил Гук, "Процесcоры Intel от 8086 до Pentium II", 1998. Такий собі розширений огляд архітектури та внутрішньої будови цих процесорів. 

Михаил Гук, "Аппаратные средства IBM PC" (3-тє видання -- 2006) -- огляд комп'ютера в цілому, крім процесорів описано пам'ять, шини, периферія. Із часовими діаграмами пам'яті та регістрами контролеру клавіатури. :-)

Дж. Уокерли, "Архитектура и программирование микро-ЭВМ", 1981, переклад 1984 -- про PDP-11,  Motorola 68000 та 6809, Z80, TI 9900, i8086. MCS-48. (Порівнюємо із списком однієї згаданої вище сучасної книги ;-)

Повертаючись у наш час:

За детальним і систематичним розглядом внутрішньої будови процесорів сімейства x86 -- див. книги Агнера Фога: "Software optimization resources".

Щодо архітектури пам'яті -- обов'язково читати вже загадану "What every programmer should know about memory" by Ulrich Drepper.

Ще згадаю книгу William Stallings "Computer Organization And Architecture". Вона приблизно паралельна книзі Таненбаума -- із яким вони явні конкуренти, бо про операційні системи Stallings теж пише. Актуальне на момент написання -- 10-те видання, починаю читати восьме -- дочитаю, напишу детальніше.

А на  разі -- 

Дякую за увагу!


Немає коментарів:

Дописати коментар