Опубликовано

Новинка: “Алгоритмы на языке Go”

Алгоритмы на языке Go

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

Для Go-разработчиков

.

Современный бэкенд от API баз данных до вставок на TypeScript

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

В этой книге рассмотрены алгоритмы и их реализации на языке Go, относящиеся к следующим предметным областям:

  • Понятие о структурах данных
  • Поиск, сортировка и сжатие данных
  • Алгоритмы достижения консенсуса
  • Алгоритмы для распределенных систем
  • Криптографические алгоритмы
  • Создание и защита цифровых подписей

Артём Михайлов — опытный программист, специалист по высоконагруженным системам, в настоящее время работает в стартапе, занятым высоконагруженными приложениями, ранее работал в научном кластере «Иннополис», компаниях «МТС» и «Тензор». Постоянно делится своим опытом на Хабре, пишет статьи для корпоративных блогов «Росатом», «ВТБ», «VK», «IBS», «OTUS».

Книгу “Алгоритмы на языке Go” можно купить в нашем интенет-магазине.

Предисловие. 7

– Глава 1 –
Алгоритмы, сложности и структуры данных. 9

Структуры данных: массивы, списки, хеш-таблицы, деревья. 11

Массивы.. 11

Связные списки. 13

Хеш-таблицы.. 14

Деревья. 15

Структуры данных в Go. 18

Массивы и срезы в Go. 18

Связные списки в Go. 20

Хеш-таблицы (отображения) в Go. 22

Деревья в Go. 24

– Глава 2 –
Поиск, сортировка и сжатие данных. 28

Алгоритмы поиска. 28

Двоичный поиск. 28

Интерполяционный поиск. 30

Поиск Фибоначчи. 31

Алгоритмы сортировки. 33

Быстрая сортировка. 34

Сортировка слиянием.. 36

Пирамидальная сортировка. 37

Поразрядная сортировка. 39

Алгоритмы сжатия данных. 42

Алгоритм Хаффмана. 42

Алгоритм LZW… 45

Алгоритм Brotli 48

Алгоритм Snappy. 50

Алгоритмы поиска подстроки. 52

Алгоритм Кнута–Морриса–Пратта. 52

Алгоритм Бойера–Мура. 54

Алгоритм Рабина–Карпа. 57

Алгоритмы кратчайших путей. 59

Алгоритм Дейкстры.. 60

Алгоритм Беллмана–Форда. 65

Алгоритм A*: эвристический поиск. 68

Примеры использования алгоритмов кратчайшего пути. 72

Сравнение алгоритмов кратчайших путей. 73

Потоки в сетях. 73

Сети и потоки. 73

Задача о максимальном потоке: найти поток наибольшей величины.. 74

Алгоритм Форда-Фалкерсона. 74

Алгоритм Диница. 76

Применения. 79

Теорема о максимальном потоке и минимальном разрезе. 79

– Глава 3 –
Распределенные алгоритмы.. 81

Что делает распределенные системы сложными?. 82

CAP-теорема: фундаментальный компромисс. 83

Три свойства. 84

Теорема. 84

Почему нельзя всё сразу?. 84

А что с CA?. 85

Примеры систем.. 85

Критика и уточнения. 86

Модели согласованности. 86

Строгая согласованность (Strong Consistency / Linearizability) 86

Последовательная согласованность (Sequential Consistency) 87

Причинная согласованность (Causal Consistency) 87

Read Your Writes (прочитайте ваши записи) 87

Eventual Consistency (согласованность в конечном счете) 88

Eventual Consistency. 88

Разрешение конфликтов. 90

Кворумы: настраиваемая согласованность. 93

Окно несогласованности. 94

Практические паттерны.. 94

Saga — для распределенных транзакций. 94

Outbox — для надежной публикации событий. 96

Idempotency key — для идемпотентных операций. 97

Circuit breaker — для устойчивости. 98

– Глава 4 –
Алгоритмы консенсуса. 101

Что такое консенсус и зачем он нужен?. 101

Формальное определение. 102

Практические применения. 102

Невозможность: почему это так сложно?. 103

Проблема двух генералов. 103

Почему это невозможно?. 103

FLP-невозможность. 104

Интуиция доказательства. 105

Как жить с невозможностью?. 105

Paxos: алгоритм, изменивший всё. 106

Одна инстанция Paxos. 106

Номера предложений (proposal numbers) 107

Протокол: две фазы.. 107

Почему это работает?. 110

Пример выполнения. 110

Сценарий 1: простой случай. 110

Сценарий 2: конкурирующие proposers. 111

Проблема прогресса: дуэль proposers. 113

Multi-Paxos: от одного значения к журналу. 114

Практические соображения. 115

