# Конспект по Операционным Системам --- ## Архитектура компьютерных систем `// TODO` --- ### Архитектуры компьютера по организации памяти В ходе развития компьютерной техники сформировалось две основные организации архитектуры компьютера: __фон Неймановская__ и __Гарвардская__ ![architectures](https://i.imgur.com/E6QWgSX.png) --- #### Гарвардская архитектура Данная архитектура отличается тем, что: * инструкции и данные __физически разделены__ ( __Instruction Memory__ и __Data Memory__ ) * шины инструкций и данных __не пересекаются__ — процессор может __одновременно__ выполнять инструкцию и оперировать с данными, в отличие от фон Неймановской архитектуры В настоящий момент данная архитектура применяется при: * проектировании некоторых __микроконтроллеров__ и __Программируемых Логических Контроллеров__ * построении __L1-кэша__ --- #### фон Неймановская архитектура Данная архитектура отличается тем, что: * __Память однородна__ — инструкции и данные внешне __неразличимы__, так как хранятся в __одной и той же памяти__ * __Память адресуется__ — память состоит из __последовательно пронумерованных ячеек__, к каждой из которых процессор __имеет доступ__ * __Способна к программному управлению__ — вычисления = программы < последовательность инструкций * __Обладает принципом двоичного кодирования__ — и инструкции, и данные в памяти кодируются __двоичным кодом__ — последовательностью __0 и 1__ --- ### Архитектура многопроцессорных систем Современные реалии диктуют надобность в наличии нескольких процессоров для общего ускорения вычислений и обработки больших объемов информации. Выделяют две основные архитектуры таких систем: * __UMA — Uniform Memory Access__ _( букв. однородный доступ к памяти )_, т.е. каждое ядро процессора имеет доступ к общей памяти * __NUMA — Non-Uniform Memory Access__ _( букв. неоднородный доступ к памяти )_, т.е. ядро процессора может иметь свой банк памяти --- #### UMA ![UMA](https://i.imgur.com/bndY4K3.png) * Каждое ядро имеет доступ к системной ( общей ) шине, посредством которой он получает доступ к памяти * Таким образом, __время доступа не зависит__ от того, __где__ и в каком конкретном чипе __находятся__ требуемые ядром __данные__ * Но есть __недостаток__, когда одно ядро занимает системную шину и читает с памяти, остальные __ядра вынуждены простаивать__ Системную шину может также заменить __crossbar-коммутатор__, который позволяет точечно соединять ядра и банки памяти, что не убирает недостатка, но сокращает время простоя. --- #### NUMA ![NUMA](https://i.imgur.com/KAwt8jJ.png) * Состоит из базовых узлов — процессор + память * Присутствует кэш --- `// TODO: законспектировать промежуточные слайды` --- ## Основные понятия надежности ОС `// TODO` --- ### Понятие отказоустойчивости Это свойство системы продолжать свою работу, несмотря на возникновения программных и аппаратных ошибок. Реализуется следующими способами: * Избыточность аппаратуры ( лишний HDD ) * Аппаратная "горячая" замена компонентов ( замена процессоров, дисков, контроллеров и т.п. не выключая систему ) * Поддержка ОС возможности замены компонентов системы, путем их предварительного отключения от использования ОС * RAID-массивы ( объединение нескольких физических дисковых устройств, в одно ) * Диск под сами данные * Диск под биты четности * Диск под код Хемминга --- ### Надежность ( Reliability ) `// TODO` --- `// TODO: законспектировать остатки` --- ## Средства для отладки Linux В данной секции будут рассмотрены основные утилиты для отладки ядра Linux. Сюда входят различные средства наблюдения счетчиков ядра, трассировщики работы ядра, а также его отладчики. --- ### Общая картина всех утилит мониторинга В Linux доступны множества утилит, доступных на разных уровнях абстракции ОС. Все их многообразие представлено на картинке ![observability_tools](https://i.imgur.com/YrNRa3Z.png) --- ### Базовые утилиты мониторинга ![observability_tools.basic](https://i.imgur.com/LCW2EMu.png) Базовые утилиты для мониторинга работы: * планировщика ( Scheduler ): * `uptime — показывает средние показатели загруженности процессораи подсистемы ввода/вывода` ![uptime](https://i.imgur.com/iZhBuAd.png) * `mpstat — показывает статистику загруженности каждого ядра процессора, служит для определения "горячих" ядер` ![mpstat](https://i.imgur.com/6GuywLx.png) * `top ( or htop ) — включает показания uptime, и общую статистику по всем процессорам, а также показывает какие процессы грузят процессор` ![top](https://i.imgur.com/uaNRAxZ.png) * загруженность ядер ( CPU ): * `mpstat` * `top ( or htop )` * `ps — показывает снимок текущего состояния процессов, также включает их иерархию ` ![ps](https://i.imgur.com/GH83bVQ.png) Здесь есть таблица расшифровывающая статусы процессов: ![ps_states](https://i.imgur.com/HxDMnCM.png) * с виртуальной памятью ( Virtual Memory ): * `top ( or htop )` * `ps` * `vmstat — показывает статистику использования виртуальной памяти` ![vmstat](https://i.imgur.com/uoWQUrQ.png) ![vmstat.decypher](https://i.imgur.com/t7hPOVA.png) * `free — показывает статистику использования RAM` ![free](https://i.imgur.com/PyIgMbV.png) * подсистемы ввода/вывода ( I/O ): * `iostat — показывает статистику чтения и записи на блочные устройства и дисковые разделы` ![iostat](https://i.imgur.com/5DfteHz.png) --- ### Стандартные средства мониторинга ![observability_tools.intermediate](https://i.imgur.com/OblWlmZ.png) --- Стандартные средства мониторинга и трассировщики работы подсистем: * системных вызовов: * `strace — выводит стек системных вызовов и сигналов ОС` ![strace](https://i.imgur.com/Vq61iyO.png) * сетевой подсистемы: * `tcpdump — выводит пакеты, которыми происходит обмен, можно задать регулярные выражения для фильтрации вывода сетевого трафика` ![tcpdump](https://i.imgur.com/bUlMyA9.png) --- * сетевой подсистемы: * `netstat — позволяет вывести статистику по пользованию сети:` * список соединений ![netstat.default](https://i.imgur.com/BSQkP0R.png) * статистика по сетевым протоколам ![netstat.statistic](https://i.imgur.com/G1ZIp0D.png) * таблицу маршрутизации ![netstat.routes](https://i.imgur.com/HNF2rwa.png) --- * сетевой подсистемы: * `netstat` * список интерфейсов ![netstat.interfaces](https://i.imgur.com/hj4S0Wv.png) * список соединений, но с информацией по процессам ![netstat.processes](https://i.imgur.com/IpR7wGZ.png) * `nicstat — позволяет вывести информацию по использованию сетевого трафика для каждого сетевого интерфейса` ![nicstat](https://i.imgur.com/jWHx1Gg.png) --- ![nicstat.output.1](https://i.imgur.com/ELTuZHK.png) --- ![nicstat.output.2](https://i.imgur.com/K7XttoV.png) --- * загруженность ядер: * `pidstat — динамически выводит подробную ( потоки / I/O ) статистику по запущенным процессам ` $$ pidstat \approx top $$ ![pidstat](https://i.imgur.com/Jux5rVm.png) --- * ввод/вывод: * `swapon — позволяет вывести информацию об устройстве свопа` ![swap](https://i.imgur.com/bL4tFiu.png) --- #### Универсальный sar ![sar](https://i.imgur.com/liAgHtd.png) --- #### Универсальный collectl ![collectl](https://i.imgur.com/qE9gEww.png) --- ## Продвинутые средства инструментирования Linux Мониторить показатели это, конечно хорошо, это позволяет установить факт того, что с программа недостаточно оптимизирована. Но хотелось бы также находить конкретные места, где у нас случаются просадки производительности. Этому и способствуют различные трассировщики и профилировщики. --- ### Трассировщики Программа, которая выводит последовательные вызовы функций с их аргументами и результаты их выполнения * `strace — выводит стек системных вызовов и сигналов ОС` ![strace](https://i.imgur.com/Vq61iyO.png) * `ltrace — выводит трассировку вызова библиотек` ![ltrace](https://i.imgur.com/wQOJ1lu.png) * `bpftrace — // TODO` --- ### Профилировщики Программа, позволяющая делать измерения различных показателей или наблюдать события в системе для их дальнейшего анализа, в основном с целью оптимизации ![perf](https://i.imgur.com/AnDMCAE.png) Картинка взята с [хабра](https://habr.com/ru/company/first/blog/442738/) сама статья тоже очень полезна. * `stap — позволяет обрабатывать события в ядре, путем добавления своих обработчиков в качестве модуля ядра` --- ### Отладчик ядра `kdb // TODO`