Friday, May 27, 2016

William Golding "Lord of the flies"

It is so astoundingly that for so many years of existing, humanity cannot decide which shape should morality take. "Lord of the flies" tells us about nature of morality and about its connection with a wild human nature. Evil exists within men from our first appearance in the world. It is a wild sense produced by fear and thirst of survival and it is the main enemy of mind and society. "Fancy thinking the Beast was something you could hunt and kill! You knew, didn't you? I'm part of you" - tells the pig's skull to the one of the main heroes. The scene of this "interview" shakes your mind when you read it.  The symbol of the demon who lives inside, who has been created by your fear of the unknown, the lord of the flies lives somewhere inside and tries to swallow you.

We need to understand, that we always have a choice. We can listen to Piggy (voice of the mind) and stay with Ralph as a chief (civilization and society) and keep the fire going (work to have a salvation) or join the tribe of colored savages, hunting, killing and degrading with our own selfishness. It is always hard to choose between a moment of selfish fun and working for the commonweal because the human nature turns you to the first option. Golding tries to say, that you cannot build the society only on rules that seem right to everyone from the reasonable point of view. You always need to count your nature and keep in mind that we are humans, otherwise, the inner evil will become too strong and you wouldn't be able to control it.

"We did everything adults would do. What went wrong?" - asks Ralph when everything he tried to build was breaking down. He hadn't realized yet that he is already an adult, and Ralph, unlike Simon understands it only in the end of the novel. It is a very significant moment, that tells us that the novel is not about the children on the dead island. The novel is about adults in the dead world. The navy officer who rescued children in the last sentences of the book is a great symbol. He saved children from horrid things that were going to happen, he stopped the men hunt, but as the navy officer, he did the same terrible things in his past. Adult rescued kids from the lord of the flies, but who will rescue him?

I want to mention the mastery of William Golding. I don't know how, but I've been there, on the island, with those children. I was Piggy and cried "I have the conch!", I was Jack and hunted the pig, I was Simon and talked with the lord of the flies, and of course, I was Ralph and as an animal ran away from savages in wild, uncontrolled fear. It is magic how while reading a book you can feel the heroes, feel like them, see like them, think like them. You need to be really genius to write like this, and William Golding is. This is one of the most saturated and meaningful novels I've ever read.  

Friday, May 13, 2016

Э. Таненбаум, Т. Остин "Архитектура компьютера", 6-ое издание

Я завершил очередную книгу Таненбаума, и здесь, как всегда, мой конспект. Конспект получился настолько неполным, насколько это возможно и настолько объемным, насколько можно написать в одном посте.

Многое осталось за пределами головы, так как книга очень сложная. Сложилось такое впечатление будто я упустил самое важное. С другой стороны, я узнал очень много нового и закрыл те вопросы, из-за которых начал читать эту книгу. Книга оказалась очень интересной, несмотря на сложность (а во многом и благодаря ей) и я ни разу не заставлял себя читать (наоборот, даже хотел вернуться).

За кадром конспекта, помимо кучи теории, остались архитектуры современных процессоров. Довольно инетерсно было разобраться с тем как работает Core i7, но, к сожалению, он оказался настолько сложным, что почти все разделы про него я пропускал мимо памяти. Далее конспект.

Компьютер состоит из связанных между собой процессоров, модулей памяти и устройств ввода-вывода. 

Архитектуру компьютера (так же как и компьютерных сетей) можно разделить на уровни. Самый нижний уровень описывает основные элементы, из которых конструируются компьютеры. В основе всех частей компьютера стоят транзисторы, которые соединяются в вентили. Путем различного соединения транзисторов, можно получить схемы, реализующие логические операции НЕ (если на вход подается напряжение 1В, то на выходе 0В), НЕ И (вход: 1В и 1В, выход 0В, в других случаях 1В) и НЕ ИЛИ (вход 0В и 0В, выход 1В, в других случаях 0В). Соединяя эти основные вентили, можно также получить схемы для И и ИЛИ. Функции преобразования входного сигнала создаются путем различных комбинаций этих вентилей. Модули, полученные путем реализации этих функций, расположенные на куске кремния, называются интегральными схемами.

Следующий уровень называется уровнем микроархитектуры. На этом уровне работают команду в которые интерпретируются команды следующего уровня. Обычно эти команды называются микрокомандами и выполняются они за один цикл (на RISC машинах) или за несколько циклов (на CISC машинах). Уровень микроархитектуры целиком зависит от аппаратной реализации. В книге рассматривается гипотетическая машина IJVM.  Синхронизация операций достигается путем использования тактового генератора процессора. Генератор выдает короткие импульсы, на спаде которого данные загружаются, а на фронте устанавливаются выходные. В промежутке между импульсами операции выполняются. Микрокоманды состоят из набора бит в которых указываются настройки используемых регистров и адрес следующей микрокоманды. Для управления вызовом процедур используется стек. Для оптимизации работы используется прогнозирование переходов, так как команды переходов выполняются дольше обычных. При динамическом прогнозировании, рядом с командой ставится бит, который указывает результат ее выполнения в прошлый раз. В следующий раз используется тот же путь. Если прогноз неправильный - бит меняется. Кроме того, команды могут выполняться не в той последовательности, в которой они пришли (для того, чтобы распараллелить работу и избавиться от моментов простаивания процессора). Выполнение команды до того как станет известно нужна команда или нет называется спекулятивным исполнением.