Недостатки Paxos. 116

Raft: консенсус для смертных. 116

Философия Raft 116

Роли и термы.. 117

Выбор лидера. 118

Репликация журнала. 120

AppendEntries RPC.. 120

Алгоритм follower’а. 121

Алгоритм лидера. 122

Log Matching Property: свойство сопоставления с журналом.. 124

Leader Completeness Property: свойство безопасности. 124

Почему лидер не коммитит записи прошлых термов напрямую?. 125

Кластерное членство: Joint Consensus. 125

Снэпшоты и компактификация журнала. 126

Клиентское взаимодействие. 127

Полный пример: минимальный Raft на Go. 127

Системы на Raft 133

Заключение. 133

– Глава 5 –
Распределенные транзакции. 134

ACID в распределенном мире. 134

Проблема атомарного коммита. 134

Two-Phase Commit (2PC) 135

Фаза 1: Prepare (голосование) 135

Фаза 2: Commit/Abort (фиксация) 135

Проблемы 2PC.. 136

Пример: перевод денег. 137

Three-Phase Commit (3PC) 137

Saga. 138

Оркестрация. 139

Хореография. 140

TCC: Try-Confirm-Cancel 140

Outbox Pattern: надежная публикация событий. 141

Таблица outbox. 142

Идемпотентность. 142

Сравним подходы.. 143

Когда что использовать?. 143

– Глава 6 –
Криптографические алгоритмы.. 144

От Цезаря до Тьюринга: краткая история шифров. 144

Фундаментальные понятия. 146

Симметричное шифрование. 147

Одноразовый блокнот: идеал, недостижимый на практике. 148

Потоковые и блочные шифры.. 149

Реализация AES на Go. 151

Асимметричное шифрование. 153

Хеш-функции: MD5, SHA-256, Blake2, Argon2. 157

Исторический путь: от CRC до Argon2. 158

Односторонность, коллизии и эффект лавины.. 160

Зачем нужны разные хеш-функции?. 161

MD5 — эпоха надежд и коллизий. 163

SHA-256 — надежный наследник. 164

Blake2 — быстрее, сильнее, современнее. 167

Argon2 — хеширование паролей на стероидах. 169

Выбор хеш-функции. 171

– Глава 7 –
Реализация цифровых подписей и протоколов безопасности. 174

Математическая сущность цифровых подписей. 174

Схемы подписей на эллиптических кривых. 175

Реализация Ed25519 в Go. 177

– Глава 8 –
Атаки на цифровые подписи. 178

Replay-атаки и временны́е метки. 178

Подмена контекста (context substitution) 178

Слепые подписи и их применение. 179

Пороговые подписи. 179

BLS-подписи и агрегация. 180

JWT и stateless-аутентификация. 181

Идея: зашифровать сессию в токене. 181

Анатомия JWT: три части. 182

Жизненный цикл JWT.. 182

Симметричная и асимметричная подпись. 184

Распространение публичного ключа: JWKS. 185

Теперь про уязвимости. 186

Атака Algorithm substitution. 186

Уязвимость None algorithm… 187

Слабые секреты HMAC.. 187

Атаки JKU и X5U.. 188

Предметный указатель. 189

Опубликовано

Встречайте: “Go: разработка приложений в микросервисной архитектуре с нуля”

Go: разработка приложений в микросервисной архитектуре с нуля

Базовая книга по построению микросервисной архитектуры с практическими примерами на языке Go. Также рассмотрена работа с оркестратором Kubernetes и контейнерами Docker в среде Docker Compose. Разобраны основные принципы и техники разработки распределенных систем, в частности показано, как написать и развернуть четыре микросервиса, управлять СУБД, настроить брокер сообщений Kafka, внедрить кэш Redis. Объяснены паттерны проектирования. Особое внимание уделено распределенным транзакциям и разворачиванию микросервисов на удаленном сервере. Показано, как обеспечить расширяемость и отказоустойчивость приложений, поддерживая высокую скорость загрузки страниц и приложений.

Электронный архив на сайте издательства содержит дополнительные материалы к книге.

Для начинающих веб-разработчиков

Микросервисы на Go: осваиваем аккуратную декомпозицию

Современная практика enterprise-разработки и возникающие вызовы связаны, прежде всего, с обеспечением отказоустойчивости и расширяемости приложений. Сложно рассчитывать на реализацию таких качеств без применения микросервисной архитектуры. В книге по порядку рассматривается создание целого приложения с нуля. На материале готового продукта показано, как написать и развернуть четыре микросервиса, управлять СУБД, настроить брокер сообщений Kafka, внедрить кэш Redis и объединить эти решения в среде Docker-Compose и оркестраторе Kubernetes. Все паттерны, актуальные при проектировании микросервисов для веб-архитектуры, разобраны на практических примерах.

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

