Первое понимание принципа построения компьютера - инструкции и операции

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

компьютерное железо

undefined

Основные компоненты современного компьютера на самом деле в основном состоят из трех частей: ЦП, памяти и материнской платы.

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

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

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

Архитектура фон Неймана

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

Архитектура фон Неймана, также известная как компьютер с хранимой программой, возникла из статьи, опубликованной фон Нейманом, «первого проекта», в которой описывалось, как должен выглядеть компьютер в его воображении. То есть это «хранимый» и «программируемый» компьютер, а также говорится, из каких частей должен состоять компьютер, а именно: арифметическое устройство, контроллер, память, устройство ввода и устройство вывода.

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

На рисунке показана архитектура фон Неймана:

undefined

машина Тьюринга

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

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

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

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

undefined

На мой взгляд, машина Тьюринга — это абстрактный «мысленный эксперимент», а машина фон Неймана — «физическая реализация», соответствующая этому «мысленному эксперименту». Если рассматривать «машину Тьюринга» как «душу», представляющую наиболее абстрактную сущность компьютера, то «машина фон Неймана» — это «тело», представляющее наиболее конкретную сущность компьютера. Между физиками-теоретиками и физиками-экспериментаторами существует чувство сотрудничества, которое можно описать как две стороны одной и той же проблемы.

чипсет, шина

чипсет

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

Чипсеты северного и южного мостов -> Два основных набора микросхем на материнской плате, верхний называется северным мостом, а нижний называется южным мостом.

  • Северный мост отвечает за связь с ЦП, подключение высокоскоростных устройств (память, графические карты) и связь (операции ввода-вывода) с южным мостом.
  • Южный мост отвечает за обмен данными с низкоскоростными устройствами (жесткими дисками/внешними устройствами ввода-вывода, USB и т. д.) и за обмен данными с северным мостом.

автобус

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

CPU

набор инструкций, микроархитектура

Также известная как система набора инструкций,часть компьютерной архитектуры, связанная с программированием,Содержит основные типы данных, наборы инструкций, регистры, режимы адресации, системы хранения, прерывания, обработку исключений и внешний ввод-вывод.. Архитектура набора инструкций состоит из серии кодов операций или кодов операций (машинный язык) и основных команд, которые выполняются конкретным процессором.

Различные «семейства» процессоров, такие как Intel IA-32 и x86-64, семейства процессоров IBM/Freescale Power и ARM, имеют разные архитектуры набора инструкций.

Архитектура набора инструкций — это не то же самое, что микроархитектура (набор методов проектирования микропроцессора для выполнения наборов инструкций).Компьютеры, использующие различные микроархитектуры, могут поделиться набором инструкции.Например, Pentium от Intel и AMD Athlon от AMD, оба имеют почти одинаковую версию архитектуры набора команд x86, но они существенно различаются аппаратным дизайном внутренней части.

Некоторые виртуальные машины поддерживают байт-код, созданный с помощью Smalltalk, виртуальной машины Java, виртуальной машины Microsoft с общеязыковой средой выполнения, а их архитектура набора инструкций переводит байт-код (байт-код) из пути кода в качестве общего средства в локальный машинный язык, а также путем интерпретации и выполнения кода. пути, которые обычно не используются, Transmeta таким же образом разработала процессор VLIW на основе системы инструкций x86.

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

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

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

Классификация наборов инструкций:

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

Пример разницы между набором инструкций X86 и набором инструкций ARM:

А едет в Б на машине

  • рука: подготовь четыре колеса и сиденье > поставь А на сиденье > поставь сиденье на четыре колеса > иди в Б
  • x86: найти машину на складе > взять машину > перейти к B

То же самое, хотя результат тот же, что и отправка А по назначению, но у арм нет склада, все надо строить, у х86 куча складов, можно использовать вскользь, разница в том, что потребление в рука процесс меньше, потому что это только корпус автомобиля и колеса, а Х86 вышел из машины, но фары на машине, кондиционер, и остальные свободные места были вещами, которые не нужны в этом исполнения, а также попали вместе, так чтоЗанимайте больше ресурсов, чем arm, но делайте сложные вещи, потому что в x86 есть все, поэтому это проще, чем разработка arm, а унифицированная стандартная библиотека также может сделать ее более эффективной..

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

Ссылаться на:

Интел, АМД

  • Процессоры Intel, AMD в основном представляют собой процессоры со структурой CISC, потому что они в основном ориентированы на ПК.
  • ARM относится к ЦП RISC-структуры.

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

В последние годы некоторые процессоры CISC, такие как Intel Pentium-Pro, AMD K5, K6, фактически улучшили CISC или MACHINE CYCLE, могут выполнять инструкции. Сама ARM не производит ЦП, только архитектура ЦП разработана и разрешена другим производителям для создания ЦП с архитектурой ARM, таким как Gao Tong, Liaotai и т. д. Мы знакомы с архитектурой ARM.

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

Ссылаться на:

ЦП против графического процессора

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

мимо:

  • ЦП - Северный мост - Память
  • Процессор — северный мост — видеокарта
  • Процессор — северный мост — южный мост — жесткий диск
  • ЦП — северный мост — южный мост — сетевая карта
  • ЦП — северный мост — южный мост — внешнее устройство ввода-вывода

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

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

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

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

Количество ядер и потоков процессора

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

wmic
cpu get *
-----------对应属性
NumberOfCores
NumberLogicProcessors

