Обновить
64K+

Системное программирование *

Обеспечение работы прикладного ПО

135,96
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Положил http:// в строку, и ассемблер молча собрал 0 байт

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели533

Мой ассемблер резал исходник построчными правилами: срезал комментарий, искал двоеточие, делил по запятым. Я заменил это одним проходом с состоянием и попутно проверил, нельзя ли было обойтись заплатками.
Нельзя: вторая заплатка ломает то, что починила первая.

Куда делись байты?

Новости

Я хотел сделать быстрый сжатый диск для macOS. А в итоге научился не верить собственным бенчмаркам

Уровень сложностиСредний
Время на прочтение14 мин
Охват и читатели3.2K

Полгода назад я начал писать сжатую файловую систему для macOS. Идея была довольно простой. В macOS уже существует decmpfs — встроенный механизм прозрачного сжатия файлов. Приложение продолжает видеть обычный файл, хотя физически его содержимое может храниться в сжатом виде. Но у этого подхода есть неприятное для моей задачи свойство: после изменения файла сжатие может исчезнуть.

Например, можно сжать node_modules, получить приличную экономию места, потом запустить сборку — часть файлов перезапишется, распакуется, и каталог постепенно снова начнёт занимать почти исходный объём. Мне хотелось другого поведения: если файл лежит на сжатом диске, он должен оставаться сжатым независимо от того, сколько раз его переписывали.

Читать далее

Один BPF‑объект, два верификатора, разные вердикты: разбираемся, кто прав

Уровень сложностиСложный
Время на прочтение6 мин
Охват и читатели7.1K

eBPF‑программы проходят статический анализ до загрузки в ядро Linux. Верификатор должен доказать, что программа не выходит за границы памяти, не работает с неверными указателями и не нарушает ограничений, без которых код нельзя безопасно выполнять в ядре. Но если прогнать один объект через разные верификаторы, картина меняется. Один анализатор принимает BPF‑объект, а другой считает его небезопасным и запрещает загрузку.

Именно так и вышло...

Статья для тех, кто исследует eBPF и статический анализ. Ошибку в программе мы искать не будем — её там нет. Нас интересует другое: почему два верификатора расходятся в выводах.

Читать далее

Как на ровном месте сэкономить 1000+ ядер, или Куда на самом деле уходили 80% CPU

Уровень сложностиСредний
Время на прочтение18 мин
Охват и читатели12K

Всем привет, меня зовут Миша, и я бэкенд‑разработчик в платформе Яндекс Еды. Я уже рассказывал, как мы анализировали наш PHP‑монолит и вынесли из него процессинг заказов, и с тех пор роль этого легаси заметно уменьшилась. Заодно туда стали писать гораздо меньше нового кода, релизы стали реже, и он спокойненько себе работал, не привлекая лишнего внимания. 

Так оно бы и продолжалось, но тут случилась повышенная нагрузка и необходимость зарезервировать побольше мощностей для беспроблемной обработки повышенного спроса. Монолит справился на отлично, но самое интересное случилось потом: возвращая выделение ресурсов к прежним значениям, я случайно обратил внимание, что RPS в пиковые вечерние часы как‑то подозрительно совпадает с количеством ядер CPU, выделенных на весь монолит.

Количество выделенных ядер, конечно, ещё ничего не означает, поэтому я полез смотреть реальное потребление процессорного времени, сложив CPU usage по всем подам. С помощью нехитрой арифметики я обнаружил, что 100% загрузки одного ядра приходятся на 2,5 RPS. Какое‑то время я находился в состоянии глубокого изумления, после чего решил, что это никуда не годится, и отправился в увлекательное приключение на 20 минут. 

Немного спойлеров: дело оказалось далеко не только в PHP. 

Читать далее

Задача взяла lock() и остановила весь рантайм: пять ошибок с блокировками в async Rust

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели8.1K

В async Rust одна неудачно взятая блокировка может остановить весь рантайм — вместе с таймерами и задачами, которые должны были её отпустить. Разберём пять типичных ловушек с Mutex и RwLock и посмотрим, почему привычки из синхронного кода здесь дают сбой.

Читать разбор

Гетерогенный lookup: как одна фича C++ сделала драйвер проще, чище и быстрее, чем на C

Уровень сложностиСредний
Время на прочтение14 мин
Охват и читатели13K

Нужен драйвер — пиши на C. Нужно что-то рядом с ядром — тем более пиши на C. В низкоуровневой разработке этот подход воспринимается почти как правило по умолчанию. Но иногда задача требует большей выразительности, больше удобной работы со структурами данных и дополнительных гарантий со стороны языка.

Меня зовут Женя Ерохин, у меня около 15 лет опыта разработки драйверов на C++ под macOS. Сейчас я старший разработчик в Kaspersky Lab, занимаюсь операционной системой KasperskyOS. Много всего создал в ее микроядре, а теперь знакомлю нашу ось со всяким железом на мобильных устройствах.