Вы узнаете, как:

  • разрабатывать микросервисы на языке Go;
  • выстраивать синхронное и асинхронное взаимодействие между микросервисами;
  • выполнять распределенные транзакции;
  • организовать взаимодействие между микросервисами;
  • использовать паттерны проектирования;
  • разворачивать микросервисы в облаке;
  • использовать и настраивать Docker, Docker-Compose;
  • настраивать Kubernetes в удаленной среде.

Книгу “Go: разработка приложений в микросервисной архитектуре с нуля” можно купить в нашем интенет-магазине.

Введение………………………………………………………………………………………………….. 7

Для кого эта книга?……………………………………………………………………………………………………………………… 7

Обзор Golang………………………………………………………………………………………………………………………………… 7

Сравнение монолитной и микросервисной архитектуры………………………………………………………… 9

Список литературы и источников……………………………………………………………………………………………. 11

Глава 1. Разработка первого микросервиса (User)………………………………….. 13

Настройка локального окружения…………………………………………………………………………………………… 13

Редактор кода…………………………………………………………………………………………………………………….. 13

Go…………………………………………………………………………………………………………………………………………. 14

GVM…………………………………………………………………………………………………………………………………….. 17

Установка Protobuf…………………………………………………………………………………………………………….. 18

Git…………………………………………………………………………………………………………………………………………. 19

Codestyle……………………………………………………………………………………………………………………………… 21

Docker и Docker-Compose………………………………………………………………………………………………….. 22

Тестирование API………………………………………………………………………………………………………………. 24

Создание структуры проекта……………………………………………………………………………………………………. 27

Подключение необходимых библиотек…………………………………………………………………………………… 34

Переменные окружения……………………………………………………………………………………………………… 34

Логирование……………………………………………………………………………………………………………………….. 36

ORM…………………………………………………………………………………………………………………………………….. 40

Swagger………………………………………………………………………………………………………………………………… 43

Проектирование базы данных PostgreSQL………………………………………………………………………………. 47

Что такое база данных и какие они бывают?………………………………………………………………….. 47

Нормализация данных………………………………………………………………………………………………………. 48

Первая нормальная форма (1НФ)……………………………………………………………………………. 48

Вторая нормальная форма (2НФ)……………………………………………………………………………. 50

Третья нормальная форма (3НФ)…………………………………………………………………………….. 51

Разработка бизнес-логики и маршрутизации для модуля User……………………………………………… 52

Тестирование микросервиса…………………………………………………………………………………………………….. 79

Список литературы и источников……………………………………………………………………………………………. 86

Глава 2. Разработка микросервиса авторизации и аутентификации (Auth) 87

Теоретический обзор способов авторизации и аутентификации………………………………………….. 87

Аутентификация, идентификация и авторизация……………………………………………………………. 87

Аутентификация по паролю……………………………………………………………………………………………… 88

Аутентификация по сертификатам…………………………………………………………………………………… 89

Аутентификация по одноразовым паролям…………………………………………………………………….. 90

Аутентификация по ключам доступа……………………………………………………………………………….. 91

Аутентификация по токенам……………………………………………………………………………………………… 91

Базовые меры предосторожности от возможных уязвимостей……………………………………………… 93

Переполнение буфера………………………………………………………………………………………………………… 94

Состояние гонки…………………………………………………………………………………………………………………. 94

Атаки проверки ввода………………………………………………………………………………………………………… 94

Атаки аутентификации………………………………………………………………………………………………………. 95

Атаки авторизации…………………………………………………………………………………………………………….. 95

Атаки на стороне клиента…………………………………………………………………………………………………. 96

Разработка модуля Auth……………………………………………………………………………………………………………. 96

Список литературы и источников………………………………………………………………………………………….. 110

Глава 3. Способы взаимодействия между микросервисами………………….. 111

HTTP-протокол………………………………………………………………………………………………………………………… 111

Модель OSI……………………………………………………………………………………………………………………….. 111

Физический уровень……………………………………………………………………………………………….. 112

Канальный уровень………………………………………………………………………………………………… 112

Сетевой уровень……………………………………………………………………………………………………… 113

Транспортный уровень…………………………………………………………………………………………… 113

Сеансовый уровень…………………………………………………………………………………………………. 113

Уровень представления………………………………………………………………………………………….. 114

Прикладной уровень………………………………………………………………………………………………. 114

Устройство HTTP-протокола………………………………………………………………………………………….. 114

Структура HTTP-запроса………………………………………………………………………………………. 115

Cтруктура HTTP-ответа…………………………………………………………………………………………. 116

gRPC………………………………………………………………………………………………………………………………………….. 116