Частота процессора

Основная частота ЦП это тактовая частота на которой работает ядро.Обычно ЦП это сколько мегагерц.Так называемые мегагерцы здесь описываемая частота ЦП,за которой следует модель ЦП.2.4 GHZТо есть цифровое описание основной частоты.

Основная частота напрямую не представляет скорость работы ЦП, поэтому будут случаи, когда частота ЦП высока, но скорость работы ЦП низкая.Основная частота — это только один аспект производительности ЦП.

Связь между потоками ЦП и потоками Java

Все потоки в Java находятся в процессе JVM, и ЦП планирует потоки в этом процессе.

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

процесс и поток

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

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

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

гипер потоки

Технология Intel Hyper-Threading предназначена для более полного использования ресурсов одноядерного процессора. Когда ЦП выполняет машинную инструкцию, он не полностью использует все ресурсы ЦП, и на самом деле многие ресурсы простаивают.Технология Hyper-Threading позволяет двум потокам одновременно использовать ресурсы ЦП без конфликтов.. Например, инструкция целочисленной операции использует только целочисленную операцию, а операция с плавающей запятой простаивает.Если используется технология гиперпоточности, и в это время другой поток просто должен выполнить инструкцию операции с плавающей запятой, ЦП может принадлежать двум целочисленным арифметическим инструкциям, а арифметические инструкции с плавающей запятой из разных потоков выполняются одновременно, что действительно параллельно. Я не знаю, на что похожи другие аппаратные технологии многопоточности, но что касается технологии гиперпоточности, то она может обеспечить настоящий параллелизм.Но это не означает, что два потока всегда могут выполняться параллельно в одном и том же ЦП, просто бывает так, что инструкции, которые должны выполняться двумя потоками, не используют одни и те же ресурсы ЦП..

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

производительность и энергопотребление

Для компьютеров: производительность обратно пропорциональна времени отклика.. Есть два индикатора, которые нужно сделать постоянными

  • Время отклика: время выполнения задачи, которое ускоряет работу компьютера.
  • Пропускная способность: пропускная способность, которая позволяет компьютеру обрабатывать больше.

Среди них есть много способов улучшить пропускную способность, и многоядерные процессоры — один из них. То есть наши текущие процессоры имеют все 6 ядер и 8 ядер и т. д., ЦП может выполнять несколько задач одновременно, и соответствующее время отклика также может быть сокращено, что также может увеличить пропускную способность компьютера, но теперь улучшение времени отклика процессора столкнулось с узким местом, «закон Мура» больше не применяется.

Производительность = 1/время отклика. Чем короче время отклика, тем выше значение производительности.

теоретическиВремя работы программы =Время выполнения программой инструкций в пользовательском режиме + время выполнения программой инструкций в режиме ядра.

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

Время выполнения программы ЦП = количество тактовых циклов ЦП × время единичного тактового цикла.

НапримерIntel Core - i7 - 7700HQ 2.8GHZ,здесь2.8GHZПоверхностное понимание — это то, что процессор может выполнить за одну секунду.Простой номер инструкцииЭто 2,8G. точноНаименьший временной интервал, который могут распознать «часы» ЦП.

Единица времени компьютера: часы процессора.

Время цикла часов:Внутри процессора, подобно электронным кварцевым часам, которые мы носим, ​​есть кварцевый осциллятор, для краткости называемый «кварцевый осциллятор», и каждый «тик» кварцевого генератора представляет собой время тактового цикла (время кварцевого генератора) электронные кварцевые часы. существует2.8GHZНа процессоре основной частоты это время тактового цикла равно1/2.8GHZ. ЦП выполняет свои операции в соответствии со временем, указанным этими «часами». Чем выше основная частота, тем быстрее будут работать часы, и ЦП будет «вынужден» работать быстрее. Чем быстрее ЦП, тем больше давление тепловыделения Большое.

Тактовые циклы процессора =Инструкции * Среднее количество тактовых циклов (CPI) для инструкций.

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

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

Время выполнения программы процессором:Количество инструкций * среднее количество тактовых циклов для инструкций (CPI) * время тактового цикла

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

Закон Мура: Среди них закон Мура увеличивает частоту компьютеров. Гордон Мур, один из основателей Intel, однажды сказал: когда цена остается неизменной, количество компонентов, которые могут быть размещены в интегральной схеме, будут меняться каждые 18- 24 месяца. Удвоить производительность и удвоить производительность.

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

Энергопотребление процессора ~=1/2 * емкость нагрузки * квадрат напряжения * скорость переключения * количество транзисторов

Может эффективно улучшить производительность процессора:

Обработать:

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

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

Закон Амдала:

Параллельная оптимизация, не все задачи можно оптимизировать параллельно.

  • Условие 1: вычисление, которое необходимо выполнить, само по себе может быть разложено на несколько параллельных задач, например, умножение может быть разложено на несколько сложений.
  • Условие 2: расчеты, которые могут быть декомпозированы, необходимы для обеспечения того, чтобы их можно было объединить вместе в конце.
  • Условие 3: Стадия «суммирования» больше не может быть оптимизирована параллельно и может выполняться только в один этап.

Время выполнения после оптимизации =Время выполнения, на которое влияет оптимизация/ускорение, кратное (количество параллельных обработок) + время выполнения без изменений.

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

переводчик

