От основ к вершинам или Как оно всё работает?

Вы знаете, как работает компьютер? Нет, я серьёзно! Не в смысле – какую кнопку нажать, чтобы получить результат, а в более глобальном? Не думаю, что на нашей планете вообще есть хоть один человек, который полностью понимает, как устроен компьютер у него на столе. Но попробовать в этом разобраться, право же, стоит. Рискнём?

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

Фундамент

Начнём, пожалуй, с самого низкого уровня. Как знает любой школьник, прошедший полный курс физики, в природе существует такая штука, как p‑n‑p‑переход. Его свойства (а он, как знают студенты, изучающие физические основы электротехники, может выполнять роль «ключа», пропуская или останавливая поток электронов в зависимости от того, как приложено напряжение) легли в основу самого простого электронного компонента – транзистора. Транзистор может находится в двух состояниях – «открыто» и «закрыто». Знакомые с базовым курсом информатики уже догадались, к чему я клоню. Правильно: эти состояния – ни что иное, как «0» и «1» – два базовых элемента бинарной системы счисления, используемой компьютерами.

Схема устройства транзистора

Будучи объединёнными, несколько транзисторов могут создавать простейшую логическую схему. Если приложить напряжение ко входам этой схемы, подачей напряжения на управляющие контакты можно добиться изменения состояния на выходе. Проще говоря, замыкая и размыкая логический ключ, мы можем подавать ток на следующий элемент схемы – или не подавать его. Таким образом, с помощью нескольких транзисторов мы можем выполнять простейшие арифметические и логические операции в бинарной системе счисления.
На основе групп таких простейших логических элементов можно строить уже более сложные схемы – процессоры (к примеру, в процессоре Intel Core 2 Duo (Conroe) 291 млн транзисторов). Однако, как вы понимаете, в наше время никто не перетыкает сотни проводков, чтобы управлять компьютером (хотя раньше компьютеры программировались именно таким трудоёмким способом). Для облегчения жизни программистам, инженеры-электронщики оснастили сложные логические цепи процессора особыми управляющими точками, подача напряжения на которые приводит к выполнению целого каскада внутренних команд или же перестроению отдельного участка схемы с целью подготовить его к приёму другой команды. Такие наборы команд получили название ассемблера – базового языка процессора. Для каждого типа процессора он свой, но в основе всех разновидностей лежит один принцип. Фактически именно ассемблер является переходом от аппаратной составляющей компьютера к программной.
Разумеется, всё изложенное выше – лишь общая схема работы процессора. Однако в основе даже самых современных микросхем лежит именно она.

Цоколь

Как вы понимаете, процессор как таковой – штука малополезная. Для полноценной работы компьютера нужно ещё немало элементов. Основные из них знакомы всем – устройства временного и постоянного хранения информации, управления/ввода, а также вывода информации. Проще говоря, оперативная память, жёсткий диск, клавиатура/мышь и монитор. Все эти устройства соединены с процессором так называемой общей шиной, которая делится на шину данных, адресную шину и шину команд. По названиям уже можно догадаться, для чего предназначена каждая из них. Но соединяются все эти устройства не напрямую, а через промежуточные звенья – так называемые контроллеры («процессор-шина-контроллер-шина-устройство»). Контроллеры позволяют каждому отдельному устройству общаться с процессором, являясь как бы переводчиками. В основе их лежат опять-таки логические схемы (в зависимости от типа устройства, которым управляет контроллер, его схемы могут быть более или менее простыми).
Возьмём для примера ввод двух чисел с клавиатуры, их сложение и последующий вывод на экран. Примерная схема работы электронной части компьютера (программную составляющую мы пока пропустим, дабы было проще всё это дело осмыслить) выглядит следующим образом. Пользователь нажимает на клавиатуре клавишу (скажем, с цифрой «0»). Электронный импульс попадает в контроллер клавиатуры, который «понимает», что нажата именно клавиша «0». Эта информация по шине данных поступает в процессор. Тот – опять же, по шине данных – отправляет цифру в память, одновременно по адресной шине передавая адрес ячейки в памяти, куда информацию нужно записать. Аналогичным образом в память попадает вторая цифра (скажем, «1»). Затем мы отдаём команду на сложение чисел (нажав клавишу «+»). Уже знакомым нам путём (только вместо шины данных используется командная шина) эта информация доходит до процессора. Он, поняв, что пришли не данные, а команда, начинает выполнять более сложную операцию: отправляет по адресной шине адреса ячеек памяти, в которых лежат числа, берёт эти числа и выполняет необходимую операцию. Результат отправляется обратно в память (с указанием нового адреса, разумеется) и одновременно – на контроллер монитора. Он, в свою очередь, формирует изображение цифры «1» (т.е. результата выполнения программы) и отправляет команду на отрисовку этого изображения на экране. Казалось бы, простейшая операция, а в её выполнении задействовано немало компонентов компьютера. Конечно же, все эти действия выполняются с огромной скоростью.
Подобным образом выполняются абсолютно все команды пользователя (хотя обычно схема работы ещё сложнее – ведь данных и команд в тысячи раз больше).