RabbitMQ………………………………………………………………………………………………………………………………….. 120

Apache Kafka……………………………………………………………………………………………………………………………. 123

Redis………………………………………………………………………………………………………………………………………….. 125

Разработка сервиса Gateway………………………………………………………………………………………………….. 126

Список литературы и источников………………………………………………………………………………………….. 156

Глава 4. Разработка модуля Transaction……………………………………………….. 157

Проектирование базы данных………………………………………………………………………………………………… 157

Частная форма третьей нормальной формы: нормальная форма Бойса — Кодда (НФБК)          157

Четвертая нормальная форма…………………………………………………………………………………………. 159

Пятая нормальная форма………………………………………………………………………………………………… 159

Доменно-ключевая нормальная форма………………………………………………………………………….. 160

Шестая нормальная форма……………………………………………………………………………………………… 160

Понятия миграций и транзакций в контексте базы данных PostgreSQL……………………………… 161

Миграции………………………………………………………………………………………………………………………….. 161

Индексы…………………………………………………………………………………………………………………………….. 163

Транзакции……………………………………………………………………………………………………………………….. 166

ACID…………………………………………………………………………………………………………………………. 166

Параллельные транзакции…………………………………………………………………………………….. 167

Уровни изоляции транзакций в SQL……………………………………………………………………… 168

Разработка модуля Transaction………………………………………………………………………………………………. 169

Интеграция Transaction и Account………………………………………………………………………………………….. 187

Проблема распределенных транзакций………………………………………………………………………………… 227

Двухфазная фиксация………………………………………………………………………………………………………. 228

Saga……………………………………………………………………………………………………………………………………. 229

Реализация паттерна Saga……………………………………………………………………………………… 231

Список литературы и источников………………………………………………………………………………………….. 265

Глава 5. Развертывание микросервисов……………………………………………….. 267

Обертывание микросервисов в docker-контейнеры………………………………………………………………. 294

Масштабирование при помощи оркестратора Kubernetes………………………………………………….. 306

Заключение………………………………………………………………………………………………………………………………. 311

Список литературы и источников………………………………………………………………………………………….. 311

Приложение. Описание файлового архива…………………………………………… 313

Предметный указатель…………………………………………………………………………. 315

Опубликовано

Новинка: “Linux и Go. Эффективное низкоуровневое программирование. 2-е издание”

Linux и Go. Эффективное низкоуровневое программирование. 2-е издание

Книга содержит вводный курс по языку Go для системного программирования, описывает применение Go для реализации конкурентности и параллелизма, рассказывает об интероперабельности между имеющимся кодом на C с новым кодом на Go, а также исследует возможности внедрения Go для повышения производительности различных дистрибутивов. Второе издание содержит описание языка Go в версии 1.2 и описание реализации TinyGo, дополнительно приведены новые примеры использования языка.

Книга ориентирована на программистов и системных администраторов, работающих с Linux, будет интересна разработчикам ядра Linux и драйверов устройств.

Книга ориентирована на программистов и системных администраторов, работающих с Linux, будет интересна разработчикам ядра Linux и драйверов устройств.

Материал обновлён в соответствии с новой версией 1.22 языка Go

Ядро операционной системы Linux и множество модулей для различных дистрибутивов написаны на языке C.

Притом, что язык С продолжает развиваться и активно использоваться на практике, в область системного программирования постепенно проникают и более молодые языки, в частности Go. Перед вами – первая фундаментальная книга об использовании Go в Linux. Здесь вы познакомитесь с основами системного программирования, изучите детали взаимодействия между ядром и пользовательским пространством Linux, а также узнаете об интероперабельности между С и Go, о том, в каких аспектах и нюансах Linux язык Go может заменить и уже заменяет язык C. Особое внимание уделено конкурентности, параллелизму и стандарту POSIX. В конце книги для закрепления материала приведены реализации нескольких популярных алгоритмов.

Книга ориентирована на программистов и системных администраторов, работающих с Linux, будет интересна разработчикам ядра Linux и драйверов устройств.

Не старайся быстро пахать — сажай злаки, которые быстро всходят.
Андрей Рубанов

Листать

Во втором издании:

  • Материал обновлён в соответствии с новой версией 1.22 языка Go
  • Рассмотрена миниатюрная реализация языка TinyGo
  • Дополнительно приведены новые примеры использования языка

 

Книгу “Linux и Go. Эффективное низкоуровневое программирование. 2-е издание” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Предисловие…………………………………………………………………………………………….. 9

Предназначение и целевая аудитория……………………………………………………………………………………….. 9

Код примеров и замеченные опечатки…………………………………………………………………………………….. 11

Чего нет в этой книге………………………………………………………………………………………………………………….. 13

