На главную | Где купить | Авторам и заказчикам | Вакансии | Реклама | Издательство | Каталог | Статьи наших авторов | Контакты | Прайс листы

Компьютерные системы: архитектура и программирование

Автор Брайант Р., О`Халарон Д.
Название Компьютерные системы: архитектура и программирование
Серия Внесерийные книги
ISBN 5-94157-433-9
Формат 70*100 1/16
Объем 1104
Тематика
Оптовая цена
    Вернуться к описанию книги

Полное содержание

Предисловие 1
Что нужно знать перед прочтением 1
Как читать книгу 2
Происхождение книги 3
Обзор книги 4
Благодарности 7
Информация об авторах 9
Часть вводная. Обзор компьютерных систем 11

Глава 1. Экскурс в компьютерные системы

13
1.1. Информация — это биты + контекст 14
1.2. Программы, которые переводятся другими программами в различные формы 16
1.3. Как работает система компиляции 18
1.4. Процессоры читают и интерпретируют инструкции, сохраняемые в памяти 19
1.4.1. Организация аппаратных средств системы 20
Шины 20
Устройства ввода-вывода 21
Оперативная память 21
Процессор 22
1.4.2. Выполнение программы hello 23
1.5. Различные виды кэш-памяти 25
1.6. Устройства памяти образуют иерархию 26
1.7. Операционная система управляет работой аппаратных средств 27
1.7.1. Процессы 29
1.7.2. Потоки 30
1.7.3. Виртуальная память 31
1.7.4. Файлы 32
1.8. Обмен данных в сетях 33
1.9. Следующие шаги 35
1.10. Резюме 35
Библиографические заметки 36

Часть I. Структура и выполнение программы

37

Глава 2. Представление информации и работа с ней

39
2.1. Хранение информации 41
2.1.1. Шестнадцатеричная система исчисления 42
О преобразовании между десятичной и шестнадцатеричной системами 45
2.1.2. Машинные слова 46
2.1.3. Размеры данных 46
2.1.4. Адресация и упорядочение байтов 48
О присвоении типам данных имени 51
Форматированная печать 51
Указатели и массивы 51
Указатель и разыменование (снятие косвенности) 52
2.1.5. Представление строк 54
2.1.6. Представление кода 55
2.1.7. Булевы алгебры и кольца 56
Какая польза от абстрактной алгебры 58
2.1.8. Операции на уровне бита в С 61
2.1.9. Логические операции в C 63
2.1.10. Операции сдвига в C 64
2.2. Целочисленное представление 65
2.2.1. Типы целого 65
2.2.2. Кодировки со знаком и с двоичным дополнительным кодом 66
2.2.3. Преобразования между числами со знаком и без знака 71
2.2.4. Величины со знаком относительно величин без знака в C 74
2.2.5. Расширение битового представления числа 76
2.2.6. Усечение чисел 79
2.3. Целочисленная арифметика 81
2.3.1. Приращение без знака 81
2.3.2. Приращение в дополнительном коде 85
2.3.3. Отрицание в дополнительном двоичном коде 88
2.3.4. Умножение без знака 90
2.3.5. Умножение в дополнительном двоичном коде 91
2.3.6. Умножение на степени двух 93
2.3.7. Деление на степени двух 94
2.4. Числа с плавающей точкой 96
2.4.1. Дробные двоичные числа 97
2.4.2. Представление стандарта плавающей точки IEEE 100
Нормализованные значения 101
Ненормализованные значения 101
Особые значения 102
2.4.3. Примерные числа 102
2.4.4. Округление 107
2.4.5. Операции с плавающей точкой 109
2.4.6. Плавающая точка в C 111
Арифметические операции с плавающей точкой Intel IA32 112
2.5. Резюме 117
Библиографические примечания 118
Задачи для домашнего решения 119
Решение упражнений 128

Глава 3. Представление программ на машинном уровне

145
3.1. Историческая перспектива 148
3.2. Кодирование программ 151
3.2.1. Программный код машинного уровня 152
3.2.2. Примеры программных кодов 153
3.2.3. Замечание по форматированию 157
3.3. Форматы данных 159
3.4. Доступ к данным 160
3.4.1. Спецификаторы операндов 160
3.4.2. Команды перемещения данных 163
3.4.3. Перемещение данных 166
Несколько примеров указателей 166
3.5. Арифметические и логические операции 169
3.5.1. Команда загрузки исполнительного адреса 170
3.5.2. Унарные и бинарные операции 170
3.5.3. Операции сдвига 171
3.5.4. Обсуждение 172
3.5.5. Специальные арифметические операции 174
3.6. Управление 175
3.6.1. Коды управления 176
3.6.2. Доступ к кодам условия 177
3.6.3. Команды перехода и их кодирование 180
3.6.4. Трансляция условных переходов 184
3.6.5. Циклы 187
Циклы do-while 187
Циклы while 190
Циклы for 194
3.6.6. Операторы выбора 196
3.7. Процедуры 201
3.7.1. Структура стекового фрейма 202
3.7.2. Передача управления 203
3.7.3. Соглашения об использовании регистров 204
3.7.4. Примеры процедур 207
3.7.5. Рекурсивные процедуры 210
3.8. Распределение памяти под массивы и доступ к массивам 213
3.8.1. Базовые принципы 213
3.8.2. Арифметические операции с указателями 215
3.8.3. Массивы и циклы 216
3.8.4. Вложенные циклы 218
3.8.5. Массивы фиксированных размеров 220
3.8.6. Динамически размещаемые массивы 222
3.9. Структуры разнородных данных 225
3.9.1. Структуры 226
Представление объекта как структуры типа struct 226
3.9.2. Объединения 229
3.10. Выравнивание 234
3.11. Как пользоваться указателями 237
3.12. Использование отладчика GDB 241
3.13. Ссылки на ячейку в памяти и переполнение буферов 244
3.14. Коды с плавающей точкой 250
3.14.1. Регистры с плавающей точкой 250
3.14.2. Вычисления выражений с помощью стека 252
3.14.3. Операции перемещения и преобразования данных 255
3.14.4. Арифметические операции с плавающей запятой 257
3.14.5. Использование значений с плавающей точкой в процедурах 261
3.14.6. Тестирование и сравнение значений с плавающей точкой 262
3.15. Встраивание ассемблерных кодов в программы на C 265
3.15.1. Базовый встроенный ассемблер 266
3.15.2. Расширенная форма оператора asm 268
3.16. Резюме 273
Библиографические заметки 274
Задачи для домашнего решения 275
Решение упражнений 282

Глава 4. Архитектура процессора

301
4.1. Архитектура системы команд Y86 304
аппаратными средствами HCL 319
4.2.1. Логические шлюзы 320
4.2.2. Комбинационные схемы и булевы выражения HCL 320
4.2.3. Комбинационные схемы на уровне слова и целочисленные выражения в HCL 322
4.2.4. Принадлежность множеству 327
4.2.5. Память и синхронизация 328
4.3. Последовательные реализации Y86 330
4.3.1. Поэтапная организация процессора 330
Выборка 330
Декодирование 331
Выполнение 331
Память 331
Обратная запись 331
Обновление PC 331
Выполнение команды rmmovl 337
Выполнение команды pushl 338
Выполнение команды je 340
Выполнение команды ret 342
4.3.2. Структура аппаратных средств SEQ 343
Выборка 343
Декодирование 343
Выполнение 343
Память 344
Обратная запись 344
4.3.3. Синхронизация SEQ 347
4.3.4. Реализация этапов SEQ 351
Этап выборки 352
Этапы декодирования и обратной записи 353
Этап выполнения 355
Этап памяти 356
Этап обновления PC 358
Исследование SEQ 358
4.3.5. Реконфигурация этапов вычисления 359
4.4. Общие принципы конвейерной обработки 362
4.4.1. Конвейеры вычислений 363
4.4.2. Подробное описание конвейерной операции 364
4.4.3. Ограничения конвейерной обработки 367
Неравномерное разбиение 367
Уменьшение возвратов глубокой конвейерной обработки 368
4.4.4. Конвейеризация системы с обратной связью 369
4.5. Конвейерные реализации Y86 371
4.5.1. Вставка конвейерных регистров 372
4.5.2. Реконфигурация и смена меток сигналов 375
4.5.3. Прогнозирование следующего значения PC 376
4.5.4. Риски конвейерной обработки 378
Перечисление классов рисков по данным 382
4.5.5. Как избежать рисков по данным с помощью останова 383
4.5.6. Как избежать рисков по данным с помощью продвижения 385
4.5.7. Риски по данным load/use 391
4.5.8. Реализации этапов PIPE 393
Выбор PC и этап выборки 393
Этапы декодирования и обратной записи 395
Этап выполнения 399
Этап памяти 399
4.5.9. Управляющая логика конвейера 400
Желательная обработка особых контрольных случаев 400
Выявление особых условий управления 403
Механизмы управления конвейером 404
Комбинации управляющих условий 406
Реализация управляющей логики 409
4.5.10. Анализ эффективности 410
4.5.11. Незаконченная работа 412
Обработка исключительных ситуаций 412
Многократные команды 415
Сопряжение с системой памяти 415
4.6. Резюме 418
4.6.1. Имитаторы Y86 419
Библиографические примечания 419
Задачи для домашнего решения 420
Решение упражнений 425

Глава 5. Оптимизация производительности программ

437
5.1. Возможности и ограничения оптимизирующего компилятора 439
5.2. Выражение производительности программы 442
5.3. Пример программы 445
5.4. Устранение недостаточности циклов 448
5.5. Сокращение обращений к процедурам 453
5.6. Устранение ненужных ссылок на ячейки памяти 455
5.7. Общее описание современных процессоров 458
5.7.1. Общее функционирование 458
5.7.2. Производительность функционального устройства 463
5.7.3. Более пристальный взгляд на работу процессора 464
Перевод команд в операции 464
Обработка операций устройством выполнения 466
Планирование операций с неограниченными ресурсами 467
Планирование операций с ограничениями ресурсов 469
Выводы о производительности combine4 472
5.8. Снижение непроизводительных издержек циклов 473
5.9. Преобразование в код указателя 477
5.10. Повышение параллелизма 480
5.10.1. Разбиение циклов 480
5.10.2. Вытеснение регистров 485
5.10.3. Ограничения параллелизма 487
5.11. Сводка результатов оптимизации объединяющего кода 489
5.11.1. Аномалия производительности операций с числами с плавающей точкой 489
5.11.2. Изменение платформ 491
5.12. Прогнозирование ветвей и штрафы за некорректное прогнозирование 492
5.13. Понятие производительности памяти 496
5.13.1. Задержка операций загрузки 496
5.13.2. Задержка операций сохранения 498
5.14. Жизнь в реальном мире: методы повышения производительности 504
5.15. Выявление и устранение критических элементов производительности 504
5.15.1. Профилирование программ 505
5.15.2. Использование профайлера при управлении оптимизацией 507
5.15.3. Закон Эмдала 510
5.16. Резюме 512
Библиографические примечания 513
Задачи для домашнего решения 513
Решение упражнений 518

Глава 6. Иерархия памяти

523
6.1. Технологии сохранения информации 524
6.1.1. Память с произвольной выборкой 524
Статическая RAM 525
Динамическая RAM 525
Стандартные DRAM 526
Модули памяти 528
Расширенные DRAM 529
Энергонезависимая память 530
Доступ к основной памяти 531
6.1.2. Дисковый накопитель 534
Геометрия диска 534
Емкость диска 535
Функционирование диска 536
Логические блоки диска 538
Оценка дисков 539
6.1.3. Направления развития технологий записывающих устройств 544
6.2. Локальность 546
6.2.1. Локальность обращений к данным программы 547
6.2.2. Локальность выборки команд 550
6.2.3. Резюме локальности 550
6.3. Иерархия памяти 552
6.3.1. Кэширование в иерархии памяти 553
Результативные обращения 555
Промахи кэша 555
Виды промахов кэша 555
Управление кэшем 556
6.3.2. Резюме концепции иерархии памяти 557
6.4. Виды кэш-памяти 558
6.4.1. Родовая организация кэш-памяти 559
6.4.2. Кэш прямого отображения 561
Выбор множества в кэше прямого отображения 562
Сопоставление строк в кэше прямого отображения 562
Извлечение слова в кэшах прямого отображения 563
Вытеснение строк при промахах обращения в кэш прямого отображения 563
Окончательная сборка: кэш прямого обращения в действии 563
Конфликтные промахи в кэше прямого отображения 566
6.4.3. Ассоциативные множествам кэши 570
Выбор множества в ассоциативных множеству кэшах 570
Сопоставление строк и извлечение слова в ассоциативных множеству кэшах 570
Вытеснение строк при промахах в ассоциативных множеству кэшах 572
6.4.4. Полностью ассоциативные кэши 572
Выбор множества в полностью ассоциативных множеству кэшах 572
ассоциативных множеству кэшах 573
6.4.5. Работа с операциями записи 576
6.4.6. Кэши команд и унифицированные кэши 577
6.4.7. Влияние параметров кэша на производительность 578
Влияние размера кэша 579
Влияние размера блока 579
Влияние ассоциативности 579
Влияние стратегии записи 580
6.5. Написание кодов, дружественных кэш-памяти 580
6.6. Влияние кэша на производительность программ 586
6.6.1. Гора памяти 586
6.6.2. Реконфигурация циклов для повышения пространственной локальности 592
6.6.3. Использование блокирования для повышения временной локальности 596
6.7. Использование локальности в программах 599
6.8. Резюме 600
Библиографические примечания 601
Задачи для домашнего решения 602
Решение упражнений 608

Часть II. Исполнение программ в системе

617

Глава 7. Редактирование связей

619
7.1. Драйверы компилятора 621
7.2. Статическое связывание 623
7.3. Объектные файлы 624
7.4. Переместимые объектные файлы 624
7.5. Идентификаторы и таблицы имен 626
7.6. Разрешение ссылок 630
7.6.1. Многократно определенные глобальные ссылки 631
7.6.2. Связывание со статическими библиотеками 635
7.6.3. Использование статических библиотек 638
7.7. Перемещение 640
7.7.1. Входы перемещения 640
7.7.2. Перемещение ссылок на имя 641
Перемещение ссылок с относительной адресацией по PC 642
Перемещение абсолютных ссылок 643
7.8. Исполняемые объектные файлы 645
7.9. Загрузка исполняемых объектных файлов 647
7.10. Динамическое связывание с разделяемыми библиотеками 649
7.11. Загрузка и связывание с разделяемыми библиотеками из приложений 652
7.12. Переместимый программный код 655
7.12.1. Ссылки на данные PIC 656
7.12.2. Вызовы функций PIC 657
7.13. Средства управления объектными файлами 659
7.14. Резюме 659
Библиографические замечания 660
Задачи для домашнего решения 661
Решение упражнений 667

Глава 8. Управление исключениями

671
8.1. Исключения 673
8.1.1. Обработка исключений 674
8.1.2. Классы исключений 676
Аппаратные прерывания 677
Системные прерывания 677
Сбои 678
Аварийные завершения 679
8.1.3. Исключения в процессорах Intel 679
8.2. Процессы 681
8.2.1. Логический поток управления 681
8.2.2. Закрытое адресное пространство 683
8.2.3. Пользовательский и привилегированный режимы 684
8.2.4. Контекстные переключатели 685
8.3. Системные вызовы и обработка ошибок 687
8.4. Управление процессами 688
8.4.1. Получение ID процесса 688
8.4.2. Порождение и завершение процессов 689
8.4.3. Снятие дочерних процессов 694
Изменение поведения по умолчанию 695
Проверка статуса выхода снятого дочернего процесса 696
Состояния ошибки 696
Константы, связанные с функциями Unix 696
Примеры 697
8.4.4. Перевод процессов в состояние "сна" 699
8.4.5. Загрузка и запуск программ на исполнение 700
8.4.6. Использование функций для запуска программ 703
8.5. Сигналы 706
8.5.1. Терминология, связанная с сигналами 709
8.5.2. Посылка сигналов 710
Группы процессов 710
Посылка сигналов с клавиатуры 710
Посылка сигналов с помощью функций 711
8.5.3. Получение сигналов 714
8.5.4. Некоторые вопросы обработки сигналов 716
8.5.5. Переносимая обработка сигналов 722
8.5.6. Явная блокировка сигналов 724
8.6. Нелокальные передачи управления 727
8.7. Организация управления процессами 730
8.8. Резюме 731
Библиографические замечания 731
Задачи для домашнего решения 732
Решение упражнений 738

Глава 9. Измерение времени исполнения программы

741
9.1. Течение времени в компьютерной системе 743
9.1.1. Планирование процессов и прерывания от таймера 744
9.1.2. Течение времени с точки зрения прикладной программы 745
9.2. Измерение времени подсчетом количества интервалов 748
9.2.1. Роль операционной системы 748
9.2.2. Считывание данных от таймеров 749
9.2.3. Точность таймеров процесса 750
9.3. Счетчики тактов 752
9.3.1. Счетчики тактов в IA32 753
9.4. Измерение времени исполнения программы с помощью счетчиков тактов 755
9.4.1. Эффект переключения контекста 755
9.4.2. Кэширование и другие эффекты 757
9.4.3. Схема измерения K-best 761
Экспериментальная оценка 762
Установка значения K 764
Компенсация обработки прерываний от таймера 767
Вычисление на других машинах 768
Результаты наблюдений 771
9.5. Измерение по часам реального времени 771
9.6. Протокол эксперимента 774
9.7. Взгляд в будущее 775
9.8. Реализация схемы измерения K-best 776
9.9. Задания по пройденному материалу 776
9.10. Резюме 777
Библиографические замечания 778
Задачи для домашнего решения 778
Решение упражнений 779

Глава 10. Виртуальная память

783
10.1. Физическая и виртуальная адресация 785
10.2. Пространство адресов 786
10.3. Инструментальное средство кэширования 787
10.3.1. Организация кэш в DRAM 788
10.3.2. Таблицы страниц 789
10.3.3. Страница находится в DRAM 791
10.3.4. Обращение к отсутствующей странице 791
10.3.5. Размещение страниц 793
10.3.6. Снова о компактности размещения 793
10.4. Манипулирование памятью 794
10.4.1. Упрощение компоновки 795
10.4.2. Упрощение совместного использования 796
10.4.3. Упрощение выделения памяти 797
10.4.4. Упрощение загрузки 797
10.5. VM как средство защиты памяти 797
10.6. Преобразование адресов 799
10.6.1. Интегрирование кэш в виртуальную память 802
10.6.2. Ускорение трансляции адресов с помощью TLB 803
10.6.3. Многоуровневые таблицы страниц 805
10.6.4. Непрерывная трансляция адреса 807
10.7. Система памяти Pentium/Linux 811
10.7.1. Трансляция адресов системой Pentium 812
Таблицы страниц в Pentium 814
Трансляция таблицы страниц в системе Pentium 816
Преобразование TLB в системе Pentium 816
10.7.2. Система виртуальной памяти Linux 817
Области виртуальной памяти в Linux 819
Обработка исключительной ситуации, возникающей при обращении к отсутствующей странице в системе Linux 820
10.8. Отображение в памяти 821
10.8.1. Разделяемые повторно посещаемые объекты 822
10.8.2. Еще раз о функции fork 825
10.8.3. Еще раз о функции execve 825
10.8.4. Отображение в памяти на уровне пользователя с помощью функции mmap 826
10.9. Динамическое распределение памяти 828
10.9.1. Функции malloc и free 830
10.9.2. Что дает динамическое распределение памяти 832
10.9.3. Назначение программы распределения памяти и требования к ней 833
10.9.4. Фрагментация 835
10.9.5. Вопросы реализации 836
10.9.6. Неявные списки свободных блоков 837
10.9.7. Размещение распределенных блоков 839
10.9.8. Разбиение свободных блоков 840
10.9.9. Получение дополнительной динамической памяти 841
10.9.10. Объединение свободных блоков 841
10.9.11. Объединение с использованием граничных тегов 842
10.9.12. Реализация простой программы распределения памяти 845
Разработка программы выделения памяти 846
Основные константы и макроопределения для управления списком свободных блоков 848
Создание начального списка свободных блоков 849
Освобождение и объединение блоков 851
Выделение блоков 852
10.9.13. Явные списки свободных блоков 854
10.9.14. Раздельные свободные списки 855
Простое разделение памяти 856
Разделение с учетом размера 857
Метод близнецов 858
10.10. Сборка мусора 859
10.10.1. Основные принципы функционирования программ сборки мусора 860
10.10.2. Программы сборки мусора, реализующие алгоритм Mark&Sweep 861
10.10.3. Консервативный алгоритм Mark&Sweep для программ на C 863
10.11. Часто встречающиеся ошибки 864
10.11.1. Разыменование плохих указателей 865
10.11.2. Чтение неинициализированной области памяти 865
10.11.3. Переполнение буфера стека 866
10.11.4. Предположение о размере указателей и объектов 866
10.11.5. Ошибки занижения или завышения на единицу 867
10.11.6. Ссылка на указатель вместо объекта 868
10.11.7. Неправильное понимание арифметических операций над указателями 868
10.11.8. Ссылки на несуществующие переменные 869
10.11.9. Ссылка на данные в свободных блоках динамической памяти 869
10.11.10. Представление об утечках в памяти 870
10.12. Сводка некоторых ключевых понятий, связанных с виртуальной памятью 871
10.13. Резюме 871
Библиографические замечания 872
Задачи для домашнего решения 873
Решение упражнений 878

Часть III. Взаимодействие и взаимосвязи программ

885

Глава 11. Системный уровень ввода-вывода

887
11.1. Ввод-вывод Unix 888
11.2. Открытие и закрытие файлов 889
11.3. Считывание и запись файлов 891
11.4. Устойчивое считывание и запись с помощью пакета RIO 893
11.4.1. Небуферизованные функции ввода и вывода RIO 893
11.4.2. Буферные функции ввода RIO 895
11.5. Считывание метаданных файла 899
11.6. Совместное использование файлов 901
11.7. Переадресация данных ввода-вывода 904
11.8. Стандартный ввод-вывод 905
11.9. Окончательная сборка: какие функции ввода-вывода стоит использовать? 906
11.10. Резюме 908
Библиографические примечания 909
Задачи для домашнего решения 909
Решение упражнений 910

Глава 12. Сетевое программирование

913
12.1. Программная модель клиент-сервер 913
12.2. Компьютерные сети 914
12.3. Глобальная сеть Internet 919
12.3.1. IP-адреса 921
12.3.2. Имена доменов в Internet 923
12.3.3. Internet-соединения 927
12.4. Интерфейс сокетов 929
12.4.1. Адресные структуры сокетов 930
12.4.2. Функция socket 931
12.4.3. Функция connect 931
12.4.4. Функция open_clientfd 931
12.4.5. Функция bind 932
12.4.6. Функция listen 933
12.4.7. Функция listenfd 933
12.4.8. Функция accept 934
12.4.9. Примеры эхо-клиента и эхо-сервера 936
12.5. Web-серверы 939
12.5.1. Основные сведения о Web 939
12.5.2. Содержимое Web 940
12.5.3. Транзакции HTTP 941
Запросы HTTP 942
Ответы HTTP 943
12.5.4. Обслуживание динамического содержимого 944
Как клиент передает аргументы программы серверу 945
Как сервер передает аргументы порожденному процессу 945
Как сервер передает порожденному процессу другую информацию 945
Куда порожденный процесс отправляет свои выходные данные 946
12.6. Разработка небольшого Web-сервера TINY 947
Программа main сервера TINY 948
Функция doit 949
Функция clienterror 950
Функция read_requesthdrs 951
Функция parse_uri 952
Функция serve_static 953
Функция serve_dynamic 954
12.7. Резюме 956
Библиографические заметки 957
Задачи для домашнего решения 957
Решение упражнений 959

Глава 13. Параллельное программирование

961
13.1. Параллельное программирование с процессами 963
13.1.1. Параллельный сервер, основанный на процессах 965
13.1.2. За и против использования процессов 966
13.2. Параллельное программирование с мультиплексированием ввода-вывода 967
13.2.1. Параллельный событийно-управляемый сервер на базе мультиплексирования ввода-вывода 971
13.2.2. За и против мультиплексирования ввода-вывода 975
13.3. Параллельное программирование с потоками 976
13.3.1. Модель выполнения потока 977
13.3.2. Потоки интерфейса операционной системы Posix 978
13.3.3. Создание потоков 979
13.3.4. Завершение выполнения потоков 979
13.3.5. Отделение потоков 980
13.3.6. Инициализация потоков 981
13.3.7. Параллельный сервер, основанный на потоках 981
13.4. Совместно используемые переменные в поточных программах 983
13.4.1. Модель памяти для потоков 984
13.4.2. Отображение переменных в память 985
13.4.3. Совместно используемые переменные 986
13.5. Синхронизация потоков с семафорами 986
Упорядочение команд для первой итерации цикла 988
13.5.1. Графы продвижения 990
13.5.2. Использование семафоров для доступа к совместно используемым переменным 993
13.5.3. Семафоры Posix 995
13.5.4. Использование семафоров для планирования совместно используемых ресурсов 996
13.6. Параллельный сервер на базе предварительной организации поточной обработки 998
13.7. Другие вопросы параллелизма 1002
13.7.1. Безопасность потоков 1002
Класс 1: функции, не защищающие совместно используемые переменные 1002
Класс 2: функции, поддерживающие состояние при многократных вызовах 1002
Класс 3: функции, возвращающие указатель статической переменной 1003
Класс 4: функции, вызывающие небезопасные по потокам функции 1004
13.7.2. Реентерабельность 1004
13.7.3. Использование существующих библиотечных функций в поточных программах 1006
13.7.4. Гонки 1007
13.7.5. Взаимоблокировка (тупиковые ситуации) 1009
13.8. Резюме 1012
Библиографические примечания 1013
Задачи для домашнего решения 1013
Решение упражнений 1017
   
Приложения 1023
   
Приложение 1. Описание управляющей логики процессоров с помощью HCL 1025
Справочное руководство HCL 1025
Объявление сигналов 1026
Текст в кавычках 1026
Выражения и блоки 1026
Пример HCL 1028
Описание SEQ 1030
Описание SEQ+ 1034
Конвейер 1039
   
Приложение 2. Обработка ошибок 1047
Обработка ошибок в системе Unix 1048
Обработка ошибок в стиле Unix 1048
Обработка ошибок в стиле Posix 1048
Обработка ошибок в стиле DNS 1048
Резюме сообщающих об ошибках функций 1049
Интерфейсные программы обработки ошибок 1050
Программы обработки ошибок стиля Unix 1050
Программы обработки ошибок стиля Posix 1051
Программы обработки ошибок стиля DNS 1051
Заголовочный файл csapp.h 1051
Исходный файл csapp.с 1055
   
Библиография 1073
Предметный указатель 1079


На главную | Где купить | Авторам | Вакансии | Реклама | Издательство | Каталог | Статьи наших авторов | Контакты
© 2001–2020 Издательство «БХВ-Петербург».
Все права защищены. Частичное или полное копирование текстов, слоганов и фотоизображений без письменного согласия Правообладателя запрещено.