Книга: Простой Python. Современный стиль программирования. 2-е изд.
Назад: Приложения
Дальше: Приложение Б. Установка Python 3

Приложение А. Аппаратное и программное обеспечение для начинающих программистов

Некоторые вещи понятны на интуитивном уровне. Что-то мы видим в природе, что-то изобрел человек — например, колесо или пиццу.

В другие вещи нужно просто поверить. Как телевидение преобразует невидимые колебания в воздухе в звук и движущиеся изображения?

Компьютер попадает во вторую категорию. Как добиться того, чтобы машина поняла и выполнила напечатанное вами?

Когда я учился программированию, было трудно найти ответы на какие-то простые вопросы. Например, в некоторых книгах память компьютера объясняется через аналогию с библиотечной книжной полкой. Мне казалось: если вы читаете данные из памяти, то в рамках аналогии берете книгу с полки. Означает ли это, что книга удаляется из памяти? На самом деле нет. Это больше похоже на получение копии книги с полки.

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

Аппаратное обеспечение

Компьютеры пещерных людей

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

Далекие потомки Ога (Тог был растоптан мамонтом, когда клал очередной камень) научились считать, писать и пользоваться абаком. Но, чтобы перейти от этих инструментов к концепции компьютера, потребуется задействовать воображение и технологические достижения. Первая необходимая технология — электричество.

Электричество

Бен Франклин считал, что электричество — это поток некой невидимой жидкости из места с большим количеством жидкости (положительного) в место с меньшим количеством (отрицательное). Он был прав, но перепутал термины. Электроны путешествуют от «отрицательного» места в «положительное», но они были открыты гораздо позже — менять терминологию оказалось слишком поздно. Поэтому с тех пор нам нужно помнить, что электроны движутся в одну сторону, а ток течет в другую.

Все мы знакомы с такими природными электрическими феноменами, как статическое электричество или молнии. После того как люди открыли способ отправить электроны по проводам для создания электрических цепей, мы еще на один шаг приблизились к созданию компьютеров.

Раньше я думал, что электрический ток в проводе вызывается проворными электронами, которые нарезают круги по всей дистанции. На самом деле это не так. Электроны перемещаются от одного атома к другому. Они ведут себя как шарикоподшипники в трубке (или шарики тапиоки в соломинке). Добавленный с одного конца шарик толкает соседа. Так происходит до тех пор, пока шарик с противоположного конца не вытолкнется. Как правило, электроны перемещаются медленно (скоростьперемещения по проводу составляет примерно три дюйма в час), однако это практически мгновенное столкновение очень быстро распространяет электромагнитную волну: ее скорость составляет от 50 до 99 % скорости света в зависимости от проводника.

Изобретения

Нам все еще нужно следующее:

способ запоминать какие-то данные;

способ что-то сделать с теми данными, которые мы запомнили.

Одной из концепций памяти был выключатель — предмет, который либо включен, либо выключен, при этом он сохраняет свое состояние до тех пор, пока что-то не переключит его в другое состояние. Электрический выключатель работает, открывая и закрывая цепь, позволяя электронам течь по ней или блокируя их. Мы постоянно используем выключатели, чтобы управлять светом и другими электрическими устройствами. Нужен был способ управлять самим выключателем с помощью электричества.

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

С течением лет компьютеры становились быстрее и дешевели по мере того, как их размеры уменьшались. Сигналы перемещаются быстрее, когда компоненты находятся рядом друг с другом.

Однако существует предел тому, насколько маленьким можно сделать транзистор. Резвость электрона встречает сопротивление, вследствие чего вырабатывается тепло. Мы достигли предела более десяти лет назад, производители компенсируют это, размещая несколько чипов на одной плате. Как следствие, повысился спрос на распределенные вычисления; мы рассмотрим данное явление позже.

Независимо от этих деталей, с помощью рассмотренных изобретений мы смогли собрать компьютеры: машины, которые могут запоминать данные и что-то делать с ними.