Соглашения и выделения, принятые в тексте………………………………………………………………………….. 13

Напоминание……………………………………………………………………………………………………………………………… 14

Источники информации…………………………………………………………………………………………………………….. 15

Часть I. Инструментарий языка Go…………………………………………. 17

Глава 1. Предыстория Go………………………………………………………………………. 19

Отцы-основатели о целях и мотивации……………………………………………………………………………………. 19

Применимость: беглый взгляд…………………………………………………………………………………………………… 20

Go, C, C++, Java, Python, Rust …………………………………………………………………………………………………… 21

Управление памятью и истоки ненадежности………………………………………………………………………… 28

Источники информации…………………………………………………………………………………………………………….. 29

Глава 2. Разворачиваем экосистему Go………………………………………………….. 31

Создание среды………………………………………………………………………………………………………………………….. 31

Стандартная инсталляция………………………………………………………………………………………………… 31

Версии среды……………………………………………………………………………………………………………………… 34

Альтернативы…………………………………………………………………………………………………………………….. 35

«Самая последняя» версия………………………………………………………………………………………………… 36

Смена версий………………………………………………………………………………………………………………………. 40

Проверяем: простейшая программа…………………………………………………………………………………………. 42

Простейшее приложение…………………………………………………………………………………………………… 44

Библиотеки статические и динамические………………………………………………………………………… 45

Компиляция или интерпретация?……………………………………………………………………………………… 46

Выбор: GoLang или GCC?…………………………………………………………………………………………………. 47

Инфраструктура GoLang…………………………………………………………………………………………………………… 48

Команды go………………………………………………………………………………………………………………………… 48

Переменные окружения……………………………………………………………………………………………………… 51

Переменная окружения GOPATH…………………………………………………………………………….. 55

Переменная окружения GOTOOLDIR………………………………………………………………………. 56

Переменные окружения GOARCH и GOOS……………………………………………………………… 57

Платформы, переносимость и кросс-компиляция………………………………………………….. 58

Стиль кодирования — автоформатирование: fmt…………………………………………………………… 61

Сборка приложений: build………………………………………………………………………………………………… 62

Сценарии на языке Go: run………………………………………………………………………………………………… 63

Загрузка проектов из сети: get………………………………………………………………………………………….. 64

Репозиторные системы……………………………………………………………………………………………… 64

Установка проектов………………………………………………………………………………………………….. 67

Утилиты GoLang: tool………………………………………………………………………………………………………… 68

Утилиты компиляции…………………………………………………………………………………………………………. 71

Связь с кодом C: cgo………………………………………………………………………………………………………………….. 73

Сторонний и дополнительный инструментарий…………………………………………………………………….. 76

Онлайн-инструмент для изучения Go………………………………………………………………………………. 77

Графический терминал Geany………………………………………………………………………………………….. 78

Интерактивный отладчик Delve………………………………………………………………………………………… 79

Источники информации…………………………………………………………………………………………………………….. 81

Глава 3. Неформально о синтаксисе Go…………………………………………………. 82

Типы данных………………………………………………………………………………………………………………………………. 87

Переменные………………………………………………………………………………………………………………………………… 89

Объявление переменных……………………………………………………………………………………………………. 90

Повторные декларации и переприсвоения………………………………………………………………………. 92

Константы………………………………………………………………………………………………………………………………….. 93

Агрегаты данных……………………………………………………………………………………………………………………….. 95

Массивы и срезы………………………………………………………………………………………………………………… 95

Двумерные массивы и срезы………………………………………………………………………………….. 100

Структуры………………………………………………………………………………………………………………………… 101

Таблицы (хеши)………………………………………………………………………………………………………………… 103

Динамическое создание переменных…………………………………………………………………………………….. 105

Конструкторы и составные литералы……………………………………………………………………………. 106

Операции………………………………………………………………………………………………………………………………….. 107

Функции……………………………………………………………………………………………………………………………………. 110

Вариативные функции…………………………………………………………………………………………………….. 115

Стек процедур завершения……………………………………………………………………………………………… 117

Обобщенные функции……………………………………………………………………………………………………… 118

Функции высших порядков……………………………………………………………………………………………… 119

Встроенные функции……………………………………………………………………………………………………….. 121

Объектно-ориентированное программирование………………………………………………………………….. 123

Методы……………………………………………………………………………………………………………………………… 124

Множество методов………………………………………………………………………………………………… 126

Встраивание и агрегирование……………………………………………………………………………….. 127

Функции как объекты……………………………………………………………………………………………… 129

Интерфейсы………………………………………………………………………………………………………………………. 130

Именование интерфейсов……………………………………………………………………………………….. 133

