Compare commits

...

44 Commits

Author SHA1 Message Date
roma-dxunvrs c513ce326f web fix 2
deploy / Pull and Restart (push) Successful in 17s
2026-11-02 22:45:19 +03:00
roma-dxunvrs 9361978648 web fix
deploy / Pull and Restart (push) Successful in 16s
2026-11-02 22:42:10 +03:00
roma-dxunvrs 8f42d4a320 web add some tasks for 1 milestone
deploy / Pull and Restart (push) Successful in 16s
2026-11-02 17:27:14 +03:00
roma-dxunvrs c654fcd9c2 web add info for 1 milestone
deploy / Pull and Restart (push) Successful in 18s
2026-10-31 22:26:37 +03:00
roma-dxunvrs 2ec4a7e7db web add lectures for 1 milestone
deploy / Pull and Restart (push) Successful in 18s
2026-10-30 19:01:08 +03:00
roma-dxunvrs 283660b9ef web update milestone 1
deploy / Pull and Restart (push) Successful in 16s
2026-10-29 14:49:49 +03:00
roma-dxunvrs f0817da47e web update index.md
deploy / Pull and Restart (push) Successful in 17s
2026-10-29 14:37:34 +03:00
roma-dxunvrs c9bc96dafc web milestone 1
deploy / Pull and Restart (push) Successful in 16s
2026-10-29 14:35:00 +03:00
roma-dxunvrs 6538742678 Update helios guide
deploy / Pull and Restart (push) Successful in 17s
2026-10-25 22:15:31 +03:00
roma a7f8e74f3f revert 9b0c9f4b4a
deploy / Pull and Restart (push) Successful in 15s
revert Merge pull request 'Kotlin guide ready' (#5) from AK_Additions into master

Reviewed-on: #5
2026-10-20 13:43:08 +03:00
roma 9b0c9f4b4a Merge pull request 'Kotlin guide ready' (#5) from AK_Additions into master
deploy / Pull and Restart (push) Successful in 16s
Reviewed-on: #5
2026-10-20 13:38:05 +03:00
Aklivtsov b62e54bbb0 Merge branch 'master' into AK_Additions 2026-10-20 12:55:54 +03:00
Aklivtsov 6853ada348 Kotlin guide done. (20.10.26) 2026-10-20 12:54:25 +03:00
roma-dxunvrs 4d0e404259 add vliw, empty risc and m68k
deploy / Pull and Restart (push) Successful in 16s
2026-10-15 16:39:49 +03:00
Aklivtsov da3ad9dd1a Added kotlin guide. (WIP) (15.10.26) 2026-10-15 00:24:21 +03:00
roma-dxunvrs 005017595b 10.10
deploy / Pull and Restart (push) Successful in 16s
2026-10-10 19:41:44 +03:00
roma-dxunvrs 23a9e06d53 update index
deploy / Pull and Restart (push) Successful in 16s
2026-10-08 21:27:47 +03:00
roma-dxunvrs 8c95d15f6c add deploy guide 2026-10-08 21:00:18 +03:00
roma-dxunvrs 61e293f81b update zsh guide
deploy / Pull and Restart (push) Successful in 17s
2026-10-05 23:57:00 +03:00
roma-dxunvrs 75e45eb930 web add deploy guide
deploy / Pull and Restart (push) Successful in 17s
2026-10-05 22:49:35 +03:00
roma-dxunvrs 12a473f46e web update
deploy / Pull and Restart (push) Successful in 17s
2026-10-04 19:57:51 +03:00
roma-dxunvrs 11432e782f csa update
deploy / Pull and Restart (push) Successful in 16s
2026-10-03 13:42:57 +03:00
roma-dxunvrs fec7f50b3e 02.10.26
deploy / Pull and Restart (push) Successful in 16s
2026-10-02 22:58:53 +03:00
roma-dxunvrs 4886625dac fix
deploy / Pull and Restart (push) Successful in 18s
2026-10-01 20:57:53 +03:00
roma-dxunvrs 977e016822 other: important
deploy / Pull and Restart (push) Successful in 17s
2026-10-01 20:55:51 +03:00
roma-dxunvrs 3764f7dafa js: add table of contents
deploy / Pull and Restart (push) Successful in 17s
2026-10-01 11:32:48 +03:00
roma-dxunvrs ecd928d72d other: add zsh guide
deploy / Pull and Restart (push) Successful in 16s
2026-09-30 20:41:07 +03:00
roma-dxunvrs c0b8ac0043 fix PL, add x86 in CS
deploy / Pull and Restart (push) Successful in 16s
2026-09-29 21:49:51 +03:00
roma 88b307c311 Merge pull request 'ProgLangs added. 29.09.26' (#4) from AK_Additions into master
deploy / Pull and Restart (push) Successful in 17s
Reviewed-on: #4
2026-09-29 21:29:11 +03:00
AK dc82207723 ProgLangs added. 29.09.26 2026-09-29 21:22:14 +03:00
roma-dxunvrs 8ebd7b0b4f ci: Add 2 AM daily schedule to deploy workflow
deploy / Pull and Restart (push) Successful in 1m15s
2026-09-28 11:29:36 +03:00
roma-dxunvrs dd3ac17361 docs: Add RKN IP ban workaround to VPN notes 2026-09-28 11:29:01 +03:00
roma-dxunvrs fc45caa657 24.09.26
deploy / Pull and Restart (push) Successful in 18s
2026-09-24 21:57:22 +03:00
roma-dxunvrs 7637cab7a9 22.09.26
deploy / Pull and Restart (push) Successful in 18s
2026-09-22 22:37:41 +03:00
roma-dxunvrs 0e6e583e6d refactor: wiki links -> md links
deploy / Pull and Restart (push) Successful in 17s
2026-09-22 08:52:23 +03:00
roma-dxunvrs 6421fd3a48 21.09.26
deploy / Pull and Restart (push) Successful in 18s
2026-09-22 00:07:22 +03:00
roma-dxunvrs 08e557da92 Add js
deploy / Pull and Restart (push) Successful in 18s
2026-09-20 13:12:31 +03:00
roma-dxunvrs c90a404c40 Refactor
deploy / Pull and Restart (push) Successful in 18s
2026-09-19 19:20:43 +03:00
roma-dxunvrs d5adddc4f1 Fix index
deploy / Pull and Restart (push) Successful in 17s
2026-09-19 11:25:55 +03:00
roma-dxunvrs 05a67d2998 18.09.26
deploy / Pull and Restart (push) Successful in 17s
2026-09-18 22:52:40 +03:00
roma-dxunvrs 98eeb949fc Fix2 bbi
deploy / Pull and Restart (push) Successful in 17s
2026-09-18 14:01:11 +03:00
roma-dxunvrs 3e4e10da10 Fix bbi
deploy / Pull and Restart (push) Successful in 17s
2026-09-18 13:57:14 +03:00
roma-dxunvrs 8c815df1bc BBI
deploy / Pull and Restart (push) Successful in 18s
2026-09-18 13:54:08 +03:00
roma-dxunvrs fb5f9d4cf2 Add f32a 2026-09-18 13:47:58 +03:00
258 changed files with 6152 additions and 493 deletions
+5
View File
@@ -4,6 +4,8 @@ on:
push:
branches:
- master
schedule:
- cron: '0 2 * * *'
workflow_dispatch:
jobs:
@@ -20,7 +22,10 @@ jobs:
key: ${{ secrets.SERVER_SSH_KEY }}
script: |
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
echo "${{ secrets.SERVER_SUDO_PASSWORD }}" | sudo -S docker compose up -d --build
+3
View File
@@ -0,0 +1,3 @@
[submodule "LeterZP"]
path = LeterZP
url = ../../LeterZP/Info.git
Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 223 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 298 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

+11 -5
View File
@@ -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)
## Сети
- Компьютерные сети
@@ -0,0 +1,88 @@
- 32-битная стековая архитектура
- Главный принцип - команды не имеют операндов в коде. Все данные неявно берутся с веришны стека, результат кладется обратно в стек.
- Небольшая пасхалка на [вот эту задачу с литкода](../../АиСД/Задачи/LeetCode/Evaluate%20Reverse%20Polish%20Notation.md)
## Регистры, флаги и стеки
- Имеет два независимых аппаратных стека и два регистра-указателя
### Стеки
- `Data Stack` - место где происходят вычисления
- `T` - вершина стека данных
- `S` - второй элемент на стеке данных
- `Return Stack` - стек возврата
- `R` - вершина стека возвратов
### Регистры
- `A` - указатель адреса памяти с поддержкой автоинкремента
- `B` - второй указатель памяти
### Флаги
- `C` - перенос
- `EAM` - режим расширенной арифметики
> [!info] Все регистры, флаги и стеки можно выводить в отчете: `A:dec`, `stack:dec`, `rstack:hex`, `C`, `EAM` и так далее
> [!info] Получение максимальной глубины стека, которая была достигнута на конкретном шаге через: `f32a:data-stack-max` и `f32a:return-stack-max`
## Система команд
- Комментарии - `\`
- Опкод - 1 байт. Если есть операнд, то еще 4 байта
### 1. Операции со стеком
- `dup` - дублировать вершину (`[X] -> [X, X`])
- `drop` - удалить вершину (`[X, Y] -> [X]`)
- `over` - скопировать второй элемент наверх (`[X, Y] -> [X, Y, X]`)
### 2. Операции над памятью
- `<value>` (или `lit <value>`) - положить константу на `Data Stack` (от слова literal)
- `a!` / `b!` - снять значение со стека и записать в регистр `A` / `B`
- `a` - скопировать значение из регистра `A` на стек
- `@p <addr>` - прочитать из адреса на стек
- `!p <addr>` - снять со стека и записать по адресу
- `@` / `!` - чтение/запись по адресу, который лежит в регистре `A`
- `@+` / `!+` - чтеение/запись по адресу в `A` и инкремент `A`
- `@b` / `!b` - чтение/запись по адресу, который лежит в регистре `B`
### 3. Арифметика
- `+` - сумма, снимает два верхних числа, складывает, кладет на вершину стека. Если в режиме `EAM`, то прибавляет еще и флаг переноса. Устанавливает флаг переноса в любом случае
- `+*` - один шаг умножения
- `+/` - один шаг деления
- `2*` - сдвиг влево вершины стека
- `2/` - сдвиг вправо вершины стека
- `inv` - побитовая инверсия вершины стека
- `eam` - снять число с `Data Stack` и записать его в `EAM`
### 4. Побитовые операции
- `and` - побитовое И над `T` и `S` (снимает их)
- `xor` - исключающее ИЛИ
### 5. Управление вычислительным процессом
- `;` - возврат из подпрограммы (снять адрес с `Return Stack` и прыгнуть)
- `<label>` - вызов подпрограммы (адрес возврата кладется на `Return Stack` + прыжок)
- `<label> ;` - прыжок (без записи адреса возврата)
- `next <label>` - цикл for, проверяет вершину стека возврата `R`, если `R != 0`, уменьшает его на 1 и прыгает на метку. Если `R==0`, удаляет `R` и выходит из цикла
- `if <label>` - снимает значение с `Data Stack`, если оно ноль, то прыжок
- `-if <label>` - снимает значение с `Data Stack`, если оно `>=0`. то прыгает
- `halt` - стоп
### 6. Взаимодействие со стеком возврата
- `r>` - снять элемент с `Return Stack` и положить на `Data Stack`
- `>r` - снять элемент с `Data Stack` и положить на `Return Stack`
## Подробнее про умножение и деление
### `+*`
- Как работает умножение чисел в двоичной системе (`A*S`): смотрим на каждый бит числа A, если бит 1, то прибавляем S к результату, если бит 0, то пропускаем, в конце сдвигаем результат
- Как использует эта команда данные
1. Регистр `A` - множитель
2. `S` (второй элемент стека данных) - множимое
3. `T` (первый элемент стека данных) - накапливается ответ, сначала 0
- Теперь эта команда по шагам
1. Процессор смотрит на младший бит `A`
2. Если там `1`, то прибавляет `S` к `T` (`T = T + S`). Если `0` - ничего не прибавляет
3. Сдвигает регистр `A` вправо на 1 бит (`A >> 1`). Тот бит, который мы только что проверили выбрасывается
4. Сдвигает результат `T` вправо на 1 бит (`T >> 1`)
5. Сдвинутый из `T` бит вставляется в старший бит `A` (`A[31]`)
- После 32 повторений такой команды, в регистре `A` и на вершине стека `T` образуется 64-битное число - полный результат умножения. В `A` - младшая половина ответа, а в `T` - старшая
### `+/`
- Деление в двоичной системе: сдвигаем влево и пытаемся вычесть делитель. Если вычитается - пишем 1, если нет - 0
- Как использует данные команда
1. Регистр `A` - делимое
2. `Mem[B]` - делитель
3. `S` - старшая часть числа, здесь будет остаток
4. `T` - кладем 0, здесь будет частное
- Команда по шагам
1. Сдвигаем остаток `S` влево на 1 бит
2. Забираем старший бит из `A` и вставляем в младший бит `S`
3. Сдвигаем `A` влево
4. Сдвигаем `T` влево
5. Если можно вычесть делитель (`S >= Mem[B]`), то ставим в младший бит ответа единицу (`T[0]=1`), если нельзя - бит ответа оставляем нулем
- После 32 повторений на стеке в `T` будет лежать частное, в `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,4 +1,9 @@
## Инструментарий
- [[Платформа Wrench]]
- [Платформа Wrench](Платформа%20Wrench.md)
## Архитектуры
- [[ACC32]]
- [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]]
![Лог линейка](../../Attachments/Лог%20линейка.png)
### Линейка и операция деления
![[Деление на линейке.png]]
![Деление на линейке](../../Attachments/Деление%20на%20линейке.png)
Двигаем делимое напротив делителя, в начале получаем частное
### Номограмма и операция умножения
![[Номограмма.png]]
![Номограмма](../../Attachments/Номограмма.png)
Соединяем две точки, которые хотим перемножить. Пересечение этого отрезка с осью Y - наш результат
# Табличное исполнение
@@ -26,7 +26,7 @@
- Принципы расчета воплощены в мехнизмах устройства
- Расчет производится по шагам (алгоритмически), с учетом переноса между разрядами
![[Арифмометр.png]]
![Арифмометр](../../Attachments/Арифмометр.png)
# Отличие арифмометра от логарифмической линейки
1. Рост области определения функций:
- для арифмометра: медленный рост сложности устройства, средний рост длительности расчета (зависит от функции)
@@ -53,7 +53,7 @@
### Архитектура эффективного решения
Реконфигурируемый потоковой вычислитель
![[Потоковый вычислитель.png]]
![Потоковый вычислитель](../../Attachments/Потоковый%20вычислитель.png)
1. Расчетная формула представляется в виде графа
2. Каждой вершине графа сопоставляется человек, способный выполнить соответствующую операцию (только одну)
@@ -63,7 +63,7 @@
6. Для повышения надежности расчетов используются двоирование (две роты, сравниваем результаты, не совпадение - повтор)
### Структура белкового вычислителя
![[Белковый вычислитель.png]]
![Белковый вычислитель](../../Attachments/Белковый%20вычислитель.png)
### Достоинства
1. Радикальный рост производительности (параллелизм инструкций)
- Параллельное исполнение независимых операций
@@ -73,11 +73,11 @@
- Минимальная вариативность процесса
3. Возможность реконфигурации вычислителя под новую задачу
![[Конвейризация расчетов.png]]
![Конвейризация расчетов](../../Attachments/Конвейризация%20расчетов.png)
Цвета - 3 партии входных данных. Цифры - на каком такте будут на данном этапе вычисления
### Практика
На практике все перечисленные механизмы встречаются в современных [[Компьютерные системы|компьютерных системах]], в том числе:
На практике все перечисленные механизмы встречаются в современных [компьютерных системах](../Системная%20инженерия/Компьютерные%20системы.md), в том числе:
- В процессорах общего назначения
- В специализированных процессорах
- В распределенных системах
@@ -87,7 +87,7 @@
- вертикальные нити - натянуты равномерно
- горизонтальные нити разных цветов, дисбаланс петель с одной из сторон формирует узор
![[Жаккард.png]]
![Жаккард](../../Attachments/Жаккард.png)
### Проблема создания станка
Плетение полотна:
1. Нити разделяются на верхние и нижние по схеме узора
@@ -98,7 +98,7 @@
- Разделение на верхнюю и нижнюю нить нерегулярно
- "Гребенка" не работает
![[Обычный ткацкий станок.png]]
![Обычный ткацкий станок](../../Attachments/Обычный%20ткацкий%20станок.png)
### Жаккардовый ткацкий станок
Считается первой программно-управляемой машиной
Элементы решения:
@@ -107,17 +107,17 @@
- Сильное нажатие и поворот - освободить нить
- Как автоматизировать регулярное нажатие на кнопочки?
![[Идея крючка 1.png]]
![Идея крючка 1](../../Attachments/Идея%20крючка%201.png)
Идея крючка
![[Идея крючка 2.png]]
![Идея крючка 2](../../Attachments/Идея%20крючка%202.png)
### Программное обеспечение
Элементы решения:
- Пластина с отверстиями позволяет разом "нажать" нужные крючки (перфокарта)
- Лента из пластин - программа узора
![[Жаккард программное решение.png]]
![Жаккард программное решение](../../Attachments/Жаккард%20программное%20решение.png)
Структура шага работы станка:
1. Нажатие пластиной на крючки (разделение верхней и нижней)
@@ -151,4 +151,4 @@
- Линейный рост скорости поиска от количества городов (до 8 штук)
- При росте вычислительной сложности по экспоненте
Как развитие и скачок произошел переход к использованию электричества в сигналах и состояниях. ([[Цифровая схемотехника]])
Как развитие и скачок произошел переход к использованию электричества в сигналах и состояниях. ([Цифровая схемотехника](../Цифровая%20схемотехника/Цифровая%20схемотехника.md))
@@ -0,0 +1,61 @@
1. Развитие [Машины Тьюринга](Модель%20вычислений.md#Машина%20Тьюринга). Отличия:
- Лента заменена на Random-Access Memory (RAM)
- Инструкции и данные объединены
2. Призвана быть максимально простой в реализации и производстве
3. Процедурное программирование и ООП - тот же принцип
![](../../Attachments/Машина%20фон%20Неймана.png)
## Особенности
1. Использование двоичного кодирования
- Встречается и троичное, и двоично-десятичное кодирование
2. Программное управление. Команды выполняются последовательно
- Последовательность и порядок сегодня условны
3. Память компьютера однородно хранит данные и программы
- Однородность спорна
4. Ячейки памяти компьютера имеют адреса. Random-Access Memory
- Адрес не сводится к целому числу сегодня
- Память не является пассивным элементом компьютера
5. Возможность условного перехода
- И перехода по иным причинам
## Окружение
### (Микро)процессор
Цифровая схема, которая выполняет операции с внешним источником данных (обычно с памятью или потоком данных)
### (Микро)контроллер
Микросхема, предназначенная для управления электронными устройствами. Типичный микроконтроллер сочетает функции процессора и периферийных устройств, содержит ОЗУ и/или ПЗУ
### Оперативная память (память)
Обычно часть компьютерной памяти, в которой хранится выполняемый машинный код, а также входные, выходные и промежуточные данные
## Control Unit и DataPath
### Control Unit
Компонент центрального процессора (CPU), управляющей работой процессора. CU часто использует двоичный декодер для преобразования закодированных инструкций в управляющие сигналы, координирующие работу остальных блоков
### DataPath
АЛУ, набор регистров и внутренние шины CPU, по которым данные перемещаются между ними
![](../../Attachments/Control%20Unit%20and%20DataPath.png)
## Виды инструкций
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
Относительно просто реализуются в виде аппаратных схем
### Конечные автоматы
![](../../Attachments/FSM.png)
Несколько наборов состояний системы и условия переходов между ними
#### Автомат с магазинной памятью
![](../../Attachments/Автомат%20с%20магазинной%20памятью.png)
Например, парсеры
#### Достоинства
- Таблица состояний
- Верифицируемость переходов
- Простая реализация в схемотехнике и ПО
### Машина Тьюринга
Включает:
- Неограниченную двустороннюю ленту, разделенную на ячейки
- Устройство управления (головка записи-чтения), которое может находиться в конечном числе состояний
Управляющее устройство может:
- Перемещаться по ленте влево и вправо
- Читать и записывать в ячейки символы конечного алфавита
Машина Тьюринга
1. Не может быть реализована на практике (нет бесконечной ленты)
2. Обладает полнотой по Тьюрингу (можно реализовать любой известный алгоритм)
3. Проблема остановки
4. Данные и управление отделены
5. Ориентирована на реализацию
### Random Access Machine
![](../../Attachments/RAM.png)
## Функциональные модели
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. Эксплуатация в тяжелых условиях
### Типовое устройство ПЛК
![ПЛК](../../Attachments/ПЛК.png)
- Существуют и полностью программные реализации
- Отделение инструментальной составляющей
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. Формальные свойства, реальное время
![АСУТП](../../Attachments/АСУТП.png)
### Программирование ПЛК (N штук)
- **IEC 61499** - Standard for distributed Automation
- System of Systems
- Разделение управления и данных
- Интероперабельность по данным (возможность обмена данными между разными системами, даже разных фирм)
![ПЛК N](../../Attachments/ПЛК%20N.png)
@@ -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
![](../../Attachments/Процессоры%20и%20системы%20команд.png)
## Архитектура процессора
То, как видит компьютер программист. Определена набором команд (язык), местом нахождения операндов (регистры и память) и вычислительными механизмами (кеш, прерывания и тд)
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
![](../../Attachments/CoDesign%20HW-SW.png)
В итоге: сокращение цикла разработки
## Как выбирать инструменты для разработки Software
1. От доступного Hardware и инструментальных средств
2. От доступной команды разработки
3. От прикладной задачи
- От области (библиотеки)
- От модели вычислений (принципов организации вычислительного процесса: параллелизм, конвейризация, оптимизации и тд)
@@ -5,11 +5,11 @@
3. Кластерные и облачные вычисления
## История
![[История инф систем.png]]
![История инф систем](../../Attachments/История%20инф%20систем.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. Плотность ограничена прямотой рук монтажника
На макетной плате
![Макетная плата](../../Attachments/Макетная%20плата.png)
### Монтаж на печатную плату
Печатная плата - пластина из диэлектрика, на поверхности и/или в объеме которой сформированы электропроводящие цепи электронной схемы. Электрическое и механическое соединение компонентов
Различают:
- одно- и двухслойные платы
- многослойные платы
## Виды монтажа компонентов
- Выводной (в отверстие)
- Поверхностный
- Встроенный
## Поверхностный монтаж (SMD) и Surface-mount technology (SMT)
![SMT](../../Attachments/SMT.png)
### Виды SMD компонентов
![Виды SMD](../../Attachments/Виды%20SMD.png)
### Встроенные компоненты
![Встроенные комопненты](../../Attachments/Встроенные%20комопненты.png)
### Достоинства
1. Автоматизация
2. Плотность размещения компонентов
3. Размеры
4. Стоимость в серии
### Недостатки
1. Необходимость подготовки производства
2. Удлинение производственной цепочки
3. Сложность внесения изменений
### Гибкость
1. Джампер (by design)
2. "Перерезать дорожку"
3. "Навесная дорожка"
### Производственная цепочка
![Произв цепочка SMD](../../Attachments/Произв%20цепочка%20SMD.png)
## Интегральные схемы. Кремниевое произодство
![Кремний 1](../../Attachments/Кремний%201.png)
### Кремниевый песок
Начало производственной цепочки
![Кремний песок](../../Attachments/Кремний%20песок.png)
### Выращиваем монокристалл кремния (буля
![Буля](../../Attachments/Буля.png)
### Производим подложку будущих чипов (Wafer)
![Wafer](../../Attachments/Wafer.png)
### Фотолитография и "море" транзисторов
"свет-шаблон-фоторезист"
1. На кремниевую подложку наносят материал для рисунка
2. Наносится фоторезист
3. Экспонирование через фотошаблон
4. Удаление отработанного фоторезиста
![Фотолитография](../../Attachments/Фотолитография.png)
### Interconnect
![Кремний 2](../../Attachments/Кремний%202.png)
### Структура чипа в разрезе
![Кремний 3](../../Attachments/Кремний%203.png)
### Извлечение будущих чипов
![Кремний 4](../../Attachments/Кремний%204.png)
### Корпус и контакты
![Кремний 5](../../Attachments/Кремний%205.png)
### Современный степпер (засветка фотошаблона)
![Кремний 6](../../Attachments/Кремний%206.png)
### Надежность
Производственный брак неизбежен: не все транзисторы на пластине работают корректно
**Чип биннинг** - один и тот же кристалл продается под разными марками: дефектные или нестабильные блоки блокируются программно или лазером
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]]
![Иерархия систем](../../Attachments/Иерархия%20систем.png)
### Структура системы
![[Структура системы.png]]
![Структура системы](../../Attachments/Структура%20системы.png)
Одна система при разных взглядах. При разных взглядах на систему что-то может и совпадать. В зависимости от нужд от системы - она меняется.
Например: дом с точки зрения сантехника, электрика и строителя
@@ -55,6 +55,6 @@
5. Рассмотрения ее обеспечивающих систем
## Фундаментальная проблема систем
Множественность точек зрения на систему. Систему может разрушить проблема коммуникации при разработке
Формальный способ зафиксировать эти точки зрения и передать их другим - [[Понятие архитектуры|архитектура]]
Формальный способ зафиксировать эти точки зрения и передать их другим - [архитектура](Понятие%20архитектуры.md)
## Применение в Computer Science
- [[Компьютерные системы]]
- [Компьютерные системы](Компьютерные%20системы.md)
@@ -17,7 +17,7 @@
Пример, где один код может быть как ИС, так и УС - видеокодек ffmpeg ( 1 сценарий - конвертация видео на сервере - классика ИС, 2 сценарий - воспроизведение на устройстве пользователя - УС)
## Эволюция
![[Эволюция УС.png]]
![Эволюция УС](../../Attachments/Эволюция%20УС.png)
1. Информационная УС - объект управления + кабели (тот же мейнфрейм, только без входного пакета данных, данные были всегда одни и те же)
2. Встроенные системы - большая интеграция, ну и размеры стали меньше
@@ -22,4 +22,7 @@
- *Языки* (Languages) - на чем описываем/пишем
- *Типы* (Types) - предопределенные платформой абстракции и структуры данных
- *Экземпляры* (Instances) - готовые, предопределенные платформой объекты и компоненты
- *Шаблоны* (Patterns) - связывают языки, типы и экземпляры, задают повторяемые решения (про [[Системные паттерны]])
- *Шаблоны* (Patterns) - связывают языки, типы и экземпляры, задают повторяемые решения (про [Системные паттерны](../Системные%20паттерны/Системные%20паттерны.md))
## Принципы формирования уровней (платформ)
- **Принцип развития иерархически систем Седова** - закономерности и механизмы, по которым развиваются сложные иерархические системы. Ключевой принцип: ограничение разнообразия на нижележащем уровне для получения разнообразия на вышележащем уровне
- **Метасистемный подход** - концепция, предложенная Валентином Турчиным, описывающая процесс перехода системы на новый уровень организации, становясь метасистемой. В этом процессе несколько систем интегрируются в одну более сложную, обладающую новыми свойствами
@@ -0,0 +1,48 @@
## Кодирование
### Двоичное кодирование
![Сигналы](../../Attachments/Сигналы.png)
#### Достоинства
1. Надежно и помехоустойчиво
2. Простая арифметика
3. Диапазоны и точность наращиваются разрядностью (слева и справа соотвественно)
4. Погрешности "by design", а не "by implementation"
#### Недостатки
1. Нечитаемое представление
2. Простые десятичные дроби записываются в виде бесконечных двоичных дробей
3. Дискретное кодирование сигналов (точность)
## Машинное слово. Представления данных
- Машинное слово - единица данных, естественная для обработки вычислителем
- Примеры: сложение, пересылка и т.п.
- Целые числа
- Позиционные системы счисления
- Дополнительный код
- Big & Little endian
- Дроби
- С фиксированной точкой
- С плавающей точкой
- Перечисления
- Двоично-десятичное кодирование
- Символы (старые кодировки)
- Тегированные данные
![Little & Big endian](../../Attachments/Little%20&%20Big%20endian.png)
### Классификация типов по версии IBM
![IBM types](../../Attachments/IBM%20types.png)
## Код Грея и BCD
### Код Грея
Две "соседние" кодовые комбинации различаются только в одном двоичном разряде
### BCD
Форма записи рациональных чисел, когда каждый десятичный разряд числа записывается в виде его четырехбитного двоичного кода
![Gray and BCD](../../Attachments/Gray%20and%20BCD.png)
### Base64 и Base58
### Base64
Стандарт кодирования двоичных данных при помощи только 64 символов ASCII. Алфавит кодирования содержит латинские символы A-Z, a-z, цифры 0-9 (всего 62 знака) и 2 дополнительных символа
![Base64](../../Attachments/Base64.png)
### 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]]
![Реле 1](../../../Attachments/Реле%201.png)
## Управление двигателем
Классическая схема включения электродвигателя с аварийной остановкой
![[Реле двигатель.png]]
![Реле двигатель](../../../Attachments/Реле%20двигатель.png)
![[Реле двигатель 2.png]]
![Реле двигатель 2](../../../Attachments/Реле%20двигатель%202.png)
## Практика применения реле
1. Когда-то использовали, чтобы делать компьютеры
2. Непосредственное применение, силовые шкафы управления. Высокий ток, неблагоприятная среда эксплуатации
@@ -0,0 +1,28 @@
### Комбинационная схема
Схема, составленная из набора логических элементов, в совокупности реализующая заданную таблицу истинности
### Простейшие элементы комбинационных схем
![Комб схемы](../../../Attachments/Комб%20схемы.png)
### КС: Возможности
Реализация функций - отображение множества A на множество B
A и B конечны (представимы конечной последовательностью бит) -> возможно построить комбинационную схему
### КС: Подход к построению
1. Через таблицу истинности (черный ящик)
2. Через алгоритмизацию (белый ящик, этапность/структура расчета) - логарифмическая линейка и арифмометр
#### Через таблицу истинности
1. Формирование таблицы истинности
2. Запись таблицы истинности в каноническую форму (ДНФ и КНФ), отображаемую в комбинационную схему
3. Минимизация булевой функции (сокращаем размер схемы)
Пример: шифратор (encoder, 4-to-2)
![Encoder](../../../Attachments/Encoder.png)
#### Через алгоритмизацию
Схема строится на основе понимания функции, взаимосвязи входа и выхода. Творческий процесс. Схема может быть каскадной
![Сумматоры](../../../Attachments/Сумматоры.png)
### Свойства комбинационных схем
1. Возможность **установления стабильного состояния** при корректном входе (нет циклов)
2. **Задержка** установления состояния после изменения входных значений
3. **Накопление ошибки** в физическом процессе, что может привести к ошибке на логическом уровне (буферы)
4. **Параллелизм уровня бит** (узлы с параллельным включением работают параллельно)
5. **Уровень линии**, не сигнал (как и в реле)
@@ -0,0 +1,5 @@
## Условный оператор. Мультиплексор
Схемотехника не может не работать. Уровень не может не быть
На уровне комбинационных схем без состояния: спекулятивные вычисления и выбор нужного результата (мультиплексор является классом [комбинационных схем](Комбинационные%20схемы.md))
![Мультиплексор](../../../Attachments/Мультиплексор.png)
@@ -1,7 +1,7 @@
Асинхронный триггер, который сохраняет свое предыдущее состояние при неактивном состоянии обоих входов и изменяет свой состояние при подаче на один из его входов активного уровня
![[RS-триггер.png]]
![RS-триггер](../../../Attachments/RS-триггер.png)
Реализация на [[Электрическое реле|реле]]:
Реализация на [реле](../Базовые%20элементы/Электрическое%20реле.md):
![[RS-триггер на реле.png]]
![RS-триггер на реле](../../../Attachments/RS-триггер%20на%20реле.png)
@@ -0,0 +1,40 @@
### 1. Конвейрное исполнение
- Количество стадий - количество паралельных задач
- Больше "разбиений" - ниже задержка схемы, выше частота
Пример: сравнение 4 чисел:
![Многотакт](../../../Attachments/Многотакт.png)
### 2. Spatial and Temporal Computation
- Сложение 16-битных чисел:
- Сумматор на 16 бит и 1 такт
- Сумматор на 8 бит и 2 такта + система управления
![Spatial Computation](../../../Attachments/Spatial%20Computation.png)
Сумматор на 8 бит и 2 така + система управления
![Сумматор 8 бит 2 такта](../../../Attachments/Сумматор%208%20бит%202%20такта.png)
### 3. Синхронная схемотехника
- Меньше гонок, проще синхронизация
- Частота по самой медленной комбинационной схеме
- Дискредитация входных сигналов по времени
- Синхронность - в заданном диапазоне
![Синхронная схемотехника](../../../Attachments/Синхронная%20схемотехника.png)
### 4. Программное управление
## Пример схемы с состоянием
![Схема с состоянием](../../../Attachments/Схема%20с%20состоянием.png)
### Реализация схемы на Verilog
![Схема 1](../../../Attachments/Схема%201.png)
### Схема детальная с состоянием
![Схема 2](../../../Attachments/Схема%202.png)
- Так как память используется только для чтения, она выродилась в комбинационную схему
- Смысл цветов линий неизвестен...
### Временная диаграмма схемы с состоянием
![Схема 3](../../../Attachments/Схема%203.png)
@@ -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. Таблица истинности неполна - результат будет слуйчайным, но будет (и возможно воспроизводимым)
Submodule
+1
Submodule LeterZP added at a267b4171e
+29
View File
@@ -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)`
+5
View File
@@ -0,0 +1,5 @@
Повседневные или почти вещи
- [Linux](Linux.md)
- [Полезные утилиты и сайты](Полезные%20утилиты%20и%20сайты.md)
- [VPN](VPN.md)
- [Миграция с npm на npmplus](Миграция%20с%20npm%20на%20npmplus.md)
+5
View File
@@ -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
```
+10 -6
View File
@@ -1,8 +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 - будет...
[LeterZP](LeterZP) - заметки [LeterZP](https://gitea.aklivtsov.tech/LeterZP) (aka Boris Bosenkob)
+11 -1
View File
@@ -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)
+47
View File
@@ -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)```
## Код

Some files were not shown because too many files have changed in this diff Show More