Compare commits
42 Commits
8c815df1bc
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| c513ce326f | |||
| 9361978648 | |||
| 8f42d4a320 | |||
| c654fcd9c2 | |||
| 2ec4a7e7db | |||
| 283660b9ef | |||
| f0817da47e | |||
| c9bc96dafc | |||
| 6538742678 | |||
| a7f8e74f3f | |||
| 9b0c9f4b4a | |||
| b62e54bbb0 | |||
| 6853ada348 | |||
| 4d0e404259 | |||
| da3ad9dd1a | |||
| 005017595b | |||
| 23a9e06d53 | |||
| 8c95d15f6c | |||
| 61e293f81b | |||
| 75e45eb930 | |||
| 12a473f46e | |||
| 11432e782f | |||
| fec7f50b3e | |||
| 4886625dac | |||
| 977e016822 | |||
| 3764f7dafa | |||
| ecd928d72d | |||
| c0b8ac0043 | |||
| 88b307c311 | |||
| dc82207723 | |||
| 8ebd7b0b4f | |||
| dd3ac17361 | |||
| fc45caa657 | |||
| 7637cab7a9 | |||
| 0e6e583e6d | |||
| 6421fd3a48 | |||
| 08e557da92 | |||
| c90a404c40 | |||
| d5adddc4f1 | |||
| 05a67d2998 | |||
| 98eeb949fc | |||
| 3e4e10da10 |
@@ -4,6 +4,8 @@ on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
schedule:
|
||||
- cron: '0 2 * * *'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
@@ -22,6 +24,7 @@ jobs:
|
||||
cd /opt/docs/obsidian
|
||||
echo "${{ secrets.SERVER_SUDO_PASSWORD }}" | sudo -S git reset --hard origin/master
|
||||
echo "${{ secrets.SERVER_SUDO_PASSWORD }}" | sudo -S git pull origin master
|
||||
echo "${{ secrets.SERVER_SUDO_PASSWORD }}" | sudo -S git submodule sync
|
||||
echo "${{ secrets.SERVER_SUDO_PASSWORD }}" | sudo -S git submodule update --init --recursive --remote
|
||||
cd ..
|
||||
echo "${{ secrets.SERVER_SUDO_PASSWORD }}" | sudo -S docker compose down
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
[submodule "LeterZP"]
|
||||
path = LeterZP
|
||||
url = https://gitea.aklivtsov.tech/LeterZP/Info.git
|
||||
url = ../../LeterZP/Info.git
|
||||
|
||||
|
After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 75 KiB |
|
After Width: | Height: | Size: 82 KiB |
|
After Width: | Height: | Size: 80 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 77 KiB |
|
After Width: | Height: | Size: 120 KiB |
|
After Width: | Height: | Size: 111 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 205 KiB |
|
After Width: | Height: | Size: 223 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 121 KiB |
|
After Width: | Height: | Size: 298 KiB |
|
After Width: | Height: | Size: 137 KiB |
|
After Width: | Height: | Size: 63 KiB |
|
After Width: | Height: | Size: 184 KiB |
|
After Width: | Height: | Size: 180 KiB |
|
After Width: | Height: | Size: 117 KiB |
|
After Width: | Height: | Size: 121 KiB |
|
After Width: | Height: | Size: 105 KiB |
|
After Width: | Height: | Size: 380 KiB |
|
After Width: | Height: | Size: 146 KiB |
|
After Width: | Height: | Size: 192 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 80 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 106 KiB |
|
After Width: | Height: | Size: 101 KiB |
|
After Width: | Height: | Size: 147 KiB |
|
After Width: | Height: | Size: 81 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 84 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 97 KiB |
|
After Width: | Height: | Size: 106 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 59 KiB |
@@ -7,14 +7,20 @@
|
||||
- Сформировать насмотренность и знание вычислительных механизмов (которые воспроизводятся в разных технологиях).
|
||||
- Устранить элементы "магического мышления" и "карго культа".
|
||||
## Системная инженерия
|
||||
- [[Понятие системы]]
|
||||
- [[Компьютерные системы]]
|
||||
- [Понятие системы](Системная%20инженерия/Понятие%20системы.md)
|
||||
- [Компьютерные системы](Системная%20инженерия/Компьютерные%20системы.md)
|
||||
- [Особенности производства аппаратуры](Системная%20инженерия/Особенности%20производства%20аппаратуры.md)
|
||||
- [Hardware and Software](Системная%20инженерия/Hardware%20and%20Software.md)
|
||||
## Схемотехника
|
||||
- [[Цифровая схемотехника]]
|
||||
- [Цифровая схемотехника](Цифровая%20схемотехника/Цифровая%20схемотехника.md)
|
||||
## Теория вычислений
|
||||
- [Модель вычислений](Вычислительные%20системы/Модель%20вычислений.md)
|
||||
- [Процессоры и системы команд](Вычислительные%20системы/Процессоры%20и%20системы%20команд.md)
|
||||
- [Машина фон Неймана](Вычислительные%20системы/Машина%20фон%20Неймана.md)
|
||||
## Вычислительные архитектуры
|
||||
- [[Вычислительные архитектуры]]
|
||||
- [Вычислительные архитектуры](Архитектуры/Вычислительные%20архитектуры.md)
|
||||
## Инструменты low-level
|
||||
- C Language
|
||||
- [[Системные паттерны]]
|
||||
- [Системные паттерны](Системные%20паттерны/Системные%20паттерны.md)
|
||||
## Сети
|
||||
- Компьютерные сети
|
||||
@@ -1,6 +1,6 @@
|
||||
- 32-битная стековая архитектура
|
||||
- Главный принцип - команды не имеют операндов в коде. Все данные неявно берутся с веришны стека, результат кладется обратно в стек.
|
||||
- Небольшая пасхалка на [[Evaluate Reverse Polish Notation|вот эту задачу с литкода]]
|
||||
- Небольшая пасхалка на [вот эту задачу с литкода](../../АиСД/Задачи/LeetCode/Evaluate%20Reverse%20Polish%20Notation.md)
|
||||
## Регистры, флаги и стеки
|
||||
- Имеет два независимых аппаратных стека и два регистра-указателя
|
||||
### Стеки
|
||||
@@ -60,7 +60,7 @@
|
||||
- `>r` - снять элемент с `Data Stack` и положить на `Return Stack`
|
||||
## Подробнее про умножение и деление
|
||||
### `+*`
|
||||
- Как работает умноежение чисел в двоичной системе (`A*S`): смотрим на каждый бит числа A, если бит 1, то прибавляем S к результату, если бит 0, то пропускаем, в конце сдвигаем результат
|
||||
- Как работает умножение чисел в двоичной системе (`A*S`): смотрим на каждый бит числа A, если бит 1, то прибавляем S к результату, если бит 0, то пропускаем, в конце сдвигаем результат
|
||||
- Как использует эта команда данные
|
||||
1. Регистр `A` - множитель
|
||||
2. `S` (второй элемент стека данных) - множимое
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
## Учебная архитектура
|
||||
## Реальные VLIW и Эльбрус
|
||||
### Виды параллелизма
|
||||
> [!warning] Эта часть должна переехать в часть лекций
|
||||
1. На уровне инструкций
|
||||
- Конвейризация
|
||||
- Суперскалярность
|
||||
- Длинные машинные слова (very long instruction word)
|
||||
2. На уровне данных
|
||||
- Векторы
|
||||
3. На уровне потоков - многопоточность
|
||||
4. На уровне процессов - много ядер в процессоре
|
||||
### Оптимизация обращений к памяти
|
||||
- Есть спекулятивные команды, по типу спекулятивного чтения. В самом начале процессор читает, а если нигде по итогу не использовалось, то прочитанное значение отваливается.
|
||||
- Оптимизация обращений к памяти в цикле: вместо `load -> alu -> store` компилятор расслаивает итерации и делает `store i -> alu i+1 -> load i+2` (i - номер итерации)
|
||||
### Оптимизация переходов
|
||||
Переход довольно затратная операция для конвейрных процессоров. Виды оптимизаций:
|
||||
1. Штраф за переход и просто все этапы конвейера сбрасываются (самый простой вариант, на практике встречается редко)
|
||||
2. В Эльбрусе - предикаты, выполняются обе ветки (if-else) а потом записывает только то, что в предикате. Превращает Control Flow в Data Flow. Используется только для коротких веток (3-5 команд). Логика: команды сравнения записывают в регистровый файл предикатов 0 или 1. Компилятор ставит абсолютно все команды в поток исполнения (и из if, и из else), но ставит специальные биты в команду: номер предиката, который контроллирует выполнение. Дальше команды исполняются, на этапе декода процессор видит предикат, а на этапе записи в память делает операцию, только если управляющий предикат - 1. (P.S. такое же было и в Intel Itanium)
|
||||
3. Предикт переходов, в cisc - это делает процессор (у него маленькая область видимости, поэтому может быть неэффективно), в vliw - это делает компилятор (компилятор видит всю программу целиком и может отлично с этим справится). Процессор готовится к переходу и загружает команды в конвейер. Эльбрус позволяет подготовавливать до трех переходов одновременно.
|
||||
### Регистровое окно и стек регистров
|
||||
- Процессор содержит несколько сотен регистров, каждая фукнция "заказывает" себе у процессора нужное количество, при этом видимые для функции регистров делятся на три группы: регистры с параметрами, регистры для временных вычислений, регистры с параметрами для вызываемой функции. В момент вызова функции регистровый файл виртуально сдвигается вниз - первая и вторая группы не будут видны вызванной функции. Третья группа становится первой, а новые вторые и третью группы функция снова заказывает.
|
||||
- Если процессору не хватает физических регистров для функции, то процессор сам в фоновом режиме сбрасывает неиспользуемую часть регистрового файла в стек в ОЗУ. При возврате из функции процессор незаметно восстанавливает регистры из стека.
|
||||
- Есть глобальная группа регистров (типичные регистры из cisc, risc)
|
||||
### Безопасность
|
||||
- Несколько стеков: регистры пользователя на одном, адрес возврата и состояние процессора - на другом - защита от buffer overflow и подмены адреса возврата
|
||||
- Процессор различает в памяти указатели и сами данные. В Эльбрусе нельзя создать указатель не из указателя. При этом первичный указатель безопасно получается специальными командами и механизмами в процессоре
|
||||
@@ -0,0 +1,90 @@
|
||||
## Архитектура
|
||||
- 64-битная (процессоры Intel / AMD)
|
||||
- Ассемблер: `NASM`
|
||||
- OC: Linux
|
||||
- Размеры данных:
|
||||
- `byte`
|
||||
- `word` (два байта)
|
||||
- `dword` (4 байта)
|
||||
- `qword` (8 байт)
|
||||
## Регистры общего назначения
|
||||
Все 64-битные регистры начинаются с `R`. Их младшие части можно прочитать отдельно
|
||||
#### База
|
||||
- `RAX` (Accumulator) - аккумулятор, возвращаются результаты функций и номера сисколлов
|
||||
- `RBX` (Base) - обычная переменная
|
||||
- `RCX` (Counter) - счетчик циклов, 4-й аргумент функции, уничтожается сисколлом
|
||||
- `RDX` (Data) - данные, 3-й аргумент функции, второе возвращаемое значение, хранит остаток при делении
|
||||
#### Индексы и указатели
|
||||
- `RDI` (Destination Index) - 1-й аргумент функции
|
||||
- `RSI` (Source Index) - 2-й аргумент фукнции
|
||||
- `RSP` (Stack Pointer) - указатель вершины стека
|
||||
- `RBP` (Base Pointer) - указатель базы стекового кадра
|
||||
#### Новые регистры
|
||||
- `R8, R9` - 5-й и 6-й аргументы функций
|
||||
- `R10, R11` - временные
|
||||
- `R12-R15` - свободные переменные
|
||||
#### Имена частей регистров
|
||||
|
||||
| *64 бита (qword)* | *32 бита (dword)* | *16 бит (word)* | *8 бит (byte)* |
|
||||
| :---------------: | :---------------: | :-------------: | :------------: |
|
||||
| `rax` | `eax` | `ax` | `al` |
|
||||
| `rbx` | `ebx` | `bx` | `bl` |
|
||||
| `rcx` | `ecx` | `cx` | `cl` |
|
||||
| `rdx` | `edx` | `dx` | `dl` |
|
||||
| `rdi` | `edi` | `di` | `dil` |
|
||||
| `rsi` | `esi` | `si` | `sil` |
|
||||
| `rsp` | `esp` | `sp` | `spl` |
|
||||
| `rbp` | `ebp` | `bp` | `bpl` |
|
||||
| `r8..15` | `r8..15d` | `r8..15w` | `r8..15b` |
|
||||
## Соглашение о вызовах
|
||||
1. Аргументы: `RDI`, `RSI`, `RDX`, `RCX`, `R8`, `R9`
|
||||
2. Возврат значения: `RAX` и `RDX`
|
||||
3. Сохранность регистров
|
||||
- *Caller-saved* (портятся при вызове `call`): `RAX`, `RCX`, `RDX`, `RSI`, `RDI`, `R8-R11`. Обязанность запоминать их - на вызывающем
|
||||
- *Callee-saved* (обязаны остаться неизменными): `RBX`, `RBP`, `RSP`, `R12-R15`. Обязанность вернуть их в исходное состояние - на функции
|
||||
4. Выравнивание стека
|
||||
- В момент `call` значение регистра `RSP` должно быть кратно 16
|
||||
- При входе в функцию стек сдвинут адресом возврата, поэтому RSP % 16 == 8. Перед внутренним call нужно выровнять стек (сделать push или sub rsp, 8)
|
||||
## Самые нужные сисколлы
|
||||
Все сисколлы [тут](https://gitlab.se.ifmo.ru/programming-languages/cse-programming-languages-fall-2026/main/-/blob/master/docs/system-calls.md)
|
||||
|
||||
| Назначение | RAX | RDI (fd) | RSI (buffer) | RDX (size) | Возврат в RAX |
|
||||
| :----------------------- | :--- | :----------- | :------------- | :---------- | :--------------------------------------------- |
|
||||
| **Чтение (`sys_read`)** | `0` | `0` (stdin) | Адрес в памяти | Кол-во байт | Кол-во прочитанных байт (0 = EOF, <0 = ошибка) |
|
||||
| **Запись (`sys_write`)** | `1` | `1` (stdout) | Адрес в памяти | Кол-во байт | Кол-во записанных байт |
|
||||
| **Выход (`sys_exit`)** | `60` | Код возврата | - | - | Процесс завершается |
|
||||
## Самые нужные инструкции
|
||||
#### Перемещение данных
|
||||
- `mov A, B` - скопировать B в A
|
||||
- `movzx` - скопировать байт B в регистр A и заполнить старшие биты нулями
|
||||
#### Математика
|
||||
- `add A, B` / `sub A, B` - сложение / вычитание `A = A +/- B`
|
||||
- `inc A` / `dec A` - инкремент / декремент
|
||||
- `neg A` - `A = -A`
|
||||
- `imul A, B` - знаковое умножение `A = A * B`
|
||||
- `mul B` - беззнаковое умножение, умножает `RAX` на B. Старшая часть результата в `RDX`, младшая - в `RAX` (результат - `RDX:RAX`)
|
||||
- `div B` - беззнаковое деление. Делит `RDX:RAX` на B. Частное в `RAX`, остаток в `RDX`
|
||||
#### Логика
|
||||
- `and`, `or`, `not` - побитовое И, ИЛИ, НЕ
|
||||
- `xor A, B` - исключающее ИЛИ (`xor rax, rax` - быстрый способ обнулить регистр)
|
||||
- `test A, B` - побитовое И без сохранения результата (только ставит флаги) - лучший способ проверить регистр на ноль
|
||||
#### Ветвление и переходы
|
||||
- `cmp A, B` - сравнивает A и B, ставит флаги
|
||||
- `jmp метка` - безусловный переход
|
||||
- `je` / `jne` (или `jz` / `jnz`) - прыжок, если `Z = 1` / `Z = 0`
|
||||
- Дли знаковых чисел
|
||||
- `jl` / `jle` (Less / Less or Equal) - меньше / меньше или равно
|
||||
- `jg` / `jge` (Greater / Greater or Equal) - больше / больше или равно
|
||||
- `js` / `jns` (Sign) - отрицательное / положительное (флаг `S`)
|
||||
- Для беззнаковых чисел:
|
||||
- `jb` / `jbe` (Below / Below or Equal) - меньше / меньше или равно
|
||||
- `ja / jae` (Above / Above or Equal) - больше / больше или равно
|
||||
- Для переполнений
|
||||
- `jc` / `jnc` (Carry)
|
||||
- `jo` / `joc` (Overflow)
|
||||
#### Работа со стеком
|
||||
Растет как в БЭВМ (в сторону уменьшения адресов)
|
||||
- `push A` - кладет 8 байт на стек (`rsp -= 8, [rsp] = A`)
|
||||
- `pop A` - достает 8 байт со стека (`A = [rsp], rsp += 8`)
|
||||
- `sub rsp, 24` - выделить буфер на 24 байта
|
||||
- `add rsp, 24` - освободить буфер
|
||||
@@ -1,5 +1,9 @@
|
||||
## Инструментарий
|
||||
- [[Платформа Wrench]]
|
||||
- [Платформа Wrench](Платформа%20Wrench.md)
|
||||
## Архитектуры
|
||||
- [[acc32]]
|
||||
- [[f32a]]
|
||||
- [x86_64](x86_64.md) (реальная архитектура)
|
||||
- [acc32](acc32.md)
|
||||
- [f32a](f32a.md)
|
||||
- [m68k](m68k.md) (будет)
|
||||
- [risc-iv](risc-iv.md) (будет)
|
||||
- [vliw-iv](vliw-iv.md) (в работе, есть интересные факты про Эльбрус)
|
||||
@@ -63,6 +63,6 @@
|
||||
### Сдвиги
|
||||
- Если сдвинуть числа больше чем на 32, то просто зануление - для сдвига влево
|
||||
- Для сдвигов вправо, если исходное число было положительным - зануление
|
||||
- Для сдвигов вправо, если иходное число было отрицательным - `-1`
|
||||
- Для сдвигов вправо, если исходное число было отрицательным - `-1`
|
||||
### Переходы
|
||||
- В отличие от БЭВМ переходы тут работают иначе. Переходы, которые сравнивают с нулем, учитывают только знак (в бэвм учитывали еще `n+v(mod2)`). Поэтому надо самому реализовывать переходы, которые учитывают специфику доп. кода через `bvz+bltz` например
|
||||
@@ -4,15 +4,15 @@
|
||||
- Принцип расчета - воплощение таблицы значений в виде, позволяющем быстро находить нужные зависимости
|
||||
- Расчет производится путем выставления линейки в требуемое положение и считывания результата
|
||||
|
||||
![[Лог линейка.png]]
|
||||

|
||||
### Линейка и операция деления
|
||||
|
||||
![[Деление на линейке.png]]
|
||||

|
||||
|
||||
Двигаем делимое напротив делителя, в начале получаем частное
|
||||
### Номограмма и операция умножения
|
||||
|
||||
![[Номограмма.png]]
|
||||

|
||||
|
||||
Соединяем две точки, которые хотим перемножить. Пересечение этого отрезка с осью Y - наш результат
|
||||
# Табличное исполнение
|
||||
@@ -26,7 +26,7 @@
|
||||
- Принципы расчета воплощены в мехнизмах устройства
|
||||
- Расчет производится по шагам (алгоритмически), с учетом переноса между разрядами
|
||||
|
||||
![[Арифмометр.png]]
|
||||

|
||||
# Отличие арифмометра от логарифмической линейки
|
||||
1. Рост области определения функций:
|
||||
- для арифмометра: медленный рост сложности устройства, средний рост длительности расчета (зависит от функции)
|
||||
@@ -53,7 +53,7 @@
|
||||
### Архитектура эффективного решения
|
||||
Реконфигурируемый потоковой вычислитель
|
||||
|
||||
![[Потоковый вычислитель.png]]
|
||||

|
||||
|
||||
1. Расчетная формула представляется в виде графа
|
||||
2. Каждой вершине графа сопоставляется человек, способный выполнить соответствующую операцию (только одну)
|
||||
@@ -63,7 +63,7 @@
|
||||
6. Для повышения надежности расчетов используются двоирование (две роты, сравниваем результаты, не совпадение - повтор)
|
||||
### Структура белкового вычислителя
|
||||
|
||||
![[Белковый вычислитель.png]]
|
||||

|
||||
### Достоинства
|
||||
1. Радикальный рост производительности (параллелизм инструкций)
|
||||
- Параллельное исполнение независимых операций
|
||||
@@ -73,11 +73,11 @@
|
||||
- Минимальная вариативность процесса
|
||||
3. Возможность реконфигурации вычислителя под новую задачу
|
||||
|
||||
![[Конвейризация расчетов.png]]
|
||||

|
||||
|
||||
Цвета - 3 партии входных данных. Цифры - на каком такте будут на данном этапе вычисления
|
||||
### Практика
|
||||
На практике все перечисленные механизмы встречаются в современных [[Компьютерные системы|компьютерных системах]], в том числе:
|
||||
На практике все перечисленные механизмы встречаются в современных [компьютерных системах](../Системная%20инженерия/Компьютерные%20системы.md), в том числе:
|
||||
- В процессорах общего назначения
|
||||
- В специализированных процессорах
|
||||
- В распределенных системах
|
||||
@@ -87,7 +87,7 @@
|
||||
- вертикальные нити - натянуты равномерно
|
||||
- горизонтальные нити разных цветов, дисбаланс петель с одной из сторон формирует узор
|
||||
|
||||
![[Жаккард.png]]
|
||||

|
||||
### Проблема создания станка
|
||||
Плетение полотна:
|
||||
1. Нити разделяются на верхние и нижние по схеме узора
|
||||
@@ -98,7 +98,7 @@
|
||||
- Разделение на верхнюю и нижнюю нить нерегулярно
|
||||
- "Гребенка" не работает
|
||||
|
||||
![[Обычный ткацкий станок.png]]
|
||||

|
||||
### Жаккардовый ткацкий станок
|
||||
Считается первой программно-управляемой машиной
|
||||
Элементы решения:
|
||||
@@ -107,17 +107,17 @@
|
||||
- Сильное нажатие и поворот - освободить нить
|
||||
- Как автоматизировать регулярное нажатие на кнопочки?
|
||||
|
||||
![[Идея крючка 1.png]]
|
||||

|
||||
|
||||
Идея крючка
|
||||
|
||||
![[Идея крючка 2.png]]
|
||||

|
||||
### Программное обеспечение
|
||||
Элементы решения:
|
||||
- Пластина с отверстиями позволяет разом "нажать" нужные крючки (перфокарта)
|
||||
- Лента из пластин - программа узора
|
||||
|
||||
![[Жаккард программное решение.png]]
|
||||

|
||||
|
||||
Структура шага работы станка:
|
||||
1. Нажатие пластиной на крючки (разделение верхней и нижней)
|
||||
@@ -151,4 +151,4 @@
|
||||
- Линейный рост скорости поиска от количества городов (до 8 штук)
|
||||
- При росте вычислительной сложности по экспоненте
|
||||
|
||||
Как развитие и скачок произошел переход к использованию электричества в сигналах и состояниях. ([[Цифровая схемотехника]])
|
||||
Как развитие и скачок произошел переход к использованию электричества в сигналах и состояниях. ([Цифровая схемотехника](../Цифровая%20схемотехника/Цифровая%20схемотехника.md))
|
||||
@@ -0,0 +1,61 @@
|
||||
1. Развитие [Машины Тьюринга](Модель%20вычислений.md#Машина%20Тьюринга). Отличия:
|
||||
- Лента заменена на Random-Access Memory (RAM)
|
||||
- Инструкции и данные объединены
|
||||
2. Призвана быть максимально простой в реализации и производстве
|
||||
3. Процедурное программирование и ООП - тот же принцип
|
||||
|
||||

|
||||
## Особенности
|
||||
1. Использование двоичного кодирования
|
||||
- Встречается и троичное, и двоично-десятичное кодирование
|
||||
2. Программное управление. Команды выполняются последовательно
|
||||
- Последовательность и порядок сегодня условны
|
||||
3. Память компьютера однородно хранит данные и программы
|
||||
- Однородность спорна
|
||||
4. Ячейки памяти компьютера имеют адреса. Random-Access Memory
|
||||
- Адрес не сводится к целому числу сегодня
|
||||
- Память не является пассивным элементом компьютера
|
||||
5. Возможность условного перехода
|
||||
- И перехода по иным причинам
|
||||
## Окружение
|
||||
### (Микро)процессор
|
||||
Цифровая схема, которая выполняет операции с внешним источником данных (обычно с памятью или потоком данных)
|
||||
### (Микро)контроллер
|
||||
Микросхема, предназначенная для управления электронными устройствами. Типичный микроконтроллер сочетает функции процессора и периферийных устройств, содержит ОЗУ и/или ПЗУ
|
||||
### Оперативная память (память)
|
||||
Обычно часть компьютерной памяти, в которой хранится выполняемый машинный код, а также входные, выходные и промежуточные данные
|
||||
## Control Unit и DataPath
|
||||
### Control Unit
|
||||
Компонент центрального процессора (CPU), управляющей работой процессора. CU часто использует двоичный декодер для преобразования закодированных инструкций в управляющие сигналы, координирующие работу остальных блоков
|
||||
### DataPath
|
||||
АЛУ, набор регистров и внутренние шины CPU, по которым данные перемещаются между ними
|
||||
|
||||

|
||||
## Виды инструкций
|
||||
1. Работа с памятью: запись констант, копирование данных (память, регистры, порты I/O)
|
||||
2. Арифметческие, логические и битовые операции
|
||||
3. Управляющие операции: переходы, вызов и возврат из подпрограмм
|
||||
4. Инструкции сопроцессоров: загрузка и выгрузка данных, управление сопроцессором
|
||||
## Роль машинного слова
|
||||
Единица данных, которая выбрана естественной для данной архитектуры процессора
|
||||
1. Может быть адресована в памяти
|
||||
2. Передается по шине между памятью и процессором за один раз
|
||||
3. Является стандартной единицей обрабатываемой информации
|
||||
4. Связанные вопросы: формат инструкции, форматы данных, форматы адресов
|
||||
## На практике
|
||||
1. В чистом виде практически не встречаются
|
||||
2. Влияние на индустрию - трудно переоценить
|
||||
3. Элементы архитектуры присутствуют в подавляющем большинстве процессоров и средств разработки
|
||||
4. Структурное программирование, ООП - наследие фон Неймана
|
||||
5. Ловушка обратной совместимости
|
||||
## Вариации
|
||||
1. Память команд и данных: Принстонская и Гарвардская архитектуры
|
||||
- Типы данных, адресные пространства, машинные слова, теги
|
||||
2. Принцип работы с данными в DataPath
|
||||
- Accumulator, Register-to-Register, Register-to-Memory, Memory-to-Memory, Stack Architectures
|
||||
3. "Мощность" системы команд: CISC, RISC
|
||||
- Количество операндов (0, 1, 2, ...)
|
||||
- Кодирование инструкций
|
||||
- Принципы построения Control Unit
|
||||
4. Адресация операндов
|
||||
Кроме того: ввод-вывод, параллелизм, иерархия памяти и тп
|
||||
@@ -0,0 +1,82 @@
|
||||
MoC - Model of Computation
|
||||
1. MoC предоставляет язык для описания моделей процессов/программ/структур
|
||||
2. MoC определяет возможности вычислительной машины
|
||||
3. MoC характеризует, как исполняется модель (программа): возможные состояния вычислителя, их последовательность, правила переходов (детерменированные или нет)
|
||||
4. MoC, обычно, минималистичны относительно реальных вычислителей
|
||||
## Последовательные модели
|
||||
Sequential models
|
||||
Относительно просто реализуются в виде аппаратных схем
|
||||
### Конечные автоматы
|
||||
|
||||

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

|
||||
|
||||
Например, парсеры
|
||||
#### Достоинства
|
||||
- Таблица состояний
|
||||
- Верифицируемость переходов
|
||||
- Простая реализация в схемотехнике и ПО
|
||||
### Машина Тьюринга
|
||||
Включает:
|
||||
- Неограниченную двустороннюю ленту, разделенную на ячейки
|
||||
- Устройство управления (головка записи-чтения), которое может находиться в конечном числе состояний
|
||||
Управляющее устройство может:
|
||||
- Перемещаться по ленте влево и вправо
|
||||
- Читать и записывать в ячейки символы конечного алфавита
|
||||
Машина Тьюринга
|
||||
1. Не может быть реализована на практике (нет бесконечной ленты)
|
||||
2. Обладает полнотой по Тьюрингу (можно реализовать любой известный алгоритм)
|
||||
3. Проблема остановки
|
||||
4. Данные и управление отделены
|
||||
5. Ориентирована на реализацию
|
||||
### Random Access Machine
|
||||
|
||||

|
||||
## Функциональные модели
|
||||
Functional models
|
||||
Представление вычислительного процесса как совокупности символов и правил их преобразований
|
||||
1. Арифметика
|
||||
2. Лямбда исчисление (полнота по Тьюрингу)
|
||||
3. Combinatory logic
|
||||
4. General recursive functions
|
||||
5. Abstract rewriting systems
|
||||
Программа/данные - математический объект
|
||||
Возможна Тьюринг неполнота
|
||||
### Лямбда исчисление
|
||||
#### 4 вида выражений
|
||||
1. Переменная: $x, y\ \text{и} \ z$
|
||||
2. Константа: $a,b,c$
|
||||
3. Коминация (вызов): $s\ t$
|
||||
4. Абстракция: $\lambda x.s$
|
||||
#### 3 вида редукций/подстановки
|
||||
1. Переименование переменных: $\lambda u.u\ v \xrightarrow{\alpha} \lambda w.w\ v$
|
||||
2. Применение функции (подстановка аргумента): $(\lambda x.s)\ t \xrightarrow{\beta} s[t/x]$
|
||||
3. Сокращение аргумента: $\lambda u.v\ u \xrightarrow{\eta} v$
|
||||
## Параллельные модели
|
||||
Системы, включающие несколько взаимодействующих процессов
|
||||
- Kahn process networks - однонаправленные каналы с неограниченными буферами (+- как в гошке)
|
||||
- Actor model - отправка сообщений в "почтовые ящики" (как в Erlang)
|
||||
- Discrete Event - события в заданные моменты времени (цифровые схемы)
|
||||
- Multi-Thread Model - общая память (как в джаве)
|
||||
- Synchronous Data Flow - синхронизированные потоки данных
|
||||
## Близкие понятия
|
||||
### Парадигмы программирования
|
||||
Способ классификации языков программирования на основе их функций. Языки могут относиться к нескольким парадигмам
|
||||
### Стиль программирования
|
||||
Это набор правил или рекомендации, используемых при написании исходного кода компьютерной программы
|
||||
## Применение на практике
|
||||
1. Computer Science. Формальные модели
|
||||
2. Дизайн ЯПов
|
||||
3. Ограничение творческого порыва, контроль сложности
|
||||
4. Модель-ориентированная инженерия
|
||||
## Model-Driven Engineering
|
||||
1. Разработка через моделирование предметной области
|
||||
2. Автоматическая генерация кода из моделей
|
||||
3. Повышение уровня абстракции при разработке
|
||||
4. Сокращение разрыва между требованиями и реализацией
|
||||
5. Улучшение коммуникации между заинтересованными сторонами
|
||||
6. Снижение сложности разработки масштабных систем
|
||||
@@ -0,0 +1,41 @@
|
||||
## Реле -> Программируемые логические контроллеры
|
||||
### Проблемы автоматизации релейными схемами
|
||||
- Плохо масштабируется
|
||||
- Сложная настройка и поддержка
|
||||
- Ненадежность сложных схем
|
||||
- Проблема ведения документации
|
||||
### ПЛК
|
||||
- Специальная разновидность электронной вычислительной машины
|
||||
- Особенности
|
||||
1. [Управляющие системы](../Системная%20инженерия/Управляющие%20системы.md)
|
||||
2. Законченные устройства для встроенного использования
|
||||
3. Специализация ввода-вывода, модульность
|
||||
4. Выделение инструментальной составляющей
|
||||
5. Эксплуатация в тяжелых условиях
|
||||
### Типовое устройство ПЛК
|
||||
|
||||

|
||||
|
||||
- Существуют и полностью программные реализации
|
||||
- Отделение инструментальной составляющей
|
||||
P.S. оптическая изоляция нужна, чтобы не сгорел сам ПЛК, а лишь модули ввода/вывода (на входе - защита от большого напряжения, на выходе - если модуль вывода выйдет из строя, то начнет накапливаться ток - от этого и защита)
|
||||
### Программирование ПЛК (1 штука)
|
||||
- **IEC 61121** - standard for programmable controllers
|
||||
- Языки для АСУТП (автоматизированная система управления технологическим процессом)
|
||||
1. Ladder Diagram (релейно-контактные схемы)
|
||||
2. Function Block Diagram (функциональные блоковые диаграммы)
|
||||
3. Sequential Function Chart (последовательные функциональные диаграммы)
|
||||
4. Structured Text (структурированный текст)
|
||||
- Почему именно они
|
||||
1. Использование не программистами
|
||||
2. Визуальность
|
||||
3. Формальные свойства, реальное время
|
||||
|
||||

|
||||
### Программирование ПЛК (N штук)
|
||||
- **IEC 61499** - Standard for distributed Automation
|
||||
- System of Systems
|
||||
- Разделение управления и данных
|
||||
- Интероперабельность по данным (возможность обмена данными между разными системами, даже разных фирм)
|
||||
|
||||

|
||||
@@ -0,0 +1,64 @@
|
||||
## Инорфмационный процессор
|
||||
- Система (электрическая, механическая или биологическая), которая принимает информацию (последовательность символов или состояний) в одной форме и обрабатывает (преобразует) ее в другую форму
|
||||
- Например: исходный сигнал в статистику, посредством алгоритмического процесса
|
||||
- Включает:
|
||||
1. Ввод
|
||||
2. Процессор
|
||||
3. Хранилище
|
||||
4. Вывод
|
||||
## Универсальный процессор
|
||||
Позволяет решать широкий круг задач, настройка которых производится после производства "по месту" или в run-time
|
||||
### Примечания
|
||||
1. Универсальность != полнота по Тьюрингу
|
||||
2. Теоретическая универсальность != практическая универсальность
|
||||
3. Универсальность противоречит эффективности
|
||||
4. Современный процессор - совокупность программного и аппаратного обеспечения
|
||||
### Свойства
|
||||
1. [Hardware and Software](../Системная%20инженерия/Hardware%20and%20Software.md) (двухэтапное производство)
|
||||
2. Полнота по Тьюрингу
|
||||
3. Отсутствие "серьезных" ограничений на "объем" программы
|
||||
4. Изменяемость ПО
|
||||
## Виды процессоров
|
||||
1. Application-Specific Integrated Circuit
|
||||
2. Coarse-Grained Reconfigurable Arrays
|
||||
3. Field-Programmable Gate Array
|
||||
4. Digital Signal Processor
|
||||
5. Graphics Processing Unit
|
||||
6. Central Processing Unit
|
||||
|
||||

|
||||
## Архитектура процессора
|
||||
То, как видит компьютер программист. Определена набором команд (язык), местом нахождения операндов (регистры и память) и вычислительными механизмами (кеш, прерывания и тд)
|
||||
1. Множество разных [архитектур](../Архитектуры/Вычислительные%20архитектуры.md)
|
||||
2. Чтобы понять архитектуру, нужно знать ее язык
|
||||
3. Слова в языке компьютера - "инструкции" или "команды"
|
||||
4. Словарный запас - "система команд"
|
||||
## Микроархитектура процессора
|
||||
Соединение простейших цифровых элементов в логические блоки, предназначенные для выполнения команд определенной архитектуры
|
||||
### Примечания
|
||||
1. Описывает, как в процессоре расположены и соединены друг с другом регистры, АЛУ, конечные автоматы, блоки памяти, интерфейсы ввода-вывода и тп
|
||||
2. У каждой архитектуры может быть много микроархитектур, обеспечивающих разное соотношение производительности, цены, сложности, технической эстетики. Они смогут выполнять одни и те же программы
|
||||
3. Если ISA и микроархитектура отличаются на уровне MoC - обычно требуется уровень виртуализации (ПО, аппаратура, транслятор и тд)
|
||||
## Система команд (ISA)
|
||||
- Instruction Set Architecture
|
||||
- Абстрактная модель процессора, формирующая интерфейс взаимодействия между программным обеспечением и процессором
|
||||
- Производительность, энергопотребление и задержки часто не рассматриваются
|
||||
### Что входит
|
||||
1. Типы данных
|
||||
2. Модель памяти, система и методы адресации
|
||||
3. Набор инструкций
|
||||
4. Механизмы обработки прерываний и исключений
|
||||
5. Методы ввода и вывода
|
||||
### Машинное слово
|
||||
Фрагмент данных фиксированного размера, обрабатываемый как единое целое процессором
|
||||
### Разнообразие систем команд
|
||||
1. Действие над памятью/регистрами
|
||||
- Произвольной сложности и длины (CISC)
|
||||
- Фиксированного формата (RISC)
|
||||
2. Действие без указания обрабатываемых данных (стековый)
|
||||
3. Управляющие сигналы процессора под видом команды (NISC)
|
||||
4. Группа команд под видом одной команды (VLIW)
|
||||
5. Действие над шиной данных (TTA)
|
||||
6. Команды без последовательного исполнения (редукционные)
|
||||
7. Система команд из одной команды (URISC)
|
||||
8. Управляющие сигналы процессоров под видом команды (NITTA)
|
||||
@@ -0,0 +1,82 @@
|
||||
- **Hardware** производится один раз и дальше не меняется, не корректируется
|
||||
- **Software** адаптируется под задачу, легко изменяется
|
||||
- Разделены по времени/специальности: разные дисциплины и разные индустрии
|
||||
## Как разделить HW/SW
|
||||
1. Определяем возможности "конфигурирования":
|
||||
- Заложенные при проектировании - интерфейс задокументирован и стабилен (ISA, API)
|
||||
- Незадокументированные (нецелевое использование, дыра в безопасности) - используется то, что интерфейсом не гарантировано но работает
|
||||
2. Фиксируем интерфейс "конфигурирования"
|
||||
- Набор механизмов
|
||||
- Модель вычислений
|
||||
- Интструментальные средства
|
||||
## Конфигурирование [РЭА](Особенности%20производства%20аппаратуры.md#Монтаж%20радиоэлектронной%20аппаратуры%20(РЭА))
|
||||
1. Макетные платы
|
||||
2. Печатные платы: перерезать, навесить дорожку
|
||||
3. Джамперы
|
||||
4. Платы расширения
|
||||
- Вычислительные платы
|
||||
- Порты ввода/вывода
|
||||
- Dendy (память программ и графическая память)
|
||||
## Реконфигурация. Коммутация
|
||||
### Реконфигурируемые архитектуры
|
||||
Архитектуры, где задача отображается в структуру вычислителя (пространственно, spatial), а не выполняется потоком инструкций. В отличие от ASIC, это структура может быть перенастроена после изготовления
|
||||
1. Программируемые логические интеграционные схемы
|
||||
2. Крупногранулярные реконфигурируемые массивы (CGRA)
|
||||
3. Выстраивание людей для расчета таблиц
|
||||
## Программное управление
|
||||
1. Данные (программы) определяют то, какой прикладной процесс будет разворачиваться
|
||||
2. Количество уровней исполнения/интерпретации данных ограничено только целесообразностью
|
||||
**Временные вычисления** - одна и та же схема последовательно проходит через разные состояния во времени
|
||||
## Аппаратное обеспечение
|
||||
Электронные и механические части вычислительного устройства, входящие в состав системы. Включает: компьютеры и логические устройства, внешние устройства и диагностическую аппаратуру, энергетическое оборудование
|
||||
## Программное обеспечение (ПО)
|
||||
Совокупность программ и программных документов необходимых для эксплуатации. Позволяет аппаратному обеспечению выполнять функции
|
||||
## Аппаратура и ПО != Hardware и Software
|
||||
1. Программная/аппаратная составляющая слабо связаны с SW/HW:
|
||||
- Minix - ОС встроена в Intel ME/CSME
|
||||
- Микропрограммное обеспечение
|
||||
2. Часто аппаратурой называют то, что работает как аппаратное обеспечение
|
||||
- Virutal-Computer, Virtual-Network, Virtual-Volume, etc
|
||||
- Реконфигурируемые архитектуры (ПЛИС, CGRA)
|
||||
3. Разделение на SW/HW зависит в большей степени от способа использования
|
||||
- Hardware - тяжело/долго/дорого поменять
|
||||
- Software - легко/быстро/дешево поменять
|
||||
## Плюсы и минусы ПО/SW
|
||||
### Часть плюсов
|
||||
1. Быстрый цикл разработки, CI/CD и тд
|
||||
2. Меняем у пользователя
|
||||
3. Пользователь - Beta-тестер
|
||||
### Часть минусов
|
||||
1. Высокая сложность программ
|
||||
2. Безопасность
|
||||
3. Культура разработки. Верификация
|
||||
## Типовое HW/SW проектирование
|
||||
### Проектируем аппаратуру
|
||||
- Система команд и вычислительные механизмы
|
||||
- Интерфейсы управления аппаратурой
|
||||
- Цифровая схематехника, система команд
|
||||
### Пишем программу
|
||||
- Прикладная задача
|
||||
- Язык и библиотеки
|
||||
- Система команд и вычислительные механизмы (виртуальная память, прерывания)
|
||||
- Интерфейсы управления аппаратурой
|
||||
### Проблемы
|
||||
1. Излишне шаблонное проектирование
|
||||
2. Высокие интеграционные риски
|
||||
3. Последовательная разработка (сроки)
|
||||
## Hardware/Software CoDesign
|
||||
Мы проектируем систему
|
||||
1. Разработка интерфейса HW/SW (системы команд)
|
||||
2. Разработка моделей HW/SW, для получения обратной связи
|
||||
3. Разработка HW/SW, верификация моделей
|
||||
4. Заменая моделей на HW/SW
|
||||
|
||||

|
||||
|
||||
В итоге: сокращение цикла разработки
|
||||
## Как выбирать инструменты для разработки Software
|
||||
1. От доступного Hardware и инструментальных средств
|
||||
2. От доступной команды разработки
|
||||
3. От прикладной задачи
|
||||
- От области (библиотеки)
|
||||
- От модели вычислений (принципов организации вычислительного процесса: параллелизм, конвейризация, оптимизации и тд)
|
||||
@@ -5,11 +5,11 @@
|
||||
3. Кластерные и облачные вычисления
|
||||
## История
|
||||
|
||||
![[История инф систем.png]]
|
||||

|
||||
|
||||
1. Mainframes - большие компьютерные системы, колоды перфокарт. Пакетный режим, долго считает
|
||||
2. Minis - миниЭВМ, компьютеры значительно меньше, эксклюзивный доступ к компьютеру, человек логиниться уже под своим юзером, а не кучу людей на одно вычисление
|
||||
3. Desktops - компьютеры на рабочем месте, почти у всех
|
||||
4. Сервисы - решения прикладных задач, чтобы не делать их локально
|
||||
5. Мобильные вычисления - повсеместно
|
||||
6. Вычисления окружают нас уже повсеместно
|
||||
6. Вычисления окружают нас уже повсеместно
|
||||
@@ -10,8 +10,8 @@
|
||||
- станок
|
||||
- и т.п.
|
||||
## Классификация компьютерных систем
|
||||
1. [[Информационные системы]]
|
||||
2. [[Управляющие системы]]
|
||||
1. [Информационные системы](Информационные%20системы.md)
|
||||
2. [Управляющие системы](Управляющие%20системы.md)
|
||||
|
||||
Про [[Уровни компьютерных систем]]
|
||||
История: [[Докомпьютерные вычисления]]
|
||||
Про [Уровни компьютерных систем](../Системная%20инженерия/Уровни%20компьютерных%20систем.md)
|
||||
История: [Докомпьютерные вычисления](Докомпьютерные%20вычисления.md)
|
||||
@@ -0,0 +1,120 @@
|
||||
Задача производства: превратить документацию в изделие
|
||||
## Монтаж радиоэлектронной аппаратуры (РЭА)
|
||||
### Ключевые тенденции
|
||||
1. Рост уровня интеграции
|
||||
2. Снижение затрат на производство изделия
|
||||
3. Усложнение производственной цепочки
|
||||
### Навесной монтаж
|
||||
Способ монтажа электронных схем, при котором расположенные на изолирующем шасси радиоэлементы соединяются друг с другом проводами или непосредственно выводами
|
||||
#### Достоинства
|
||||
1. Простота производства
|
||||
2. Простота подготовки производства
|
||||
3. Гибкость
|
||||
#### Недостатки
|
||||
1. Сложность автоматизации, дорого в серии
|
||||
2. Надежность
|
||||
3. Плотность ограничена прямотой рук монтажника
|
||||
|
||||
На макетной плате
|
||||
|
||||

|
||||
### Монтаж на печатную плату
|
||||
Печатная плата - пластина из диэлектрика, на поверхности и/или в объеме которой сформированы электропроводящие цепи электронной схемы. Электрическое и механическое соединение компонентов
|
||||
Различают:
|
||||
- одно- и двухслойные платы
|
||||
- многослойные платы
|
||||
## Виды монтажа компонентов
|
||||
- Выводной (в отверстие)
|
||||
- Поверхностный
|
||||
- Встроенный
|
||||
## Поверхностный монтаж (SMD) и Surface-mount technology (SMT)
|
||||
|
||||

|
||||
### Виды SMD компонентов
|
||||
|
||||

|
||||
### Встроенные компоненты
|
||||
|
||||

|
||||
### Достоинства
|
||||
1. Автоматизация
|
||||
2. Плотность размещения компонентов
|
||||
3. Размеры
|
||||
4. Стоимость в серии
|
||||
### Недостатки
|
||||
1. Необходимость подготовки производства
|
||||
2. Удлинение производственной цепочки
|
||||
3. Сложность внесения изменений
|
||||
### Гибкость
|
||||
1. Джампер (by design)
|
||||
2. "Перерезать дорожку"
|
||||
3. "Навесная дорожка"
|
||||
### Производственная цепочка
|
||||
|
||||

|
||||
## Интегральные схемы. Кремниевое произодство
|
||||
|
||||

|
||||
### Кремниевый песок
|
||||
Начало производственной цепочки
|
||||
|
||||

|
||||
### Выращиваем монокристалл кремния (буля
|
||||
|
||||

|
||||
### Производим подложку будущих чипов (Wafer)
|
||||
|
||||

|
||||
### Фотолитография и "море" транзисторов
|
||||
"свет-шаблон-фоторезист"
|
||||
1. На кремниевую подложку наносят материал для рисунка
|
||||
2. Наносится фоторезист
|
||||
3. Экспонирование через фотошаблон
|
||||
4. Удаление отработанного фоторезиста
|
||||
|
||||

|
||||
### Interconnect
|
||||
|
||||

|
||||
### Структура чипа в разрезе
|
||||
|
||||

|
||||
### Извлечение будущих чипов
|
||||
|
||||

|
||||
### Корпус и контакты
|
||||
|
||||

|
||||
### Современный степпер (засветка фотошаблона)
|
||||
|
||||

|
||||
### Надежность
|
||||
Производственный брак неизбежен: не все транзисторы на пластине работают корректно
|
||||
**Чип биннинг** - один и тот же кристалл продается под разными марками: дефектные или нестабильные блоки блокируются программно или лазером
|
||||
1. Разные частоты процессоров -> разные SKU из одного wafer
|
||||
2. Core Single / Core Duo / Core Quad -> одинаковый кристалл, разное число активных ядер
|
||||
3. Intel Pentium / Celeron -> урезанные Core с отключенными кэшем и функциями
|
||||
## Реальный мир
|
||||
### Производство
|
||||
1. Логистика
|
||||
2. Склады
|
||||
3. Специалисты
|
||||
4. Производственная цепочка
|
||||
5. Тестирование
|
||||
6. Упаковка
|
||||
7. Дистрибуция
|
||||
8. Гарантийный ремонт
|
||||
### Эксплуатация
|
||||
1. Амортизация. Выход оборудования из строя
|
||||
2. Необходимость физического доступа
|
||||
3. Особенности среды эксплуатации
|
||||
4. Долгосрочные эффекты
|
||||
### Сложность изменений
|
||||
1. Чем совершеннее технология, тем сложнее внести изменения
|
||||
2. Физический контакт
|
||||
### Варианты замены устаревшей аппаратуры
|
||||
1. Перепроектирование на новой элементной базе
|
||||
2. Модульная организация. Стандартные интерфейсы. Имитация старых систем
|
||||
3. Виртуализация
|
||||
|
||||
Как решаем проблемы аппаратуры - [Hardware and Software](Hardware%20and%20Software.md)
|
||||
@@ -11,10 +11,10 @@
|
||||
## 1. Система как совокупность частей
|
||||
Система состоит из подсистем, которые в свою очередь тоже являются системами, и так далее - иерархия систем
|
||||
|
||||
![[Иерархия систем.png]]
|
||||

|
||||
### Структура системы
|
||||
|
||||
![[Структура системы.png]]
|
||||

|
||||
|
||||
Одна система при разных взглядах. При разных взглядах на систему что-то может и совпадать. В зависимости от нужд от системы - она меняется.
|
||||
Например: дом с точки зрения сантехника, электрика и строителя
|
||||
@@ -55,6 +55,6 @@
|
||||
5. Рассмотрения ее обеспечивающих систем
|
||||
## Фундаментальная проблема систем
|
||||
Множественность точек зрения на систему. Систему может разрушить проблема коммуникации при разработке
|
||||
Формальный способ зафиксировать эти точки зрения и передать их другим - [[Понятие архитектуры|архитектура]]
|
||||
Формальный способ зафиксировать эти точки зрения и передать их другим - [архитектура](Понятие%20архитектуры.md)
|
||||
## Применение в Computer Science
|
||||
- [[Компьютерные системы]]
|
||||
- [Компьютерные системы](Компьютерные%20системы.md)
|
||||
@@ -17,7 +17,7 @@
|
||||
Пример, где один код может быть как ИС, так и УС - видеокодек ffmpeg ( 1 сценарий - конвертация видео на сервере - классика ИС, 2 сценарий - воспроизведение на устройстве пользователя - УС)
|
||||
## Эволюция
|
||||
|
||||
![[Эволюция УС.png]]
|
||||

|
||||
|
||||
1. Информационная УС - объект управления + кабели (тот же мейнфрейм, только без входного пакета данных, данные были всегда одни и те же)
|
||||
2. Встроенные системы - большая интеграция, ну и размеры стали меньше
|
||||
@@ -22,4 +22,7 @@
|
||||
- *Языки* (Languages) - на чем описываем/пишем
|
||||
- *Типы* (Types) - предопределенные платформой абстракции и структуры данных
|
||||
- *Экземпляры* (Instances) - готовые, предопределенные платформой объекты и компоненты
|
||||
- *Шаблоны* (Patterns) - связывают языки, типы и экземпляры, задают повторяемые решения (про [[Системные паттерны]])
|
||||
- *Шаблоны* (Patterns) - связывают языки, типы и экземпляры, задают повторяемые решения (про [Системные паттерны](../Системные%20паттерны/Системные%20паттерны.md))
|
||||
## Принципы формирования уровней (платформ)
|
||||
- **Принцип развития иерархически систем Седова** - закономерности и механизмы, по которым развиваются сложные иерархические системы. Ключевой принцип: ограничение разнообразия на нижележащем уровне для получения разнообразия на вышележащем уровне
|
||||
- **Метасистемный подход** - концепция, предложенная Валентином Турчиным, описывающая процесс перехода системы на новый уровень организации, становясь метасистемой. В этом процессе несколько систем интегрируются в одну более сложную, обладающую новыми свойствами
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
## Кодирование
|
||||
### Двоичное кодирование
|
||||
|
||||

|
||||
|
||||
#### Достоинства
|
||||
1. Надежно и помехоустойчиво
|
||||
2. Простая арифметика
|
||||
3. Диапазоны и точность наращиваются разрядностью (слева и справа соотвественно)
|
||||
4. Погрешности "by design", а не "by implementation"
|
||||
#### Недостатки
|
||||
1. Нечитаемое представление
|
||||
2. Простые десятичные дроби записываются в виде бесконечных двоичных дробей
|
||||
3. Дискретное кодирование сигналов (точность)
|
||||
## Машинное слово. Представления данных
|
||||
- Машинное слово - единица данных, естественная для обработки вычислителем
|
||||
- Примеры: сложение, пересылка и т.п.
|
||||
- Целые числа
|
||||
- Позиционные системы счисления
|
||||
- Дополнительный код
|
||||
- Big & Little endian
|
||||
- Дроби
|
||||
- С фиксированной точкой
|
||||
- С плавающей точкой
|
||||
- Перечисления
|
||||
- Двоично-десятичное кодирование
|
||||
- Символы (старые кодировки)
|
||||
- Тегированные данные
|
||||
|
||||

|
||||
|
||||
### Классификация типов по версии IBM
|
||||
|
||||

|
||||
## Код Грея и BCD
|
||||
### Код Грея
|
||||
Две "соседние" кодовые комбинации различаются только в одном двоичном разряде
|
||||
### BCD
|
||||
Форма записи рациональных чисел, когда каждый десятичный разряд числа записывается в виде его четырехбитного двоичного кода
|
||||
|
||||

|
||||
### Base64 и Base58
|
||||
### Base64
|
||||
Стандарт кодирования двоичных данных при помощи только 64 символов ASCII. Алфавит кодирования содержит латинские символы A-Z, a-z, цифры 0-9 (всего 62 знака) и 2 дополнительных символа
|
||||
|
||||

|
||||
### Base58
|
||||
Модификация Base64 для избежания неоднозначных символов (0, I, O, |). В конце сообщения - хешсумма (checksum)
|
||||
@@ -2,4 +2,5 @@
|
||||
- Сторожевые таймеры - микроконтроллеры, OC/гипервизоры, оркестраторы
|
||||
- Кеши и когерентность - CPU, OC (page cache), диски, CDN, браузер
|
||||
- Прерывания и события - аппартные IRQ, сигналы OC, event loop, message queue
|
||||
- Системы команд - ISA процессора, байткод виртуальных машин ([[JVM]], CLR), API/протоколы (свой Language на каждом уровне), DSL
|
||||
- Системы команд - ISA процессора, байткод виртуальных машин ([JVM](../../Программирование%20на%20Java/JVM/JVM.md), CLR), API/протоколы (свой Language на каждом уровне), DSL
|
||||
- [Представление данных](Представление%20данных.md)
|
||||
@@ -0,0 +1,9 @@
|
||||
## Цифровая схемотехника. Булев базис
|
||||
### Элементы цифровой схемотехники
|
||||
1. Двоичная логика
|
||||
2. Полный набор булевых функций
|
||||
- И, ИЛИ, НЕ
|
||||
- Штрих Шеффера ($x|y=\overline{xy}$)
|
||||
- Стрелка Пирса ($x \downarrow y = \overline{x \lor y}$)
|
||||
3. [Комбинационные схемы](../Комбинационные%20схемы/Комбинационные%20схемы.md)
|
||||
4. Триггер - хранение состояния
|
||||
@@ -13,13 +13,13 @@
|
||||
- `( )` - нормально неактивный актуатор
|
||||
- `(\)` - нормально активный актуатор
|
||||
|
||||
![[Реле 1.png]]
|
||||

|
||||
## Управление двигателем
|
||||
Классическая схема включения электродвигателя с аварийной остановкой
|
||||
|
||||
![[Реле двигатель.png]]
|
||||

|
||||
|
||||
![[Реле двигатель 2.png]]
|
||||

|
||||
## Практика применения реле
|
||||
1. Когда-то использовали, чтобы делать компьютеры
|
||||
2. Непосредственное применение, силовые шкафы управления. Высокий ток, неблагоприятная среда эксплуатации
|
||||
@@ -0,0 +1,28 @@
|
||||
### Комбинационная схема
|
||||
Схема, составленная из набора логических элементов, в совокупности реализующая заданную таблицу истинности
|
||||
### Простейшие элементы комбинационных схем
|
||||
|
||||

|
||||
### КС: Возможности
|
||||
Реализация функций - отображение множества A на множество B
|
||||
A и B конечны (представимы конечной последовательностью бит) -> возможно построить комбинационную схему
|
||||
### КС: Подход к построению
|
||||
1. Через таблицу истинности (черный ящик)
|
||||
2. Через алгоритмизацию (белый ящик, этапность/структура расчета) - логарифмическая линейка и арифмометр
|
||||
#### Через таблицу истинности
|
||||
1. Формирование таблицы истинности
|
||||
2. Запись таблицы истинности в каноническую форму (ДНФ и КНФ), отображаемую в комбинационную схему
|
||||
3. Минимизация булевой функции (сокращаем размер схемы)
|
||||
Пример: шифратор (encoder, 4-to-2)
|
||||
|
||||

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

|
||||
### Свойства комбинационных схем
|
||||
1. Возможность **установления стабильного состояния** при корректном входе (нет циклов)
|
||||
2. **Задержка** установления состояния после изменения входных значений
|
||||
3. **Накопление ошибки** в физическом процессе, что может привести к ошибке на логическом уровне (буферы)
|
||||
4. **Параллелизм уровня бит** (узлы с параллельным включением работают параллельно)
|
||||
5. **Уровень линии**, не сигнал (как и в реле)
|
||||
@@ -0,0 +1,5 @@
|
||||
## Условный оператор. Мультиплексор
|
||||
Схемотехника не может не работать. Уровень не может не быть
|
||||
На уровне комбинационных схем без состояния: спекулятивные вычисления и выбор нужного результата (мультиплексор является классом [комбинационных схем](Комбинационные%20схемы.md))
|
||||
|
||||

|
||||
@@ -1,7 +1,7 @@
|
||||
Асинхронный триггер, который сохраняет свое предыдущее состояние при неактивном состоянии обоих входов и изменяет свой состояние при подаче на один из его входов активного уровня
|
||||
|
||||
![[RS-триггер.png]]
|
||||

|
||||
|
||||
Реализация на [[Электрическое реле|реле]]:
|
||||
Реализация на [реле](../Базовые%20элементы/Электрическое%20реле.md):
|
||||
|
||||
![[RS-триггер на реле.png]]
|
||||

|
||||
@@ -0,0 +1,40 @@
|
||||
### 1. Конвейрное исполнение
|
||||
- Количество стадий - количество паралельных задач
|
||||
- Больше "разбиений" - ниже задержка схемы, выше частота
|
||||
Пример: сравнение 4 чисел:
|
||||
|
||||

|
||||
### 2. Spatial and Temporal Computation
|
||||
- Сложение 16-битных чисел:
|
||||
- Сумматор на 16 бит и 1 такт
|
||||
- Сумматор на 8 бит и 2 такта + система управления
|
||||
|
||||

|
||||
|
||||
Сумматор на 8 бит и 2 така + система управления
|
||||
|
||||

|
||||
### 3. Синхронная схемотехника
|
||||
- Меньше гонок, проще синхронизация
|
||||
- Частота по самой медленной комбинационной схеме
|
||||
- Дискредитация входных сигналов по времени
|
||||
- Синхронность - в заданном диапазоне
|
||||
|
||||

|
||||
### 4. Программное управление
|
||||
## Пример схемы с состоянием
|
||||
|
||||

|
||||
|
||||
### Реализация схемы на Verilog
|
||||
|
||||

|
||||
### Схема детальная с состоянием
|
||||
|
||||

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

|
||||
@@ -0,0 +1,15 @@
|
||||
## Состояние в комбинационной схеме
|
||||
Триггер - класс электронных устройств, обладающих способностью длительно находиться в одном из двух устойчивых состояний и чередовать их под воздействием внешних сигналов
|
||||
Триггер позволяет:
|
||||
1. Зафиксировать состояние линии на длительное время
|
||||
2. Ограничить распространение сигнала по схеме
|
||||
- Разорвать цикл
|
||||
- Сократить задержку в комбинационной схеме
|
||||
### Виды триггеров
|
||||
1. Условие изменения состояния
|
||||
- По фронту
|
||||
- По уровню
|
||||
2. Интерфейс
|
||||
- D-триггер - запоминает состояние входа и выдает его на выход
|
||||
- [RS-триггер](RS-триггер.md)
|
||||
- И другие
|
||||
@@ -1,8 +1,15 @@
|
||||
## Коммутация и базовые элементы
|
||||
- [[Базовая логика]]
|
||||
- [[Логические вентили]]
|
||||
- [[Электрическое реле]]
|
||||
## Память и состояние
|
||||
- [[RS-триггер]]
|
||||
|
||||
## Комбинационные схемы
|
||||
- [Базовая логика](Базовые%20элементы/Базовая%20логика.md)
|
||||
- [Логические вентили](Базовые%20элементы/Логические%20вентили.md)
|
||||
- [Электрическое реле](Базовые%20элементы/Электрическое%20реле.md)
|
||||
## Комбинационные схемы
|
||||
- [Комбинационные схемы](Комбинационные%20схемы/Комбинационные%20схемы.md)
|
||||
- [Мультиплексор](Комбинационные%20схемы/Мультиплексор.md)
|
||||
## Схемы с памятью
|
||||
- [Многотактовые схемы](Схемы%20с%20памятью/Многотактовые%20схемы.md)
|
||||
- [Триггеры](Схемы%20с%20памятью/Триггеры.md)
|
||||
## Ключевые отличия схемотехники от программирования
|
||||
1. Все процессы между регистрами всегда происходят параллельно. Не читайте код как алгоритм, рисуйте схему
|
||||
2. Передача сигнала - физический аналоговый процесс. Есть питание и контакт - есть передача. Сигнал не может не идти
|
||||
3. Нет понятия "система остановилась". Она всегда работает, если есть питание
|
||||
4. Таблица истинности неполна - результат будет слуйчайным, но будет (и возможно воспроизводимым)
|
||||
@@ -0,0 +1,29 @@
|
||||
#### Имя процесса в debian
|
||||
```bash
|
||||
xprop WM_CLASS
|
||||
```
|
||||
Дальше кликаем в открытом окне. Нужно чтобы изменить иконку на панели задач, путь: `~/.local/share/applications`
|
||||
#### Установка zsh + oh-my-zsh + powerlevel10k
|
||||
1. Скачиваем zsh: `sudo apt install zsh`
|
||||
2. Меняем оболочку: `chsh -s $(which zsh)`
|
||||
3. Скачиваем `oh-my-zsh`: `sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"`
|
||||
4. Скачиваем два нужных дополнения: `sudo apt install zsh-autosuggestions zsh-syntax-highlighting`
|
||||
5. Скачиваем тему `powerlevel10k`: `git clone --depth=1 https://github.com/romkatv/powerlevel10k.git "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k"`
|
||||
6. Меняем `.zshrc`:
|
||||
```
|
||||
|
||||
...
|
||||
ZSH_THEME="powerlevel10k/powerlevel10k"
|
||||
...
|
||||
plugins=(git zsh-autosuggestions)
|
||||
...
|
||||
|
||||
source /usr/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh # в конце
|
||||
```
|
||||
7. Применяем через `source .zshrc` и настраиваем тему
|
||||
Дополнения можно скачать и так:
|
||||
```bash
|
||||
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
|
||||
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
|
||||
```
|
||||
Затем в `zshrc`: `plugins=(git zsh-autosuggestions zsh-syntax-highlighting)`
|
||||
@@ -0,0 +1,5 @@
|
||||
Повседневные или почти вещи
|
||||
- [Linux](Linux.md)
|
||||
- [Полезные утилиты и сайты](Полезные%20утилиты%20и%20сайты.md)
|
||||
- [VPN](VPN.md)
|
||||
- [Миграция с npm на npmplus](Миграция%20с%20npm%20на%20npmplus.md)
|
||||
@@ -0,0 +1,5 @@
|
||||
Тут будет настройка xray по красоте и возможно баш-скрипт
|
||||
Репа с моей апи для работы с ядром: [ссылка](https://github.com/dxunvrs/xray-subscription)
|
||||
|
||||
> [!hint] РКН
|
||||
> После бана основного ip закрывайте его сразу iptables и делайте nat через alias. Отморозится основной ip через пару недель
|
||||
@@ -0,0 +1,2 @@
|
||||
Может меняться, актуальная информация в [ридми](https://github.com/ZoeyVid/NPMPlus#migration-from-upstreamvanilla-nginx-proxy-manager)
|
||||
1.
|
||||
@@ -0,0 +1,13 @@
|
||||
## gitingest
|
||||
Собирает информацию с репозитория/папки репозитория в один `.txt` файл, удобно использовать в качестве контекста в ИИ
|
||||
Установка через `pipx`: `pipx install gitingest`, дальше в любой папке команда `gitingest`, либо команда с указанием папки
|
||||
Есть веб-версия, переходим в любой репозиторий или папку в репозитории и меняем в ссылке `https://github.com/...` на `https://gitingest.com/...`
|
||||
## roadmap.sh
|
||||
[Сайт](https://roadmap.sh/) с полезными роадмапами
|
||||
## thefuck
|
||||
Быстро исправляет опечатку в команде и так далее
|
||||
```bash
|
||||
sudo apt install thefuck
|
||||
echo 'eval $(thefuck --alias oops)' >> ~/.zshrc # oops - алиас на thefuck, можно любое слово
|
||||
source ~/.zshrc
|
||||
```
|
||||
@@ -1,10 +1,12 @@
|
||||
Очень "полезные" материалы
|
||||
[[Java]] - полный, ультимативный гайд по жабе (WIP)
|
||||
[[Список задач]] - разбор задач на алгоритмы и структуры данных (пока что только с литкода), позже будут добавлены шаблоны для методов, описание каждой из структур данных и много чего еще
|
||||
[[3 сем|ИТМО]] - список предметов на текущий семестр + базовые требования + материалы
|
||||
[[Веб]] - лекции и заметки по Веб-программированию
|
||||
[[Computer Science]] - лекции и материалы по АК+ОПД+PL и в целом база по CS
|
||||
[[Экзамен]] - разбор экзамена по ОПД за 2 семестр
|
||||
[Java](Программирование%20на%20Java/Java.md) - полный, ультимативный гайд по жабе (WIP)
|
||||
[АиСД](АиСД/АиСД.md)- разбор задач на алгоритмы и структуры данных (пока что только с литкода), позже будут добавлены шаблоны для методов, описание каждой из структур данных и много чего еще
|
||||
[ИТМО](Итмо/ИТМО.md) - список предметов на текущий семестр + базовые требования + материалы
|
||||
[Веб](Веб/Веб.md) - лекции и заметки по Веб-программированию
|
||||
[Computer Science](Computer%20Science/Computer%20Science.md) - лекции и материалы по АК+ОПД+PL и в целом база по CS
|
||||
[Экзамен](ОПД/Экзамен.md) - разбор экзамена по ОПД за 2 семестр
|
||||
[ЯПы](ЯПы/ЯПы.md) - семинары по ЯПам (осторожно, AI-SLOP)
|
||||
[Other](Other/Other.md) - всякая всячина
|
||||
Spring Boot - будет...
|
||||
|
||||
[[README]] - заметки [LeterZP](https://gitea.aklivtsov.tech/LeterZP) (aka Boris Bosenkob)
|
||||
[LeterZP](LeterZP) - заметки [LeterZP](https://gitea.aklivtsov.tech/LeterZP) (aka Boris Bosenkob)
|
||||
|
||||
@@ -1 +1,11 @@
|
||||
Объединение нескольких классических структур данных в кастомную или другую классическую
|
||||
Объединение нескольких классических структур данных в кастомную или другую классическую
|
||||
## Примеры задач
|
||||
- [Design Hit Counter](../Задачи/LeetCode/Design%20Hit%20Counter.md)
|
||||
- [Flatten Nested List Iterator](../Задачи/LeetCode/Flatten%20Nested%20List%20Iterator.md)
|
||||
- [Implement Queue using Stacks](../Задачи/LeetCode/Implement%20Queue%20using%20Stacks.md)
|
||||
- [Implement Rand10() Using Rand7()](../Задачи/LeetCode/Implement%20Rand10()%20Using%20Rand7().md)
|
||||
- [Implement Trie (Prefix Tree)](../Задачи/LeetCode/Implement%20Trie%20(Prefix%20Tree).md)
|
||||
- [Insert Delete GetRandom O(1)](../Задачи/LeetCode/Insert%20Delete%20GetRandom%20O(1).md)
|
||||
- [LRU Cache](../Задачи/LeetCode/LRU%20Cache.md)
|
||||
- [Max Stack](../Задачи/LeetCode/Max%20Stack.md)
|
||||
- [Number of Recent Calls](../Задачи/LeetCode/Number%20of%20Recent%20Calls.md)
|
||||
@@ -0,0 +1,47 @@
|
||||
Решение алгоритмических задач, теория по алгоритмам и структурам данных
|
||||
Внутри структур данных и методов ссылки на задачи на эти темы
|
||||
Сейчас решены почти все задачи с 150-roadmap на neetcode, хватает для абсолютного большинства алгособесов
|
||||
Упор надо делать на запоминание типовых паттернов решения, затем просто в каждой новой задаче научиться замечать эти паттерны и комбинировать их (для #Easy задач 1 паттерн, для #Medium задач 2-3 паттерна, для #Hard задач нужно комбинировать 3+ паттернов). Под паттерном подразумевается метод и/или структура данных в определенной ситуации
|
||||
## Теория
|
||||
- [Big-O](Теория/Big-O.md)
|
||||
## Структуры данных
|
||||
### Base
|
||||
- [Хэш-таблицы](Структуры/Хэш-таблицы.md)
|
||||
- [Связный список](Структуры/Связный%20список.md)
|
||||
- [Стек](Структуры/Стек.md)
|
||||
- [Очередь](Структуры/Очередь.md)
|
||||
### Advanced
|
||||
- [Куча](Структуры/Куча.md)
|
||||
- [Графы](Структуры/Графы.md)
|
||||
- [Деревья](Структуры/Деревья.md)
|
||||
- [Префиксные деревья](Структуры/Префиксные%20деревья.md)
|
||||
### Pro
|
||||
- Красно-черные деревья
|
||||
## Методы решения
|
||||
### Base
|
||||
- [Бинарный поиск](Методы/Бинарный%20поиск.md)
|
||||
- [Два указателя](Методы/Два%20указателя.md)
|
||||
- [Интервалы](Методы/Интервалы.md)
|
||||
- [Математика](Методы/Математика.md)
|
||||
- [Префикс](Методы/Префикс.md)
|
||||
- [Рекурсия](Методы/Рекурсия.md)
|
||||
- [Скользящее окно](Методы/Скользящее%20окно.md)
|
||||
- [Указатель на запись](Методы/Указатель%20на%20запись.md)
|
||||
### Advanced
|
||||
- [1-D Динамика](Методы/1-D%20Динамика.md)
|
||||
- [Быстрый и медленный указатели](Методы/Быстрый%20и%20медленный%20указатели.md)
|
||||
- [Жадный алгоритм](Методы/Жадный%20алгоритм.md)
|
||||
- [Матрица](Методы/Матрица.md)
|
||||
- [Расширение из центра](Методы/Расширение%20из%20центра.md)
|
||||
- [Backtracking](Методы/Backtracking.md)
|
||||
- [BFS](Методы/BFS.md)
|
||||
- [BST](Методы/BST.md)
|
||||
- [DFS](Методы/DFS.md)
|
||||
- [O(26)](Методы/O(26).md)
|
||||
### Pro
|
||||
- [Монотонная очередь](Методы/Монотонная%20очередь.md)
|
||||
- [Монотонный стек](Методы/Монотонный%20стек.md)
|
||||
- [Топологическая сортировка](Методы/Топологическая%20сортировка.md)
|
||||
- 2-D динамика
|
||||
## Задачи на архитектуру
|
||||
- [Design](Design/Design.md)
|
||||
@@ -1,7 +1,7 @@
|
||||
Leetcode #415 | #Easy | [[Два указателя]] | [[Математика]]
|
||||
Leetcode #415 | #Easy | [Два указателя](../../Методы/Два%20указателя.md) | [Математика](../../Методы/Математика.md)
|
||||
## Идея
|
||||
Сложение столбиком как в [[Add Two Numbers]]
|
||||
## [[Big-O]]
|
||||
Сложение столбиком как в [Add Two Numbers](Add%20Two%20Numbers.md)
|
||||
## Big-O
|
||||
- Время ```O(max(M,N))```
|
||||
- Память ```O(max(M,N))```
|
||||
## Код
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Leetcode #2 | #Medium | [[Связный список]] | [[Математика]] | [[Два указателя]]
|
||||
Leetcode #2 | #Medium | [Связный список](../../Структуры/Связный%20список.md) | [Математика](../../Методы/Математика.md) | [Два указателя](../../Методы/Два%20указателя.md)
|
||||
## Идея
|
||||
Указатель на первый лист и указатель на второй лист, идея сложения столбиком, на каждом шаге инитим слагаемое, если указатель не null (еще и двигаем заодно), считаем сумму с учетом переноса и перенос. В конце когда все закончилось, а перенос остался создаем новую ноду с переносом. В начале создаем заглушку dummy и возвращаем dummy.next
|
||||
## [[Big-O]]
|
||||
## Big-O
|
||||
- Время ```O(max(N,M))```
|
||||
- Память ```O(max(N,M))```
|
||||
## Код
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Leetcode #122 | Medium | [[1-D Динамика]]
|
||||
Leetcode #122 | Medium | [1-D Динамика](../../Методы/1-D%20Динамика.md)
|
||||
## Идея
|
||||
Продолжение задачи [[Best Time to Buy and Sell Stock]], только теперь можно покупать и выкупать сколько угодно раз, главное, чтобы не было пересечений. Идея: для монотонного массива прибыль будет такая же, как прибыль при покупке/продаже каждый день. То есть `[1, 2, 5] - 5-1=4` то же, что и `2-1 + 5-2 = 4`. Тогда просто идем по массиву парами и если есть прибыль - берем к себе
|
||||
## [[Big-O]]
|
||||
Продолжение задачи [Best Time to Buy and Sell Stock](Best%20Time%20to%20Buy%20and%20Sell%20Stock.md), только теперь можно покупать и выкупать сколько угодно раз, главное, чтобы не было пересечений. Идея: для монотонного массива прибыль будет такая же, как прибыль при покупке/продаже каждый день. То есть `[1, 2, 5] - 5-1=4` то же, что и `2-1 + 5-2 = 4`. Тогда просто идем по массиву парами и если есть прибыль - берем к себе
|
||||
## Big-O
|
||||
- Время ```O(N)```
|
||||
- Память ```O(1)```
|
||||
## Код
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Leetcode #121 | Easy | [[1-D Динамика]]
|
||||
Leetcode #121 | Easy | [1-D Динамика](../../Методы/1-D%20Динамика.md)
|
||||
## Идея
|
||||
Ставим левый указатель на 0 и идем по массиву правым. Если цена на левом меньше цены на правом, то можно зафиксировать прибыль - обновляем результат. Если же цена стала меньше либа равна, то двигаем левый указатель на место правого. Мы не может потерять никаких промежуточных сумм на этом действии, потому что в силу монотонности, никаие значения на (l,r) не удовлетворяли `p[l]<p[r]`
|
||||
## [[Big-O]]
|
||||
## Big-O
|
||||
- Время ```O(N)```
|
||||
- Память ```O(1)```
|
||||
## Код
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Leetcode #124 | #Hard | [[Деревья]] | [[DFS]]
|
||||
Leetcode #124 | #Hard | [Деревья](../../Структуры/Деревья.md) | [DFS](../../Методы/DFS.md)
|
||||
## Идея
|
||||
dfs + отбрасываем отрицательные пути
|
||||
## [[Big-O]]
|
||||
## Big-O
|
||||
- Время ```O(N)```
|
||||
- Память ```O(H)```
|
||||
N - кол-во узлов, H -высота дерева
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Leetcode #180 | #Medium | [[Жадный алгоритм]]
|
||||
Leetcode #180 | #Medium | [Жадный алгоритм](../../Методы/Жадный%20алгоритм.md)
|
||||
## Идея
|
||||
Обычный проход по строке с сохранением последнего символа prev. Важно сделать после цикла еще одну проверку результата, чтобы последние накопления тоже смогли засчитаться, если они максимальной длины
|
||||
## [[Big-O]]
|
||||
## Big-O
|
||||
- Время ```O(N)```
|
||||
- Память ```O(1)```
|
||||
## Код
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Leetcode #532 | #Medium | [[Префикс]] | [[Хэш-таблицы]] | [[Математика]]
|
||||
Leetcode #532 | #Medium | [Префикс](../../Методы/Префикс.md) | [Хэш-таблицы](../../Структуры/Хэш-таблицы.md) | [Математика](../../Методы/Математика.md)
|
||||
## Идея
|
||||
Любимая идея префиксных сумм. Сумам любого подмассива это разность префиксных сумм - значит они должны давать одинаковый остаток при делении на k. Считаем очередную преф сумму, если ее нет в мапе кладем ее и индекс (получится что запишется минимальный индекс, это нужно чтобы максимизировать длину чтобы условие точно выполнилось), а если такой остаток уже есть, то смотрим на длину подмассива и если >=2 под условие, то возвращаем true.
|
||||
## [[Big-O]]
|
||||
## Big-O
|
||||
- Время ```O(N)```
|
||||
- Память ```O(K)```
|
||||
## Код
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Leetcode #210 | #Medium | [[Топологическая сортировка]] | [[BFS]] | [[Очередь]] | [[Указатель на запись]]
|
||||
Leetcode #210 | #Medium | [Топологическая сортировка](../../Методы/Топологическая%20сортировка.md) | [BFS](../../Методы/BFS.md) | [Очередь](../../Структуры/Очередь.md) | [Указатель на запись](../../Методы/Указатель%20на%20запись.md)
|
||||
## Идея
|
||||
Та же [[Course Schedule]], только нужно еще и выдать результат. Трюк: чтобы не выделять память на лист, заводим указатель на запись и обходимся одним массивом.
|
||||
## [[Big-O]]
|
||||
Та же [Course Schedule](Course%20Schedule.md), только нужно еще и выдать результат. Трюк: чтобы не выделять память на лист, заводим указатель на запись и обходимся одним массивом.
|
||||
## Big-O
|
||||
- Время ```O(V+E)```
|
||||
- Память ```O(V+E)```
|
||||
## Код
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Leetcode #207 | #Medium | [[Топологическая сортировка]] | [[BFS]] | [[Очередь]]
|
||||
Leetcode #207 | #Medium | [Топологическая сортировка](../../Методы/Топологическая%20сортировка.md) | [BFS](../../Методы/BFS.md) | [Очередь](../../Структуры/Очередь.md)
|
||||
## Идея
|
||||
Заводим массив счетчиков зависимостей (сколько нужно пройти курсов для прохождения i-го), заводим мапу курс->лист курсов, которые открываются после прохождения. Дальше заводим счетчик пройденных курсов и очередь. Наполняем очередь курсами с нулями зависимостей - их можно пройти прям сейчас. Дальше итерируемся по очереди. Достали курс, прибавили пройденные, если от этого курса что-то зависит то идем по этим зависящим курсам, уменьшаем их зависимость и если они стали доступными дял прохождения - добавляем в очередь
|
||||
## [[Big-O]]
|
||||
## Big-O
|
||||
- Время ```O(V+E)```
|
||||
- Память ```O(V+E)```
|
||||
## Код
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Leetcode #739 | #Medium | [[Монотонный стек]] | [[Стек]]
|
||||
Leetcode #739 | #Medium | [Монотонный стек](../../Методы/Монотонный%20стек.md) | [Стек](../../Структуры/Стек.md)
|
||||
## Идея
|
||||
Идея монотонного стека. Кладем дни в стек, как бы садим на скамейку. При проходе по очередному дню смотрим на вершину стека, если день теплее, то он "забирает" день со стека в результат. И так далее собирает пока не станет слишком "холодным" для ждущего, либо пока стек не закончится. Монотонный - потому что в стеке температуры будут только возрастать, если на понижение - то день уходит в результат.
|
||||
## [[Big-O]]
|
||||
## Big-O
|
||||
- Время ```O(N)```
|
||||
- Память ```O(N)```
|
||||
## Код
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Leetcode #362 | #Medium | [[Очередь]] | [[Интервалы]] | [[Design]]
|
||||
Leetcode #362 | #Medium | [Очередь](../../Структуры/Очередь.md) | [Интервалы](../../Методы/Интервалы.md) | [Design](../../Design/Design.md)
|
||||
## Идея
|
||||
Аналог [[Number of Recent Calls]], также очередь
|
||||
## [[Big-O]]
|
||||
Аналог [Number of Recent Calls](Number%20of%20Recent%20Calls.md), также очередь
|
||||
## Big-O
|
||||
- Время ```O(1)```
|
||||
- Память ```O(W)```
|
||||
## Код
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Leetcode #150 | #Medium | [[Стек]] | [[Математика]]
|
||||
Leetcode #150 | #Medium | [Стек](../../Структуры/Стек.md) | [Математика](../../Методы/Математика.md)
|
||||
## Идея
|
||||
Просто стек
|
||||
## [[Big-O]]
|
||||
## Big-O
|
||||
- Время ```O(N)```
|
||||
- Память ```O(N)```
|
||||
## Код
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Leetcode #438 | #Medium | [[Скользящее окно]] | [[O(26)]]
|
||||
Leetcode #438 | #Medium | [Скользящее окно](../../Методы/Скользящее%20окно.md) | [O(26)](../../Методы/O(26).md)
|
||||
## Идея
|
||||
Скользящее окно с идеей `O(26`) (`int[26]` для частот символов)
|
||||
## [[Big-O]]
|
||||
## Big-O
|
||||
- Время ```O(N)```
|
||||
- Память ```O(1)```
|
||||
## Код
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Leetcode #34 | #Medium | [[Бин. поиск]]
|
||||
Leetcode #34 | #Medium | [Бинарный поиск](../../Методы/Бинарный%20поиск.md)
|
||||
## Идея
|
||||
Просто два фирменных бин. поиска. Для первого прохода инваринт, что правый указатель >= элемента (тогда он попадет на его первое вхождение). Для второго прохода инвариант, что правый указатель > элемента (тогда левый укажет на последнее вхождение)
|
||||
## [[Big-O]]
|
||||
## Big-O
|
||||
- Время ```O(logN)```
|
||||
- Память ```O(1)```
|
||||
## Код
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Leetcode #153 | #Medium | [[Бин. поиск]]
|
||||
Leetcode #153 | #Medium | [Бинарный поиск](../../Методы/Бинарный%20поиск.md)
|
||||
## Идея
|
||||
Это первый этап задачи [[Search in Rotated Sorted Array]].
|
||||
## [[Big-O]]
|
||||
Это первый этап задачи [Search in Rotated Sorted Array](Search%20in%20Rotated%20Sorted%20Array.md).
|
||||
## Big-O
|
||||
- Время ```O(log(N))```
|
||||
- Память ```O(1)```
|
||||
## Код
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Leetcode #387 | #Easy | [[O(26)]] | [[Хэш-таблицы]]
|
||||
Leetcode #387 | #Easy | [O(26)](../../Методы/O(26).md) | [Хэш-таблицы](../../Структуры/Хэш-таблицы.md)
|
||||
## Идея
|
||||
Идея с O(26)
|
||||
## [[Big-O]]
|
||||
## Big-O
|
||||
- Время ```O(N)```
|
||||
- Память ```O(N)```
|
||||
## Код
|
||||
|
||||