Контроль интерфейса…………………………………………………………………………………………….. 133

Обработка ошибочных ситуаций…………………………………………………………………………………………… 134

Структура пакетов (библиотек) Go………………………………………………………………………………………… 137

Функция init………………………………………………………………………………………………………………………. 142

Импорт для использования побочных эффектов…………………………………………………………… 143

Некоторые полезные и интересные стандартные пакеты……………………………………………………. 144

Пакет runtime……………………………………………………………………………………………………………………. 144

Форматированный ввод/вывод……………………………………………………………………………………….. 145

Строки и пакет strings……………………………………………………………………………………………………… 146

Строчные литералы…………………………………………………………………………………………………………. 156

Большие числа…………………………………………………………………………………………………………………. 157

Автоматизированное тестирование……………………………………………………………………………….. 158

Источники информации…………………………………………………………………………………………………………… 159

Глава 4. Новости от последних версий…………………………………………………. 160

Модули……………………………………………………………………………………………………………………………………… 160

Дженерики………………………………………………………………………………………………………………………………… 162

Источники информации…………………………………………………………………………………………………………… 167

Глава 5. Альтернативы: TinyGo……………………………………………………………. 168

Источники информации…………………………………………………………………………………………………………… 176

Часть II. Конкурентность и многопроцессорность………. 177

Глава 6. Процессоры в Linux………………………………………………………………… 179

Процессоры, ядра и гипертрейдинг……………………………………………………………………………………….. 182

Загадочная нумерация процессоров……………………………………………………………………………………… 184

Управление процессорами Linux…………………………………………………………………………………………… 187

Аффинити маска……………………………………………………………………………………………………………….. 187

Как происходит диспетчирование в Linux?…………………………………………………………………… 190

Приоритеты nice……………………………………………………………………………………………………… 193

Приоритеты реального времени……………………………………………………………………………. 194

Источники информации…………………………………………………………………………………………………………… 196

Глава 7. Параллелизм и многопроцессорность……………………………………… 197

Эволюция модели параллелизма…………………………………………………………………………………………… 197

Параллельные процессы и fork………………………………………………………………………………………. 197

Потоки ядра и pthread_t POSIX………………………………………………………………………………………. 200

Потоки C++………………………………………………………………………………………………………………. 203

Сопрограммы — модель Go……………………………………………………………………………………………. 206

Параллелизм в Go…………………………………………………………………………………………………… 207

Сопрограммы — как это выглядит?……………………………………………………………………………………….. 208

Возврат значений функцией……………………………………………………………………………………………. 211

Ретроспектива: сопрограммы в C++……………………………………………………………………………….. 212

Каналы……………………………………………………………………………………………………………………………………… 212

Функциональные замыкания в сопрограммах………………………………………………………………………. 218

Примитивы синхронизации…………………………………………………………………………………………………….. 220

Конкурентность и параллельность………………………………………………………………………………………… 226

Источники информации…………………………………………………………………………………………………………… 231

Глава 8. Масштабирование………………………………………………………………….. 232

Планирование активности сопрограмм…………………………………………………………………………………. 232

Испытательный стенд……………………………………………………………………………………………………………… 234

Одноплатные микрокомпьютеры (Single-Board Computers)…………………………………………. 234

Рабочие десктопы…………………………………………………………………………………………………………….. 238

Серверы промышленного класса……………………………………………………………………………………. 239

Масштабирование в реальном мире……………………………………………………………………………………… 240

Первая попытка………………………………………………………………………………………………………………… 241

Второй подход к снаряду………………………………………………………………………………………………… 247

О числе потоков исполнения…………………………………………………………………………………………………… 254

Источники информации…………………………………………………………………………………………………………… 258

Часть III. Некоторые примеры и сравнения……………………….. 261

Глава 9. Осваиваемся в технологии Go………………………………………………… 263

Консольный ввод/вывод………………………………………………………………………………………………………….. 263

Утилита echo……………………………………………………………………………………………………………………………. 267

Итерационное вычисление вещественного корня…………………………………………………………………. 269

Вычисление числа π………………………………………………………………………………………………………………… 271

Вычисления неограниченно высокой точности……………………………………………………………………. 274

Случайная последовательность и ее моменты……………………………………………………………………… 275

Расчет параметров выпуклых 2D-многоугольников…………………………………………………………….. 278

TCP клиент-сервер…………………………………………………………………………………………………………………… 283

Тривиальный веб-сервер…………………………………………………………………………………………………………. 288

Порядок итераций для map: сюрприз…………………………………………………………………………………….. 289

Консольный калькулятор……………………………………………………………………………………………………….. 290

Источники информации…………………………………………………………………………………………………………… 293