Идеальный компьютер

Реальные компьютеры имеют множество сложных особенностей. Сконцентрируемся на самых необходимых компонентах.

Интегральная плата содержит центральный процессор, память и провода, соединяющие их друг с другом и другими устройствами.

Процессор

ЦП (центральный процессор), или чип, выполняет собственно вычисления:

математические задачи вроде сложения;

сравнение значений.

Память и кэш

ОЗУ (оперативное запоминающее устройство) занимается «запоминанием». Оно работает быстро, но энергозависимо (данные теряются, если выключается питание).

ЦП становятся еще быстрее, чем память, поэтому разработчики компьютеров добавляют кэши: небольшие и более быстрые участки памяти, располагающиеся между процессором и основной памятью. Пытаясь считать байты из памяти, ваш ЦП сначала обращается к ближайшему кэшу (он называется L1), затем к следующему (L2) и, наконец, к основной памяти.

Хранение

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

Традиционный метод хранения — магнитные диски (или жесткие дискиhard drives, HDD) с перемещающимися головками, которые отвечают за чтение и запись, как виниловые пластинки и стилус.

Гибридная технология называется SSD (Solid State Driveтвердотельный накопитель). Он изготавливается из полупроводников, как и ОЗУ, но при этом энергонезависим, как магнитные диски. Цена и скорость работы выше, чем у HDD, но ниже, чем у ОЗУ.

Ввод данных

Как вы помещаете данные в компьютер? Для людей основные варианты — это клавиатуры, мыши и сенсорные экраны.

Вывод данных

Как правило, люди видят данные с помощью экранов и принтеров.

Относительное время доступа

Время, которое требуется для записи и получения данных из этих компонентов, может значительно различаться. Это оказывает большое практическое влияние. Например, ПО должно работать в памяти и получать оттуда данные, но также должно надежно сохранять их в энергонезависимых устройствах, таких как диски. Проблема заключается в том, что диски в тысячи раз медленнее, а сеть — и того больше. Это значит, что программисты тратят много времени на выбор наилучшего компромиссного решения между скоростью и стоимостью.

В статье Computer Latency at a Human Scale () Дэвид Джеппесен сравнивает устройства. Я перенес его изыскания и другие исследования в табл. А.1. Последние столбцы — соотношение, относительное время (ЦП — одна секунда) и относительное расстояние (ЦП — один дюйм) — помогут лучше понять эту таблицу.

Таблица A.1. Относительное время доступа

Расположение

Время

Соотношение

Относительное время

Относительное расстояние

ЦП

0,4 нс

1

1 с

1 дюйм

Кэш L1

0,9 нс

2

2 с

2 дюйма

Кэш L2

2,8 нс

7

7 с

7 дюймов

Кэш L3

28 нс

70

1 мин

6 футов

ОЗУ

100 нс

250

4 мин

20 футов

SSD

100 мкс

250 000

3 дня

4 мили

Магнитный диск

10 мс

25 000 000

9 месяцев

400 миль

Интернет: SFNY

65 мс

162 500 000

5 лет

2500 миль

Хорошо, что выполнение инструкции процессора на самом деле занимает меньше наносекунды, поскольку в противном случае за то время, которое потребовалось бы для обращения к диску несколько раз, у вас мог бы родиться ребенок. Время отклика диска и сети гораздо больше, чем для ЦП и ОЗУ, поэтому полезно выполнять в памяти максимально много работы. И поскольку процессор сам по себе быстрее, чем ОЗУ, лучше иметь последовательные данные, чтобы байты можно было отправить в более быстрые (и менее объемные) кэши, расположенные ближе к ЦП.

Программное обеспечение

Как же управлять всем этим оборудованием? Для начала нужны инструкции (команды, которые указывают процессору, что делать) и данные (входные и выходные параметры инструкций). В компьютерахс запоминаемой программой данными можно считать все, что упрощает процесс проектирования. Но как представить инструкции и данные? Что, если они сохраняются в одном месте, а выполняются в другом? Дальние родственники пещерного человека Ога очень хотели бы узнать это.

