DNK_C_C++_Go_Rust
45 subscribers
14 photos
45 links
DNK - дневник кодера С и С++
Download Telegram
#40_TOS

СИГНАЛЫ зачастую описываются как «программные прерывания».

Поступление сигнала информирует процесс о том, что случилось какое-то событие или возникли исключительные условия.
Каждый тип сигнала идентифицируется с помощью целочисленного значения, определяемого в символьном имени, имеющем форму

SIGxxxx.

Сигналы отправляются процессу ядром, другим процессом (с соответствующими разрешениями) или самим процессом.
Например, ядро может отправить сигнал процессу, когда произойдет что-нибудь из следующего перечня:
— пользователь набрал на клавиатуре команду прерывания (обычно это Ctrl+C);
— завершился один из дочерних процессов данного процесса;
— истекло время таймера (будильника), установленного процессом;
— процесс попытался получить доступ к неверному адресу в памяти.


В оболочке сигнал процессу можно отправить с помощью команды

$ kill.

Внутри программ ту же возможность может предоставить системный вызов

kill( ).

Когда процесс получает сигнал, он, в зависимости от сигнала, выполняет одно из
следующих действий:

— игнорирует сигнал;
— прекращает свою работу по сигналу;
— приостанавливается, чтобы впоследствии возобновить свое выполнение с получением сигнала специального назначения.
#41_TOS_TP

ПОТОКИ — в современных реализациях UNIX у каждого процесса может быть несколько потоков выполнения.
Потоки можно представить себе в качестве набора процессов, совместно использующих одну и ту же виртуальную память, а также ряд других атрибутов.
Каждый поток выполняет один и тот же программный код и совместно с другими потоками использует одну и ту же область данных и кучу. Но каждый поток имеет свой СОБСТВЕННЫЙ СТЕК, содержащий локальные переменные и информацию о связанности вызовов функций.
Потоки могут осуществлять взаимный обмен данными через совместно используемые глобальные переменные.

API для работы с потоками предоставляет условные переменные и мьютексы, являющиеся примитивами, позволяющими потокам процесса обмениваться данными и синхронизировать свои действия, в частности их использование общих переменных.
Потоки могут также обмениваться друг с другом данными с применением IPC и механизмов синхронизации.
Основным преимуществом использования потоков является упрощение обмена данными (через глобальные переменные) между сотрудничающими потоками. Кроме того, некоторые алгоритмы более естественно преобразуются в многопоточные реализации,
чем в варианты использования нескольких процессов.

Помимо этого, многопоточные приложения могут легко воспользоваться преимуществами параллельной обработки на многопроцессорном оборудовании.
#42_TOS_TP

РЕГИСТРЫ (registers) — это области (локации), используемые процессором для хранения данных, инструкций или адресов памяти.
Количество
регистров невелико, но процессор может считывать и записывать их чрезвычайно быстро.
Можно считать регистры некоторой разновидностью блокнота для процессора, где он хранит временную информацию.

ПРАВИЛО — если важна скорость, то процессор может получать доступ к регистрам намного быстрее, чем доступ к оперативной памяти.
#43_ASM_TOS_TP

РЕГИСТРЫ ОБЩЕГО НАЗНАЧЕНИЯ.

Существует 16 регистров общего назначения, и каждый из них может использоваться как 64-битовый, 32-битовый, 16-битовый или 8-битовый регистр.

В таблице ниже перечислены имена всех этих регистров, обозначающие соответствующие размеры.
Четыре регистра rax, rbx, rcx, rdx могут иметь два типа 8-битовых регистровнижние 8 бит в нижней половине 16-битового регистра и верхние 8 бит в верхней половине 16-битового регистра.
Несмотря на то, что регистры rbp и rsp называются регистрами общего назначения, с ними нужно работать с особой осторожностью, так как они используются процессором во время выполнения программы.
#44_ASM_TOS_TP

РЕГИСТР СЧЕТЧИКА КОМАНД - rip.

Процессор постоянно отслеживает следующую выполняемую инструкцию, сохраняя ее адрес в регистре rip.
Значение в регистре rip можно изменить на любое на свой страх и риск (но лучше этого не делать).
Более безопасный способ изменения значения rip — использование инструкций переходов (jump).
#45_ASM_TOS_TP