Глава 10. Структуры данных, типы и их методы…………………………………. 294

Массивы и срезы……………………………………………………………………………………………………………………… 294

Многомерные срезы и массивы………………………………………………………………………………………………. 299

Функции с множественным возвратом…………………………………………………………………………………… 300

Глава 11. Строки, руны и UNICODE……………………………………………………. 303

Символы, байты и руны………………………………………………………………………………………………………….. 303

Изменение содержимого строк……………………………………………………………………………………………….. 305

Палиндромы…………………………………………………………………………………………………………………………….. 306

Регулярные выражения……………………………………………………………………………………………………………. 311

Источники информации…………………………………………………………………………………………………………… 315

Глава 12. Элементы функционального программирования………………….. 316

Функциональные замыкания………………………………………………………………………………………………….. 316

Карринг…………………………………………………………………………………………………………………………………….. 324

Рекурсия……………………………………………………………………………………………………………………………………. 325

Рекурсия с кешированием……………………………………………………………………………………………….. 326

Чистые функции……………………………………………………………………………………………………………………….. 329

Источники информации…………………………………………………………………………………………………………… 329

Глава 13. Скоростные и другие сравнения языков………………………………. 330

Алгоритмические задачи для сравнения……………………………………………………………………………….. 330

Некоторые известные алгоритмы…………………………………………………………………………………………… 331

Числа Фибоначчи…………………………………………………………………………………………………………….. 332

Пузырьковая сортировка…………………………………………………………………………………………………. 335

Ханойская башня……………………………………………………………………………………………………………… 341

Решето Эратосфена…………………………………………………………………………………………………………. 344

Глава 14. Многопроцессорные параллельные вычисления………………….. 349

Скорость активации параллельных ветвей…………………………………………………………………………… 349

Гонки…………………………………………………………………………………………………………………………………………. 354

Защита критических данных………………………………………………………………………………………….. 358

Неблокирующий ввод с клавиатуры……………………………………………………………………………………… 362

Многопроцессорный брутфорс………………………………………………………………………………………………. 366

Каналы в сопрограммах…………………………………………………………………………………………………………. 372

Таймеры……………………………………………………………………………………………………………………………………. 373

Тикеры………………………………………………………………………………………………………………………………. 375

Когда не нужно злоупотреблять многопроцессорностью…………………………………………………… 376

Источники информации…………………………………………………………………………………………………………… 380

Заключение………………………………………………………………………………………….. 381

Об авторе……………………………………………………………………………………………… 382

 

Цилюрик Олег Иванович

Цилюрик Олег Иванович — программист-разработчик с более чем 40-летним опытом, преподаватель, автор книг по Linux и Unix , в том числе «Расширения ядра Linux. Драйверы и модули» и «Linux и Go. Эффективное низкоуровневое программирование», высоко оцененных профессионалами и широкой читательской аудиторией.

Опубликовано

Вышла книга “Linux и Go. Эффективное низкоуровневое программирование”

Linux и Go. Эффективное низкоуровневое программирование

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

Книга ориентирована на программистов и системных администраторов, работающих с Linux, будет интересна разработчикам ядра Linux и драйверов устройств.

 

Ядро операционной системы Linux и множество модулей для различных дистрибутивов написаны на языке C. Притом, что язык С продолжает развиваться и активно использоваться на практике, в область системного программирования постепенно проникают и более молодые языки, в частности Go.

Перед вами – первая фундаментальная книга об использовании Go в Linux. Здесь вы познакомитесь с основами системного программирования, изучите детали взаимодействия между ядром и пользовательским пространством Linux, а также узнаете об интероперабельности между С и Go, о том, в каких аспектах и нюансах Linux язык Go может заменить и уже заменяет язык C. Особое внимание уделено конкурентности, параллелизму и стандарту POSIX. В конце книги для закрепления материала приведены реализации нескольких популярных алгоритмов.

Цилюрик Олег Иванович

Цилюрик Олег Иванович — программист-разработчик с более чем 40-летним опытом, преподаватель, автор нескольких книг по Linux и Unix, высоко оцененных профессионалами и широкой читательской аудиторией.

Книгу “Linux и Go. Эффективное низкоуровневое программирование” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Предисловие. 7

Предназначение и целевая аудитория. 7

Код примеров и замеченные опечатки. 9

Соглашения и выделения, принятые в тексте. 10

Напоминание. 11

Источники информации. 11

Часть I. Инструментарий языка Go. 13

Глава 1. Предыстория Go. 15

«Отцы-основатели» о целях и мотивации…… 15

Применимость: беглый взгляд. 16

Go, C, C++ и другие…… 17

Источники информации. 22

Глава 2. Разворачиваем экосистему Go. 23

Создание среды. 23

