Что происходит со всем компьютером, когда вы запускаете код? Интервью нужно спросить

алгоритм
Что происходит со всем компьютером, когда вы запускаете код? Интервью нужно спросить

Что происходит со всем компьютером, когда вы запускаете код?

Во-первых, давайте возьмем программу на языке C в качестве примера.

Первый шаг запуска кода C/C++:

在这里插入图片描述

  • Скомпилировать, оптимизировать (.c->.s, .asm)

    Когда программа C/C++ выбрана для запуска, программа будет скомпилирована и оптимизирована после предварительной обработки.

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

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

  • Сборка (.s, .asm->.obj, .o, .a, .ko)

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

    1. Сегмент кода: этот сегмент содержит в основном программные инструкции. Этот сегмент обычно доступен для чтения и выполнения, но обычно недоступен для записи.

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

  • ссылка (.obj, .o, .a, .ko->.exe, .elf, .axf)

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

Что делает операционная система?

Затем, если вы хотите запустить исполняемую программу (которая была скомпилирована и связана)

  • До первого запуска файл лежал на диске, а на данный момент он просто сохранился на диске в виде набора бинарных файлов.

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

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

  • Затем операционная система запрограммируетнагрузка, то есть для создания структуры процесса у него будет свой набор виртуальных адресов, таблиц страниц и других структур.

    Но загрузчик не загружает код в физическую память, а использует таблицу страниц для записи местоположения кода на жестком диске, и загружает его в память только тогда, когда он действительно работает.

    Наконец, загрузчик найдет адрес входа программы и при выполнении прочитает первую инструкцию по адресу входа.

  • готов к запуску

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

    Операционная система планирует процесс, и когда наступает очередь процесса, он начинает выполнение с точки входа, возвращенной загрузчиком.

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

    Наконец, ЦП загрузит код с жесткого диска в память, а затем, конечно же, ЦП должен изменить таблицу страниц, чтобы отразить, что данные поступили в память.

  • ЦП будет непрерывно читать и записывать данные.Когда наступит квант времени, процесс будет приостановлен, что означает, что процесс на самом деле не монополизирует ЦП, а потому, что процесс переключается очень быстро.С человеческой точки зрения, это предполагается, что программа выполняется одновременно с Same. В конце процесса данные в памяти будут очищены и перезаписаны.

Почему операционная система делает это?

Почему операционная система беспокоится о отображении памяти и виртуальной памяти? Это не потому, что ресурсы ограничены, память так велика и существует так много программ. Чтобы заставить больше программ работать и эффективно использовать память и ЦП, используйте только этот метод.

Что делает аппаратная система?

Возьмем в качестве примера компьютерную архитектуру фон Неймана:在这里插入图片描述

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

И архитектура нашего современного компьютера: память, арифметическая логика (калькулятор), блок управления (контроллер) и конечно устройства ввода-вывода.

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

Возьмите кусок машинного языка в качестве примера: ax^2+bx+c процесс выполнения программы (программный код стал машинным языком)

  1. Программа отправляется на компьютер устройством ввода-вывода
  2. ПК+1, получить первый адрес программы
  3. программа запускается
  4. Инструкция выборки: ПК->MAR->банк памяти->MDR->IR (регистр инструкций)
  5. Инструкция анализа: извлеките код операции из регистра инструкций, отправьте его в блок управления CU для анализа и получите значение инструкции.
  6. Выполнить инструкцию: вынуть адресный код в IR -> MAR -> банк памяти -> MDR -> ACC
  7. ПК+1=ПК, получить новый адрес
  8. Инструкция выборки: ПК->MAR->банк памяти->MDR->IR (регистр инструкций)
  9. Инструкция анализа: извлеките код операции из регистра инструкций, отправьте его в блок управления CU для анализа и получите значение инструкции.
  10. Выполнить инструкцию: вынуть адресный код в IR -> MAR -> банк памяти -> MDR -> X

... конечный результат программа завершена