Вначале был бит

Вернемся к идее выключателя — чего-то, что сопровождает одно из двух значений. Он может быть либо выключен, либо включен, иметь либо высокое, либо низкое напряжение, быть положительным или отрицательным — он получает значение, не забывает его и может предоставить любому, кто запросит это значение. Интегральные схемы дали нам способ интегрировать и соединить миллиарды маленьких переключателей в маленькие чипы.

Если переключатель может иметь всего два значения, то его можно использовать для того, чтобы представить бит, или бинарную цифру. Ее значения можно расценивать как 0 и 1, да и нет, true и false или любым другим удобным для нас способом.

Однако биты слишком малы, чтобы представить какое-либо значение, помимо 0 и 1. Как нам убедить биты представлять более крупные объекты?

Чтобы получить ответ, взгляните на свои пальцы. Мы используем всего десять цифр (от 0 до 9) в повседневной жизни, а числа больше 9 получаются благодаря позиционной записи. Если я добавлю 1 к числу 38, то 8 станет 9 и мы получим значение 39. Если я добавлю еще 1, то 9 превратится в 0, а 1 перенесется влево, увеличивая 3 до 4, что даст нам результат, равный 40. Крайнее правое число — это «колонка единиц», то, что слева от него, — «колонка десятков» и т.д., по мере продвижения влево выполняется умножение на 10. С помощью трех десятичных чисел вы можете представить тысячу (10 * 10 * 10) чисел от 000 до 999.

Мы можем использовать позиционную запись и для битов, объединяя их в более крупные коллекции. Байт имеет 8 бит и может представлять 28 (256) возможных комбинаций. Вы можете использовать байт для сохранения, например, небольших чисел от 0 до 255 (в позиционной записи нужно оставить место для нуля).

Байт выглядит как последовательность из 8 бит, каждый из которых имеет либо значение 0 (или «выкл.», или false), либо значение 1 (или «вкл.», или true). Самый правый бит — наименеезначимый, а самый левый — наиболее значимый.

Машинный язык

ЦП каждого компьютера разработан с набором инструкций, представленных масками битов (они еще называются кодами операций), которые он может понимать. Каждый код операции выполняет определенную функцию; ее входные значения находятся в одном месте, а выходные — в другом. В процессоре есть специальные внутренние локации, называемые регистрами, в которых хранятся коды операций и значения.

Воспользуемся упрощенным компьютером, который работает только с байтами и имеет четыре регистра размером 1 байт, которые называются A, B, C и D. Предположим следующее:

код операции команды помещается в регистр А;

• команда получает входные значения из регистров B и C;

команда сохраняет результат в регистре D.

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

Предположим, что:

в регистре A содержится код операции сложения двух целых чисел: десятичная 1 (бинарное представление — 00000001);

• в регистре B содержится десятичное значение 5 (бинарное представление — 00000101);

в регистре C содержится десятичное значение 3 (бинарное представление — 00000011).

ЦП видит, что в регистре А появилась инструкция. Он декодирует и запускает ее, читая значения из регистров В и С и передавая их во внутренние цепи, которые могут выполнять сложение. При получении результата мы должны увидеть десятичное значение 8 (бинарное представление — 00001000) в регистре D.

Процессор выполняет сложение и другие математические функции, используя регистры похожим способом. Он декодирует код операции и перенаправляет управление конкретным цепям внутри ЦП. Он также может сравнивать объекты, например, «Больше ли значение регистра В, чем значение регистра С?» Кроме того, немаловажно, что он получает значения из памяти в процессоре и сохраняет значения из него в памяти.

Компьютер сохраняет программы (инструкции на машинном языке и данные) в памяти и обрабатывает передачу инструкций и данных в ЦП и из него.

Ассемблер

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