Стандартная инсталляция. 23

Версии среды. 25

Альтернативы. 26

«Самая последняя» версия. 27

Смена версий. 30

Проверяем: простейшая программа. 30

Проверяем на простейшем приложении. 32

Библиотеки статические и динамические. 34

Компиляция или интерпретация. 34

Выбор: GoLang или GCC?. 35

Инфраструктура GoLang. 36

Команды go. 36

Переменные окружения. 39

Платформы, переносимость и кросс-компиляция. 47

Стиль кодирования (автоформатирование — fmt) 49

Сборка приложений (build) 51

Сценарии на языке Go (run) 51

Загрузка проектов из сети (get) 52

Утилиты GoLang (tool) 57

Связь с кодом C (Cgo) 60

Сторонний и дополнительный инструментарий. 63

Источники информации. 65

Глава 3. Неформально о синтаксисе Go. 66

Типы данных. 71

Переменные. 73

Выполнение такого приложения. 74

Повторные декларации и переприсваивания. 76

Константы. 77

Агрегаты данных. 79

Массивы и срезы. 79

Двухмерные массивы и срезы. 84

Структуры. 85

Таблицы (хэши) 87

Динамическое создание переменных. 89

Конструкторы и составные литералы. 90

Операции. 91

Функции. 94

Вариативные функции. 98

Стек процедур завершения. 100

Обобщенные функции. 101

Функции высших порядков. 102

Встроенные функции. 104

Объектно-ориентированное программирование. 106

Методы. 107

Интерфейсы. 113

Обработка ошибочных ситуаций. 117

Структура пакетов (библиотек) Go. 121

Функция init 125

Импорт для использования побочных эффектов. 126

Некоторые полезные и интересные стандартные пакеты. 126

Пакет runtime. 127

Форматированный ввод-вывод. 128

Строки и пакет strings 129

Большие числа. 134

Автоматизированное тестирование. 135

Источники информации. 135

Часть II. Конкурентность и многопроцессорность. 137

Глава 4. Процессоры в Linux. 139

Процессоры, ядра и гипертрэдинг. 142

Загадочная нумерация процессоров. 144

Управление процессорами Linux. 147

Привязка к процессору. 147

Как происходит диспетчирование в Linux. 150

Источники информации. 156

Глава 5. Параллелизм и многопроцессорность. 157

Эволюция модели параллелизма. 157

Параллельные процессы и fork. 157

Потоки ядра и pthread_t POSIX.. 160

Сопрограммы — модель параллелизма Go. 166

Параллелизм в Go. 167

Сопрограммы — как это выглядит. 168

Возврат значений функцией. 171

Ретроспектива: сопрограммы в C++. 172

Каналы. 172

Функциональные замыкания в сопрограммах. 177

Примитивы синхронизации. 179

Конкурентность и параллельность. 185

Источники информации. 190

Глава 6. Масштабирование. 191

Планирование активности сопрограмм. 191

Испытательный стенд. 193

Микрокомпьютеры (Single-Board Computers) 193

Рабочие десктопы. 196

Серверы промышленного класса. 197

Масштабирование в реале. 198

1-я попытка …… 199

2-й подход к снаряду…… 205

О числе потоков исполнения. 213

Источники информации. 217

Часть III. Некоторые примеры и сравнения. 219

Глава 7. Осваиваемся в синтаксисе Go. 221

Утилита echo. 221

Итерационное вычисление вещественного корня. 223

Вычисление числа π. 225

Случайная последовательность и ее моменты. 227

Обсчет параметров 2D выпуклых многоугольников. 230

Тривиальный web-сервер. 235

Источники информации. 236

Глава 8. Структуры данных, типы и их методы.. 237

Массивы и срезы. 237

Многомерные срезы и массивы. 242

Функции с множественным возвратом. 243

Глава 9. Элементы функционального программирования. 246

Функциональные замыкания. 246

Карринг. 253

Рекурсия. 255

Рекурсия с кэшированием. 255

Чистые функции. 257

Источники информации. 257

Глава 10. Скоростные и другие сравнения языков. 258

Алгоритмические задачи для сравнения. 258

Некоторые известные алгоритмы. 259

Числа Фибоначчи. 260

Пузырьковая сортировка. 263

Ханойская башня. 268

Решето Эратосфена. 272

Глава 11. Многопроцессорные параллельные вычисления. 276

Скорость активации параллельных ветвей. 276

Гонки. 281

Защита критических данных. 285

Многопроцессорный брутфорс. 289

Каналы в сопрограммах. 295

Таймеры. 296

Тикеры. 298

Когда не нужно злоупотреблять многопроцессорностью.. 299

Источники информации. 302

Заключение. 303

Об авторе. 304