Под катом я покажу, как мы использовали C++ при разработке драйвера для микроядерной ОС. В том числе разберу гетерогенный lookup — возможность выполнять поиск по разным типам аргументов без лишних преобразований. На практике такая фича хорошо показывает, почему C++ может быть полезен даже там, где обычно ждут C. Я расскажу, почему драйверы на C++ для микроядерной ОС — вполне рабочее инженерное решение. Покажу, где именно плюсы помогают писать более аккуратный и надежный код, как они упрощают работу со структурами данных и почему в нашей задаче такой выбор оказался естественным.

Читать далее

Go 1.27 подменил движок encoding/json. Замерил три конфигурации и нашёл, где стало хуже

Уровень сложностиСложный
Время на прочтение9 мин
Охват и читатели7.7K

В Go 1.27 encoding/json стал тонким слоем поверх нового encoding/json/v2. Собрал тулчейн из исходников, прогнал один и тот же код в четырёх конфигурациях и разобрался, почему разбор в any стал медленнее в полтора раза.

Читать далее

Кроссплатформенный мониторинг аппаратных ресурсов на C++ и Python: библиотека hardware_monitor_cpp

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели10K

После того как мой пет-проект случайно «выстрелил» на Reddit, я решил, что пора поделиться так же и своей кроссплатформенной библиотекой на C++20 для мониторинга железа, с нативной поддержкой Python.

Рассказываю историю создания hardware_monitor_cpp: как избавиться от лишних зависимостей, получить адекватную статистику swap-файла под Windows и macOS, упаковать все в удобное C++ API, а заодно получить готовую консольную утилиту с визуализацией графиков прямо в терминале.

Читать далее

Ускоряем eMMC в 5 раз для процессора AllWinner H6 на примере Repka Pi 4

Уровень сложностиСложный
Время на прочтение40 мин
Охват и читатели9.2K

Когда речь заходит о производительности одноплатных компьютеров, чаще всего внимание уделяют процессору, объему оперативной памяти или системе охлаждения. Однако в реальных сценариях использования скорость работы системы очень сильно зависит от накопителя. Именно накопитель влияет на время загрузки ОС, скорость установки пакетов, работу Docker-контейнеров, баз данных, браузера и общую отзывчивость системы.

Читать далее

Vodka, или как мы планируем заменить Wine

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели103K

Всем привет!

В этой статье я расскажу, почему у нас действительно получится заменить Wine, и что мы для этого делаем.

Читать далее

Утёкшие горутины теперь ищет сборщик мусора. Проверил, где он молчит

Уровень сложностиСложный
Время на прочтение9 мин
Охват и читатели8.7K

В Go 1.27 профиль goroutineleak вышел из эксперимента: рантайм научился доказывать, что горутину уже некому разбудить. Собрал тулчейн из исходников, прогнал десяток программ и замерил, что детектор находит, где он молчит и во что обходится вызов.

Читать далее

Как я писал сервер и нечаянно пробил 1М RPS

Уровень сложностиСложный
Время на прочтение4 мин
Охват и читатели7.1K

История об асинхронном серверном EAV‑движке, epoll'е, битовых полях и шардинге, который не смог.

Это должен был быть очередной вялотекущий рутинный проект TCP сервера, listen socket, пул потоков, пул соединений, СУБД и синхронизация всего этого добра. Сказать, что скучно — ничего не сказать.

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

Этот сервер не стоит миллион рублей. Это обычная облачная виртуалка: 4 vCPU, 4.5 ГБ RAM, AlmaLinux 8. И она выдала 1М+ RPS на пакетах по 4 байта. Сервер стоял на 40% CPU.

Я прогнал тесты ещё несколько раз — результат не менялся. Сравнил счетчик сервера со счетчиками эмуляторов. Сервер стабильно держал 1М с копейками. Запросил информацию по производительности NGINX. Да ладно!?

Читать далее

Rust 1.98.0: алгебраические методы для f32,f64, исправление взаимодействия между ManuallyDrop и Box

Время на прочтение3 мин
Охват и читатели6.7K

Команда Rust рада объявить о выходе новой версии Rust — 1.98.0. Rust — это язык программирования, который помогает каждому создавать надёжное и эффективное программное обеспечение.

Если у вас уже установлена предыдущая версия Rust через rustup, вы можете получить 1.98.0 командой:

$ rustup update stable

Если Rust ещё не установлен, вы можете получить rustup на соответствующей странице нашего сайта и ознакомиться с подробными release notes для 1.98.0.

Если вы хотите помочь нам, тестируя будущие релизы, рассмотрите возможность переключиться локально на beta-канал (rustup default beta) или nightly-канал (rustup default nightly). Пожалуйста, сообщайте о любых обнаруженных ошибках!

Читать далее

Ближайшие события