Первый этаж

Описанная мной схема (повторюсь ещё раз – упрощённая!) устраивала бы всех, если бы не одно «но»: большинству пользователей компьютер нужен вовсе не для сложения ноликов и единичек в различных комбинациях. А управлять кучей умного «железа» посредством одного лишь ассемблера – дело хотя и не невозможное, но довольно хлопотное. Дабы упростить процесс, программисты (люди, как известно, очень ленивые) придумали расширенные наборы команд. Самые известные из них – MMX, 3D Now! и SSE (трёх версий). По сути, они являются своеобразной прослойкой (очередной) между ассемблером и программами более высокого уровня (о них – далее). Одна команда такого набора запускает на выполнение целую последовательность (иногда – очень и очень большую) ассемблерных команд.
Но даже при помощи таких команд создание сложных программ было бы утомительным процессом, так что самые ленивые (но самые умные) программисты придумали себе так называемые «языки высокого уровня». Названия всех их перечислять не буду – тут и всего номера может не хватить. Самые распространённые из них на слуху у всех: Pascal, Basic, C++. Каким бы ни был язык программирования (не буду сейчас рассуждать о преимуществах и недостатках каждого из названных), в конечном итоге, написанный на нём код преобразуется в набор ассемблерных команд (процессор-то, как вы помните, ничего другого не понимает).

Второй этаж

И всё бы ничего, но программа сама по себе (даже самая простая) выполняться не начнёт. Конечно, можно добавлять к каждой программе набор команд, выполнение которых заставит процессор считать все необходимые данные и подготовить к работе все прочие устройства в составе компьютера. Но делать такое для каждой программы – занятие нудное. А программисты… Ну, вы уже в курсе.

Схема передачи данных между компонентами компьютера

И вот на свет появляются особые программы – операционные системы. Они берут на себя всю нудную, но нужную работу: загружают программы, отдают процессору базовые команду на их выполнение… Конечно, работа современных ОС этим далеко не ограничивается, но описанные функции обязательны для любой операционки.

Третий этаж

Да, вы правильно поняли – лень программистов не знает границ. Дабы программам было легче общаться с операционными системами (и наоборот), они придумали ещё одну прослойку – так называемые API (Applicaton Program’s Interface; программный интерфейс приложений). Таких интерфейсов очень много. Самый известный, наверное, – это WinAPI. Он содержит команды для отрисовки окон и выполнения базовых операций в рамках операционных систем Windows. Использование команд WinAPI ограждает (ленивых) программистов от постоянного рисования на экране собственных окон, кнопок и прочих радостей пользователя своими силами.
Дальше – больше. Для дальнейшего облегчения жизни программистам были придуманы более функциональные API, охватывающие практически все сферы:
• .NET. Часть ОС Windows Vista (а также Windows XP SP2), позволяющая писать Windows-программы быстрее и проще, чем средствами WinAPI; хотя сама, по сути, является надстройкой над оным);
• DirectX. Набор программных средств для работы с мультимедиа. Облегчает жизнь разработчикам игр и всяческих проигрывателей, беря на себя базовые функции по отрисовке графики, воспроизведению звука и т.п.
• OpenGL. Во многом похож на DirectX, но ограничивается 3D-графикой.
Перечислять можно долго, но суть, думаю, уже ясна. Приведу лишь пример. Допустим, программист, взявшийся за написание игры, использовал некую команду из API OpenGL. Эта команда вызвала на выполнение из соответствующей библиотеки некую последовательность программ, которые должны нарисовать на экране, скажем, сферу. Эти программы, в свою очередь, выполняют цепочку ассемблерных команд, управляя таким образом, контроллером монитора и формируя на экране необходимое изображение (проекцию сферы).

Окна

Для конечных пользователей, как вы понимаете, работа с компьютером сводится обычно к простому вводу текста с клавиатуры, тыканию по красивым окошкам на экране и просмотру не менее красивых картинок. Развитие операционных систем привело к тому, что человеку просто не нужно знать всё, про что я сегодня рассказал. А ведь если задуматься – какие интересные процессы происходят внутри серого ящика, стоящего на нашем столе! Более интересные, пожалуй, происходят лишь в одном устройстве…

Крыша

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

P.S. Все замечания принимаются в комментариях.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *