Среди фронтенд-разработчиков немалая доля студентов не пришла с курса, поэтому для базового класса必修课
,Например:计算机组成原理
,操作系统
,计算机网络
,数据结构和算法
Мало знаний и тд.
Чем больше вы изучаете, тем больше вы понимаете важность этого знания.
Например, все знают, что в js0.1 + 0.2
да不等于0.3
Да, почему? Это включает в себя принцип компьютерной композиции浮点数
представительство и浮点数
Операции сложения и вычитания (в тексте будет просторечный вариант ответа).
Другой пример — ввод с клавиатуры.a+b
Как передать эту командуcpu
Вывод расписания на屏幕上
Шерстяная ткань? Это включает в себя冯诺依曼体系
, если ты программист, то данные с клавиатуры на экран не знаешь基本流向
, пришло время взглянуть на это «Ten Quan Da Supplement»
Эта статья计算机组成原理
Самая основная вступительная статья, не думаю, что фронтенду нужно так глубоко вникать в эту тему и осваивать базовые计算机组成原理
здравый смысл.
1. Принцип работы компьютера
Прежде всего, пять основных компонентов компьютера следующие:输入设备
(как клавиатура),存储器
(например, память),运算器
(cpu), 控制器
(cpu), 输出设备
(монитор).
Это работает следующим образом
1.1 Контроллер ---> Управляющее устройство ввода --> Поток команд в память
Когда мы вводим данные, процессор в控制器
позволит输入设备
хранить эти инструкции в存储器
(Память).
1.2 Команда анализа контроллера ---> управление памятью ---> отправка данных в вычислитель
После того, как контроллер проанализирует инструкцию, пусть存储器
отправить данные на运算器
внутри(控制器
а также运算器
здесьcpu
в)
Обратите внимание,存储器
обе存储数据
, но также存储指令
1.3 Контроллер управляет оператором для выполнения операции с данными и возвращает результат операции в память
1.4 Контроллер управляет памятью, чтобы вернуть результат на устройство вывода
Со следующего шага давайте подойдем ближе и посмотрим, как ЦП взаимодействует с памятью внутри компьютера.
2. ЦП и его рабочий процесс
Две наиболее важные части процессора:运算器
а также控制器
, давайте посмотрим на главную роль оператора
2.1 Основные компоненты калькулятора
Как показано выше, наиболее важными компонентами калькулятора являютсяALU
, называется по-китайски算术逻辑单元
, используется для выполнения算术
а также逻辑运算
из. разноеMQ
,ACC
Мы не заботимся об этом, это некоторые寄存器
.
2.2 Основные компоненты контроллера
Наиболее важной частью контроллера являетсяCU
(блок управления), пока он分析指令
, давая控制信号
.
IR
(регистр инструкций), в котором хранится инструкция, которую необходимо выполнить в данный момент
PC
Адрес сохраненной инструкции.
2.3 Пример. Процесс выполнения команды выборки
Во-первых, процесс получения инструкций выглядит следующим образом.
- первый шаг,
PC
, то есть где хранится адрес инструкции.Если мы хотим знать, какая будет следующая инструкция, мы должны обратиться к памяти, чтобы получить ее.CPU
Просто знай, что делать дальше.PC
запомнилсяMAR
Возьмите адрес инструкции для выполнения,MAR
(Место в памяти, предназначенное для хранения адреса инструкции) - Второй и третий шаги,
MAR
После перехода в память для получения инструкции поместите адрес инструкции вMDR
(специальное место для хранения данных в памяти) - четвертый шаг
MDR
Данные в возврате кIR
в,IR
Здесь хранятся инструкции, сюда мы помещаем инструкции, которые только что взяли из банка памяти.
Затем проанализируйте инструкцию, и процесс выполнения инструкции выглядит следующим образом
- пятый шаг,
IR
введите команду вCU
, для анализа инструкции, например, анализируется, что это инструкция выборки, а затем инструкция будет выполняться (инструкция выборки здесь фактически код адреса, по этому адресу для выборки данных из банка памяти) - шаг шестой, шаг седьмой
IR
затем отправится в хранилищеMAR
(где хранится адрес),MAR
Просто зайти в банк памяти, чтобы получить данные по адресу в инструкции выборки? - Восьмой шаг, полученные данные возвращаются в
MDR
(где хранятся данные) - девятый шаг,
MDR
Данные в нем помещаются в регистр арифметического устройства, и процесс выборки инструкции здесь завершен.
Приходите на эпизод, мы знаем, что данные в内存
является二进制
есть, то есть0和1
, 0和1
Как это выразить?
Давайте рассмотрим один из способов хранения нулей и единиц, чтобы проиллюстрировать это.
- Если конденсатор заряжен, заряд означает 1, отсутствие заряда означает 0
- Как показано ниже
3. Языки программирования
Давайте посмотрим на машинный язык, как представить инструкцию для хранения числа, как показано на следующем рисунке.
0000,0000,000000010000
- первый из которых
0000
, что означает, что на ассемблереLOAD
, то есть загрузить, что загрузить - адрес загрузки
000000010000
данные на второй0000
(место регистрации).
Далее посмотрим, если汇编语言
как выразить
LOAD A, 16
Это означает поместить данные 16-го блока в тело хранилища по адресу регистра A.ADD C, A, B
Это означает добавить данные A и B в регистр, чтобы получить CSTORE C, 17
Это означает, что данные в регистре хранятся в 17-й ячейке банка памяти.
Наконец, давайте посмотрим, как использовать高级语言
выражать
Является ли язык высокого уровня очень простым, всего одинa+b
, вам не нужно думать об этом寄存器
,存储体
Эти вещи.
Краткое содержание этой части
Обычно существует два способа преобразования языка высокого уровня в машинный язык.
- Один из них заключается в непосредственном использовании
编译器
, который преобразует язык высокого уровня в二进制
код, напримерc
,такc
Он очень быстро запускается, потому что после компиляции это машинный язык, и он может работать непосредственно в системе, но проблема в том, что скорость компиляции может быть относительно низкой. - Один объяснительный, например
js
, который переводит код в одну строку机器语言
(середина может быть переведена сначала как汇编
код или字节码
), объяснить строку, выполнить строку
Следует отметить, что согласно первому способу перевода большого объема высокоуровневого кода на машинный язык остается много места для编译器
Для оптимизации кода интерпретируемым языкам сложно выполнить такую оптимизацию, но вv8
в двигателе,js
еще нужно оптимизировать, т.编译阶段
(кодовые точки编译
а также执行
Два этапа) будут выполнять некоторую оптимизацию кода, а способ выполнения сразу после компиляции обычно называетсяJIT (Just In Time) Comipler
.
4. Преобразование системы
В следующем разделе 4.3 объясняется, почему 0,1 + 0,2 равно 0,3.
4.1 Как двоичное число преобразуется в десятичное
Например2
основание101.1
как преобразовать в10
система. (Некоторые ученики считают, что его можно использоватьparseInt('101.1', 2)
, это невозможно, потому чтоparseInt
вернуть целое число)
Метод преобразования следующий:
Какие правила изображены на картинке выше?
二进制
каждое количество乘以2
Соответствующая степень , обратите внимание, что десятичная точка умножается на нее负相应次方
.
Возьмите другой пример, и вы поймете,
бинарный1101
преобразовать в десятичную
4.2 Преобразование десятичных целых чисел в двоичные
JS
можно использовать внутрьtoString(2)
этот метод для преобразования. Если вы хотите использовать общий метод, например: преобразовать десятичное число(29)
При преобразовании в двоичные числа алгоритм выглядит следующим образом:
- Разделите данное десятичное число 29 на 2, в частном будет 14, остаток 1 - младший разряд двоичного числа.
- Разделите 14 на 2, в частном будет 7, а в остатке 0.
- Разделите 7 на 2, частное равно 3, остаток равен 1, затем разделите 3 на 2, частное равно 1, остаток равен 1.
- Затем разделите 1 на 2, частное равно 0, а остаток равен 1, что является старшей цифрой двоичного числа.
4.3 Преобразование десятичных дробей в двоичные
Метод заключается в использовании метода «умножение на 2, округление, упорядоченное расположение». Конкретный метод:
- Умножение десятичной дроби на 2 дает произведение, взяв целую часть произведения -
- Умножьте оставшуюся дробную часть на 2, чтобы получить еще одно произведение, и вынесите целую часть произведения -
- Делайте это до тех пор, пока дробная часть произведения не станет равной нулю или пока не будет достигнута требуемая точность.
Возьмем пример
Например: преобразовать десятичное число 0,25 в двоичное.
-
0.25 * 2 = 0.5
Вынесите целую часть:0
-
0.5 * 2 = 1.0
вынуть целую часть 1
то есть десятичный0.25
Двоичный файл0.01
(Первый раз самый высокий, а последний самый низкий)
На данный момент мы можем попробовать десятичный0.1
а также0.2
Как преобразовать в двоичный
0.1(十进制) = 0.0001100110011001(二进制)
十进制数0.1转二进制计算过程:
0.1*2=0.2……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.2”接着计算。
0.2*2=0.4……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.4”接着计算。
0.4*2=0.8……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.8”接着计算。
0.8*2=1.6……1——整数部分为“1”。整数部分“1”清零后为“0”,用“0.6”接着计算。
0.6*2=1.2……1——整数部分为“1”。整数部分“1”清零后为“0”,用“0.2”接着计算。
0.2*2=0.4……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.4”接着计算。
0.4*2=0.8……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.8”接着计算。
0.8*2=1.6……1——整数部分为“1”。整数部分“1”清零后为“0”,用“0.6”接着计算。
0.6*2=1.2……1——整数部分为“1”。整数部分“1”清零后为“0”,用“0.2”接着计算。
0.2*2=0.4……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.4”接着计算。
0.4*2=0.8……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.2”接着计算。
0.8*2=1.6……1——整数部分为“1”。整数部分“1”清零后为“0”,用“0.2”接着计算。
……
……
所以,得到的整数依次是:“0”,“0”,“0”,“1”,“1”,“0”,“0”,“1”,“1”,“0”,“0”,“1”……。
由此,大家肯定能看出来,整数部分出现了无限循环。
см. далее0.2
0.2化二进制是
0.2*2=0.4,整数位为0
0.4*2=0.8,整数位为0
0.8*2=1.6,整数位为1,去掉整数位得0.6
0.6*2=1.2,整数位为1,去掉整数位得0.2
0.2*2=0.4,整数位为0
0.4*2=0.8.整数位为0
就这样推下去!小数*2整,一直下去就行
这个数整不断
0.0011001
так0.1
а также0.2
не могут быть идеально преобразованы в двоичные файлы, поэтому они складываются, конечно, не0.3
охватывать
5. Числа с фиксированной и плавающей запятой
Прежде всего, что такое число с фиксированной точкой?
5.1 Числа с фиксированной точкой
Как показано выше, пример чистого целочисленного двоичного кода1011
а также-1011
,если整数
, используется знаковый бит0
указывает, что если это负数
символ использования1
выражать
Точно так же пример чистого десятичного представления выглядит следующим образом:
то если нет纯小数
или纯整数
, как это выразить?
Например10.1
, можно умножить на коэффициент масштабирования10.1 ---> 101
Масштабный коэффициент10
, или10.1 ---> 0.101
Масштабный коэффициент100
Числа с фиксированной точкой очень просты.Далее мы вводим числа с плавающей запятой.В JS используются числа双精度的浮点数
, поэтому изучение чисел с плавающей запятой помогает нам понять числа в JS.
5.2 Числа с плавающей запятой
Как представляются числа с плавающей запятой?
выше十进制
научное обозначение, из которого нам нужно понять несколько понятий, одно из которых尾数
,基数
а также阶码
-
尾数
Должен быть чистым десятичным числом, поэтому изображение выше1.2345
Не соответствует формату мантиссы и нуждается в изменении на0.12345
-
基数
, что в двоичном формате2
-
阶码
сколько полномочий
так浮点数
из通用
Формат представления следующий:
- S означает мантисса
- r означает базу
- j представляет собой код заказа
Здесь следует отметить, что сложение и вычитание чисел с плавающей запятой не так просто, как то, что мы описали выше, и будет выполнено с помощью следующих шагов.
Если вас интересуют эти условия, вы можете проверить их онлайн, нам нужно только знать浮点数加减运算
Это много работы, но если вы собираетесь сделать библиотеку для арифметики с плавающей запятой, вам определенно придется ее освоить.
6. Принцип локальности и уловки (кэширования)
Посмотрите на картинку ниже
(Объяснять,MDR
а такжеMAR
Хотя логически принадлежит основной памяти, в电路实现
когда,MDR
а такжеMAR
ПокинутьCPU
относительно недалеко)
На изображении выше выполняется строка кода, которую можно понимать как цикл for js.
const n = 1000;
const a = [1, 2, 3, 4, 5, 6, 7]
for(let i =0; i < n; i++) {
a[i] = a[i] + 2
}
мы можем узнать, что
- Данные массива иногда хранятся в памяти непрерывно.
- Например, если мы хотим извлечь данные, для извлечения данных a[0] из памяти требуется 1000 нс (ns означает наносекунды), тогда для выборки a[0] в a[7] требуется 1000 * 8 = 8000 нс.
- Если наш процессор обнаружит, что это выборка данных массива, то насколько хорошо было бы для меня хранить все ближайшие блоки данных от a[0] до a[7] в кеше, чтобы нам нужно было получить данные только один раз и потреблять 1000 нс
cahce
то есть局部性原理
приложение
-
空间局部性
: информация, которая будет использована в ближайшем будущем (指令
а также数据
), скорее всего, связано с информацией, используемой в настоящее время в存储空间
находится рядом -
时间局部性
: Информация, которая будет использована в ближайшем будущем, скорее всего, сейчас.正在使用的信息
можно увидетьcache
одноразовый приемa[0]
прибытьa[9]
данные в банке памяти, нужно только1000ns
,потому чтоCache
да高速存储器
,а такжеcpu
Скорость взаимодействияcpu
а также主存
Взаимодействие намного быстрее.
Затем войдите в последний раздел (пропустите изучение шины), эволюцию устройств ввода-вывода.
7. Эволюция устройств ввода/вывода
Что такое ввод-вывод?
输入/输出(Input /Output ,简称I/O),指的是一切操作、程序或设备与计算机之间发生的数据传输过程。
Например, операции чтения и записи файлов являются типичнымиI/O
работать. Далее, давайте посмотрим на эволюцию устройств ввода-вывода.
cpu
как знатьI/O设备
Задача выполнена? Например, как узнатьI/O设备
Вы закончили чтение данных файла?CPU
будет продолжать запрашиватьI/O设备
Это готово. В настоящее время,cpu
находится в состоянии ожидания. то естьcpu
при работе,I/O
система не работает,I/O
система работает,cpu
не работает.
Тогда посмотрите на второй этап
-
Для решения первого этапа
CPU
ждатьI/O设备
,串行
способ работы, всеI/O设备
пройти черезI/O总线
приходи и следуйCPU
сделка, как только определеннаяI/O设备
Когда задача будет выполнена, она будет中断请求
путь, черезI/O总线
,РассказыватьCPU
,Я готов. -
Но для
高速外设
, они выполняют задачи очень быстро, поэтому часто прерываютCPU
, Чтобы решить эту проблему, используется прямой путь передачи данных между высокоскоростными периферийными устройствами и основной памятью,DMA总线
соединять,CPU
Просто организуйте запуск высокоскоростных периферийных устройств, а остальные оставьте в покое, что предотвратит частые прерывания.CPU
.
Наконец, посмотрите на третий этап
На третьем этапе ЦП управляет устройствами ввода-вывода через компонент управления каналом. ЦП не нужно организовывать для него задачи. Ему нужно просто выдавать такие команды, как запуск и остановка, и компонент канала автоматически организует соответствующие устройства ввода-вывода для работы.
В конце этой статьи я надеюсь, что вам всем понравилось и вы поделитесь своим сердцем💗.