Высокоуровневые языки

Чтобы освоить ассемблер, требуется приложить немало усилий, поэтому люди разработали более высокоуровневые языки, которые им было бы проще использовать. Такие языки транслируются в ассемблер программой, которая называется компилятором, или же запускаются непосредственно с помощью интерпретатора. Одними из самых старых подобных языков являются FORTRAN, LISP и С — их дизайн и предполагаемое использование значительно различаются, но объединяет эти языки их место в компьютерной архитектуре.

Для реальных задач, как правило, выделяют определенные «стеки» ПО:

Мейнфрейм — IBM, COBOL, FORTRAN и др.;

• Microsoft — Windows, ASP, C#, SQL Server;

• JVM — Java, Scala, Groovy;

системы с открытым исходным кодом — Linux, языки (Python, PHP, Perl, C, C++, Go), базы данных (MySQL, PostgreSQL), веб (apache, nginx).

Программисты обычно остаются в одном из этих миров, используя языки и инструменты внутри него. Некоторые технологии, такие как TCP/IP и веб, позволяют этим стекам взаимодействовать.

Операционные системы

Каждая инновация построена на других новшествах, появившихся до нее, и обычно мы не знаем (или нам неважно), как работают более низкие уровни. Инструменты строят инструменты для создания еще большего количества инструментов, и мы принимаем это как должное.

Рассмотрим основные операционные системы:

Windows (Microsoft) — коммерческая, много версий;

• macOS (Apple) — коммерческая;

• Linux — открытый исходный код;

Unix — много коммерческих версий, в основном замененных на Linux.

Операционная система состоит из следующих компонентов:

ядро — планирует выполнение программ и управляет ими, а также вводом/выводом;

• драйверы устройств — используются ядром для получения доступа к ОЗУ, диску и другим устройствам;

• библиотеки — файлы исходного кода и бинарные файлы, используемые разработчиками;

приложения — отдельные программы.

Один компьютер может поддерживать больше одной операционной системы, но за один раз запускается только одна. Процесс запуска ОС называется начальной загрузкой (booting), перезапуск — перезагрузкой (rebooting). Эти термины появились даже в области маркетинга фильмов — студии «перезагружают» предыдущие неудачные попытки. Вы можете выполнить мультисистемную загрузку вашего компьютера, установив больше одной операционной системы, но запускать одновременно можно только одну.

Выражение «пустая машина» означает один компьютер, на котором запущена операционная система. В нескольких следующих подразделах мы отступим от «пустой машины».

Виртуальные машины

Операционная система — по сути, большая программа, поэтому в конечном счете кто-то придумал способ запустить чужие операционные системы как виртуальные машины (гостевые программы) на своих хост-машинах. Вы можете установить на свой компьютер Microsoft Windows, а затем в то же время запустить Linux на виртуальной машине, не покупая второй компьютер или не выполняя мультисистемную загрузку.

Контейнеры

Более свежая идея — это контейнер. Контейнер — способ запускать множество операционных систем одновременно до тех пор, пока у них одинаковое ядро. Идея была популяризована командой разработчиков Docker (/) — они взяли малоизвестные особенности ядра Linux и добавили к ним полезные возможности по управлению. Их аналогия по отправке контейнеров (которая революционизировала отправку и сэкономила нам много денег) была прозрачной и привлекательной. Выложив код в открытый доступ, команда разработчиков Docker добилась того, что контейнеры быстро приняла вся компьютерная отрасль.

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

Распределенные вычисления и сети

Когда бизнес только начал применять ПК, нужно было найти способ заставить компьютеры общаться друг с другом, а также с другими устройствами, например принтерами. Изначально использовалось проприетарное сетевое ПО, такое как Novell, но в конечном счете его заменил стек протоколов TCP/IP, поскольку Интернет заметно развился во второй половине 1990-х. Microsoft позаимствовала стек TCP/IP из бесплатного варианта Unix, которая называется BSD.