РЕГИСТР ФЛАГОВ - rflags.

После выполнения очередной инструкции программа может проверить, установлен ли конкретный флаг (например, ZF=1), чтобы затем действовать соответственно.

Существует еще один регистр флагов с именем MXCSR, который используется в одной инструкции со многими потоками данных (SIMD).

В таблице ниже приведены возможные значения регистра rflags.
#46_ASM_TOS_TP

РЕГИСТРЫ xmm и ymm — используются для операций с числами с плавающей точкой и в инструкциях со многими потоками данных (SIMD).
#47_CMPL_TP

ЭЛИЗИЯ процесс когда компилятору разрешается упростить (сократить, оптимизировать код), например отказаться от вызова конструктора копирования и просто выполнить прямую инициализацию.

Например, в следующем случае:

ClassName objectName(ClassName(int arg));

компилятор может заменить это на:

ClassName objectName(int arg);
#49_TOS_TP

ОВЕРЛЕИ — небольшие части на которые разбивается программа.
#50_TOS_TP

ВИРТУАЛЬНАЯ ПАМЯТЬ.

В основе виртуальной памяти лежит идея, что у каждой программы имеется собственное адресное пространство, которое разбивается на участки, называемые СТРАНИЦАМИ.
Каждая страница представляет собой непрерывный диапазон адресов. Эти страницы отображаются на физическую память, но для запуска программы одновременное присутствие в памяти всех страниц необязательно.
Когда программа ссылается на часть своего адресного пространства, находящегося в физической памяти, аппаратное обеспечение осуществляет необходимое отображение на лету.
Когда программа ссылается на часть своего адресного пространства, которое не находится в физической памяти, ОС предупреждается о том, что необходимо получить недостающую часть и повторно выполнить потерпевшую неудачу команду.
Виртуальная память неплохо работает и в многозадачных системах, когда в памяти одновременно содержатся составные части многих программ.
Пока программа ждет считывания какой-либо собственной части, ЦП может быть отдан другому процессу.

PAGING — страничная организация виртуальной памяти.

ДИСПЕТЧЕР ПАМЯТИ (Memory Management Unit - MMU) — отображает виртуальные адреса на адреса физической памяти.

Виртуальное адресное пространство состоит из блоков фиксированного размера, называемых страницами.
Соответствующие блоки в физической памяти называются страничными блоками.
Страницы и страничные блоки имеют, как правило, одинаковые размеры. В системах используются размеры страниц от 512 байт до 1 Гбайт.
Перенос информации между оперативной памятью и диском всегда осуществляется целыми страницами.
Многие ЦП поддерживают несколько размеров страниц, которые могут быть смешаны и подобраны по усмотрению ОС.
Например, архитектура x86-64 поддерживает страницы размером 4 Кбайт, 2 Мбайт и 1 Гбайт, поэтому для пользовательских приложений можно использовать страницы размером 4 Кбайт, а для ядра — одну страницу размером 1 Гбайт.

Реальное оборудование отслеживает присутствие конкретных страниц в физической памяти за счет бита ПРИСУТСТВИЯ-ОТСУТСТВИЯ.

PAGE FAULT (ОШИБКА ОТСУТСТВИЯ СТРАНИЦЫ) — это название системного прерывания.
Оно происходит когда запрашивается страница памяти, которой нет в физической памяти.
После того как осуществлено прерывание ОС выбирает редко используемый страничный блок и сбрасывает его содержимое на диск (если оно еще не там). Затем она извлекает (также с диска) страницу, на которую была ссылка, и помещает ее в только что освободившийся страничный блок, вносит изменения в таблицы и заново запускает прерванную команду.
#51_BASH

Команда time — используется для измерения времени выполнения команды или скрипта. Она выводит статистику по использованию процессора и других ресурсов, затраченных на выполнение указанной команды.

Синтаксис:

$ time [options] command [arguments]

Примеры.
Измерение времени выполнения команды:

$ time ls -l

Запуск скрипта и измерение времени его выполнения:


$ time ./my_script.sh