Ассемблер — это инструмент для преобразования исходных программ на языке ассемблера в машинный язык. Машинный язык — это числовой язык, специально разработанный для понимания компьютерными процессорами (ЦП).Все процессоры x86 понимают общий машинный язык.

Язык ассемблера содержит оператор, написанный коротким вспомогательным сообщением, таким как Add, MOV, SUB и CALL.Между языком ассемблера и машинным языком существует отношение один к одному: каждая инструкция языка ассемблера соответствует инструкции машинного языка.. Это означает, что если машинный язык (набор инструкций), используемый разными моделями процессоров, отличается, то и язык ассемблера у них не одинаков.

Языки высокого уровня, такие как Python, C++ и Java, имеют отношения «один ко многим» с языком ассемблера и машинным языком. Например, инструкция в C++ расширяется до нескольких ассемблерных или машинных инструкций.Язык называется переносимым, если его исходные программы могут быть скомпилированы и запущены на самых разных компьютерных системах.

Язык ассемблера не является переносимым, поскольку он был разработан для определенного семейства процессоров. Существует несколько широко используемых языков ассемблера, каждый из которых основан на семействе процессоров.Для некоторых известных семейств процессоров, таких как Motorola 68x00, x86, SUN Sparc, Vax и IBM-370, инструкции на языке ассемблера либо напрямую соответствуют архитектуре компьютера, либо преобразуются встроенной программой процессора.

Чтобы заставить программу на языке C работать в операционной системе Linux, нам нужно перевести всю программу в программу на языке ассемблера.Этот процесс обычно называетсякомпилируется в ассемблерный код. Для ассемблерного кода мы можем использовать ассемблер для перевода его в машинный код. Эти машинные коды представлены машинным языком, состоящим из «0» и «1». Существуют также компиляторы для языка C, которые могут быть напрямую скомпилированы из языка C в машинный язык для непосредственного выполнения. Этот фрагмент машинного кода состоит из фрагментов компьютерных инструкций.Подобно нашим обычным китайским иероглифам, их всего 4,5 000, а всего 1W+, что может помочь нам написать сотни тысяч, миллионы романов и сборников. Такая строка шестнадцатеричных чисел является компьютерной инструкцией, которую наш ЦП действительно может распознать. Для удобства чтения мы обычно выражаем соответствующее двоичное число в шестнадцатеричном формате.

Интерпретируемые языки переводятся предложение за предложением через интерпретатор во время работы программы, в то время как Java использует язык виртуальной машины, где виртуальная машина интерпретирует скомпилированный байт-код в машинный код для окончательного выполнения.


Процессор Intel, который мы используем каждый день, имеет около 2000 инструкций процессора. Общие команды можно разделить на пять категорий:

  • Первый класс - это арифметический класс инструкций. Наши сложение, вычитание, умножение и деление станут арифметическими инструкциями на уровне процессора.
  • Вторая категория — инструкции по передаче данных. Присваивайте значения переменным, читайте и записывайте данные в память и используйте инструкции по передаче данных.
  • Третья категория — логический класс инструкций. Логическое И или НЕ является типом инструкции.
  • Четвертая категория - инструкция условного перехода. «Если/иначе», которые мы пишем каждый день, на самом деле являются инструкциями условного перехода.
  • Последняя категория — инструкции безусловного перехода. Чтобы написать несколько больших программ, нам часто нужно написать некоторые функции или методы. При вызове функции она фактически инициирует инструкцию безусловного перехода.

Взгляните на кусок ассемблерного кода:

#include <time.h>
#include <stdlib.h>


