Files

132 KiB

1leveldomainquestionanswerref
2basealgoВо что превращается 3n + 100 в O-нотацииO(n)урок D1_algo
3basealgoСколько шагов у бинарного поиска в массиве из 10⁶ элементов20 (log₂ 10⁶ ≈ 20)урок D1_algo
4corealgoПочему push_back в среднем O(1), а не O(n)ёмкость растёт геометрически (удвоение), сумма реаллокаций на n вставок — геометрическая прогрессия ≈ n, а не n²урок D1_algo
5corealgoЧто ломает удвоение ёмкости у vectorуказатели/итераторы/ссылки на старые элементы (реаллокация переносит блок памяти)урок D1_algo
6deepalgoЧто будет, если ёмкость vector растить на +1 за раз вместо удвоениясуммарная стоимость n вставок станет O(n²)урок D1_algo
7basealgoСложность построения кучи (heapify) из произвольного массиваO(n), не O(n log n)урок D1_algo
8basealgoКакая сортировка всегда O(n log n) и устойчиваmergesortурок D1_algo
9corealgoХудший случай quicksort и когда он достигаетсяO(n²), на уже отсортированном массиве при плохом выборе опорногоурок D1_algo
10corealgoНижняя граница сортировки сравнениямиΩ(n log n)урок D1_algo
11corealgoЗа счёт чего map держит высоту log nинвариант красно-чёрного дерева: чередование цветов + равное число чёрных узлов на пути от корня до листаурок D1_algo
12deepalgoПочему нельзя полагаться на порядок обхода unordered_mapпорядок бакетов не гарантирован и может меняться при rehashурок D1_algo
13basealgoФормула фактора загрузкиload = size / capacityурок D1_algo
14basealgoПорог load factor при открытой адресации, после которого делают rehashобычно ≤ 0.7урок D1_algo
15corealgoЗачем tombstone при открытой адресациичтобы удаление не обрывало цепочку зондирования: поиск должен пройти сквозь помеченную ячейку до элемента, вставленного позжеурок D1_algo
16corealgoПочему ёмкость хеш-таблицы берут степенью двойкиidx = hash & (cap-1) вместо деления по модулю — дешевле на процессореурок D1_algo
17corealgoЧто физически происходит при rehashвыделяется массив вдвое больше, каждый элемент переставляется по новому индексу (зависит от cap)урок D1_algo
18deepalgoПочему rehash даёт амортизированное O(1), а не O(n) на вставкута же геометрическая прогрессия, что у vector::push_back: суммарная стоимость n вставок ≈ n, а не n²урок D1_algo
19basealgoСложность has_pair (вложенный цикл по всем парам)O(n²)урок D1_algo
20corealgoСложность has_pair_fast по времени и по памятиO(n) по времени в среднем, O(n) дополнительной памяти под хеш-множествоурок D1_algo
21basealgoКакие константы использует FNV-1a в этом коде (offset basis / prime)1469598103934665603 / 1099511628211урок D1_algo
22corealgoПочему rehash пересчитывает индекс для каждого узла, а не переносит их как естьиндекс = hash % buckets.size(), а size() изменился (удвоился), старые индексы для нового размера в общем случае неверныурок D1_algo
23corealgoЧем открытая адресация выигрывает у цепочек по производительности и почемуона кэш-дружелюбнее: элементы лежат подряд в массиве, а не разбросаны по куче отдельными узламиурок D1_algo
24deepalgoМожет ли load factor у цепочек быть больше 1да, цепочка просто станет длиннее (в отличие от открытой адресации, где load ≤ 1 всегда)урок D1_algo
25baselinuxЧто возвращает `fork()` в родителе и в ребёнкев родителе PID ребёнка (>0), в ребёнке 0, при ошибке −1урок D1_linux
26corelinuxЧто происходит со страницами памяти при `fork()`ничего сразу: COW, физическая копия страницы создаётся при первой записи в неё (page fault)урок D1_linux
27corelinuxПочему `fork` дешёвый даже для процесса с гигабайтами памятикопируются не данные, а только записи таблицы страниц; сами страницы данных не дублируются, пока их не изменятурок D1_linux
28baselinuxЧто нужно сделать с `stdout` перед `fork`, если он не пуствызвать `fflush(stdout)`, иначе буфер продублируется в ребёнкеурок D1_linux
29deeplinuxКакой размер страницы памяти на x86-64, о которой копия делается при COW4 КБурок D1_linux
30baselinuxЧем `exec` отличается от `fork``fork` создаёт новый процесс, `exec` заменяет образ текущего процесса, не создавая новогоурок D1_linux
31corelinuxЧто сохраняется у процесса после успешного `exec`PID и таблица открытых файловых дескрипторов, кроме помеченных `FD_CLOEXEC`урок D1_linux
32corelinuxПочему `exec` при успехе никогда не возвращает управлениестарого кода, куда можно было бы вернуться, больше не существует — адресное пространство заменено новым образомурок D1_linux
33baselinuxРазница между `execlp`, `execv`, `execvp``execlp` ищет в `PATH`, `execv` — по полному пути, `execvp` — по имени в `PATH`урок D1_linux
34baselinuxЗачем нужен `waitpid`забрать код возврата завершившегося ребёнка и позволить ядру освободить его запись в таблице процессовурок D1_linux
35corelinuxЧто такое зомби и почему он не исчезает сампроцесс, завершивший `exit()`, чью запись ещё не забрал родитель через `wait`; ядру некуда передать код возврата, кроме как дождаться `wait`урок D1_linux
36corelinuxЧем зомби отличается от сиротызомби: родитель жив, но не вызвал `wait`; сирота: родитель умер, процесс усыновлён init/systemd (PID 1)урок D1_linux
37baselinuxОткуда код возврата 137 и 139137 = 128+9 (SIGKILL), 139 = 128+11 (SIGSEGV) — так оболочка кодирует завершение по сигналуурок D1_linux
38corelinuxКак правильно проверить, что ребёнок убит сигналом, а не завершился штатномакросами `WIFSIGNALED(status)`/`WTERMSIG(status)`, не сравнением `status` напрямуюурок D1_linux
39deeplinuxЧто показывает `WCOREDUMP(status)`что завершение по сигналу сопровождалось записью core-дампа на дискурок D1_linux
40baselinuxНомера сигналов SIGINT/SIGKILL/SIGTERM/SIGSEGV/SIGPIPE/SIGCHLD2/9/15/11/13/17урок D1_linux
41corelinuxЧем SIGTERM отличается от SIGKILLSIGTERM перехватывается и позволяет корректно завершиться, SIGKILL не перехватывается и не игнорируется, ядро снимает процесс с исполнения напрямуюурок D1_linux
42corelinuxЧто можно делать внутри обработчика сигналатолько менять `volatile sig_atomic_t`; `printf`/`malloc` небезопасны (не async-signal-safe)урок D1_linux
43baselinuxЧем `sigaction` лучше `signal`поведение `signal` исторически различается между Unix-системами, `sigaction` даёт предсказуемую и переносимую семантикуурок D1_linux
44deeplinuxЧто происходит, если сервис игнорирует SIGTERM при `systemctl stop`по истечении `TimeoutStopSec` (по умолчанию ~90 c) systemd посылает SIGKILL принудительноурок D1_linux
45baselinuxЧто означает EINTR и как на него реагироватьвызов прерван доставкой сигнала; корректная реакция — повторить вызовурок D1_linux
46baselinuxЧем EAGAIN отличается от обычной ошибки чтенияданных сейчас нет на неблокирующем дескрипторе, это не сбой, а сигнал «попробуй позже»урок D1_linux
47corelinuxКогда безопасно читать `errno`сразу после ошибки вызова, до любого другого вызова, способного его перезаписатьурок D1_linux
48deeplinuxКакой errno сигнализирует об исчерпании лимита открытых дескрипторов процессаEMFILE (лимит задаётся `ulimit -n`)урок D1_linux
49baselinuxКакой код возврата у шелла даст несуществующая команда127урок D1_linux
50baselinuxКакие дескрипторы дочерний процесс получает от родителя при `fork` и почему вывод команды сразу виден в терминале0/1/2 (stdin/stdout/stderr) наследуются через копию таблицы дескрипторов при `fork`урок D1_linux
51corelinuxКаким флагом собрать бинарник для проверки на утечки и UB`-fsanitize=address,undefined -fno-omit-frame-pointer`урок D1_linux
52basealgoИз чего состоит узел бинарного дерева при представлении указателямизначение + два указателя (left, right)урок D2_algo
53corealgoРазмер `struct TreeNode { int val; TreeNode *left, *right; }` на x86-6424 байта: 4 байта `val` + 4 байта паддинга (выравнивание указателя на 8) + 8 + 8 байт под указателиурок D2_algo
54corealgoКогда массивное представление дерева компактно, а когда неткомпактно только для полного/близкого к полному дерева (куча); для разреженного дерева индексы `2i+1/2i+2` требуют до `2^h` ячеек, большинство из которых пустуетурок D2_algo
55deepalgoПочему куча хранится в массиве, а не через указателикуча всегда почти полное дерево (заполнена по уровням слева направо без пропусков), индексная арифметика не тратит память впустую и не требует отдельной аллокации на узелурок D2_algo
56basealgoПорядок посещения в inorder-обходеleft, node, rightурок D2_algo
57basealgoКакой обход даёт отсортированный порядок для BSTinorderурок D2_algo
58corealgoПамять DFS (рекурсия или явный стек) по глубине дереваO(h) — пропорционально высотеурок D2_algo
59corealgoПамять BFS (очередь)O(w) — пропорционально максимальной ширине уровняурок D2_algo
60corealgoДля полного сбалансированного дерева из 10⁶ узлов: высота и ширина последнего уровняh ≈ 20 (log₂10⁶≈20), ширина последнего уровня ≈ 500 000 — BFS может требовать памяти на порядки больше, чем DFSурок D2_algo
61deepalgoКакой обход используют, чтобы освободить дерево снизу вверхpostorder (сначала оба ребёнка, потом сам узел)урок D2_algo
62basealgoИнвариант BSTдля каждого узла все значения в левом поддереве меньше значения узла, все значения в правом — большеурок D2_algo
63basealgoСложность поиска в BSTO(h), где h — высота дереваурок D2_algo
64corealgoЧто даёт inorder-обход BSTзначения по возрастанию — прямое следствие инвариантаурок D2_algo
65corealgoВысота BST в лучшем и худшем случае для n узловсбалансированное: h ≈ log₂n; вырожденное: h = nурок D2_algo
66deepalgoЧто произойдёт при вставке 1,2,...,n по порядку в обычный (небалансирующийся) BSTдерево вырождается в цепочку (каждый новый узел — правый ребёнок предыдущего), поиск деградирует до O(n)урок D2_algo
67basealgoПочему нельзя валидировать BST, сравнивая узел только с непосредственным родителемнарушение инварианта может возникнуть через поколение (правый потомок левого поддерева больше корня, но меньше своего прямого родителя) — локальная проверка это не ловитурок D2_algo
68corealgoКак правильно валидировать BST рекурсивнопередавать вниз границы (min, max): узел должен строго лежать между ними, для левого поддерева ужесточается верхняя граница, для правого — нижняяурок D2_algo
69corealgoСложность LCA в BST и почемуO(h): если оба искомых значения меньше текущего узла — влево, оба больше — вправо, иначе текущий узел и есть LCAурок D2_algo
70corealgoСложность LCA в обычном бинарном дереве без порядкаO(n): нет инварианта, отсекающего часть дерева, нужна рекурсия postorder по потенциально всем узламурок D2_algo
71deepalgoАльтернативный способ валидации BST без явных границ (min, max)inorder-обход с проверкой строгого возрастания относительно предыдущего посещённого значенияурок D2_algo
72basealgoИндексы детей и родителя в куче на массиве для узла iдети 2i+1, 2i+2; родитель (i-1)/2 (целочисленное деление)урок D2_algo
73basealgoСложность доступа к максимуму (top) в max-heapO(1) — максимум всегда в корне по инвариантуурок D2_algo
74corealgoСложность sift-up/sift-downO(log n) — путь ограничен высотой дереваурок D2_algo
75corealgoЗа какое время строится куча через bottom-up heapify против n последовательных pushO(n) против O(n log n): работа sift-down в узле пропорциональна его высоте h, а сумма Σ h/2^h по всем узлам сходится к константеурок D2_algo
76deepalgoС какого индекса стартует bottom-up heapify и куда идётс последнего нелистового узла, индекс n/2 - 1, к корню (индекс 0)урок D2_algo
77basealgoЧто такое `std::priority_queue` по умолчаниюmax-heap поверх vector; для min-heap передают компаратор std::greater<>урок D2_algo
78corealgoСложность top-K через полную кучуO(n + k log n): O(n) heapify + k раз pop по O(log n)урок D2_algo
79corealgoКогда используют min-heap размера k вместо полной кучина потоке данных, не помещающемся в память целиком: min-heap размера k хранит только k текущих кандидатов, O(n log k), память O(k)урок D2_algo
80corealgoСредняя и худшая сложность `nth_element` (quickselect)в среднем O(n), в худшем O(n²) — та же причина, что у quicksort: устойчиво плохой выбор опорногоурок D2_algo
81deepalgoПочему top-K через nth_element не даёт готовый отсортированный списокnth_element только частично упорядочивает вокруг k-го элемента без порядка внутри половин; нужна досортировка k-элементного префиксаурок D2_algo
82deepalgoКак получить top-K частых элементов за O(n) без log-фактораподсчёт хеш-таблицей O(n), затем bucket sort по частоте: частота не превышает n, массив корзин размера n+1 индексируется частотой напрямуюурок D2_algo
83basec_cppsizeof(struct { char a; int b; char c; }) на x86-6412 байтурок D2_cpp
84corec_cppСмещения полей a, b, c в этой структуреa=0, b=4 (после 3 байт паддинга), c=8урок D2_cpp
85corec_cppПочему в конце структуры ещё 3 байта паддингаразмер всей структуры округляется вверх до кратного выравниванию самого строгого поля (здесь int, выравнивание 4): 9 → 12урок D2_cpp
86deepc_cppЧто делает #pragma pack(1) и какая у него ценаубирает паддинг (sizeof(S) станет 6), но доступ к невыровненным полям дороже на x86 и может аппаратно упасть на платформах со строгим выравниваниемурок D2_cpp
87basec_cppКакие 5 функций входят в правило пятидеструктор, конструктор копирования, оператор присваивания копированием, конструктор перемещения, оператор присваивания перемещениемурок D2_cpp
88basec_cppЧто делает сгенерированный компилятором конструктор копирования по умолчаниюпобитовое (memberwise) копирование каждого поляурок D2_cpp
89corec_cppПочему копирование объекта с владеющим сырым указателем даёт double-freeоба объекта получают одно и то же значение указателя (адрес), оба деструктора вызывают delete на этом адресе — второй раз на уже освобождённой памятиурок D2_cpp
90corec_cppЧто такое rule of zeroне объявлять ни одну из пяти спецфункций вручную, доверив владение ресурсом готовым RAII-обёрткам (unique_ptr, vector, string) — их сгенерированные копирование/перемещение уже корректныурок D2_cpp
91basec_cppЧто добавляет в объект наличие хотя бы одной virtual-функциискрытый указатель на vtable, обычно 8 байт на 64-битной платформеурок D2_cpp
92corec_cppЧто произойдёт при delete через Base*, если ~Base() не virtual, а объект на деле Derivedвызовется только ~Base(), ~Derived() не вызовется вообще — утечка ресурсов Derived, формально UBурок D2_cpp
93corec_cppЧем это ловитсяLeakSanitizer, со стеком выделения внутри конструктора Derivedурок D2_cpp
94deepc_cppЧто вызовет virtual-функция, вызванная из конструктора базового классаверсию базового класса, а не переопределённую в наследнике: vtable объекта на этом этапе ещё указывает на таблицу Baseурок D2_cpp
95basec_cppЧто физически делает std::move во время выполнения программыничего: это static_cast к rvalue-ссылке (T&&), явный каст, не операцияурок D2_cpp
96corec_cppЧто реально выполняет перемещение данныхmove-конструктор/move-оператор присваивания конкретного типа, выбранный благодаря касту std::moveурок D2_cpp
97corec_cppЧто происходит с vector при перемещении и за какое времякопируются 3 внутренних указателя (начало, конец данных, конец ёмкости) в новый объект, у источника они обнуляются — O(1), без копирования элементовурок D2_cpp
98deepc_cppВ каком состоянии находится объект после std::move(obj) по стандартув валидном, но неопределённом состоянии — использование старых данных не UB, но логическая ошибка, не ловится санитайзерамиурок D2_cpp
99basec_cppЧто проверяет ASAN, а чтоUBSAN? — ASAN: ошибки работы с памятью (границы, use-after-free, double-free, утечки); UBSAN: операции, являющиеся UB по стандарту (переполнение, сдвиг, выравнивание)урок D2_cpp
100basec_cppЗначение INT_MAX для 32-битного int2147483647урок D2_cpp
101corec_cppПочему UB опасен именно тем, что код может работать в отладочной сборке и падать в релизнойоптимизатор релизной сборки строит код в предположении, что UB не происходит, и может убрать проверки, которые, по мнению программиста, должны были сработатьурок D2_cpp
102corec_cppКакой флаг компилятора включает сразу оба санитайзера-fsanitize=address,undefinedурок D2_cpp
103deepc_cppПочему разыменование nullptr на практике обычно даёт SIGSEGV, а не тихо читает мусорОС намеренно не отображает страницу по адресу 0 в физическую память, поэтому любое обращение к ней гарантированно и предсказуемо падаетурок D2_cpp
104baselinuxКакие флаги комбинируются битовым ИЛИ при open()O_RDONLY/O_WRONLY/O_RDWR, O_APPEND, O_CREAT, O_TRUNC, O_NONBLOCKурок D2_linux
105baselinuxЧто возвращает read() при достижении конца файла0урок D2_linux
106corelinuxЧто делает lseek() и меняет ли он содержимое файладвигает позицию чтения/записи файла, содержимое не трогаетурок D2_linux
107corelinuxЧем O_APPEND отличается от ручного lseek(fd, 0, SEEK_END) перед каждой записьюO_APPEND атомарно смещает позицию в конец непосредственно перед самой записью на уровне ядра, ручной lseek+write у двух процессов может гонку: оба сделают lseek, потом оба write, и один перезапишет данные другогоурок D2_linux
108baselinuxМожет ли write() записать меньше байт, чем попросили, без ошибкида, это не ошибка, нужен цикл дозаписиурок D2_linux
109corelinuxЧем fdatasync отличается от fsyncfsync сбрасывает на диск данные и все метаданные файла, fdatasync — только данные и те метаданные, что нужны для последующего чтения (например, размер), пропуская остальные (время доступа)урок D2_linux
110corelinuxКакой errno означает «вызов прерван сигналом, нужно просто повторить»EINTRурок D2_linux
111baselinuxВ чём разница MAP_SHARED и MAP_PRIVATEMAP_SHARED: изменения видны другим процессам и попадают в файл; MAP_PRIVATE: copy-on-write, изменения приватны и не попадают в файл на дискеурок D2_linux
112baselinuxЧто делает msyncпринудительно сбрасывает изменения MAP_SHARED-области на диск, не дожидаясь ядраурок D2_linux
113corelinuxЧем minor page fault отличается от majorminor: страница уже в страничном кэше, только добавляется отображение (дёшево); major: страница реально читается с диска (дорого)урок D2_linux
114corelinuxКогда mmap проигрывает read по скоростипри однократном последовательном чтении небольшого файла — накладные расходы на отображение и page fault не амортизируютсяурок D2_linux
115deeplinuxЧто ограничивает mmap на 32-битных системахразмер доступного виртуального адресного пространства (порядка нескольких гигабайт) — файл целиком отобразить может не получитьсяурок D2_linux
116baselinuxЖёсткий лимит числа дескрипторов у select и его значениеFD_SETSIZE, 1024урок D2_linux
117baselinuxСложность select и poll на один вызовO(n) от общего числа отслеживаемых дескрипторов, независимо от того, сколько готовыурок D2_linux
118corelinuxТри функции epoll и их рольepoll_create1 (создать инстанс), epoll_ctl (ADD/MOD/DEL в списке интереса), epoll_wait (забрать готовые из списка готовых)урок D2_linux
119corelinuxНа чём построен список интереса epoll внутри ядрана красно-чёрном деревеурок D2_linux
120corelinuxСложность epoll_wait на одно готовое событиеO(1) — ядро уже отфильтровало готовые дескрипторы заранее, работа не зависит от общего числа зарегистрированныхурок D2_linux
121baselinuxВ чём разница level-triggered и edge-triggeredLT: событие повторяется, пока условие истинно; ET: событие сообщается один раз, в момент перехода в готовое состояниеурок D2_linux
122corelinuxПочему ET требует неблокирующих дескрипторовна блокирующем дескрипторе цикл чтения до исчерпания данных на последнем вызове заблокируется навсегда вместо возврата EAGAINурок D2_linux
123corelinuxЧто произойдёт, если в ET-режиме не дочитать данные до EAGAINоставшиеся данные не будут сигнализированы повторно, пока состояние дескриптора не изменится снова (например, не придут новые данные)урок D2_linux
124deeplinuxКакой флаг epoll_ctl включает edge-triggered режимEPOLLETурок D2_linux
125baselinuxЧто означает EAGAIN/EWOULDBLOCK на неблокирующем дескриптореданных для чтения нет (или буфер записи полон) прямо сейчас — не ошибка, повторить позжеурок D2_linux
126corelinuxСовпадают ли числовые значения EAGAIN и EWOULDBLOCK на Linuxда, это синонимы с одним и тем же значениемурок D2_linux
127baselinuxСколько времени сокет проводит в TIME_WAIT2×MSL (удвоенное время жизни сегмента в сети)урок D2_linux
128corelinuxЗачем нужно состояние TIME_WAITчтобы поймать задержавшиеся в сети дубликаты сегментов старого соединения и не спутать их с новым, если порт переиспользуют слишком быстроурок D2_linux
129corelinuxЧто даёт SO_REUSEADDRразрешает bind на адрес/порт, у которого уже есть сокеты в состоянии TIME_WAIT — иначе bind вернёт «Address already in use»урок D2_linux
130basealgoСложность вставки в список, если указатель на место уже естьO(1)урок D3_algo
131basealgoСложность поиска элемента в связном спискеO(n)урок D3_algo
132corealgoПочему список медленнее массива на практике, хотя вставка O(1) на бумагеузлы разбросаны по куче, промахи кэша при обходеурок D3_algo
133corealgoЧем двусвязный список платит за удаление по указателю на сам узел без знания предыдущеголишним указателем `prev` в каждом узлеурок D3_algo
134basealgoСложность разворота списка тремя указателямиO(n) по времени, O(1) по памятиурок D3_algo
135corealgoЗачем нужен третий указатель `next`сохранить связь с остатком списка до перезаписи `curr->next`урок D3_algo
136basealgoСколько проходов по списку нужно, чтобы найти k-й элемент с конца без знания длиныодинурок D3_algo
137corealgoНа сколько шагов вперёд продвигают ведущий указатель перед стартом совместного движенияна k шаговурок D3_algo
138basealgoНа сколько узлов за шаг двигается `fast` в поиске серединына 2, `slow` — на 1урок D3_algo
139corealgoЧто вернёт `find_middle` для списка из 4 узлов (1→2→3→4)узел 3 (второй из двух средних)урок D3_algo
140deepalgoПочему условие цикла`fast && fast->next`, а не только `fast`? — без `fast->next` обращение `fast->next->next` на последнем узле разыменует `nullptr`урок D3_algo
141basealgoС какой относительной скоростью `fast` догоняет `slow` внутри цикла1 узел за шагурок D3_algo
142corealgoСколько указателей нужно сбросить в голову списка, чтобы найти вход в цикл после первой встречиодин, второй остаётся в точке встречи, оба идут дальше по 1 шагуурок D3_algo
143deepalgoПочему после первой встречи путь от головы длиной `a` и путь от точки встречи длиной `c-b` сходятся в одной точкеиз равенства `2(a+b) = a+b+n·c`, откуда `a = (n-1)c + (c-b)`урок D3_algo
144basealgoЧто решает dummy-узелубирает отдельную ветку кода для вставки/удаления в начало спискаурок D3_algo
145corealgoЧто возвращают в конце вместо dummy`dummy->next` как настоящую голову результатаурок D3_algo
146basealgoСложность push/pop у стека на массивеO(1)урок D3_algo
147corealgoСколько раз за свою жизнь в очереди на двух стеках элемент перекладывается между `in` и `out`не более одного разаурок D3_algo
148corealgoСредняя (амортизированная) сложность pop в очереди на двух стекахO(1), несмотря на то что отдельный вызов с переливом стоит O(n)урок D3_algo
149basealgoФормула перехода индекса на начало массива в кольцевом буфере`idx = (idx + 1) % capacity`урок D3_algo
150basealgoСложность push/pop в кольцевом буфереO(1), без сдвига элементовурок D3_algo
151corealgoКак отличить полный кольцевой буфер от пустого, если `head == tail`счётчик `size`, либо держать одну ячейку всегда свободнойурок D3_algo
152corealgoБолее быстрая замена `% capacity` без деления`if (++idx == capacity) idx = 0;`урок D3_algo
153deepalgoГде кольцевой буфер встречается в драйверахбуферы DMA и приёма/передачи пакетов, head/tail двигаются независимо без перемещения данныхурок D3_algo
154basealgoНаивная сложность Next Greater Element вложенным цикломO(n²)урок D3_algo
155basealgoСложность Next Greater Element через монотонный стекO(n)урок D3_algo
156corealgoПочему монотонный стек даёт O(n), если внутри есть вложенный `while`каждый индекс кладётся в стек и снимается не более одного раза, суммарно ≤2n операций за весь проходурок D3_algo
157corealgoЧто хранит монотонный стек в задаче Next Greater Elementзначения или индексы? — индексы (значения по ним убывают снизу вверх)урок D3_algo
158deepalgoЧем Daily Temperatures отличается от Next Greater Element по сути алгоритматем же алгоритмом, но в ответ пишут расстояние в днях, а не значениеурок D3_algo
159baselinuxКакие два флага компиляции нужны для комфортной отладки в gdb`-g -O0`урок D3_gdb
160baselinuxКак называется формат отладочной информации, который встраивает `-g`DWARFурок D3_gdb
161corelinuxПочему `-O2` мешает отладке даже при наличии `-g`оптимизатор переставляет/удаляет инструкции и переиспользует регистры, отладочная информация перестаёт однозначно совпадать с исходникомурок D3_gdb
162baselinuxКакая команда печатает стек вызовов в gdb`bt`урок D3_gdb
163baselinuxЧто означает `x/16xb ptr`16 байт в hex начиная с адреса `ptr` (формат `x/NFU addr`)урок D3_gdb
164corelinuxЧем `frame N` отличается от `bt``bt` печатает весь стек, `frame N` переключает текущий контекст `print`/`info locals` на конкретный кадр из этого стекаурок D3_gdb
165baselinuxЧем `tbreak` отличается от `break``tbreak` удаляется автоматически после первого срабатыванияурок D3_gdb
166corelinuxЧем `rwatch` отличается от `watch``watch` реагирует на изменение значения, `rwatch` — на чтение переменнойурок D3_gdb
167deeplinuxСколько аппаратных регистров отладки на x86 ограничивают число одновременных аппаратных watchpoint4 (`DR0`–`DR3`)урок D3_gdb
168baselinuxЧем `next` отличается от `step``next` не заходит внутрь вызываемых функций, `step` заходитурок D3_gdb
169corelinuxЧто делает `finish`выполняет до возврата из текущей функции и печатает возвращаемое значениеурок D3_gdb
170corelinuxЗачем нужен `until` внутри циклапродолжить до строки с номером больше текущей, не проходя цикл пошаговоурок D3_gdb
171baselinuxКаким кодом завершается процесс при SIGSEGV139 (128+11)урок D3_gdb
172baselinuxКакой командой разрешить сохранение core-файлов перед ожиданием падения`ulimit -c unlimited`урок D3_gdb
173corelinuxКак открыть core dump вместе с бинарником в gdb`gdb prog core`урок D3_gdb
174corelinuxПочему пересборка бинарника перед анализом core ломает разборадреса в новом бинарнике не совпадают с адресами, записанными в core, gdb покажет несогласованный стекурок D3_gdb
175baselinuxКакая команда gdb показывает все потоки процесса разом`info threads`урок D3_gdb
176corelinuxКак переключиться на конкретный поток по номеру для `bt`/`print``thread N`урок D3_gdb
177corelinuxКак gdb помогает диагностировать дедлок, если программа просто зависла без вывода`info threads` + `bt` по каждому потоку показывают, кто на каком мьютексе застрялурок D3_gdb
178corelinuxВ чём разница между точкой, которую покажет gdb при краше, и точкой, которую покажет ASANgdb показывает точку симптома (где реально упало), ASAN — точку причины (момент нарушения)урок D3_gdb
179baselinuxКаким флагом компиляции включается ASAN`-fsanitize=address`урок D3_gdb
180baselinuxКаким флагом компиляции включается UBSAN`-fsanitize=undefined`урок D3_gdb
181baselinuxКакой модуль valgrind ищет ошибки памяти`memcheck` (`valgrind --tool=memcheck`)урок D3_gdb
182corelinuxПочему valgrind медленнее ASANэмулирует каждую машинную инструкцию в софтверной VM, а не добавляет проверки только вокруг обращений к памяти в нативном кодеурок D3_gdb
183corelinuxКогда valgrind предпочтительнее санитайзеровкогда нет доступа к исходникам/пересборке (готовый бинарник, сторонняя библиотека)урок D3_gdb
184baselinuxКакой командой собирают `crash.c` для отладки с санитайзерами`gcc -g -O0 -fsanitize=address,undefined crash.c -o crash`урок D3_gdb
185baselinuxЧто печатает `./crash` без аргументов после починки`len=5`, код возврата 0урок D3_gdb
186corelinuxПочему падение может произойти не в строке с самой ошибкой, а при выходе из программыиспорченный служебный указатель (стек/метаданные кучи) проявляется только в момент разрушения объекта, а не в момент самой порчиурок D3_gdb
187basethreadsКогда именно стартует новый поток при `std::thread t(f)`сразу, в конструктореурок D3_threads
188basethreadsПримерный размер стека потока на типичной Linux-системе~8 МБурок D3_threads
189corethreadsЧто произойдёт, если объект `std::thread` с незавершённым и не присоединённым потоком уничтожится`std::terminate`, программа аварийно завершитсяурок D3_threads
190corethreadsКаким системным вызовом Linux создаёт новый поток`clone`урок D3_threads
191basethreadsЧто такое data raceодновременный доступ к одной памяти минимум с одной записью без синхронизацииурок D3_threads
192corethreadsЯвляется ли гонка на обычном `int` без атомиков UB по стандарту C++да, даже если на конкретном железе чтение/запись `int` физически атомарныурок D3_threads
193corethreadsПочему компилятору мало того, что чтение `int` атомарно на железебез синхронизации он вправе кэшировать значение в регистре и переупорядочивать обращения к памятиурок D3_threads
194basethreadsКакая RAII-обёртка нужна для работы с `condition_variable::wait``std::unique_lock`урок D3_threads
195basethreadsЧто делает `std::scoped_lock`атомарно захватывает несколько мьютексов сразуурок D3_threads
196corethreadsПочему дедлок ловится ThreadSanitizer, а не компиляторомэто динамическая ошибка, зависящая от конкретной раскладки потоков в рантайме, а не от статической структуры кодаурок D3_threads
197basethreadsЧто атомарно делает `cv.wait(lock)` при входеосвобождает мьютекс и усыпляет поток одной неделимой операциейурок D3_threads
198corethreadsПочему `while`, а не `if`, вокруг `wait`из-за spurious wakeup: `wait` может вернуться без единого вызова `notify`урок D3_threads
199corethreadsОбязательно ли вызывать `notify` под захваченным мьютексомнет, обязательно лишь менять состояние под мьютексом; `notify` после `unlock()` — оптимизация, не требование корректностиурок D3_threads
200deepthreadsНа каком примитиве ОС реализован `condition_variable` на Linux`futex`урок D3_threads
201corethreadsНазови 4 условия Коффмана для дедлокавзаимное исключение, удержание-и-ожидание, невозможность отбора, круговое ожиданиеурок D3_threads
202corethreadsКакое условие обычно разрушают на практике фиксированным порядком захвата мьютексовкруговое ожиданиеурок D3_threads
203basethreadsКакой командой gdb смотрят, на каком мьютексе застрял каждый поток при зависании`info threads` (и стек каждого потока)урок D3_threads
204basethreadsЧем `std::atomic` дешевле мьютекса для простого счётчикаодна аппаратная инструкция (например CAS), без перехода в ядро и усыпления потокаурок D3_threads
205corethreadsЧто гарантирует `memory_order_relaxed`только атомарность операции, без ограничений порядка с другими обращениями к памятиурок D3_threads
206corethreadsЧто запрещает `acquire`, а что`release`? — acquire запрещает переносить более поздние обращения ДО себя; release запрещает переносить более ранние обращения ПОСЛЕ себяурок D3_threads
207deepthreadsСколько состояний у кэш-линии в протоколе MESI4 (Modified, Exclusive, Shared, Invalid)урок D3_threads
208deepthreadsКакой memory_order используется по умолчанию у операций `std::atomic``seq_cst`урок D3_threads
209basethreadsКаким исключением отвечает `push` после `close()``std::runtime_error`урок D3_threads
210corethreadsПочему `size()` в этой задаче требует того же мьютекса, что и данные очередиинкремент/декремент — не атомарная операция read-modify-write, без синхронизации это гонка данныхурок D3_threads
211basethreadsПримерно сколько потоков создают в пуле относительно ядер CPUпорядка числа ядер процессораурок D3_threads
212corethreadsКакую конкретно цену амортизирует пул потоковстоимость создания потока (системный вызов, стек, регистрация в планировщике) на каждую отдельную короткую задачуурок D3_threads
213basethreadsЧто возвращает `std::async` сразу после вызова`std::future` с будущим результатомурок D3_threads
214corethreadsСколько раз можно вызвать `future.get()` для одного результатаодин; второй вызов — неопределённое поведение (`valid() == false`)урок D3_threads
215basethreadsКаким флагом компиляции включается ThreadSanitizer`-fsanitize=thread`урок D3_threads
216corethreadsПочему чистый прогон под TSan не гарантирует отсутствие гонки в коде вообщеTSan ловит гонку по факту конкретной раскладки потоков в конкретном запуске, а не статическим анализом всех возможных раскладокурок D3_threads
217basealgoПамять матрицы смежности для V вершинO(V²)урок D4_algo
218basealgoПамять списка смежностиO(V+E)урок D4_algo
219corealgoСложность перебора всех соседей вершины в списке смежностиO(deg(v)), в матрице — всегда O(V)урок D4_algo
220corealgoПочему для графа 100 000 вершин нужен список смежности, а не матрицаматрица заняла бы 10¹⁰ ячеек, не влезает в памятьурок D4_algo
221basealgoСложность BFS на списке смежностиO(V+E)урок D4_algo
222basealgoКакую структуру данных использует BFSочередь (FIFO)урок D4_algo
223corealgoЧто гарантированно находит BFS в невзвешенном графекратчайший путь по числу рёбер от источникаурок D4_algo
224corealgoПочему BFS даёт кратчайший путь именно из-за очереди, а не из-за чего-то ещёFIFO-порядок раскрывает граф строго по слоям расстояния, вершина расстояния k не может обработаться раньше всех вершин расстояния <kурок D4_algo
225basealgoСложность DFS на списке смежностиO(V+E)урок D4_algo
226basealgoКакую структуру данных использует DFSстек (явный или стек вызовов рекурсии)урок D4_algo
227corealgoГарантирует ли DFS кратчайший путьнет, в отличие от BFSурок D4_algo
228deepalgoПочему рекурсивный DFS опасен на графе-цепочке из 100 000 вершинглубина рекурсии равна длине цепочки, стек вызовов переполняетсяурок D4_algo
229basealgoСложность подсчёта связных компонент через BFS/DFS от каждой непосещённой вершиныO(V+E), суммарно по всем запускамурок D4_algo
230corealgoЧто в задаче Number of Islands является «вершиной» и «ребром»вершина — клетка `'1'`, ребро — соседство по 4 направлениямурок D4_algo
231basealgoДля какого типа графа определена топологическая сортировканаправленный ациклический граф (DAG)урок D4_algo
232basealgoСложность алгоритма КанаO(V+E)урок D4_algo
233corealgoЧто такое степень входа вершины в алгоритме Каначисло входящих в неё рёбер (нерассмотренных зависимостей)урок D4_algo
234corealgoКак алгоритм Кана обнаруживает циклсчётчик обработанных вершин `order.size()` меньше `n` после завершенияурок D4_algo
235corealgoКак задача Course Schedule сводится к топологической сортировкекурсы — вершины, пререквизит — направленное ребро, цикл = невозможно пройти все курсыурок D4_algo
236basealgoОбязательное условие применимости Дейкстрывсе веса рёбер неотрицательны (w ≥ 0)урок D4_algo
237basealgoСложность наивной Дейкстры (без кучи)O(V²)урок D4_algo
238corealgoСложность Дейкстры с `priority_queue`O((V+E) log V)урок D4_algo
239corealgoПочему отрицательное ребро ломает Дейкструвершина считается решённой сразу после извлечения минимума, а отрицательное ребро из ещё не рассмотренной вершины теоретически могло бы уменьшить это «зафиксированное» расстояниеурок D4_algo
240corealgoЧто проверяет `if (d != dist[v]) continue;` в реализации на кучечто извлечённая запись не устарела (для v уже нашли путь короче)урок D4_algo
241deepalgoПочему куча может держать до O(E) записей вместо O(V)при каждом улучшении расстояния в кучу кладётся новая запись вместо обновления старой (нет decrease-key)урок D4_algo
242basealgoСложность Беллман-ФордаO(V·E)урок D4_algo
243basealgoСколько раз алгоритм проходит по всем рёбрам в основном циклеV-1 разурок D4_algo
244corealgoКак Беллман-Форд обнаруживает отрицательный циклесли расстояние ещё можно уменьшить на дополнительной V-й итерации, в графе есть отрицательный циклурок D4_algo
245corealgoПочему V-1 итераций достаточнократчайший путь без отрицательных циклов не может содержать больше V-1 ребра (иначе повторяет вершину)урок D4_algo
246basealgoКакие два приёма дают почти-константную сложность union-findсжатие пути и объединение по рангуурок D4_algo
247basealgoАмортизированная сложность операции union-find с обоими приёмамиO(α(n)), обратная функция Аккермана, практически O(1)урок D4_algo
248corealgoСложность алгоритма Kruskal и что в ней доминируетO(E log E), доминирует сортировка рёберурок D4_algo
249corealgoКак union-find решает Redundant Connectionпервое ребро, для которого `unite` вернул false (вершины уже в одной компоненте), и есть лишнееурок D4_algo
250corealgoКак Network Delay Time сводится к Дейкстревершина k — источник, ответ — максимум из всех кратчайших расстояний, -1 если что-то недостижимоурок D4_algo
251deepalgoКаково верхнее ограничение обратной функции Аккермана для практических nα(n) ≤ 4 для любого n, меньшего числа атомов во вселеннойурок D4_algo
252basenetСколько уровней в модели OSI7урок D4_net
253basenetСколько уровней в модели TCP/IP4урок D4_net
254corenetКакие три уровня OSI объединяет прикладной уровень TCP/IPсеансовый, представления, прикладнойурок D4_net
255corenetНа каком уровне создаётся сокеттранспортном (L4 OSI / транспортный TCP/IP)урок D4_net
256basenetРазмер заголовка TCP-сегмента (без опций)20 байтурок D4_net
257basenetРазмер заголовка IP-пакета (без опций)20 байтурок D4_net
258basenetРазмер заголовка Ethernet-кадра и трейлера FCS14 байт заголовок + 4 байта FCSурок D4_net
259corenetПо какому полю верхний уровень при приёме узнаёт, что лежит внутри нижнегопо полю типа протокола (EtherType в Ethernet, `protocol` в IP)урок D4_net
260basenetДлина Ethernet-заголовка14 байтурок D4_net
261basenetДлина трейлера FCS4 байтаурок D4_net
262basenetДлина MAC-адреса в битах и байтах48 бит, 6 байтурок D4_net
263corenetИз скольки байт состоит OUI в MAC-адресе и кто его назначает3 байта, назначает IEEE производителюурок D4_net
264corenetЧто меняется в заголовках при переходе пакета через маршрутизаторMAC или IP получателя? — MAC-адрес получателя, IP остаётся прежнимурок D4_net
265basenetКак рассылается ARP-запросbroadcast или unicast? — broadcastурок D4_net
266basenetКак отправляется ARP-ответunicast, от владельца адресаурок D4_net
267corenetЗачем нужен ARP-кэшне повторять broadcast-запрос для каждого исходящего пакета к уже известному узлуурок D4_net
268corenetЧто такое gratuitous ARP и для чего он нуженнезапрошенный ARP про собственный IP; обновление чужих кэшей заранее и обнаружение конфликта адресовурок D4_net
269basenetСколько байт добавляет VLAN-тег 802.1Q к Ethernet-заголовку4 байта (14 → 18)урок D4_net
270basenetЗначение поля TPID для VLAN-тега0x8100урок D4_net
271corenetИз каких трёх полей состоит TCI и сколько бит занимает VIDPCP (3 бита), DEI (1 бит), VID (12 бит)урок D4_net
272corenetДиапазон реально используемых VLAN ID1–4094 (0 и 4095 зарезервированы)урок D4_net
273basenetЗначение MTU для стандартного Ethernet1500 байтурок D4_net
274corenetЧто происходит с IP-пакетом крупнее MTU, если флаг DF не выставленфрагментируется на несколько IP-пакетов меньшего размераурок D4_net
275corenetЧто происходит, если пакет крупнее MTU и выставлен флаг DFпакет отбрасывается, отправителю летит ICMP о необходимости фрагментацииурок D4_net
276deepnetПочему фрагментация считается дорогой операциейнагружает маршрутизаторы на пути, и потеря одного фрагмента роняет весь исходный пакетурок D4_net
277basenetМинимальный размер IPv4-заголовка20 байтурок D4_net
278basenetЗначение поля Protocol для TCP / UDP / ICMP6 / 17 / 1урок D4_net
279corenetСколько бит занимает поле IHL и что оно означает4 бита, длина заголовка в 32-битных словахурок D4_net
280corenetКакие условия делают IPv4-пакет некорректным при разборе (по `tasks/04_ipv4`)буфер <20 байт, version≠4, ihl<5, ihl·4>len, total_length<ihl·4 или >lenурок D4_net
281deepnetПочему в `tasks/04_ipv4` запрещён `reinterpret_cast` на буферневыровненный адрес и другой порядок байт на проводе дают UB при чтении полей как структуры напрямуюурок D4_net
282basenetНа сколько уменьшается TTL на каждом маршрутизаторена 1урок D4_net
283basenetКакой ICMP-тип отправляется при обнулении TTLTime Exceeded, тип 11урок D4_net
284corenetКак traceroute находит промежуточные маршрутизаторы, не имея отдельного протокола обнаружения путипоследовательно шлёт пакеты с TTL=1,2,3..., каждый умирает на очередном хопе и присылает ICMP Time Exceeded с адресом этого хопаурок D4_net
285basenetНомера типов Echo Request и Echo Reply8 и 0урок D4_net
286basenetТип ICMP-сообщения Destination Unreachableтип 3урок D4_net
287corenetКакой код Destination Unreachable запускает PMTUDfragmentation needed and DF setурок D4_net
288corenetПочему ICMP не имеет портовдиагностика работает на сетевом уровне, где ещё нет понятия транспортного соединенияурок D4_net
289deepnetПочему `ping` может не проходить, а `curl` на тот же хостработать? — ICMP заблокирован файрволом отдельно от TCP-порта, это два разных уровня фильтрацииурок D4_net
290basenetАлгоритм контрольной суммы IPv4-заголовкасумма в дополнительном коде по 16-битным словам, затем инверсияурок D4_net
291corenetКакое значение должна давать сумма при проверке валидности (с учётом поля суммы)0xFFFFурок D4_net
292corenetПочему контрольная сумма покрывает только заголовок, а не данныезаголовок (минимум TTL) меняется на каждом хопе и пересчитывается заново; целостность данных проверяют TCP/UDP-checksum и FCS канального уровняурок D4_net
293deepnetЧто такое end-around carry в one's complement сложенииперенос из старшего бита не отбрасывается, а прибавляется обратно к младшему биту суммыурок D4_net
294basenetСколько хостов доступно в подсети /24254урок D4_net
295basenetСколько хостов доступно в подсети /2662урок D4_net
296basenetСколько хостов доступно в подсети /302урок D4_net
297corenetЧем /31 отличается от остальных масок по числу служебных адресовоба адреса хостовые (RFC 3021), нет отдельного сетевого/broadcast адресаурок D4_net
298corenetЧто означает запись `/N` в CIDRдлина префикса сети в битах вместо классовой адресации A/B/Cурок D4_net
299deepnetФормула подбора самой узкой подсети под h хостов за O(1)`32 - ceil(log2(h+2))`урок D4_net
300basenetНа каком уровне работает хаб / коммутатор / маршрутизаторL1 / L2 / L3урок D4_net
301basenetЧто такое FDB коммутатора по структуре данныххеш-таблица MAC-адрес → портурок D4_net
302corenetКак коммутатор заполняет FDB без отдельного протокола объявлениясамообучением по source MAC каждого входящего кадраурок D4_net
303corenetЧто делает коммутатор с кадром, чей MAC получателя не найден в FDBрассылает на все порты кроме входного (flooding)урок D4_net
304corenetЗачем нужен aging записей FDBудалять устаревшие пары MAC-порт, если устройство отключилось или переехало на другой портурок D4_net
305deepnetЧто разделяет маршрутизатор, чего не делает коммутаторшироковещательные домены (домены коллизий разделяет уже коммутатор)урок D4_net
306basealgoДва условия применимости ДПоптимальная подструктура + перекрывающиеся подзадачиурок D5_algo
307corealgoПочему наивный рекурсивный `fib(n)` работает за экспоненциальное времяодни и те же подзадачи (`fib(k)` для одного и того же k) пересчитываются заново много разурок D5_algo
308corealgoЧто ломается, если применить ДП-переход к задаче без оптимальной подструктурыпереход не отражает реальную зависимость оптимумов, ответ будет неверным независимо от таблицыурок D5_algo
309basealgoСложность по времени мемоизации/табуляцииO(число состояний)урок D5_algo
310corealgoЧем мемоизация рискует, а табуляциянет? — переполнением стека при большой глубине рекурсииурок D5_algo
311corealgoЧто нужно определить в ДП-задаче до написания кодасостояние (параметры подзадачи) и переход (формула через уже решённые состояния)урок D5_algo
312basealgoСложность по памяти Climbing Stairs при развёрнутых `prev1`/`prev2`O(1)урок D5_algo
313corealgoПочему рюкзак 0/1 нельзя ужать до O(1), только до O(W)переход `dp[i][w]` зависит от целой предыдущей строки по весу, а не от 1–2 соседних чиселурок D5_algo
314basealgoВременная сложность 0/1-рюкзака с одномерным массивомO(n·W)урок D5_algo
315corealgoПочему в одномерном 0/1-рюкзаке веса обходят от W к weight[i], а не наоборотиначе `dp[w-weight[i]]` уже обновлён текущим предметом в этой же итерации, предмет посчитается дваждыурок D5_algo
316deepalgoКак называется вариант рюкзака, в который случайно превращается 0/1-рюкзак при прямом проходе весовunbounded knapsack (неограниченное число копий предмета)урок D5_algo
317basealgoСложность Coin Change (минимум монет) по времениO(amount · число_номиналов)урок D5_algo
318corealgoКакой порядок циклов в Coin Change II даёт число комбинаций, а какойперестановок? — монета снаружи/сумма внутри → комбинации; сумма снаружи/монета внутри → перестановкиурок D5_algo
319basealgoРазмер таблицы LCS/Edit Distance для строк длины n и m(n+1)×(m+1)урок D5_algo
320basealgoВременная сложность LCS и Edit DistanceO(n·m)урок D5_algo
321corealgoПочему при несовпадении последних символов в LCS берут max(dp[i-1][j], dp[i][j-1])оба последних символа одновременно в общую подпоследовательность войти не могут, значит хотя бы один из них можно отбросить без потери оптимальностиурок D5_algo
322basealgoНаивная сложность LIS через dp[i]O(n²)урок D5_algo
323basealgoСложность LIS через массив хвостов и бинарный поискO(n log n)урок D5_algo
324corealgoЧто хранится в `tails[k]`минимально возможный последний элемент возрастающей подпоследовательности длины k+1урок D5_algo
325corealgoПочему `tails` остаётся отсортированным после каждой замены/добавленияновое значение всегда меньше заменяемого и больше всех элементов левее позиции, найденной `lower_bound`урок D5_algo
326corealgo`lower_bound` или `upper_bound` нужен для строго возрастающей LIS`lower_bound`урок D5_algo
327deepalgoСколько операций у наивного O(n²) LIS на 100 000 элементах и почему это не укладывается в тестпорядка 10¹⁰, тест роняет прогон при времени > 2 сурок D5_algo
328baselinuxЧей код возврата хранит `$?` после `cmd1 | cmd2 | cmd3`только последней команды (`cmd3`)урок D5_bash
329corelinuxКак узнать код возврата каждой команды пайплайна отдельномассив `PIPESTATUS` (`${PIPESTATUS[@]}`)урок D5_bash
330baselinuxЧто делает `-e` в `set -euo pipefail`скрипт завершается сразу при ненулевом коде возврата любой командыурок D5_bash
331baselinuxЧто делает `-u`обращение к неопределённой переменной — ошибка вместо пустой строкиурок D5_bash
332corelinuxЧто делает `pipefail` и какую проблему из раздела 1 это закрываеткод возврата пайплайна = код первой упавшей команды, а не только последней; закрывает потерю ошибок середины пайплайнаурок D5_bash
333corelinuxВ каком месте `-e` не остановит скрипт при ошибке командыесли команда — часть условия (`if`, `while`, после `&&`/`||`) или не последняя команда пайплайна без `pipefail`урок D5_bash
334baselinuxЧто по умолчанию входит в IFSпробел, таб, перевод строкиурок D5_bash
335baselinuxЧто хранит `$!`PID последнего фонового процессаурок D5_bash
336corelinuxЗачем `trap ... EXIT` используют для временных файловгарантирует очистку при любом пути завершения скрипта (успех, ошибка, сигнал), без дублирования кода в каждой точке выходаурок D5_bash
337baselinuxЧем `-0` в `xargs -0` отличается от поведения по умолчаниювход разделяется нулевыми байтами `\0` вместо пробелов/переводов строкурок D5_bash
338corelinuxС какой опцией `find` обычно комбинируют `xargs -0``-print0`урок D5_bash
339baselinuxЧто печатает `grep -c`количество совпавших строк, а не сами строкиурок D5_bash
340baselinuxПочему `uniq -c` нужно применять после `sort``uniq` схлопывает только соседние одинаковые строки, несмежные повторы не видитурок D5_bash
341corelinuxЧем `sort -u` эквивалентен по результату`sort | uniq`, но за один проходурок D5_bash
342baselinuxЧто означает `$1` в awkпервое поле текущей строкиурок D5_bash
343baselinuxЧто содержит `NR`номер текущей строки от начала потокаурок D5_bash
344corelinuxПочему awk на 1e6 строк быстрее bash-цикла с grep внутриawk — один процесс с линейным проходом по строкам, bash-цикл форкает новый процесс на каждую итерацию (миллион fork+exec против одного процесса)урок D5_bash
345baselinuxЧто делает флаг `g` в `s/OLD/NEW/g`заменяет все вхождения в строке, а не только первоеурок D5_bash
346corelinuxЧем `sed -i` отличается от `sed` без флагаредактирует файл на месте вместо печати результата в stdoutурок D5_bash
347baselinuxЧто такое /proc с точки зрения хранения данныхвиртуальная файловая система, содержимое генерируется ядром на лету, не хранится на дискеурок D5_bash
348baselinuxЧем разделены аргументы в /proc/<pid>/cmdlineнулевыми байтами `\0`урок D5_bash
349corelinuxЧто можно узнать из /proc/<pid>/mapsдиапазоны адресов памяти процесса, права доступа (r/w/x) и к какому файлу/сегменту относится каждый диапазонурок D5_bash
350corelinuxОткуда `free -h` берёт данные о памятииз /proc/meminfoурок D5_bash
351baselinuxЧто ограничивает `ulimit -n`максимальное число открытых файловых дескрипторов на процессурок D5_bash
352corelinuxПочему перед отладкой редкого краша выставляют `ulimit -c unlimited`по умолчанию размер core dump часто ограничен нулём, без этого файл с состоянием памяти на момент падения не создастсяурок D5_bash
353baselinuxРасшифровка прав 755rwxr-xr-x (владелец: полный доступ, группа и остальные: чтение+выполнение)урок D5_bash
354baselinuxКакие числа кодируют r, w, xr=4, w=2, x=1урок D5_bash
355corelinuxЧто делает `umask 022` с правами нового файла по умолчанию (666)вычитает 022, получается 644 (rw-r--r--)урок D5_bash
356baselinuxЧто показывает `strace`системные вызовы процесса с аргументами и результатом, построчноурок D5_bash
357corelinuxЧем `lsof -p PID` и `/proc/<pid>/fd/` пересекаются по смыслуоба показывают список файловых дескрипторов, открытых процессомурок D5_bash
358basenetМинимальный размер заголовка TCP20 байтурок D5_net
359basenetСколько бит занимает порт в заголовке TCP16 бит (диапазон 0–65535)урок D5_net
360corenetМаксимальный размер опций TCP-заголовка и почему именно столько40 байт, потому что Data Offset (4 бита) кодирует длину заголовка в 32-битных словах максимум 15×4=60 байт, минус 20 байт фиксированной частиурок D5_net
361corenetВ каких сегментах передаётся опция MSSтолько в сегментах с флагом SYN, при установке соединенияурок D5_net
362deepnetКакие два флага TCP появились позже исходного RFC 793 и для чегоECE и CWR (RFC 3168), сигнализация перегрузки сети (ECN) вместо/вместе с потерей пакетаурок D5_net
363basenetСколько сегментов в three-way handshake3 (SYN, SYN+ACK, ACK)урок D5_net
364corenetПочему для установки TCP-соединения недостаточно двух сегментовсоединение полнодуплексное, серверу нужно подтверждение, что его SYN-ACK (и его ISN) реально дошёл до клиентаурок D5_net
365corenetЧто означает ISN и синхронизируется ли он в одном экземпляре на оба направленияначальный порядковый номер; нет, у каждого направления свой собственный ISNурок D5_net
366basenetВ каком состоянии сервер ждёт входящие подключенияLISTENурок D5_net
367corenetЧем отличаются пути клиента и сервера в конечном автомате TCPклиент проходит SYN_SENT, сервер — LISTEN и SYN_RECEIVED; роли в рукопожатии асимметричныурок D5_net
368corenetКакой командой в Linux видно текущее состояние TCP-сокета`ss -tan` (столбец State)урок D5_net
369basenetСколько сегментов нужно для полного закрытия TCP-соединения4 (FIN, ACK, FIN, ACK)урок D5_net
370basenetФормула длительности TIME_WAIT2×MSLурок D5_net
371corenetПочему закрытие TCP асимметрично («полузакрытие»), а не мгновенное закрытие по первому FINсоединение дуплексное, получение FIN означает только «собеседник больше не пришлёт данные», но сама сторона может ещё дописывать данные в обратном направленииурок D5_net
372deepnetСколько секунд реально длится TIME_WAIT в Linux и совпадает ли это с 2×MSL по RFC 79360 секунд, фиксированная константа ядра; не совпадает с номинальными 4 минутами (2×2 мин) по RFC 793урок D5_net
373basenetЧто получает клиент в ответ на попытку подключиться к закрытому портуRSTурок D5_net
374corenetЧем RST принципиально отличается от FIN по смыслуRST — аварийный немедленный сброс (ошибка/невозможность продолжить), FIN — согласованное закрытие направленияурок D5_net
375basenetЧем измеряется flow control в заголовке TCPполем Windowурок D5_net
376corenetЧем отличается flow control от congestion control по целиflow control защищает получателя от переполнения буфера, congestion control защищает сеть от перегрузкиурок D5_net
377corenetВо сколько раз падает cwnd при обнаруженной потеревдвое (ssthresh = cwnd/2)урок D5_net
378corenetЧто такое fast retransmitретрансмиссия по 3 дублирующим ACK без ожидания полного таймаута RTOурок D5_net
379deepnetКакой алгоритм congestion control используется в Linux по умолчаниюCUBICурок D5_net
380corenetФормула RTO по Джекобсону/КарелсуSRTT + 4×RTTVARурок D5_net
381deepnetКакие коэффициенты сглаживания используются для SRTT и RTTVARα=1/8 для SRTT, β=1/4 для RTTVARурок D5_net
382basenetЧто делает флаг TCP_NODELAYотключает алгоритм Нейгла, данные отправляются сразу без задержки на накоплениеурок D5_net
383corenetПочему Nagle + delayed ACK вместе дают заметные задержкиобе стороны ждут друг друга: отправитель — ACK перед следующей мелкой отправкой, получатель — данные для отправки в обратную сторону, чтобы не слать ACK отдельноурок D5_net
384basenetРазмер заголовка UDP8 байтурок D5_net
385basenetКакие поля есть в заголовке UDPпорт источника, порт назначения, длина, контрольная суммаурок D5_net
386corenetПочему DNS исторически использует UDP, а не TCPтипичный запрос-ответ короткий и умещается в одну датаграмму, устанавливать TCP-соединение ради одного маленького обмена избыточно медленноурок D5_net
387basenetДиапазон well-known портов0–1023урок D5_net
388basenetВ каком диапазоне ОС обычно выделяет эфемерные порты клиентским соединениям49152–65535урок D5_net
389corenetЧто вернёт второй `bind` на уже занятый портошибку «Address already in use»урок D5_net
390basenetЧто делает NAT с исходящим пакетомподменяет внутренний IP:порт источника на внешний IP:порт, запоминая соответствие в таблице трансляцийурок D5_net
391corenetПочему NAT ломает входящие P2P-соединения без проброса портовзапись в таблице трансляций создаётся только исходящим трафиком, входящему от незнакомого узла не с чем сопоставитьсяурок D5_net
392basenetПорт DNS по умолчанию и протокол53, UDP (переключение на TCP/53 для больших ответов)урок D5_net
393basenetЧто хранит запись типа Aсоответствие имени домена IPv4-адресуурок D5_net
394corenetЗачем у DNS-записи есть TTLограничивает время кэширования резолверами; компромисс между скоростью распространения изменений и нагрузкой повторными запросамиурок D5_net
395basenetПорты DHCP-сервера и клиентасервер 67/UDP, клиент 68/UDPурок D5_net
396corenetИз каких четырёх шагов состоит DORADiscover, Offer, Request, Ackурок D5_net
397basenetКоманда для захвата TCP-трафика на 80 порту`tcpdump tcp port 80`урок D5_net
398basenetФлаг tcpdump для сохранения дампа в файл`-w`урок D5_net
399corenetКак в выводе tcpdump выглядит three-way handshakeтри строки подряд: `[S]` от клиента, `[S.]` от сервера, `[.]` от клиентаурок D5_net
400basetoolsИз каких двух механизмов ядра Linux состоит изоляция контейнераnamespaces (изоляция видимости ресурсов) и cgroups (ограничение потребления ресурсов)урок D6_docker
401basetoolsПеречисли namespaces, разбираемые в этом разделеpid, mnt, net, uts, ipc, userурок D6_docker
402coretoolsПочему контейнер стартует за доли секунды, а VMза секунды? — контейнер не грузит собственное ядро, старт — это fork/exec с применёнными namespaces; VM грузит через гипервизор целое гостевое ядроурок D6_docker
403coretoolsПочему изоляция контейнера слабее, чем у VM, на уровне безопасностиконтейнер и хост используют одно и то же ядро; уязвимость ядра или неверные capabilities могут дать выход на хост, а у VM с отдельным ядром такой прямой путь отсутствуетурок D6_docker
404basetoolsЧто порождает каждая инструкция `RUN`/`COPY` в Dockerfileотдельный слой (diff файловой системы)урок D6_docker
405coretoolsЧто происходит с последующими слоями, если один слой не совпал с кэшемвсе последующие слои пересобираются заново, даже если сами по себе не менялисьурок D6_docker
406coretoolsКакой порядок инструкций Dockerfile правильный для скорости пересборкисначала зависимости (меняются редко), потом исходный код (меняется часто)урок D6_docker
407basetoolsПочему `apt-get install` и `rm -rf /var/lib/apt/lists/*` объединяют в одну инструкцию `RUN`слой фиксирует файловую систему на момент завершения инструкции; в отдельном RUN кеш пакетов уже необратимо запечён в предыдущем слоеурок D6_docker
408coretoolsПочему нельзя копировать в образ каталог `build/`, собранный на хостеон собран под окружение хоста (версия компилятора, пути, архитектура), не гарантированно совместим с окружением контейнера; сборка должна идти внутри образаурок D6_docker
409basetoolsЧто переносит `COPY --from=builder` во второй `FROM`только указанные готовые файлы (например бинарник) из первого этапа, без слоёв тулчейнаурок D6_docker
410coretoolsКогда для финального этапа multi-stage можно использовать `FROM scratch`когда бинарник собран полностью статически и не нуждается ни в одной библиотеке окруженияурок D6_docker
411coretoolsЧем `debian:bookworm-slim` в качестве финального образа лучше полного `debian:bookworm` для рантаймане несёт тулчейн сборки и лишние пакеты, меньше размер и меньше поверхность атакиурок D6_docker
412basetoolsКто физически управляет расположением volume на дискесам Docker, служебная директория, не путь, выбранный вручнуюурок D6_docker
413coretoolsПочему bind mount, а не volume, используют для разработки с редактированием кода на хостеbind mount даёт прямой одновременный доступ к каталогу хоста, правки на хосте сразу видны в контейнере без пересборки образаурок D6_docker
414basetoolsЧто делает флаг `--rm` у `docker run`автоматически удаляет контейнер и его read-write-слой сразу после завершения процессаурок D6_docker
415basetoolsКакая команда даёт интерактивный shell в уже запущенном контейнере`docker exec -it <container> bash`урок D6_docker
416coretoolsЧем `--network=host` отличается от обычного режима с `-p`контейнер напрямую использует сетевой стек хоста без собственного network namespace и без проброса портов, но и без сетевой изоляцииурок D6_docker
417basetoolsКакая команда поднимает все сервисы из `docker-compose.yml` разом`docker compose up -d`урок D6_docker
418coretoolsЧто удаляет `docker compose down -v`, чего не удаляет `docker compose down` без флагаименованные volume и данные в нихурок D6_docker
419basetoolsЧто физически происходит с тегом `:latest` при каждом `docker push` без явного тегаон перезаписывается на новый образ, становится мутируемым указателем, а не фиксированной версиейурок D6_docker
420coretoolsПочему фиксация `myapp@sha256:...` вместо тега `:latest` важна для воспроизводимости CIдайджест неизменяем по определению хеша, а тег `:latest` может незаметно указывать на другое содержимое образа в разное времяурок D6_docker
421basetoolsОт какого пользователя запускается процесс в контейнере по умолчанию, если не указано иноеroot (UID 0)урок D6_docker
422coretoolsПочему root в контейнере опаснее, чем root в отдельной VMконтейнер не имеет отдельного ядра; эскалация до root хоста возможна через уязвимость общего ядра, неверные capabilities или смонтированный docker.sock, чего с отдельным ядром VM добиться сложнееурок D6_docker
423coretoolsЧто делает флаг `--user uid:gid`запускает процесс контейнера от непривилегированного UID/GID вместо rootурок D6_docker
424basetoolsКаким сигналом и с каким кодом завершения убивает процесс превышение лимита `--memory`SIGKILL, код завершения 137 (128 + 9)урок D6_docker
425coretoolsЧто ограничивает `--cpus=1.5` техническиквоту CPU-контроллера cgroups, эквивалент 1.5 ядра процессорного времени вне зависимости от простаивающих ядер хостаурок D6_docker
426baselinuxВ каком кольце защиты x86 работает ядро Linuxв кольце 0 (пользовательские процессы — в кольце 3)урок D6_kernel
427baselinuxКакая инструкция делает системный вызов на x86-64`syscall` (на ARM — `svc`)урок D6_kernel
428corelinuxПочему системный вызовотдельная инструкция процессора, а не обычный `call`? — обычный `call` не меняет уровень привилегий CPU, а переход в кольцо 0 требует именно смены режима процессораурок D6_kernel
429baselinuxЧем `insmod` отличается от `modprobe``insmod` грузит модуль по прямому пути без разрешения зависимостей, `modprobe` находит модуль по имени и сам подгружает зависимостиурок D6_kernel
430baselinuxКакая команда показывает метаданные модуля, не загружая его`modinfo`урок D6_kernel
431corelinuxОткуда `modprobe` берёт карту зависимостей модулейиз файла `modules.dep`, который строит утилита `depmod`урок D6_kernel
432baselinuxКакой макрос ядрааналог `printf`? — `printk`урок D6_kernel
433baselinuxКоманда для чтения буфера сообщений ядра`dmesg`урок D6_kernel
434corelinuxСколько уровней важности у `printk` и какие крайние8 уровней, от `KERN_EMERG` (0) до `KERN_DEBUG` (7)урок D6_kernel
435corelinuxКто вызывает функции, зарегистрированные `module_init`/`module_exit`ядро автоматически, при `insmod`/`modprobe` и `rmmod` соответственно, а не сам программистурок D6_kernel
436baselinuxКак передать параметр модулю при загрузке`insmod modname.ko имя_параметра=значение`урок D6_kernel
437corelinuxЧто означает третий аргумент `module_param`, если он ненулевойпараметр публикуется файлом в `/sys/module/<имя>/parameters/<имя>` с заданными правами доступаурок D6_kernel
438baselinuxЧем отличается соглашение о содержимом файлов `/sys` от `/proc`в `/sys` одно значение на файл, в `/proc` файл может содержать несколько значений свободным текстомурок D6_kernel
439corelinuxОткуда `cat /proc/meminfo` берёт данныеядро формирует ответ на лету в момент чтения, это не файл на дискеурок D6_kernel
440baselinuxКакие 4 обработчика минимально нужны в `file_operations` символьного драйвера`.open`, `.read`, `.write`, `.release`урок D6_kernel
441corelinuxЧто означают major и minor номера устройстваmajor определяет драйвер, minor — конкретный экземпляр устройства внутри этого драйвераурок D6_kernel
442corelinuxСколько бит под major и minor в `dev_t`12 бит major, 20 бит minor (32-битное число целиком)урок D6_kernel
443corelinuxПочему в драйвере нельзя напрямую разыменовать указатель из user spaceэто чужое адресное пространство, страница может быть не загружена или указатель некорректен; прямое разыменование роняет ядро или блокируется SMAP/SMEPурок D6_kernel
444baselinuxВ какой функции `file_operations` реализуется `ioctl``.unlocked_ioctl`урок D6_kernel
445corelinuxЗачем коды ioctl-команд собирают через `_IO`/`_IOR`/`_IOW`/`_IOWR`, а не пишут произвольным числоммакросы кодируют направление передачи, магическое число драйвера и номер команды, снижая риск коллизии кодов между разными драйверамиурок D6_kernel
446baselinuxВо что компилируется `.dts` и какой утилитойв бинарный `.dtb`, утилитой `dtc`урок D6_kernel
447corelinuxЗачем device tree вообще нужен, если можно было бы прописать адреса регистров прямо в коде драйвераодин и тот же бинарник ядра работает на разных платах без пересборки под каждую; хардкод адресов требовал бы правки и компиляции ядра под каждую конкретную платуурок D6_kernel
448baselinuxЧто задаёт переменная `CROSS_COMPILE`префикс имени инструментов тулчейна (например `arm-linux-gnueabihf-`)урок D6_kernel
449corelinuxЧто произойдёт при запуске бинарника, собранного с неверным `-march`, на реальной платекрах «illegal instruction» (процессор не поддерживает часть использованных инструкций) или отказ сборкиурок D6_kernel
450corelinuxКакую проблему в embedded снимает статическая линковканесовпадение версии динамических библиотек (например glibc) на целевой плате с версией сборкиурок D6_kernel
451baselinuxВ каком порядке идёт цепочка загрузки платыBoot ROM → U-Boot → ядро+dtb → initramfs → переключение на настоящий rootfs → init (PID 1)урок D6_kernel
452corelinuxЗачем нужен initramfs, если ядро уже загружено и работаетядру для монтирования настоящего диска может понадобиться драйвер, который сам является модулем и ещё не загружен; initramfs даёт минимальную среду в памяти, чтобы его подгрузить перед переходом на постоянный rootfsурок D6_kernel
453baselinuxЧто делает `volatile` с точки зрения компиляторазаставляет реально выполнять каждое обращение к памяти по адресу, не кэшируя значение в регистре и не убирая повторные чтения/записиурок D6_kernel
454corelinuxДаёт ли `volatile` атомарность или барьер памяти между несколькими ядрами CPUнет, только запрещает компилятору кэшировать/убирать обращения к конкретной переменнойурок D6_kernel
455corelinuxКакая функция ядра отображает физический адрес MMIO-региона в виртуальный адрес для доступа как к указателю`ioremap()`урок D6_kernel
456deeplinuxЗачем нужен `wmb()` между записью DMA-дескриптора и записью в регистр запуска устройствабез барьера порядок этих двух записей, как его видит железо, не гарантирован, и устройство может прочитать старое содержимое дескриптора раньше, чем увидит новые данныеурок D6_kernel
457basegeneralСколько уроков покрывает план перед D713 файлов (`D1_algo`…`D6_docker`) по алгоритмам, Linux, C++, сетям, потокам, отладке, bash и ядруурок D7_mock
458coregeneralГде искать формулировки механизмов, если в уроке дня их не хватает`HR_BASE_deep.md`урок D7_mock
459basegeneralСколько часов длится каждый мок сегоднямок №1 (алгоритмы) 3 часа, мок №2 (системное) 2 часаурок D7_mock
460basegeneralСредняя сложность операций хеш-таблицыамортизированное O(1)урок D7_mock
461coregeneralПри каком load factor обычно триггерят rehash при open addressingоколо 0.7урок D7_mock
462coregeneralЗачем capacity берут степенью двойки`idx = hash & (cap - 1)` вместо дорогого деления по модулюурок D7_mock
463deepgeneralКаков стандартный max_load_factor по умолчанию у `std::unordered_map` в большинстве реализаций (libstdc++, MSVC)1.0урок D7_mock
464coregeneralКакую кучу держат для потокового top-K наибольших элементов размера kmin-heap размера kурок D7_mock
465coregeneralСредняя и худшая сложность nth_elementсреднее O(n), худшее O(n²)урок D7_mock
466deepgeneralКак получить top-K частых элементов за O(n) без log-множителяподсчёт хеш-таблицей O(n) + bucket sort по частоте (массив корзин размера n+1)урок D7_mock
467basegeneralСложность обнаружения цикла алгоритмом Флойда по времени и памятиO(n) время, O(1) памятьурок D7_mock
468coregeneralКак найти вход в цикл после первой встречи указателейсбросить один указатель на head, оба двигать по 1 шагу — встретятся на входеурок D7_mock
469basegeneralСложность BFS на сетке R×CO(R·C)урок D7_mock
470coregeneralПочему BFS гарантирует кратчайший путь по числу рёберFIFO-очередь раскрывает граф строго по слоям расстоянияурок D7_mock
471coregeneralВ какой момент нужно помечать узел посещённым, чтобы избежать повторных вставок в очередьв момент постановки в очередь, а не при извлеченииурок D7_mock
472deepgeneralКак обойти граф со весами рёбер только 0 и 1 за O(V+E) без полноценной Дейкстры0-1 BFS: deque, вес 0 — push_front, вес 1 — push_backурок D7_mock
473basegeneralВременная и пространственная сложность LCS/Edit DistanceO(n·m) и по времени, и по памятиурок D7_mock
474coregeneralТри операции, между которыми выбирают минимум в Edit Distanceзамена, удаление, вставкаурок D7_mock
475basegeneralСложность наивного LIS и продвинутого через tails[]O(n²) и O(n log n) соответственноурок D7_mock
476coregeneralПочему наивный O(n²) не проходит на N=100 000 за 2 секунды10¹⁰ операций, не укладывается в типичный лимит времени внутреннего тестаурок D7_mock
477coregeneralЧто хранит tails[k]минимальный возможный последний элемент возрастающей подпоследовательности длины k+1урок D7_mock
478deepgeneralКак называется классический приём построения tails[] с заменой через бинарный поискpatience sorting (раскладка карт по кучкам)урок D7_mock
479coregeneralsizeof той же структуры с полями в порядке char a; char c; int b8 байтурок D7_mock
480basegeneralЧто физически делает std::move во время выполненияничего: это static_cast к rvalue-ссылкеурок D7_mock
481coregeneralЗа какое время перемещается std::vector и что именно переноситсяO(1): три внутренних указателя (начало, конец данных, конец ёмкости)урок D7_mock
482coregeneralФлаг компилятора, включающий сразу ASAN и UBSAN-fsanitize=address,undefinedурок D7_mock
483basegeneralОткуда взялись коды возврата 137 и 139128 + номер сигнала: 137 = SIGKILL(9), 139 = SIGSEGV(11)урок D7_mock
484coregeneralКакие два сигнала нельзя перехватить или заблокироватьSIGKILL (9) и SIGSTOP (19)урок D7_mock
485basegeneralСостояние зомби-процесса в выводе psZурок D7_mock
486coregeneralЧто именно занимает зомби-процесспамять или что-то другое? — слот в таблице процессов, не памятьурок D7_mock
487basegeneralЖёсткий лимит select и его значениеFD_SETSIZE, 1024урок D7_mock
488coregeneralСложность epoll_wait на одно готовое событие против select/poll на весь наборepoll_wait O(1) на событие; select/poll O(n) на весь набор при каждом вызовеурок D7_mock
489basegeneralРазница MAP_SHARED и MAP_PRIVATEMAP_SHARED: изменения видны другим и попадают в файл; MAP_PRIVATE: copy-on-write, изменения приватныурок D7_mock
490basegeneralДлина Ethernet-заголовка и длина заголовка с VLAN-тегом14 байт без тега, 18 байт с тегом 802.1Qурок D7_mock
491coregeneralЗначение TPID и число бит поля VIDTPID = 0x8100, VID = 12 бит (диапазон 1–4094)урок D7_mock
492basegeneralСколько хостов доступно в подсети /26 и как выглядит маска в десятичном виде62 хоста, 255.255.255.192урок D7_mock
493coregeneralСеть, broadcast и диапазон хостов для 10.0.1.130/26сеть 10.0.1.128, broadcast 10.0.1.191, хосты 129–190урок D7_mock
494basegeneralНа сколько уменьшается TTL на каждом маршрутизаторе и какой ICMP-тип шлётся при обнулениина 1; ICMP Time Exceeded, тип 11урок D7_mock
495coregeneralС какого TTL traceroute начинает зондирование и почему именно так восстанавливает маршрутс TTL=1, наращивая на 1 — каждый пакет умирает на очередном хопе и раскрывает его адресурок D7_mock
496basegeneralСколько сегментов в three-way handshake и в полном закрытии соединения3 (SYN, SYN+ACK, ACK) и 4 (FIN, ACK, FIN, ACK)урок D7_mock
497deepgeneralСколько секунд реально длится TIME_WAIT в Linux60 секунд (константа TCP_TIMEWAIT_LEN), не совпадает с номинальными 4 минутами по RFC 793урок D7_mock
498basegeneralСколько вопросов работодателю стоит подготовить заранее на такое интервью8, каждый — конкретный, не риторическийурок D7_mock
499coregeneralКогда обычно задают вопросы работодателю на техническом скринингев конце интервью, по приглашению интервьюераурок D7_mock
500basegeneralИз каких 4 частей состоит структура STAR для ответа про опытSituation, Task, Action, Resultурок D7_mock
501coregeneralКак правильно называть пробел в алгоритмах на собеседованиискрывать или называть прямо? — называть прямо: конкретная тема добирается сейчас, с указанием, что уже понятно (сложность, инварианты)урок D7_mock
502basealgoСколько байт меняет местами `bswap32`4задача 01_bits
503corealgoЧто делает `x & (x - 1)`гасит младший единичный бит `x`задача 01_bits
504corealgoСколько итераций цикла `popcount32` на `x = 0xFFFFFFFF`32 (по числу единичных бит)задача 01_bits
505deepalgoПочему `1u << 31` пишут с суффиксом `u`, а не как `int`сдвиг знакового `int` взадача 01_bits
506basealgoКакой порядок байт использует сеть для многобайтовых полейnetwork byte orderзадача 01_bits
507basealgoВо сколько раз быстрее идёт `fast` относительно `slow` в паре двух указателейв 2 разазадача 02_list
508corealgoПочему рекурсивный разворот списка не годится под требование O(1) памятикаждыйзадача 02_list
509corealgoНа чём основано доказательство, что `fast` догонит `slow` при циклевнутри циклазадача 02_list
510basealgoСколько дополнительных указателей нужно для итеративного разворота списка3задача 02_list
511basealgoСложность `push`/`pop` кольцевого буфераO(1)задача 03_ring
512corealgoКак отличить пустой буфер от полного при `head_ == tail_`хранить отдельныйзадача 03_ring
513corealgoЧем `delete[]` отличается от `delete` для массива, выделенного `new[]``delete`задача 03_ring
514basealgoКакое условие делает `push` дешевле, чем `% capacity_` на каждый вызовзадача 03_ring
515basenetМинимальная длина IPv4-заголовка без опций20 байтзадача 04_ipv4
516basenetКод `protocol` для TCP / UDP / ICMP6 / 17 / 1задача 04_ipv4
517corenetВ каком порядке лежат `src_ip`/`dst_ip` в буфере согласно заданию«как на проводе»,задача 04_ipv4
518corenetПочему `reinterpret_cast` буфера в `Ipv4Header*`UB? — нет гарантии выравниваниязадача 04_ipv4
519deepnetЧему должна быть равна сумма в доп. коде по `ihl*4` байтам заголовка (вместе с полемзадача 04_ipv4
520basealgoСложность наивного DP-решения LISO(n²)задача 05_lis
521corealgoСложность решения через `tails` + бинарный поискO(n log n)задача 05_lis
522deepalgoПочему для строгого возрастания нужен `lower_bound`, а не `upper_bound`задача 05_lis
523basethreadsКаким флагом компилятора включается ThreadSanitizer`-fsanitize=thread`задача 06_threads
524basethreadsЧто бросает `push` после `close()``std::runtime_error`задача 06_threads
525corethreadsДолжен ли `size()` быть потокобезопасным в этой задачеда, его тоже вызывают из другого потока и он тоже под захватом мьютексазадача 06_threads
526corethreadsЧто происходит с ждущими потоками при `close()`все разблокируются (никакого вечного `wait`)задача 06_threads
527corethreadsПочему `while` вокруг `wait`, а не `if`из-за spurious wakeup: `wait` может вернуться без вызова notifyзадача 06_threads
528corethreadsЧем опасен один `condition_variable` на два разных предиката вместе с `notify_one`можно разбудить не тот поток, а нужный останется ждатьзадача 06_threads
529basethreadsКакой командой запускается проверка задачи 06`python3 grade.py 06`задача 06_threads
530corethreadsПочему TSan может не показать гонку при одном прогоне, даже если она есть в кодеон ловит гонку по факту конкретной раскладки потоков в этом запуске, а не статическим анализомзадача 06_threads
531baselinuxНа каком адресе и с каким флагом сокета должен слушать сервер127.0.0.1, `SO_REUSEADDR`задача 07_epoll
532baselinuxСколько одновременных соединений сервер должен держать минимум64задача 07_epoll
533corelinuxПо какому событию сервер закрывает соединение с клиентомпо EOF со стороны клиентазадача 07_epoll
534baselinuxЧто означает `EAGAIN` на неблокирующем сокетене ошибка, сигнал «данных пока нет, попробуй позже»задача 07_epoll
535corelinuxВ чём разница между LT и ET режимами epollLT сообщает о готовности, пока данные остаются в буфере; ET — один раз, при переходе «не готов → готов»задача 07_epoll
536deeplinuxКакая асимптотика у `epoll_wait` относительно select/pollO(1) на готовое событие против O(n) на весь набор у select/pollзадача 07_epoll
537baselinuxКаким кодом возврата должен завершаться сервер по SIGTERM/SIGINT0задача 07_epoll
538corelinuxЧто возвращает `epoll_wait`, если его прервал сигнал-1 с `errno == EINTR`, не ошибка выполнениязадача 07_epoll
539baselinuxСколько соединений открывает тест `grade.py 07`3задача 07_epoll
540baselinuxКаким сигналом тест проверяет корректное завершение сервераSIGTERMзадача 07_epoll
541baselinuxСколько строк TOP выводится, если уникальных IP меньше трёхстолько, сколько есть уникальных IPзадача 08_bash
542baselinuxЧто печатает скрипт для пустого файла`TOTAL 0`, `5XX 0`, без строк TOPзадача 08_bash
543corelinuxПо какому полю строки лога определяется IPпо первому полюзадача 08_bash
544corelinuxПочему `while read line` в bash медленный на миллионе строккаждая итерация — это работа интерпретатора bash, а вызов внешних утилит из цикла — ещё и `fork+exec` на строкузадача 08_bash
545corelinuxЧто даёт связка awk + sort вместо построчного циклаодин проход по файлу целиком специализированным бинарником вместо миллиона запусков процессовзадача 08_bash
546deeplinuxПо какому полю сортируется список IP при равенстве числа запросовпо возрастанию строки IP (вторичный ключ сортировки)задача 08_bash
547baselinuxЧто делает `set -e`останавливает скрипт при первой команде с ненулевым кодом возвратазадача 08_bash
548corelinuxВ каких позициях `set -e` не останавливает скрипт при ошибке командыв условиях `if`/`while`/`until`, слева/справа от `&&`/`||`, после `!`задача 08_bash
549corelinuxПочему `local var=$(cmd)` не ловится `set -e`, если `cmd` упалитоговый код возврата строки — это код возврата `local`, а он 0 даже при упавшей подстановке внутризадача 08_bash
550corelinuxЗачем `set -o pipefail` отдельно от `set -e`без него код возврата конвейера — это код возврата только последней команды, падение команды посередине конвейера остаётся незамеченнымзадача 08_bash
551baselinuxКаким кодом возврата должен завершаться `solution.sh` при успехе0задача 08_bash
552corelinuxЧто именно сверяет `grade.py 08` с эталономточное совпадение вывода (все четыре строки) на фикстуре и на большом логезадача 08_bash
553corelinuxКакие два санитайзера должны не давать сообщений после починкиASan и UBSan (`-fsanitize=address,undefined`)задача 09_gdb
554baselinuxЧто даёт флаг `-g` при сборке для gdbотладочную информацию (DWARF): соответствие адресов строкам, именам и типам переменныхзадача 09_gdb
555corelinuxПочему для отладки собирают с `-O0`, а не с `-O2`оптимизатор переставляет/удаляет инструкции и переиспользует регистры, из-за чего строки и значения в отладчике перестают однозначно соответствовать исходникузадача 09_gdb
556corelinuxЧто ловит ASan из перечисленного: выход за границы, use-after-free, двойное освобождениевсе три, в момент обращения к памяти, а не постфактумзадача 09_gdb
557deeplinuxЧто именно ловит UBSan, в отличие от ASanнеопределённое поведение по стандарту C (знаковое переполнение, сдвиг за пределы разрядности), а не ошибки работы с памятьюзадача 09_gdb
558baselinuxКакая команда gdb показывает цепочку вызовов до краша`bt`задача 09_gdb
559corelinuxЧем `watch var` отличается от обычного `break`останавливает выполнение при каждом изменении значения переменной, а не в заданной точке кодазадача 09_gdb
560corelinuxЗачем нужен `frame N` после `bt`переключает контекст `print`/`info locals` на конкретный кадр стека, чтобы смотреть переменные не только текущей функциизадача 09_gdb
561baselinuxСколько входов прогоняет `grade.py 09`5задача 09_gdb
562baselinuxКаким компилятором собирается `crash.c` на проверкеgcc (компилятор C)задача 09_gdb
563basealgoСколько времени закладывается на задачу 101,5–2,5 часа со ступенямизадача 10_hash
564basealgoКакой командой проверяется решение`python3 grade.py 10`задача 10_hash
565deepalgoГде в реальных устройствах используется похожая структуратаблицы MAC-адресов (FDB) коммутатора, кэши сессий — открытая адресация с жёсткими ограничениями по памятизадача 10_hash
566basealgoПочему `hash & (cap-1)` эквивалентно `hash % cap`только если `cap` — степень двойки: `cap-1` в двоичном виде — маска из всех младших бит, AND с ней даёт тот же результат, что остаток от делениязадача 10_hash
567basealgoПример: `cap=8` (маска `0b111`), `hash=19` (`0b10011`). Индекс`19 & 7 = 3`задача 10_hash
568corealgoСреднее число проб при удачном поиске, load factor 0.7≈2,2 (формула Кнута `0.5·(1+1/(1-0.7))`)задача 10_hash
569corealgoТо же при load factor 0.9≈5,5 — рост почти в 2,5 раза от значения при 0.7задача 10_hash
570deepalgoСреднее число проб при НЕудачном поиске, load factor 0.9≈50,5 (`0.5·(1+1/(1-0.9)²)`) — на порядок хуже удачного поисказадача 10_hash
571corealgoПочему `EMPTY` вместо `TOMBSTONE` после удаления ломает поиск чужих ключейпоиск идёт по цепочке проб до первой `EMPTY`; если такая ячейка появляется раньше искомого ключа, элементы за ней в этой цепочке становятся ненаходимыми, хотя физически на местезадача 10_hash
572basealgoСколько ключей вставляет тест на кластеризацию и какие они512 ключей, кратных 16задача 10_hash
573basealgoЗа какое время должны пройти 100 000 вставокбыстрее 2 секундзадача 10_hash
574basealgoКакой порог load factor держит таблица≤ 0.7задача 10_hash
575basealgoМинимальная ёмкость таблицы по умолчанию16, степень двойкизадача 10_hash
576basealgoИндексы детей и родителя в max-heap на массиведети `2i+1`, `2i+2`; родитель `(i-1)/2`задача 11_heap
577basealgoЧто за 2 секунды должны выполниться на 3 000 000 элементов`heapify` и `kth_largest` с `k=1000` (по отдельности)задача 11_heap
578basealgoКакой ключевой запрет на реализацию `heapify`нельзя строить через `push` в цикле, только bottom-up за O(n)задача 11_heap
579basealgoСложность доступа к максимуму (`top`)O(1), максимум всегда в корне по инварианту кучизадача 11_heap
580basealgoСложность одного `sift-up`/`sift-down` от произвольного узлаO(log n) — путь ограничен высотой деревазадача 11_heap
581corealgoЧто сравнивается на каждом шаге `sift-down`узел с обоими детьми; меняется местами с бОльшим из них, если тот больше узлазадача 11_heap
582corealgoЗа какое время строится куча через n последовательных `push`O(n log n): сумма `Σ log₂(i)` по всем вставкам ≈ `n log₂ n`задача 11_heap
583corealgoЗа какое время строится куча через bottom-up heapifyO(n): работа в узле пропорциональна его высоте `h`, а ряд `Σ h/2^h` сходится к константе, а не растёт с `n`задача 11_heap
584deepalgoС какого индекса начинается bottom-up heapify и в какую сторону идётс последнего нелистового узла `n/2 - 1`, к корню (индекс 0)задача 11_heap
585corealgoВо сколько раз push-цикл медленнее bottom-up heapify по числу сравнений при n=3 000 000примерно на порядок (~10 раз): `log₂(3·10⁶) ≈ 21,5` против константы ~2 у bottom-upзадача 11_heap
586basealgoСложность `kth_largest`/`top_k` через полную кучуO(n + k log n): O(n) на heapify плюс k раз pop по O(log n)задача 11_heap
587corealgoКогда используют min-heap размера k вместо полной кучи на весь массивна потоке данных, который не помещается в память: min-heap размера k хранит только k текущих кандидатов, сложность O(n log k), память O(k)задача 11_heap
588corealgoЧем `std::nth_element` отличается от кучи для top-Kв среднем O(n), даёт частичный порядок вокруг k-го элемента, но не отсортированный список и без гарантии худшего случая; куча всегда O(n + k log n) и отдаёт элементы по убыванию через popзадача 11_heap
589basealgoЧто возвращает функция при `src == dst`0задача 12_dijkstra
590basealgoЧто возвращает функция при недостижимости `dst`-1задача 12_dijkstra
591basealgoВ каком типе суммируются веса и почему не `int``long long`; веса суммируются до 10^9, `int` может переполниться на длинном путизадача 12_dijkstra
592basealgoСложность наивной Дейкстры (перебор минимума по массиву)O(V²)задача 12_dijkstra
593basealgoСложность Дейкстры с бинарной кучейO((V+E) log V)задача 12_dijkstra
594corealgoПри V=100 000, E=200 000, почему наивный O(V²) не укладывается в 2 секунды100 000² = 10^10 операций против ≈5·10^6 у варианта с кучей — разница на 3–4 порядказадача 12_dijkstra
595corealgoЧто означает «ленивое удаление» устаревших записей в очередивместо decrease-key при каждом улучшении расстояния в кучу пушится новая пара (dist, v); при извлечении запись с `d != dist[v]` пропускается как устаревшаязадача 12_dijkstra
596deepalgoПочему `std::priority_queue` не используют с decrease-key напрямуюу контейнера-адаптера нет интерфейса для обновления произвольного элемента за O(log n); дешевле каждый раз пушить новую запись и лениво отбрасывать устаревшие при popзадача 12_dijkstra
597corealgoПочему Дейкстра ломается на отрицательных рёбрахалгоритм считает расстояние до извлечённой из очереди вершины окончательным; отрицательное ребро может позже уменьшить это расстояние, но вершина уже не пересматриваетсязадача 12_dijkstra
598basealgoКакой алгоритм нужен при отрицательных весах без отрицательных цикловБеллман-Форд, O(V·E)задача 12_dijkstra
599basealgoПочему self-loop с w≥0 не требует отдельной обработкидобавление неотрицательного веса к текущему расстоянию никогда не уменьшает его, значит такое ребро никогда не выигрывает релаксациюзадача 12_dijkstra
600basenetСколько узлов даёт /24254задача 13_subnet
601basenetСколько узлов даёт /2662задача 13_subnet
602basenetСколько узлов даёт /302задача 13_subnet
603basenetСеть, broadcast и диапазон узлов для `10.0.1.130/26`сеть `10.0.1.128`, broadcast `10.0.1.191`, узлы `129..190`задача 13_subnet
604basenetФормула маски для префикса p (0<p≤32)`0xFFFFFFFF << (32-p)`; для p=0 маска = 0 отдельным случаем (сдвиг на 32 — UB)задача 13_subnet
605basenetКак получить network и broadcast из ip и mask`network = ip & mask`, `broadcast = network | ~mask`задача 13_subnet
606corenetФормула host_count для prefix ≤ 30`2^(32-prefix) - 2`задача 13_subnet
607corenetПочему /31исключение и даёт 2 узла вместо 0 по общей формуле? — RFC 3021: у канала точка-точка ровно 2 узла, broadcast не нужен, поэтому оба адреса 2-адресного блока отдаются под хосты вместо потери половины блоказадача 13_subnet
608corenetЧто возвращает subnet_of для /32network=broadcast=first_host=last_host=ip, host_count=1 (host route/loopback)задача 13_subnet
609corenetФормула `prefix_for_hosts(h)``32 - ceil(log2(h+2))`, из условия `2^(32-prefix) >= h+2`задача 13_subnet
610deepnetПочему `prefix_for_hosts(63) = 25`, а не 26, хотя 62 меньше 63 всего на 1/26 даёт только 62 узла, этого не хватает даже на 1 хост меньше требуемых 63; нужно расширить хостовую часть на 1 бит — /25 с 126 узламизадача 13_subnet