Написал свой ассемблер, чтобы понять, откуда берётся ff010113. Почти половину моей программы он выдумывает

Уровень сложностиСложный
Время на прочтение13 мин
Охват и читатели16K

Написал свой ассемблер, чтобы понять, откуда в дизассемблере берётся ff010113. Заодно посчитал, сколько строк моей программы процессор вообще не умеет исполнять, и проверил это на четырёх наборах команд, включая живой ESP32 на столе. На кристалле первая программа серии сломалась: она пишет в UART быстрее, чем провод успевает передавать, и в эмуляторе этого не видно.

Что сказала плата?

Компилятор удалил вашу проверку на переполнение. И он прав

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели7.4K

Проверка на переполнение есть в коде, проходит ревью и работает в отладочной сборке — а после оптимизации исчезает из бинарника. Разберём, почему компилятор имеет на это полное право, как неопределённое поведение влияет на указатели, память и проверки, и чем ловить такие ошибки до того, как они проявятся в рабочей среде.

Разобраться в UB

Написание ядра ОС с нуля. Часть 3 — Пропуск в высшую лигу

Уровень сложностиСложный
Время на прочтение15 мин
Охват и читатели12K

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

В этой статье мы перейдем в полноценный, современный C++23, и все еще останемся на голом железе. Настроим страницы, GDT и перейдем в 64-битный режим.

Читать далее

Хороший код, минусов нет: встреча «плюсовиков» YADRO и C++ Russia

Уровень сложностиПростой
Время на прочтение2 мин
Охват и читатели9.4K

У ДДТ был свой ответ на вопрос «что такое осень». И даже не один. У C++-разработчиков — свой: это когда вместо листьев разлетаются корутины, вместо дождя — потоки событий, а select и poll внезапно становятся отличной темой для вечерней встречи. 10 сентября в 18:30 проверим эту версию на мероприятии YADRO и C++ Russia. 

В программе — два технических доклада от разработчиков «Лаборатории Касперского» и YADRO. Перед выступлениями Александр Иргер, эксперт по разработке ПО в области телекоммуникаций, расскажет о планах московского сообщества «плюсовиков» и о том, над какими задачами работают сотни разработчиков на С++ в YADRO. Чтобы присоединиться к встрече в любом формате, пожалуйста, зарегистрируйтесь заранее.

Читать далее

Ветвление оказалось дороже лишней работы: как GitHub разогнал обработку исходного кода до 45 ГиБ/с

Уровень сложностиСложный
Время на прочтение20 мин
Охват и читатели6.8K

GitHub прогоняет регистровую свёртку по каждому байту кода, который попадает в индекс Blackbird, поэтому даже базовая текстовая операция быстро превращается в вопрос производительности. Инженеры обнаружили, что ранний выход из цикла мешает LLVM векторизовать обработку: после удаления break скорость на ASCII выросла до 45+ ГиБ/с на одном ядре. Дальше они пошли ещё глубже и научились сворачивать Unicode прямо в байтовом представлении UTF-8, обходясь без полноценного декодирования символов.

Изучить оптимизацию

Go 1.27: generic-методы, которых не видит reflect

Время на прочтение4 мин
Охват и читатели9.9K

Go 1.27 (на момент написания rc3, финал обещают в августе) приносит generic-методы: метод наконец может объявить собственный тип-параметр. Взял golang:1.27rc3 в Docker и проверил, где у фичи границы. reflect новый метод не видит вообще, хотя go/types на том же типе показывает его в method set — метод доступен компилятору и недоступен через рефлексию, поэтому ни один интерфейс им не удовлетворить, а валидаторы и ORM его не заметят. Померил цену: на 200 инстанцирований с запретом инлайна бинарь с методом больше на 2264 байта, из которых 2000 приходятся на длину имён символов, а не на код; по времени разницы нет — это generic-функция с ресивером и тот же gcshape-стенсилинг. А вот что реально заметит прод на апгрейде: GODEBUG=asynctimerchan=1 теперь роняет процесс до main, encoding/json v1 на движке v2 меняет байты вывода на битом UTF-8, json.RawMessage обзавёлся String() и поменял ваши логи. Плюс замеры нового аллокатора: минус четверть времени на new(16 B) и ноль на 128 байтах.

Читать дальше →

Иммутабельные операционные системы: эволюция, архитектуры и опыт РЕД СОФТ

Время на прочтение7 мин
Охват и читатели5.4K

Привет, Хабр. Меня зовут Кирилл Балашов, я инженер-программист компании РЕД СОФТ. Мы в РЕД СОФТ изучили подходы к иммутабельным, или же неизменяемым операционным системам, сравнили полностью иммутабельную модель и гибридную, и выбрали гибрид для неизменяемого варианта РЕД ОС 8. Сегодня я расскажу, почему такая операционка удобнее для решения определённого круга enterprise-задач и покажу, как она работает.

Читать далее
1
23 ...