int main()
{
  srand(time(NULL));
  int r = rand() % 2;
  int a = 10;
  if (r == 0)
  {
    a = 1;
  } else {
    a = 2;
  } 
==================
    if (r == 0)
  3b:   83 7d fc 00             cmp    DWORD PTR [rbp-0x4],0x0
  3f:   75 09                   jne    4a <main+0x4a>
    {
        a = 1;
  41:   c7 45 f8 01 00 00 00    mov    DWORD PTR [rbp-0x8],0x1
  48:   eb 07                   jmp    51 <main+0x51>
    }
    else
    {
        a = 2;
  4a:   c7 45 f8 02 00 00 00    mov    DWORD PTR [rbp-0x8],0x2
  51:   b8 00 00 00 00          mov    eax,0x0
    } 

Машинный язык, язык ассемблера, компилятор:

В прошлом программы писались путем пробивки отверстий в бумажных лентах, поэтому программы можно было писать только с помощью машинного кода "0,1". Позднее был разработан язык ассемблера. Язык ассемблера ближе к человеческому языку. Ассемблер преобразует язык ассемблера в машинный язык. Ассемблер эквивалентен существованию транслятора, который может быть преобразован в двоичный код, распознаваемый компьютером в соответствии с конкретными инструкциями по ассемблеру, то есть в машинный код, предоставляемый каждым разработчиком ЦП, потому чтоСуществует однозначное соответствие между ассемблерным кодом и машинным кодом, распознаваемым каждым процессором.

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

  • Язык C: Язык C -> компиляция компилятора -> язык ассемблера -> ассемблер -> машинный код || Язык C -> компиляция компилятора -> машинный код
  • Java: язык Java -> компиляция компилятора -> байт-код -> JVM -> машинный код

Ссылаться на:

  1. Из стать .net/view/450. Контракт...
  2. Ууху. Call.com/question/38…
  3. zhuanlan.zhihu.com/p/53336801
  4. Ууху. Call.com/question/39…
  5. blog.CSDN.net/В AA SSD/Aretti…
  6. blog.CSDN.net/U013678930/…

регистр

Вы можете сначала прочитать:

Разница между памятью, регистром и хранилищем

основная концепция:

  • ОЗУ (оперативное запоминающее устройство) представляет собой оперативную память.Этот тип памяти теряет свое содержимое при отключении питания, поэтому он в основном используется для хранения программ, которые используются в течение короткого времени.
  • ROM (Read-Only Memory) — это постоянная память, представляющая собой твердотельную полупроводниковую память, которая может только считывать данные, сохраненные заранее.

регистр

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

  1. Регистр находится в ЦП и может хранить только небольшое количество информации, но скорость доступа очень высока;
  2. Память относится к внешним средствам хранения, таким как жесткие диски, U-диски, гибкие диски и компакт-диски, с самой низкой скоростью;
  3. Память относится к карте памяти.Поскольку половина жесткого диска читается очень медленно, она используется для чтения содержимого жесткого диска сначала в карту памяти, а затем обрабатывает его для ЦП, чтобы ускорить скорость работы системы;

Различные типы памяти расположены в соответствии с расстоянием до ЦП от ближнего к дальнему (от высокой до низкой скорости доступа к памяти), а именно регистры, кэши (уровень 1, 2 и 3), основная память и вспомогательная память.

Другие хорошие ответы:

Вид реестра

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

N триггеров или защелок могут образовывать N-битный (битовый) регистр, который может сохранять N-битные данные.. Например, мы используем 64-битный сервер Intel, и регистры 64-битные.

В процессоре есть много регистров с различными функциями. Есть три спец.

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

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

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

А некоторые специальные инструкции, такие как инструкции J-типа, то есть инструкции перехода, изменяют значение адреса в регистре ПК. Таким образом, следующая выполняемая команда не загружается последовательно из памяти. На самом деле существование этих инструкций перехода — это то, что мы можем использовать при написании программ.if…elseусловные операторы иwhile/forПричина оператора цикла.

В ЦП не так много регистров,Типичный процессор Intel i7 имеет только 16 64-битных регистров., то есть 16 8-байтовых регистров.

Битовые вычисления

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

побитовый оператор

  • &Операция И Когда оба бита равны 1, результат равен 1, иначе 0
1 0 0 1 1 
&
1 1 0 0 1 
------------------------------
1 0 0 0 1
  • |Операция ИЛИ Когда оба бита равны 0, результат равен 0, иначе - 1.
1 0 0 1 1 
| 
1 1 0 0 1 
------------------------------
1 1 0 1 1
  • ^Операция XOR, 0, если два бита одинаковы, 1, если они разные
1 0 0 1 1 
^
1 1 0 0 1 
-----------------------------
0 1 0 1 0
  • ~Отрицательная операция, 0 становится 1, 1 становится 0
~ 1 0 0 1 1 
-----------------------------
  0 1 1 0 0
  • <<Операция Left Shift, операция сдвига влево, отбросьте высокие биты и добавьте от 0 до низких битов
int a = 8;
a << 3;
移位前:0000 0000 0000 0000 0000 0000 0000 1000
移位后:0000 0000 0000 0000 0000 0000 0100 0000
  • >>Операция сдвига вправо, выполнить операцию сдвига вправо, для чисел без знака старшие биты заполняются 0, а для чисел со знаком старшие биты заполняются знаковым битом
unsigned int a = 8;
a >> 3;
移位前:0000 0000 0000 0000 0000 0000 0000 1000
移位后:0000 0000 0000 0000 0000 0000 0000 0001

int a = -8;
a >> 3;
移位前:1111 1111 1111 1111 1111 1111 1111 1000
移位后:1111 1111 1111 1111 1111 1111 1111 1111

куча

В реальной программе в стек помещается не только адрес возврата вызова функции. Например, когда функция A вызывает B, ей необходимо передать некоторые данные параметров, и эти данные параметров также будут помещены в стек, когда регистров не хватит.Все пространство памяти, занимаемое всей функцией A, является кадром стека функции A..

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

Триггерный общий метод триггера StackOverFlow: рекурсивный вызов функции, объявление переменной (огромный массив), которая занимает много памяти в стеке.

Распространенные схемы оптимизации работы программы:

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

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

Демонстрация кода:

#include <stdio.h>
int static add(int a, int b)
{
    return a+b;
}

int main()
{
    int x = 5;
    int y = 10;
    int u = add(x, y);
}

В соответствии с ассемблерным кодом вышеуказанной функции добавления, когда основная функция вызывает функцию добавления, запись функции добавления находится в строках с 0 по 1, а после завершения функции добавления — в строках с 12 по 13.

Когда мы вызываем инструкцию call в строке 34,Он поместит адрес следующей инструкции в текущем регистре ПК в стек и сохранит адрес инструкции, которая должна быть выполнена после завершения вызова функции.. И 0-я строка функции добавления, инструкция push rbp, заталкивает стек. rbp здесь также называется указателем кадра стека (Frame Pointer), который представляет собой регистр, в котором хранится текущая позиция кадра стека. push rbp помещает в стек ранее вызванную функцию, то есть нижний адрес кадра стека кадра стека основной функции.

Затем в команде mov rbp, rsp в строке 1 значение указателя кадра стека rsp копируется в rbp, и rsp (запись позиции входа кадра стека, соответствующей функции добавления) всегда будет указывать на вершину стека. Эта команда означает, что адрес, на который указывает указатель кадра стека rbp (инструкция фактического изменения), становится текущей последней вершиной стека, то есть адресом основания стека кадра стека функции добавления.

После того, как функция add будет выполнена, она вызовет pop rbp в строке 12, чтобы извлечь текущую вершину стека.Эта часть операции поддерживает весь наш кадр стека. Затем мы можем вызвать инструкцию ret в строке 13. В это же время нам нужно извлечь следующую инструкцию из регистра ПК, которая была помещена при вызове вызова, обновить ее в регистре ПК и вернуть управление программой в стеке Вершина стека.

Компиляция, компоновка и загрузка: дизассемблирование выполнения программы

Файлы языка C скомпилированы для создания следующих.oфайлы на языке ассемблера с суффиксами, такие какadd_lib.oтак же какlink_example.oНе исполняемый, а объектный файл.Только путем связывания нескольких объектных файлов и различных библиотек функций, вызываемых компоновщиком, мы можем получить исполняемый файл.

C-код — ассемблерный код — машинный кодЭтот процесс, выполняемый на нашем компьютере, состоит из двух частей.

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

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

формат ЭЛЬФ

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

как имя функцииadd,mainи т. д., а также определенные глобально доступные имена переменных хранятся в файле формата ELF.Эти имена и соответствующие им адреса в файле ELF хранятся в месте, называемом таблицей символов.. Таблица символов подобна адресной книге, связывая имена с адресами.

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

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

Поэтому некоторые файлы могут быть исполняемыми и неисполняемыми даже в разных операционных системах на одном компьютере и с одним и тем же процессором.Основная причина заключается в том, что форматы анализируемых файлов, соответствующие разным загрузчикам ОС, также различаются.. Загрузчик Linux может загружать только формат файла EFL, а Windows — PE.

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

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

Загрузчик должен соответствовать двум требованиям.

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

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

Решение:

Сегмент:Разделите непрерывное пространство памяти в памяти и назначьте его загруженной программе,Сопоставьте непрерывное пространство памяти и адрес памяти, на который указывает инструкция.

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

вопрос:фрагментация памяти

Решение:

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

вопрос:Узкое место в производительности, фрагментация памяти и пространство подкачки памяти слишком велики, скорость чтения и записи жесткого диска слишком низкая

Решение:

подкачка памяти.原理是少出现一些内存碎片。另外,当需要进行内存交换的时候,让需要交换写入或者从磁盘装载的数据更少一点。和分段这样分配一整段连续的空间给到程序相比,Пейджинг — это разрезание всего пространства физической памяти на сегменты фиксированного размера. Пространство виртуальной памяти, занимаемое соответствующей программой, также будет разделено на разделы фиксированного размера.Такое непрерывное пространство памяти фиксированного размера является страницей. Общая страница намного меньше размера программы всего на несколько КБ.

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

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

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

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

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

Ссылку можно разделить на динамическую и статическую, а совместная работа экономит память

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

Поскольку это общий код, в память может быть загружена только одна копия. Когда программа связана, мы можем ссылаться на адрес памяти общей библиотеки.В разных системах суффикс файла общей библиотеки отличается. Windows есть.dll, под линуксом есть.so.

Требования к коду файла общей библиотеки:

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

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

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

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

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

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

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

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

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

Как и динамическое связывание, непрямые переходы выполняются путем изменения «адресных данных», чтобы вызвать идею о том, что код местоположения не может быть определен в начале.В Java это похоже на реализацию полиморфизма.

Следующий код:

public class DynamicCode {// 动态代码库
   
   private HashMap<String, Object> data; // 各类私有的数据部分 - 其中有一项是GOT
   
   public static void main(strs[] args) {// 公用代码部分
   
   }
}

бинарный код

Двоичный -> Десятичный:Умножьте N-й бит справа налево на 2 в N-й степени и сложите. N начинается с 0.

Пример:

0011
=====
0×2^3 + 0×2^2 + 1×2^1 + 1×2^0

Десятичный -> Двоичный:Короткое деление. То есть остаток от деления десятичного числа на 2 используется как самая правая цифра. Затем продолжайте делить частное на 2 и поместите соответствующий остаток справа от остатка только что, чтобы повторять рекурсивно, пока частное не станет равным 0. Тогда последовательность, состоящая из остаточной последовательности снизу вверх, является двоичным представлением целого числа.

Исходный код, обратный код, дополнительный код

Сначала нужно понять:В компьютерах числа хранятся в дополнительном коде до двух., а для однобайтового (8-битного) числа в дополнительном представлении указано, что 1000 0000 равно -128.А для положительных чисел обратный код и дополнительный код являются самим исходным кодом, а отрицательное число сохраняется в компьютере по дополнительному коду..

Дополнение отрицательного двоичного числа равно отрицанию отрицательного числа плюс 1, что также равно побитовой инверсии положительного числа плюс 1..

Оригинальный код:0001 представлен как +1 в исходном коде. И самый левый бит 1001 равен 1, значит, это -1. На самом деле это исходное кодовое представление целого числа.

Проблема с обозначением исходного кода

  • 0 Есть два способа: AS -0 (1000) и +0 (0000) - дополнение решить
  • Случай, когда +1(0001) и -1(1001) не дают в сумме 0. (1010 равно -2) - дополнительное решение

Обратный код:Чтобы решить проблему, что «сложение положительного и отрицательного не равно 0», на основе «исходного кода» придумали «обратный код».Представление «дополнение до единицы» используется для работы с отрицательными числами, положение знака не изменяется, а остальные положения меняются местами..

undefined

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

Проблема с нотацией дополнения:

  • Но в настоящее время есть два способа представить 0.

дополнять: то же самое делается для «отрицательных чисел», и +1 основан на исходном «дополнении до единицы». При добавлении 1 следует отбросить старший бит (например, 1111).

undefined

Это решает проблему одновременного существования +0 и -0, а также решает проблему «сложение положительных и отрицательных чисел равно 0». Также есть лишняя цифра -8.

В исходном коде диапазон, который может представлять байт, составляет: -127 ~ 127, а диапазон, представленный дополнительным кодом, составляет: -128 ~ 127.

Дополнение отрицательного двоичного числа равно инверсии отрицательного числа плюс 1, что также равно побитовой инверсии положительного числа плюс 1.

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

Основные моменты:

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

Мы по-прежнему судим о положительном или отрицательном значении этого числа по 0 и 1 в первой крайней левой позиции. но мыБольше не рассматривайте этот бит как отдельный бит знака, добавьте знак перед десятичным числом, вычисленным по оставшимся битам.,Вместо этого при расчете всего двоичного значения добавьте отрицательный знак перед самым высоким битом слева.

Например, 4-битное двоичное дополнение 1011, преобразованное в десятичное число, равно -1×2^3 + 0×2^2 + 1×2^1 + 1×2^0 = -5. Если старший бит равен 1, число должно быть отрицательным, если старший бит равен 0, оно должно быть положительным. И только 0000 означает 0, 1000 означает -8 в данном случае. 4-битное двоичное число, которое может представлять 16 чисел от -8 до 7 без потери одного бита.

Следует отметить, что ~ в Java означает побитовую инверсию, но побитовая инверсия не является дополнением.

Ссылаться на:

кодировка строки

ASCII (американский стандартный код для обмена, американский стандартный код для обмена информацией:Самые ранние компьютеры должны были использовать только английские символы, а также цифры и некоторые специальные символы, а затем использовать 8-битный двоичный код для представления всех символов, которые нам нужны каждый день.Это код ASCII.

undefined

Код ASCII похож на словарь, со 128 различными числами в 8-битном двоичном формате, сопоставленными со 128 различными символами. Например, строчная буква а является 97-й буквой в ASCII, что соответствует 0110 0001 в двоичном коде, что соответствуетшестнадцатеричное представлениеЭто 61. Заглавная буква А является 65-й, что соответствует 0100 0001 в двоичном коде, что соответствуетшестнадцатеричное представлениеЭто 41.

нужно знать, это:

В ASCII число 9 больше не представляется как 0000 1001, как в целочисленной записи, потому что оно расположено позже в наборе символов ASCII. Вместо этого он представлен 0011 1001, что является 57-м битом.Строка "15"Он не представлен 8 битами 0000 1111, ноОн становится двумя последовательно соединенными символами 1 и 5, то есть 0011 0001 и 0011 0101, которые должны быть представлены двумя 8-битами.Две 8-битные причины в том, что представляют только до четырех (-8--7).

Мы видим, что самое большое 32-битное целое число равно 2 147 483 647. Если вы используете целочисленную запись, вам нужно всего 32 бита для ее представления. Но если он представлен строкой, всего имеется 10 символов, и каждый символ использует 8 бит, что требует полных 80 бит. Оно занимает гораздо больше места, чем целочисленное представление. Вот почему мы храним данные с помощью двоичной сериализации при хранении данных.

Юникод:Как и ASCII, это набор символов, содержащий 140 000 различных символов на 150 языках.

Кодировка символов — это словарь того, как эти символы в наборе символов представлены в двоичном виде.. Упомянутый выше Unicode может быть закодирован с помощью UTF-8, UTF-16 и даже UTF-32 и сохранен как двоичный. Следовательно, с Unicode мы фактически можем использовать более одной формы кодировки UTF-8. Пока другие знают этот набор правил кодирования, они могут нормально передавать и отображать этот код.

undefined

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

Следует отметить, что если наша программа использует или сохраняет некоторые древние наборы символов, которые обычно не используются, то не могут быть никаких таких символов в наборе символов Unicode, то Unicode будет равномерно записывать эти символы, как U + FFFD этот код. Если он хранится в формате UTF-8, это \ xef \ xbf \ xbf.

Ссылаться на:

схема

реле, ворота

Компьютеры используют двоичный код вместо десятичного по следующим причинам:

Электромагнитные отношения и происхождение реле можно отнести креле.

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

Представление базовой схемы затвора:

  • Схема «И» эквивалентна последовательному соединению двух переключателей в цепи, и когда оба переключателя разомкнуты, цепь включена.
  • «Или» эквивалентно соединению двух цепей на входе с выходом, и любая цепь разомкнута, тогда цепи на выходе соединены.
  • «Нет» соответствует открытым после переключения от выключения по умолчанию, только магнитное поле с питанием,Изменено на по умолчанию - это открыть питание, только когда питание питание..

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

undefined

Вывод: Мы представляем «1» и «0» как «включено» и «выключено» схемы.Так же, как транзистор ведет себя в проводящем состоянии «1» и в изолирующем состоянии «0» при разных условиях.

Эти вентили являются основными логическими блоками, на которых мы создаем процессоры и память. Наши различные операции с компьютерными двоичными «0» и «1» на самом деле исходят из цепей вентилей, называемых комбинационными логическими схемами.

Так называемая схема затвора в цифровой схеме, так называемая «дверь», является единственной базовой логикой, то есть основным блоком..最基本的逻辑关系是与,或,非,最基本的逻辑门是与门,或门和非门。如下是最基本的门电路,其他复杂的门电路都是由这些门电路组合而成。他们是构成现代计算机硬件的“积木”。

сумматор

полусумматор

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

полный сумматор

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

W: Это двузначное значение. С полным сумматором теоретически может быть достигнуто сложение двух 8-битных чисел.

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

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

Арифметико-логическое устройство (ALU): это исполнительный блок центрального процессора и основной компонент всех центральных процессоров.Это арифметико-логическое устройство, состоящее из логических элементов И и вентилей ИЛИ. Его основная функция заключается в выполнении двоичных арифметических операций, таких как сложение, вычитание и умножение (кроме целочисленного деления).

множитель

13 * 9 = 117Двоичная вертикальная таблица:

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

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

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

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

Но как видно из предыдущего сумматора, так называемый множитель位移+加法, работа каждого бита не является независимой, старшему биту умножителя все еще нужен результат операции (сдвиг) младшего бита перед операцией умножения. Например, если операнд 4 разряда, необходимо дождаться 4 группы операций «сдвиг + сложение».

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

  1. на группу位移+加法Операции имеют сильные ассоциации и отношения приоритета.
  2. Управляйте тактовой частотой, которую тест должен ожидать при выполнении каждого сдвига и добавления. (максимум)
  3. Когда каждая группа результатов умножения накапливается в регистре сумматором, на нее воздействуетзадержка воротвлияние.

Решение:

Расширить схему: Прежде всего, для первого пункта вертикальная столбчатая диаграмма, которую мы видели выше, анализирует так называемую каждую группу.位移+加法Сильная корреляция и взаимосвязь последовательности обусловлены нашим анализом, но на самом деле для схемы компьютера, когда определяются два добавляемых числа, также определяется, будет ли переноситься старший бит. То есть для схемы компьютера высокое положение и положение могут давать результаты одновременно, схема естественно параллельна, и нет так называемой сильной корреляции. В то же время задержка затвора, соответствующая третьей точке, имеет только набор задержек затвора для сложения и работы, то есть задержку затвора 3T. И тактовая частота, которую должен ждать сдвиг, тоже не нужна.

На самом деле, вы можете видеть, что есть два способа реализации множителя:

  1. RISC: То есть упрощенная схема, меньше вентилей и регистров, но относительно более длительные задержки вентилей и тактовые циклы для вычисления инструкции.
  2. CISC: более сложные схемы, более короткие задержки логического элемента и тактовые циклы для вычисления сложной инструкции.

Компромисс между этим на самом деле является классической войной между RISC и CISC в компьютерной архитектуре.

фиксированная точка, плавающая точка

фиксированная точка

Как представлять числа с фиксированной точкой: Используйте 4 бита для представления целых чисел от 0 до 9, тогда 32 бита могут представлять 8 таких целых чисел. Затем мы рассматриваем два крайних правых целых числа от 0 до 9 как дробную часть, а 6 целых чисел от 0 до 9 слева — как целую часть. Таким образом, мы можем использовать 32 бита для представления 100 миллионов действительных чисел от 0 до 999999,99.

Например: 0001 1001 — это 19, а не 25.

undefined

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

недостаток: значение, которое может быть представлено, слишком мало.В исходном методе 32-битного числового представления максимальное значение, которое может быть представлено, составляет 4,2 миллиарда. С двоично-десятичным кодированием он может представлять только до 100 Вт, что обычно используется в супермаркетах.

число с плавающей запятой

zhuanlan.zhihu.com/p/75581822

Можно видеть, что если их представить в виде чисел с фиксированной точкой, несомненно, будут случаи, когда большие действительные числа не могут быть представлены. Необходимо использовать метод экспоненциальной записи, гдеПредставление чисел с плавающей запятой в научной нотации имеетIEEE 754стандарт, который определяет два основных формата.Один из них — использовать 32 бита для представления чисел одинарной точности с плавающей запятой, которые мы часто называем типами float или float32. Другой — использовать 64 бита для представления чисел двойной точности с плавающей запятой, которые мы обычно называем типами double или float64.

Согласно международному стандарту IEEE 754, любое двоичное число с плавающей запятой V можно представить в виде следующей функциональной формы:

  • Знак: (-1)^s представляет бит знака.Когда s=0, V является положительным числом, когда s=1, V является отрицательным числом.
  • Мантисса: M представляет собой значащее число, большее или равное 1, меньшее 2.
  • Экспоненциальный код: 2^E означает бит экспоненты.

Например:

  • 6,0 в десятичной системе, записанной в двоичной системе, равно 110,0, что эквивалентно 1,10×2^2. Затем, в соответствии с форматом V выше, мы можем получить s=0, M=1,10, E=2.
  • Десятичное число -5,0, записанное в двоичном виде равно -101,0, что эквивалентно -1,01×2^2. Тогда s=1, М=1,01, Е=2.

IEEE 754 предусматривает, что для 32-битного числа с плавающей запятой старший 1 бит — это бит знака s, следующие 8 бит — показатель степени E, а оставшиеся 23 бита — мантиссы M. Для 64-битного числа с плавающей запятой старший 1 бит — это бит знака S, следующие 11 бит — показатель степени E, а оставшиеся 52 бита — мантиссы M.

Поскольку E — 8 бит, диапазон его значений составляет 0–255. Поскольку E в научной записи может быть отрицательным (для представления меньших действительных чисел, бесконечно близких к 0), поэтомуIEEE 754 требует, чтобы к реальному значению E добавлялось промежуточное число. Для 8-битного E это промежуточное число равно 127 (1-254, 0 и 255 — флаговые биты), для 11-битного E это промежуточное число это 1023.

Например, E в 2^10 равно 10, поэтому, когда оно хранится как 32-битное число с плавающей запятой, оно должно храниться как 10+127=137, что составляет 10001001.

Затем экспонент E также может быть подразделен на три случая:

  1. E не все 0 или не все 1. В настоящее время число с плавающей запятой представлено вышеуказанными правилами, то есть вычисленное значение показателя степени E (10001001 = 137) минус 127 (или 1023), чтобы получить реальное значение, а затем добавить первую 1 перед значащее число М.
  2. Е все 0. В это время показатель степени E числа с плавающей запятой равен 1-127 (или 1-1023),Значимая цифра M больше не добавляется к первой 1, а уменьшается до десятичного числа 0,xxxxxx. Это делается для представления ±0 и очень маленьких чисел, близких к 0.
  3. Е все 1. В это время, если значимые цифры M - это 0, это означает ± бесконечность (положительный или отрицательный, зависит от знака битов); если значимые цифры M не все 0, это означает, что число не является числом (NAN ).

При таком представлении числа с плавающей запятой, независимо от знака, наименьшее и наибольшее число, которое может представлять число с плавающей запятой, почти одно и то же.1.17 * 10^-38а также3.40 * 10^38, представленный числовой диапазон намного больше. В этот момент f равно 23 0 с, e равно -126 и f равно 23 1 с, e равно 127.

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

0,1001 такое двоичное десятичное число, преобразованное в десятичное число, равно

1*2^-1 + 0*2^-2 + 1*2^-3 + 0*2^-4` = 0.5625

Двоичное представление десятичных дробей отличается от представления целых чисел., например, 9 в 9.1 можно выразить как 1001, а 0.1 как десятичное число отличается от преобразования целого числа в двоичное и деления на 2. Десятичный метод заключается в умножении на 2, а затем посмотреть, превышает ли оно 1. Если оно превышает 1, мы записываем 1 и вычитаем 1 из результата, продолжая цикл. Здесь мы увидим, что 0,1 на самом деле становится бесконечным циклом двоичных десятичных знаков.0.0++0011++0011Здесь "0011" будет бесконечно повторяться. Как показано на рисунке:

Затем мы объединяем целую часть и дробную часть вместе, и десятичное число 9.1 становится двоичным представлением, например 1001.000110011... . Поскольку числа с плавающей запятой представлены в двоичном экспоненциальном представлении, это число становится1.001000110011...*2^3. В выражении экспоненциальной записи, соответствующем двоичному числу с плавающей запятой, здесь знаковый бит равен s = 0, а соответствующий значащий бит равен f=001000110011.... Поскольку действительный f имеет длину всего 23 бита, то f=00100011001100110011==001==. Последняя «1» в последнем цикле «0011» усекается. Соответствующий показатель степени равен 3, и нужно добавить 127, тогда двоичное представление должно быть 130, то есть 10000010.- 0.3 тоже так говорит.

Наконец-то можно получить двоичное представление 9.1: 0 10000010 0010001100110011==001==.

И наоборот, если это двоичное значение выражено в десятичном виде, фактическое точное значение равно 9,09999942779541015625.

Фальшивый адрес:IEEE-754 Floating Point Converter

Из двоичного преобразования старшей дробной части видно, что среди 9 чисел от 0,1 до 0,9 только 0,5 можно точно представить как двоичное число с плавающей запятой. А все остальное лишь приблизительное выражение.

Ссылаться на:

Принцип сложения чисел с плавающей запятой

Сначала выровнять, а потом считать.

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

Вы можете увидеть процесс сложения чисел с плавающей запятой, в котором число с меньшим битом степени необходимо сдвинуть вправо в значащем бите.В процессе сдвига вправо самый правый значащий бит отбрасывается. Это приводит к соответствующему числу с меньшим битом экспоненты, прежде чем может произойти сложение.потеря точности. Чем больше разница между показателями двух слагаемых, тем больше количество бит смещения и тем больше возможная потеря точности. Эффективная битовая длина 32-битного числа с плавающей запятой составляет всего 23 бита.Если биты экспоненты двух чисел отличаются на 23 бита, после того, как меньшее число сдвинуто вправо на 24 бита, все значащие биты потеряны. Это также означает, что хотя числа с плавающей запятой могут представлять значения в диапазоне от 3,40*10^38 до 1,17×10^-38. Но в реальных вычислениях, если разница между двумя числами составляет 2^24, что составляет почти 16 миллионов раз, результат никак не изменится после сложения двух чисел.

Следующий код:

public class FloatPrecision {
  public static void main(String[] args) {
    float a = 20000000.0f;
    float b = 1.0f;
    float c = a + b;
    System.out.println("c is " + c);
    float d = c - a;
    System.out.println("d is " + d);
  }
}
=====
c is 2.0E7
d is 0.0