Вывод реального времени:

$ time date
Вт 12 ноя 2024 16:29:50 MSK

Опции:
-p — формат вывода в POSIX формате;
-f FORMAT, --format=FORMAT
— настройка формата вывода статистики;
-a, --append
— добавление результатов к существующему файлу журнала вместо перезаписи;
-o FILE, --output=FILE — сохранение результатов в указанный файл.

Пример вывода:
real 0m0.024s
user 0m0.016s
sys 0m0.008s

где:
real — общее реальное время выполнения команды;
user — время, проведённое в пользовательском режиме (код приложения);
sys — время, проведённое в ядре системы (системные вызовы).

Команда time полезна для оценки производительности команд и скриптов, особенно при оптимизации или сравнении различных подходов к решению одной и той же задачи.
#52_ALG

ДЕРЕВО — это неориентированный граф с одним и только одним путем между любыми двумя узлами.

Самый верхний узел называется КОРНЕМ ДЕРЕВА.

Как и в генеалогическом древе, у узла могут быть потомки и предки:
ПОТОМКИ УЗЛА — все следующие за ним узлы,
ПРЕДКИ УЗЛА — все предшествующие ему узлы.

Узлы не имеющие потомков называются ЛИСТЬЯМИ.

Одно из основных свойств дерева — СБАЛАНСИРОВАННОСТЬ — одинаковое количество узлов в поддеревьях.
#53_ALG

КРАСНО-ЧЕРНОЕ ДЕРЕВО - бинарное самобалансирующееся дерево должно соответствовать следующим характеристикам:
1. Все вершины дерева покрашены в КРАСНЫЙ или ЧЕРНЫЙ цвет;
2. Корень дерева всегда ЧЕРНОГО цвета;
3. Красно-черное дерево является бинарным деревом, т.е. у каждой вершины имеется не более двух сыновей (потомков) и они могут быть черными вершинами без ключей - ЛИСТЬЯМИ;
4. Потомки красной вершины всегда ЧЕРНЫЕ;
5. Для любой вершины V на любом нисходящем пути от V до листа ОДИНАКОВОЕ количество ЧЕРНЫХ ВЕРШИН.
6. ЛИСТЬЯ красно-черного дерева всегда ЧЕРНЫЕ.

Алгоритм ВСТАВКИ вершины в RBT (red-black tree) - INSERT:
Для вставки вершины X в RBT,
ЕСЛИ дерево было пустым, то просто вставляем X в дерево и красим его в ЧЕРНЫЙ цвет так как Х становиться корнем дерева, а корень должен быть черным;
ИНАЧЕ ЕСЛИ вершина подходящая на роль родителя для Х - ЧЕРНАЯ, ТО осуществляем вставку Х в дерево, красим Х в КРАСНЫЙ и на этом вставка завершается;
ИНАЧЕ ЕСЛИ вершина подходящая на роль родителя для Х - КРАСНАЯ, ТО:
ЕСЛИ ДЯДЯ икса (Х) - КРАСНЫЙ, перекрашиваем ДЯДЮ и РОДИТЕЛЯ в ЧЕРНЫЙ, А ДЕДУШКУ в КРАСНЫЙ и проверяем рекурсивно остальные вершины пока не достигнем корня или балансировки;
ЕСЛИ ДЯДЯ - ЧЕРНЫЙ, то выполняем не более 2-х поворотов и перекрашивание.
#54_Сpp

numeric_limits в C++ определяют диапазон и характеристики фундаментальных числовых типов. Это помогает предотвратить переполнение, недополнение и другие потенциальные числовые ошибки.
Для работы с numeric_limits в C++ используется шаблонный класс

std::numeric_limits

из заголовка <limits>. Он предлагает комплексную информацию о свойствах числовых типов.
#55_Cpp

Оператор "->" в определении функции в C++ указывает завершающий возвращаемый тип.
Его можно использовать для явного указания типов возвращаемых значений для лямбда-выражений или для указания типов возвращаемых значений, которые зависят от параметров функции.
#56_Cpp

std::exchange — это функция из стандартной библиотеки C++, определённая в заголовке <utility> или <algorithm>.
Она выполняет обмен значениями между двумя параметрами, возвращая старое значение.
Например, после выполнения кода