Одним из эффектов интернет-бума стал спрос на серверы: машины и ПО, которые позволяют запустить все сервисы для работы с вебом, чатами и электронной почтой. Старый стиль сисадмина (системного администрирования) состоял в том, чтобы устанавливать все программное обеспечение и оборудование и управлять им вручную. Спустя некоторое время стало понятно, что требуется автоматизация. В 2006 году Билл Бейкер из компании Microsoft придумал аналогию «домашние животные против крупного рогатого скота» (pets versus cattle) для управления серверами, и с тех пор она стала мемом в нашей отрасли (иногда ее формулируют как pets versus livestock) (табл. A.2).

Таблица A.2. Домашние животные против скота

Домашние животные

Скот

Именуются индивидуально

Нумеруются автоматически

Требуется индивидуальный подход

Стандартизированы

Восстанавливаются при сбоях

Заменяются при сбоях

Вы можете встретить наследника «сисадмина» — термин DevOps (development and operations — «разработка и использование»). Он связан с набором приемов, призванных поддержать быстрые изменения в сервисах, не вызвав в них перегрузок. Облачные сервисы могут быть очень крупными и сложными, и даже у крупных компаний, таких как Amazon или Google, время от времени случаются сбои.

Облако

Люди много лет создавали компьютерные кластеры, используя разные технологии. Одной из более ранних концепций был Beowulf-кластер: идентичные компьютеры для массовой обработки данных (от фирмы Dell или аналогов вместо рабочих станций от Sun или HP), связанные локальной сетью.

Термин облачные вычисления означает использование компьютеров в дата-центрах для выполнения вычислений и хранения данных — однако не только для тех компаний, которым принадлежат эти ресурсы бэкенда. Сервисы предоставляются всем, а стоимость зависит от времени работы ЦП, занятого объема дисков и т.д. Компания Amazon и ее AWS (Amazon Web Services) — самый известный облачный сервис, но Azure (Microsoft) и Google Cloud также довольно велики.

На самом деле эти облака представляют собой пустые машины, виртуальные машины и контейнеры — все они считаются скотом, а не домашними животными.

Kubernetes

Все компании, которым нужно управлять крупными кластерами компьютеров, расположенных в нескольких дата-центрах, — например, Google, Amazon и Facebook — создали или позаимствовали решения, которые позволяют этим компаниям масштабироваться.

Развертывание. Как вы вводите в строй новое оборудование и программное обеспечение? Как вы заменяете его в случае сбоя?

• Конфигурация. Как должны работать эти системы? Им нужны такие вещи, как имена и адреса других компьютеров, пароли и настройки безопасности.

• Оркестрация. Как управлять всеми этими компьютерами, виртуальными машинами и контейнерами? Можно ли выполнить масштабирование, чтобы соответствовать уменьшению или увеличению нагрузки?

Обнаружение сервисов. Как узнать, кто что делает и где находится?

Некоторые конкурирующие решения были созданы командой разработчиков Docker и другими. Но за последние несколько лет стало ясно, что эту битву выигрывает Kubernetes (/).

Компания Google разработала крупные внутренние фреймворки для менеджмента под кодовыми именами Borg и Omega. Когда сотрудники компании предложили открыть исходный код этих «бриллиантов», руководство на некоторое время задумалось, но затем все же решилось. Google выпустила Kubernetes версии 1.0 в 2015 году, и с тех пор его экосистема и влияние постоянно растут.

Это отсылает к выражению «тянуть себя за шнурки ботинок» (lifting yourself by your own bootstraps), что выглядит так же невероятно, как и компьютер.

В некоторых файлах Microsoft вы можете найти записи об авторских правах, принадлежащих Университету Калифорнии.

Назад: Приложения
Дальше: Приложение Б. Установка Python 3

dofermerdat
этот. породы кроликов с фотографиями мясныефермер ру форум рассадакрупнейшие сельскохозяйственные районы зарубежной европыкрс мясо