# Конспект по Операционным Системам
---
## Архитектура компьютерных систем
`// TODO`
---
### Архитектуры компьютера по организации памяти
В ходе развития компьютерной техники сформировалось две основные организации архитектуры компьютера: __фон Неймановская__ и __Гарвардская__

---
#### Гарвардская архитектура
Данная архитектура отличается тем, что:
* инструкции и данные __физически разделены__ ( __Instruction Memory__ и __Data Memory__ )
* шины инструкций и данных __не пересекаются__ — процессор может __одновременно__ выполнять инструкцию и оперировать с данными, в отличие от фон Неймановской архитектуры
В настоящий момент данная архитектура применяется при:
* проектировании некоторых __микроконтроллеров__ и __Программируемых Логических Контроллеров__
* построении __L1-кэша__
---
#### фон Неймановская архитектура
Данная архитектура отличается тем, что:
* __Память однородна__ — инструкции и данные внешне __неразличимы__, так как хранятся в __одной и той же памяти__
* __Память адресуется__ — память состоит из __последовательно пронумерованных ячеек__, к каждой из которых процессор __имеет доступ__
* __Способна к программному управлению__ — вычисления = программы < последовательность инструкций
* __Обладает принципом двоичного кодирования__ — и инструкции, и данные в памяти кодируются __двоичным кодом__ — последовательностью __0 и 1__
---
### Архитектура многопроцессорных систем
Современные реалии диктуют надобность в наличии нескольких процессоров для общего ускорения вычислений и обработки больших объемов информации. Выделяют две основные архитектуры таких систем:
* __UMA — Uniform Memory Access__ _( букв. однородный доступ к памяти )_, т.е. каждое ядро процессора имеет доступ к общей памяти
* __NUMA — Non-Uniform Memory Access__ _( букв. неоднородный доступ к памяти )_, т.е. ядро процессора может иметь свой банк памяти
---
#### UMA

* Каждое ядро имеет доступ к системной ( общей ) шине, посредством которой он получает доступ к памяти
* Таким образом, __время доступа не зависит__ от того, __где__ и в каком конкретном чипе __находятся__ требуемые ядром __данные__
* Но есть __недостаток__, когда одно ядро занимает системную шину и читает с памяти, остальные __ядра вынуждены простаивать__
Системную шину может также заменить __crossbar-коммутатор__, который позволяет точечно соединять ядра и банки памяти, что не убирает недостатка, но сокращает время простоя.
---
#### NUMA

* Состоит из базовых узлов — процессор + память
* Присутствует кэш
---
`// TODO: законспектировать промежуточные слайды`
---
## Основные понятия надежности ОС
`// TODO`
---
### Понятие отказоустойчивости
Это свойство системы продолжать свою работу, несмотря на возникновения программных и аппаратных ошибок. Реализуется следующими способами:
* Избыточность аппаратуры ( лишний HDD )
* Аппаратная "горячая" замена компонентов ( замена процессоров, дисков, контроллеров и т.п. не выключая систему )
* Поддержка ОС возможности замены компонентов системы, путем их предварительного отключения от использования ОС
* RAID-массивы ( объединение нескольких физических дисковых устройств, в одно )
* Диск под сами данные
* Диск под биты четности
* Диск под код Хемминга
---
### Надежность ( Reliability )
`// TODO`
---
`// TODO: законспектировать остатки`
---
## Средства для отладки Linux
В данной секции будут рассмотрены основные утилиты для отладки ядра Linux. Сюда входят различные средства наблюдения счетчиков ядра, трассировщики работы ядра, а также его отладчики.
---
### Общая картина всех утилит мониторинга
В Linux доступны множества утилит, доступных на разных уровнях абстракции ОС. Все их многообразие представлено на картинке

---
### Базовые утилиты мониторинга

Базовые утилиты для мониторинга работы:
* планировщика ( Scheduler ):
* `uptime — показывает средние показатели загруженности процессораи подсистемы ввода/вывода`

* `mpstat — показывает статистику загруженности каждого ядра процессора, служит для определения "горячих" ядер`

* `top ( or htop ) — включает показания uptime, и общую статистику по всем процессорам, а также показывает какие процессы грузят процессор`

* загруженность ядер ( CPU ):
* `mpstat`
* `top ( or htop )`
* `ps — показывает снимок текущего состояния процессов, также включает их иерархию `

Здесь есть таблица расшифровывающая статусы процессов:

* с виртуальной памятью ( Virtual Memory ):
* `top ( or htop )`
* `ps`
* `vmstat — показывает статистику использования виртуальной памяти`


* `free — показывает статистику использования RAM`

* подсистемы ввода/вывода ( I/O ):
* `iostat — показывает статистику чтения и записи на блочные устройства и дисковые разделы`

---
### Стандартные средства мониторинга

---
Стандартные средства мониторинга и трассировщики работы подсистем:
* системных вызовов:
* `strace — выводит стек системных вызовов и сигналов ОС`

* сетевой подсистемы:
* `tcpdump — выводит пакеты, которыми происходит обмен, можно задать регулярные выражения для фильтрации вывода сетевого трафика`

---
* сетевой подсистемы:
* `netstat — позволяет вывести статистику по пользованию сети:`
* список соединений

* статистика по сетевым протоколам

* таблицу маршрутизации

---
* сетевой подсистемы:
* `netstat`
* список интерфейсов

* список соединений, но с информацией по процессам

* `nicstat — позволяет вывести информацию по использованию сетевого трафика для каждого сетевого интерфейса`

---

---

---
* загруженность ядер:
* `pidstat — динамически выводит подробную ( потоки / I/O ) статистику по запущенным процессам ` $$ pidstat \approx top $$

---
* ввод/вывод:
* `swapon — позволяет вывести информацию об устройстве свопа`

---
#### Универсальный sar

---
#### Универсальный collectl

---
## Продвинутые средства инструментирования Linux
Мониторить показатели это, конечно хорошо, это позволяет установить факт того, что с программа недостаточно оптимизирована. Но хотелось бы также находить конкретные места, где у нас случаются просадки производительности. Этому и способствуют различные трассировщики и профилировщики.
---
### Трассировщики
Программа, которая выводит последовательные вызовы функций с их аргументами и результаты их выполнения
* `strace — выводит стек системных вызовов и сигналов ОС`

* `ltrace — выводит трассировку вызова библиотек`

* `bpftrace — // TODO`
---
### Профилировщики
Программа, позволяющая делать измерения различных показателей или наблюдать события в системе для их дальнейшего анализа, в основном с целью оптимизации

Картинка взята с [хабра](https://habr.com/ru/company/first/blog/442738/) сама статья тоже очень полезна.
* `stap — позволяет обрабатывать события в ядре, путем добавления своих обработчиков в качестве модуля ядра`
---
### Отладчик ядра
`kdb // TODO`