Программирование: введение в профессию. 1: Азы программирования - 2016 год
Как компьютер работает - Предварительные сведения
1.3.1. Процессор, память, шина
В нашем зале есть машина,
Сквозь неё проходит шина,
А по шине взад-вперёд
Информация идёт.
Внутреннее устройство практически всех современных компьютеров базируется на одних и тех же принципах. Основой компьютера служит общая шина, которая представляет собой, грубо говоря, много (несколько десятков) параллельных проводов, называемых дорожками. К шине подключаются центральный процессор (ЦП, англ. CPU от central processing unit), оперативное запоминающее устройство (ОЗУ, англ. RAM от random access memory, то есть память случайного доступа) и контроллеры, через которые производится управление остальными устройствами компьютера. Через шину центральный процессор осуществляет взаимодействие с остальными компонентами компьютера; оперативная память и контроллеры устроены так, чтобы игнорировать любую информацию, проходящую по шине, кроме той, которая адресована конкретно данному банку памяти или данному контроллеру. Для этого часть дорожек шины выделяется под адрес; эту часть дорожек шины называют шиной адресов. Дорожки, по которым производится передача информации, называют шиной данных, а те дорожки, по которым передаются управляющие сигналы — шиной управления. Со схемотехнической точки зрения каждая дорожка может находиться в состоянии логической единицы (дорожка “подтянута” к напряжению питания схемы) или нуля (дорожка соединена с “землёй”, то есть нулевым уровнем напряжения); определённая комбинация нулей и единиц на шине адресов как раз и составляет адрес, и все устройства, кроме центрального процессора, включаются в работу с шиной только тогда, когда состояние шины адресов соответствует их адресу, а всё остальное время они не обращают на шину никакого внимания и ничего в неё не передают, чтобы не мешать работе процессора с другими устройствами.
Оперативное запоминающее устройство, или просто память, состоит из одинаковых ячеек памяти, каждая из которых имеет свой уникальный адрес, отличающий эту ячейку от других. С ячейкой памяти можно проделать всего две операции: записать в неё значение и прочитать из неё значение. Для выполнения этих операций центральный процессор устанавливает на адресной шине адрес нужной ему ячейки, а затем, используя шину управления, передаёт электрический импульс, который заставляет выбранную ячейку — то есть ту, чей адрес выставлен на шине, и никакую другую — передать в шину данных своё содержимое (операция чтения) или, наоборот, установить своё новое содержимое в соответствии с состоянием шины данных (операция записи). Старое содержимое ячейки при этом теряется. По шине данных информация передаётся параллельно: например, если ячейка содержит, как это обычно бывает, восемь разрядов (нулей и единиц), то для передачи данных при её чтении и записи используется восемь дорожек; при выполнении операции чтения ячейка памяти должна установить на этих дорожках логические уровни, соответствующее хранящимся в ней цифрам, а при операции записи, наоборот, установить хранящиеся в ячейке цифры в соответствии с логическими уровнями дорожек данных. Для хранения значений часто используется несколько ячеек памяти, идущих подряд, то есть имеющих соседние адреса, а разрядности шины данных обычно хватает на одновременную передачу информации нескольких ячеек.
Следует отметить, что оперативная память — это электронное устройство, функционирование которого требует подачи электропитания. При выключении питания информация, хранящаяся в ячейках памяти, немедленно и безвозвратно теряется.
Память компьютера ни в коем случае не следует путать с дисковыми запоминающими устройствами, где хранятся файлы. С памятью центральный процессор может непосредственно взаимодействовать через шину; работать с дисками и другими устройствами процессор сам по себе не может, для этого на процессоре нужно выполнять специальные довольно сложные программы, которые называются драйверами. Драйверы организуют работу с диском и другими внешними устройствами через контроллеры путём передачи определённой управляющей информации.
Некоторые блоки памяти могут физически представлять собой не оперативную, а постоянную память. Такая память не поддерживает операцию записи, то есть изменить её содержимое невозможно, во всяком случае, выполнением операций процессора; с другой стороны, информация, записанная в такую память, не стирается при выключении питания. Центральный процессор никак не различает между собой ячейки оперативной и постоянной памяти, поскольку при выполнении операции чтения они работают абсолютно одинаково. Обычно в постоянную память при изготовлении компьютера записывается некая программа, предназначенная для тестирования аппаратуры компьютера и подготовки его к работе. Эта программа начинает выполняться, когда вы включаете компьютер; её задача — найти, откуда можно загрузить операционную систему, затем загрузить её и отдать ей управление; всё остальное, в том числе запуск пользовательских программ — забота операционной системы. Подробный разговор об операционных системах нам предстоит позднее; пока отметим только, что операционная система — это такая программа, а не что-то иное, то есть её тоже написали программисты; от всех остальных программ операционная система отличается лишь тем, что, запустившись на компьютере раньше других, она получает доступ ко всем его возможностям, при этом все остальные программы запускаются уже силами операционной системы, а она все остальные программы запускает так, чтобы им никакого доступа к возможностям компьютера не дать; пользовательские программы могут лишь преобразовывать информацию в отведённой им памяти, а для всего остального — даже для того, чтобы просто закончить работу — вынуждены обращаться к операционной системе.
1.3.2. Принципы работы центрального процессора
Сам центральный процессор представляет собой электронную схему, обычно выполненную в виде микропроцессора (то есть в виде одной микросхемы); его основное и единственное назначение — выполнять простейшие действия, заданные командами, из которых состоит программа. В составе центрального процессора обычно присутствуют так называемые регистры — запоминающие устройства, способные хранить от нескольких до нескольких десятков двоичных разрядов; основную работу процессор производит над информацией, хранящейся в регистрах. В число операций, которые может выполнять процессор, обязательно входят чтение и запись ячеек памяти, при которых информация передаётся через шину из оперативной памяти в процессор или обратно.
Среди операций, выполняемых центральным процессором, обязательно имеется арифметика — как минимум сложение и вычитание, хотя на всех современных процессорах присутствует также умножение и деление; примером арифметического действия может быть предписание “возьми значения из второго и четвёртого регистров, сложи их, а результат запиши обратно во второй регистр”. Некоторые процессоры могут производить такие действия не только над регистрами, но и над группами ячеек памяти. Есть и другие действия, такие как копирование информации из одного регистра в другой, логические операции, всевозможные служебные действия вроде переходов к выполнению команд из другого места памяти; все вместе они образуют систему командконкретного процессора. Подробное знакомство с системой команд реально существующего процессора нам предстоит позднее, во втором томе нашей книги.
Каждое элементарное действие, выполняемое центральным процессором (машинная команда), обозначается кодом операции или, как его часто называют, машинным кодом. Программа, состоящая из таких кодов, располагается в ячейках памяти; один из регистров процессора, так называемый счётчик команд10, содержит адрес той ячейки памяти, в которой располагается следующая инструкция, предназначенная к выполнению.
Процессор работает, раз за разом выполняя цикл обработки команд. В начале этого цикла из ячеек памяти, на которые указывает11 счётчик команд, считывается код очередной команды. Сразу после этого счётчик команд меняет своё значение так, чтобы указывать на следующую команду в памяти; например, если только что прочитанная команда занимала три ячейки памяти, то счётчик команд увеличивается на три. Схемы процессора дешифруют код и выполняют действия, предписанные этим кодом: например, это может быть уже знакомое нам предписание “взять содержимое двух регистров, сложить, а результат поместить обратно в один из регистров” или “скопировать число из одного регистра в другой” и т. п. Когда действия, предписанные командой, будут исполнены, процессор возвращается к началу цикла обработки команд, так что следующий проход этого цикла выполняет уже следующую команду, и так далее до бесконечности (точнее, пока процессор не выключат).
Некоторые машинные команды могут изменить последовательность выполнения команд, предписав процессору перейти в другое место программы (то есть, попросту говоря, в явном виде изменить текущее значение счётчика команд). Такие команды называются командами перехода. Различают условные и безусловные переходы; команда условного перехода сначала проверяет истинность некоторого условия и производит переход только если условие выполнено, тогда как команда безусловного перехода просто заставляет процессор продолжить выполнение команд с заданного адреса без всяких проверок. Процессоры обычно поддерживают также переходы с запоминанием точки возврата, которые используются для вызова подпрограмм.
1.3.3. Внешние устройства
Центральный процессор и память (оперативная и постоянная) по сути, как раз и образуют то, что называется компьютером, но если бы у нас были только они, толку от такого компьютера было бы на удивление мало. Во-первых, компьютеру как-то нужно получать программы и данные из внешнего мира, а результаты работы каким-то образом отдавать обратно. Во-вторых, содержимое оперативной памяти мгновенно теряется при выключении питания, так что для сколько-нибудь долговременного и надёжного хранения информации она не годится. Ясно, что компьютеру нужны ещё какие-то устройства помимо оперативной памяти и процессора. В ранних компьютерных системах все устройства подключались непосредственно к центральному процессору, но очень быстро стало ясно, что это неудобно: для каждого нового устройства центральный процессор приходилось переделывать; между тем внешние устройства обычно гораздо проще, чем центральный процессор, и появляются, естественно, быстрее, чем новые процессоры. Кроме того, разнообразных внешних устройств слишком много. В центральном процессоре попросту технически невозможно организовать поддержку всех или хотя бы значительного количества таких устройств. Всё это привело к возникновению идеи общей шины, описанной выше.
Подключение внешних устройств к общей шине производится через контроллер — электронную схему, которая может взаимодействовать через шину с центральным процессором; все контроллеры делают это одинаково, вне зависимости от того, какими устройствами они управляют, то есть с точки зрения процессора все контроллеры оказываются “на одно лицо”. При этом “другим концом” каждый контроллер подключается непосредственно к своему внешнему устройству и осуществляет управление его работой. Взаимодействие центрального процессора с контроллером строится на уже знакомых нам операциях чтения и записи; более того, на некоторых архитектурах ячейки памяти и контроллеры находятся в одном общем пространстве адресов и оказываются взаимозаменяемы, то есть центральный процессор “не знает”, с чем он имеет дело — с настоящей памятью или с контроллером; впрочем, более популярен подход, когда контроллеры имеют отдельное пространство адресов12; в этом случае говорят об адресах портов ввода-вывода. Один контроллер может поддерживать один или больше таких “портов”, то есть при работе с шиной отзываться на несколько разных адресов. Операции чтения из порта ввода-вывода и записи в такой порт с точки зрения центрального процессора выглядят совершенно так же, как и операции чтения-записи ячеек памяти, но контроллеры, в отличие от ячеек памяти, присланные им в ходе “записи” значения не запоминают, а воспринимают их как предписания что-то сделать; в ходе “чтения” порта контроллеры выдают не какое-то заранее сохранённое значение, а такое значение, которое как-то связано с состоянием самого контроллера, то есть позволяет узнать, например, завершена ли очередная операция, готов ли контроллер к выполнению следующей операции, не обнаружены ли какие-либо неисправности и т. п.
Сколько портов поддерживает конкретный контроллер, какие ему можно отдавать предписания и каковы коды этих предписаний, что означают значения, которые прочитываются из его портов — всего этого центральный процессор не знает, потому что всё это зависит от конкретного контроллера, а для другого контроллера всё может быть совсем не так. Для работы с каждым конкретным контроллером нужна специальная программа, которая, как мы уже говорили, называется драйвером; выполняясь на центральном процессоре, программа-драйвер даёт команды записи и чтения портов ввода-вывода “своего” контроллера, решая поставленные ей задачи. Обычно драйвер является частью операционной системы или становится такой частью после его загрузки. Например, если пользователь запустил некую программу, а этой программе потребовалась запись в файл на диске, то для этого программа обратится к операционной системе с просьбой записать такие-то данные в такой-то файл, операционная система вычислит, в каком месте диска находится или должен находиться соответствующий файл, и, обратившись, в свою очередь, к драйверу (то есть фактически к своей обособленной части), потребует записать определённые данные в определённое место диска; после этого драйвер, вооружась имеющимся у него знанием возможностей контроллера диска, сначала выполнит несколько операций записи в порты ввода-вывода, что заставит контроллер начать операцию записи; затем, выполнив операции чтения из портов, узнает о результатах операции и сообщит о них операционной системе13.
1.3.4. Иерархия запоминающих устройств
Информация в вычислительной системе может запоминаться и храниться устройствами различного типа в зависимости от того, насколько оперативным должен быть доступ к данной информации, насколько долговременным должно быть её хранение и каков её объём. Иерархия запоминающих устройств схематически показана на рис. 1.3. Наиболее оперативно доступна информация в регистрах центрального процессора. Однако объём регистровой памяти задаётся раз и навсегда при проектировании процессора и увеличен быть не может; этот объём ограничен, т.к. каждый новый регистр ЦП увеличивает сложность схемы ЦП, требует введения дополнительных инструкций и в целом может существенно повысить стоимость процессора.
Рис. 1.3. Иерархия запоминающих устройств
Кеш-память предназначена для увеличения скорости доступа к данным, находящимся в оперативной памяти. Различают кеш первого уровня, физически реализованный на одной микросхеме с ЦП, и кеш второго уровня, представляющий собой отдельную конструкцию, связанную с процессором непосредственно (без использования общей шины). В кеш-памяти дублируются данные из оперативной памяти, наиболее часто используемые выполняющейся программой. Скорость доступа к кешу существенно выше, чем к оперативной памяти, поскольку для взаимодействия процессора с кешем не нужно задействовать шину — а шина как раз работает довольно медленно из-за её сравнительно большой длины, причём её работа не может быть существенно ускорена, так как ограничена скоростью света и другими физическими причинами. При этом сам кеш имеет достаточно сложное устройство, а объём его сравнительно невелик.
Оперативная память14 является основным хранилищем программ и данных, находящихся в непосредственной обработке. Объём оперативной памяти может быть сравнительно большим, а её стоимость в последние годы снизилась. Тем не менее, её объема может не хватить. Кроме того, содержимое оперативной памяти, кеша и регистров теряется с выключением компьютера, так что для долговременного хранения данных эти виды запоминающих устройств непригодны.
На следующем уровне иерархии находятся магнитные диски или, говоря в общем, устройства долговременного хранения, позволяющие производить доступ к данным в произвольном порядке. Кроме собственно магнитных дисков, к устройствам такого класса относятся, например, накопители на flash-картах. Ныне вышедшие из употребления магнитные барабаны также относились к этому классу. Объём таких устройств может быть на порядки больше, чем объём ОЗУ, а стоимость — существенно ниже. Кроме того, сохранённая на дисках информация не теряется при выключении питания и может храниться долгое время. С другой стороны, для доступа к дискам требуются медленные (в сравнении со скоростью процессора и ОЗУ) операции ввода-вывода; более того, процессор не в состоянии непосредственно обращаться к дискам, так что данные для их использования должны быть предварительно скопированы в оперативную память.
Срок хранения информации на дисках может составлять годы, но он всё же ограничен. Для нужд архивирования применяют накопители на магнитных лентах (стримеры). Ленты представляют собой самый надёжный, долговременный и дешёвый способ хранения данных. Недостаток лент состоит в невозможности доступа к блокам данных в произвольном порядке; как правило, данные с лент перед использованием копируют на диски. В последние годы с ростом объёмов жёстких дисков ленты стали использоваться сравнительно редко, сейчас стримеры можно встретить только в организациях, имеющих дело с большими архивами данных. Отметим, что современная кассета для стримера может хранить несколько терабайт данных; сам стример, то есть устройство для работы с такими кассетами, стоит заметно дороже обычного жёсткого диска аналогичной ёмкости, но кассеты, естественно, стоят дешевле; при использовании сравнительно большого числа кассет удельная стоимость15 хранения архивных данных может быть ниже в десятки раз в сравнении с использованием жёстких дисков.
1.3.5. Резюме
Итак, мы можем подвести некоторые итоги: компьютер основан на общей шине, к которой подсоединены оперативная память и центральный процессор; внешние устройства, включая жёсткие диски и дисководы, а также клавиатуру, монитор, звуковые устройства и вообще всё, что вы привыкли видеть в составе компьютера, но что не является ни процессором, ни памятью, тоже подключается к общей шине, только не напрямую, а через специальные схемы, называемые контроллерами. С памятью процессор может работать сам по себе, для работы со всеми остальными устройствами необходимы специальные программы, называемые драйверами. Для долговременного хранения информации используются дисковые запоминающие устройства, где информация обычно организуется в виде хорошо знакомых вам файлов; в файлах могут храниться как данные, так и компьютерные программы, но чтобы запустить программу или обработать данные, и то, и другое должно быть сначала загружено в оперативную память.
Среди всех программ особое место занимает программа, называемая операционной системой; она запускается первой и получает полный доступ ко всем возможностям аппаратуры компьютера, а все остальные программы запускаются уже под управлением (и под контролем) операционной системы, и непосредственного доступа к аппаратуре не имеют; для выполнения действий, не сводящихся к преобразованию информации в отведённой памяти, программы вынуждены обращаться к операционной системе.
Понимание этих основных принципов построения компьютерных систем жизненно необходимо программисту в его работе, а тем, кто решил изучать программирование — в процессе обучения; так что если что-то оказалось непонятным, попробуйте перечитать эту главу снова, если же и это не поможет, попросите кого-нибудь более опытного объяснить вам всё, что вы не поняли.