Уровень архитектуры набора команд является промежуточным звеном между программным и аппаратным обесепечением. Команды на этом уровне состоят из кода операции и некоторой дополнительной информации. Процесс поиска операндов называется адресацией. Существует несколько режимов адресации. Непосредственная адресация означает что в адресной части команды хранится сам операнд (константа в программировании). Прямая адресация - операнд выбирается по адресу. При регистровой адресации вместо адреса указывается регистр. При косвенной регистровой адресации адрес хранится в регистре. Обращение по адресу со смещением называется индексной адресацией. Существует также стековая адресация. На этом уровне вводится понятия потока управления (контекста, в котором выполняется текущая программа, например текущая процедура) и переключателей потока управления: исключений (чаще в случаях ошибок) и прерываний (в случае если ответ медленного устройства нужно срочно обработать).

На уровне операционной системы происходит виртуализация ресурсов компьютера. Сделано это для возможной совместимости с подменой железа компьютера. Виртуальная память позволяет работать с программами, которые "не влезают" в основную память. Виртуальное адресное пространство делится на страницы равного объема, которые отображаются на основную память. В памяти в каждый момент времени находится одна (или несколько) страница, остальное - на диске. Если в памяти хранится больше одной страницы, то участки памяти содержащие страницу называются страничными фрагментами. В таблице страниц находится соответствие между виртуальными и физическими адресами. Сегменты памяти - это подобие страниц, только они могут иметь разный размер. Каждый сегмент обладает своим адресным пространством. Файл - это виртуальная абстракция ввода-вывода. Файл описывается неким дескриптором, метаданными и, собственно, содержимым.

Уровень ассемблера позволяет перевести программу написаную на более-менее понятном языке для человека в машинный код, состоящий из чисел. Языком ассемблера называется язык команды в котором являются точной копией машинных команд, только в читаемом виде. Ассемблер транслирует эти команды в машинный код. Здесь я писать много не буду, так как тема более-менее мне знакома. Напишу только, что ассемблер транслирует программу в два прохода. В первом он собирает все объявленные программистом символические названия и считает их адреса, во втором он транслирует программу в выходной файл. На этой же ступени работает компоновщик, который из нескольких модулей генерирует выходной бинарный файл.

Процессоры предназначены для выполнения команд находящихся в основной памяти. Мозгом компьютера является центральный процессор. Ключевым понятием для работы процессора является тракт данных. Тракт данных состоит из входных регистров, арифметико логического устройство (АЛУ) и шин. Шины используются для передачи данных. Процессор принимает данные в регистры, проводит нужную работу в АЛУ, а затем отдает результат в выходной регистр. Процессор, ориентированный на поддержку как можно большего числа различных команд, называется СISC процессором, а процессор ориентированный на параллельный запуск как можно большего числа различных команд (при это набор команд исполняемых процессором гораздо меньше CISC системы) называется RISC процессором. Для выполнения команд в параллельном режиме используются конвейеры. Суть конвейеров заключается в том, что пока выполняется одна ступень исполнения команды, занимающая одну часть процессора, одновременно может выполняться другая часть команды, занимающая другую часть процессора. Например во время выборки следующей команды, параллельно на АЛУ может выполняться предыдущая. Существуют суперскалярные архитектуры. Суперскалярные архитектуры поддерживают либо несколько конвейеров одновременно, либо один конвейер с несколькими функциональными блоками на одной ступени (например, вместо АЛУ на ступени исполнения команды могут быть несколько АЛУ и блок отвечающий за операции над числами с плавающей точкой). Таким образом обеспечивается еще большая параллельность. RISC процессоры работают гораздо быстрее CISC процессоров. несмотря на то, что в RISC процессоров одна команда выполняется дольше, засчет параллелизма выигрыш во времени гораздо выше. Существуют также SIMD процессоры, которые состоят из большого числа схожих процессоров и выполняют одинаковые инструкции для разных наборов данных. Для ускорения обращения к памяти процессоры используют кэши. Кэш может отображаться на память прямо, таким образом память поделена на строки, определенного размера, имеющие адреса. Кэш хранит прямое отображение строк с мета-информацией, позволяющей понять какая именно строка лежит в кэше. Кэш может быть устроен как таблица, тогда для каждого адреса будет храниться n-строк. Это n-входовая ассоциативная память. Кэш может разделяться на кэш данных и кэш команд.

Для выполнения сложных вычилсительных задач используются мультипроцессоры и мультикомпьютеры. Мультипроцессоры - это несколько процессоров делящих одну память. В мультикомпьютерах каждый процессор обладает своей собственной памятью. Проблемы при организации мультипроцессорах встречаются в согласованности кэшей.  Мультипроцессоры делятся на типы в зависимости от доступа к памяти. UMA мультипроцессоры имеют одинаковый доступ к основной и локальной памяти, NUMA мультипроцессоры к локальной памяти обращаются быстрее, CC-NUMA работают с кэшами. Мультикомпьютеры, чаще всего, объединяются по локальной сети.

В памяти компьютера хранятся программы и данные. Память состоит из ячеек, которые, в свою очередь, представляют собой набор бит. Все ячейки в памяти имеют одинаковый размер, а также свой адрес. Современные компьютеры, в основном, работают с 8-разрядными ячейками (байтами). Ячейки объединяются в слова (чаще всего по 32 бита и по 64 бита). Большинство команд работают со словами. В памяти также хранится избыточная информация, для контроля правильности данных (контрольные суммы). Процессоры обладают своей небольшой памятью, которая называется кэш-памятью. Доступ к ней гораздо быстрее, чем к основной памяти компьютера, поэтому часть основной памяти копируется туда, для увеличения быстродействия. Так как место на плате процессора ограничено, кэш-память не может быть большого объема. В качестве памяти также могут выступать магнитные диски (жесткие диски), SSD, CD/DVD/Blu-Ray и т. д. Доступ к ним осуществляется дольше всего. Запись на магнитные диски осуществлется с помощью вращения диска под магнитной головкой. Дорожкой называется последовательность битов, записанных за полный оборот. Дорожка разбита на секторы. В одном жестком диске может быть несколько магнитных дисков. Набор дорожек, находящихся на одном расстоянии от центра, называется цилиндром. Диски можно организовывать в RAID массивы. Это наборы дисков, которые воспринимаются как один большой диск. SSD работают с помощью зарядки или разрядки транзисторов, оставляющих их всегда во включенном/выключенном состоянии.

Память состоит из защелок и триггеров. Защелки и триггеры это вентильные схемы, сохраняющие свою конфигурацию в течение определенного промежутка времени. Триггеры и защелки, как правило, одноразрядные. Из восьми таких элементов можно построить восьмиразрядный регистр. Для основной памяти используются немного более сложные схемы. На вход им подается адресный сигнал, состоящий из количества бит, необходимого для адресации всего адресного пространства и необходимые флаги, показывающие был ли дан сигнал для чтения или для записи. На выходе, соответственно, появляется необходимое значение. Существует два вида памяти - ОЗУ и ПЗУ. ОЗУ работает все время, пока к нему подается питание. ОЗУ может быть статическим (работает быстро) и динамическим (большой объем). Для ПЗУ питрания не нужно. Существует несколько типов ПЗУ, но я не считаю важным описывать это здесь.

Соединение компонентов компьютера осуществляется с помощью шин. Шина - это несколько проводников, соединяющих несколько устройств. Шина содержит адресные линии - чем больше линий, тем больший объем памяти можно через нее адресовать. Также существуют информационные и управляющие линии. Так как сигналы на разных линиях передаются с разной скорость возникает расфазировка шины. Чем больше скорость шины, тем больше расфазировка. Шины бывают синхронными и асинхронными. Синхронная шины содержит линию, которая запускается тактовым генератором. Любое действие шины занимает целое число циклов. Синхронная шина работает на скорости самого медленного устройства в паре. Асинхронная шина не содержит тактового генератора. Она работает засчет подачи определенных сигналов, символизирующих о завершении какой-либо операции (например после установки адресных линий, или после окончания считывания данных из памяти). Устройство которое посылает запрос по шине называется задающим, а принимающее подчиненным. Если существует несколько задающих устройств в один момент времени используется арбитраж шины. Арбитраж может быть централизованным или децентрализованным. При централизованном специальное устройство, с помощью определенной стратегии (на выбор разработчика шины) решает какое устройство воспользуется шиной в данный момент времени. При децентрализованном арбитраже, сами устройства решают кто будет передавать запрос (либо прослушивая линии запроса, либо работая с выделенной линией занятости шины). За раз шина может передать одно слово. Так как выгоднее передавать слова блоками, шина передает одно слово в цикл, до тех пор, пока не передаст целый блок данных.

Числа с плавающей точкой представляются в виде f * a^e, где f называется матиссой, е - экспонентой, а в качестве основания берется 2, 8 или 16. В зависимости от стандарта число записывается в виде 32 разрядного числа, первые несколько из которых представляют экспоненты, а оставшиеся матиссу. Точка находится перед матиссой. Нормализованный вид матиссы достигается путем сдвига влево до тех пор, пока первый бит не станет равным 1, а от экспоненты отнимается количество сдвинутых бит.