int x{3};
int y{22};
int z = std::exchange(x, y);

переменной x будет присвоено значение y, а переменной z — значение, которое x имело изначально. Т.о. в приведенном примере x получит значение 22, а z получит значение 3.

std::exchange была введена в C++14. Её можно использовать, например, при реализации операторов назначения перемещения и конструкторов перемещения.

Синтаксис функции:

std::exchange(old, new);

У неё два параметра: параметр, который нужно установить, и параметр, с помощью которого нужно установить первый параметр. В качестве результата функция возвращает старое значение установленного параметра old.
#57_Cpp

range_error в C++ — исключение, которое возникает, когда полученный результат превосходит допустимый диапазон.

Оно используется при ошибках при вычислении значений с плавающей запятой, когда компьютер не может обработать значение, поскольку оно является либо слишком большим, либо слишком маленьким.

Для использования исключения range_error в C++ нужно включить в код заголовочный файл <stdexcept>
Например:
#include <stdexcept>
#include <iostream>

int main() {
try {
int value = 100;
if (value < 0 || value > 50) {
// Выбрасывание исключения range_error
throw std::range_error("Value is out of range.");
}
std::cout << "Value is within the range." << std::endl;
}
catch (const std::range_error& e) {
// Ловля и обработка исключения range_error
std::cerr << "Range Error: " << e.what() << std::endl;
}
return 0;
}

.
#58_Cpp

std::forward в C++ — шаблонная функция для достижения идеальной передачи аргументов функциям с сохранением их типа (lvalue или rvalue).

Она принимает forwarding-ссылку, по шаблонному параметру T определяет, передана ей lvalue-ссылка или rvalue-ссылка, и возвращает ссылку соответствующего типа.

Назначение функции std::forward —реализация механизма идеальной передачи (perfect forwarding). Этот механизм подразумевает, что объекты, переданные в функцию в виде lvalue-выражений, должны копироваться, а объекты, переданные в функцию в виде rvalue-выражений, должны перемещаться.

Функция std::forward была введена в C++ 11 и является частью заголовочного файла <utility>
#59_DB_TP

В теории баз данных CAP — это акроним от англоязычных слов Consistency (Согласованность, Целостность), Availability (Доступность) и Partition tolerance (Устойчивость к разделению).

CAP-теорема утверждает, что распределенная система хранения данных не может одновременно удовлетворять всем трем важнейшим аспектам согласованности, доступности и устойчивости к разделению.
Проще говоря, теорема CAP подчеркивает неотъемлемый компромисс в системе, где только два из этих трех основных атрибутов могут быть эффективно достигнуты в любой момент времени.
#0

Расшифровка акронимов в заголовках постов, для поиска по темам:

- ADM — администрирование;
- ALG — aлгоритмы;
- ASM — ассемблер;
- BASH — командная строка;
- Boost — коллекция библиотек С++;
- С — язык Си;
- Сpp — язык С++;
- CRYP — криптография;
- CMPL — компилирование, компиляторы;
- CS — информационная безопасность;
- DB — базы данных;
- DBG — дебаггеры и дебагинг;
- DvOp — девопс;
- IdPt — идиомы, паттерны, подходы (приемы, принятые практики, полезные советы);
- GCC — компилятор GCC;
- GIT— система контроля версий ПО;
- GO — все что связано с ЯП Golang;
- LIB — библиотеки;
- MTH — многопоточность;
- IF — интересные факты;
- NTWK — компьютерные сети;
- ODP — опросник Даниила Подольского по Golang;
- PkS — подготовка к собеседованиям;
- PPPO — принципы проектирования ПО;
- PRGM — листинги программ;
- PY — все что связано с ЯП Python;
- RUST — все что связано с ЯП Rust;
- SDS — стандартные (встроенные) структуры данных;
- STL — стандартная библиотек шаблонов С++;
- SYSCL — системные вызовы;
- TLS — инструменты для разработчика;
- TOS — теория операционных систем;
- TP — теория программирования;
- UB — неопределенное поведение;
- Vim — посты связанные с настройкой и использованием Vim.