- •Предисловие
- •Введение
- •1Архитектура эвм
- •1.1 Биты и их хранение
- •1.1.1Вентили и триггеры
- •1.1.2Другие способы хранения битов
- •1.1.3Шестнадцатеричная система счисления
- •1.2 Оперативная память
- •1.2.1Структура памяти
- •1.2.2Измерение емкости памяти
- •1.3 Устройства хранения данных
- •1.3.1Магнитные диски
- •1.3.2Компакт-диски
- •1.3.3Магнитные ленты
- •1.3.4Хранение и поиск файлов
- •1.4 Представление информации в виде двоичного кода
- •1.4.1Представление текста
- •1.4.2Американский национальный институт стандартов
- •1.4.3Iso - международная организация по стандартизации
- •1.4.4Представление числовых значений
- •1.4.5Представление изображений
- •1.4.6Представление звука
- •1.5 Двоичная система счисления
- •1.5.1Альтернатива двоичной системе счисления
- •1.5.2Дроби в двоичной системе счисления
- •1.5.3Аналоговые и цифровые устройства
- •1.6 Хранение целых чисел
- •1.6.1Представление в двоичном дополнительном коде
- •1.6.2Сложение в двоичном дополнительном коде
- •1.6.3Проблема переполнения
- •1.6.4Представление с избытком
- •1.7 Хранение дробей
- •1.7.1Представление с плавающей точкой
- •1.7.2Ошибка усечения
- •1.8 Сжатие данных
- •1.8.1Общие методы сжатия данных
- •1.8.2Сжатие звука
- •1.8.3Сжатие изображений
- •1.9 Ошибки передачи данных
- •1.9.1Контрольный разряд четности
- •1.9.2Коды с исправлением ошибок
- •2Манипулирование данными
- •2.1 Архитектура эвм
- •2.1.1Сложение двух чисел, хранящихся в оперативной памяти
- •2.1.2Кто и что изобрел?
- •2.2 Машинный язык
- •2.2.1Система команд
- •2.2.2Кэш-память
- •2.2.3Арифметико-логические команды
- •2.2.4Команды управления
- •2.2.5Деление двух значений, хранящихся в памяти
- •2.3 Выполнение программы
- •2.3.1Пример выполнения программы
- •2.3.2Команды переменной длины
- •2.3.3Программы и данные
- •2.4 Арифметические и логические операции
- •2.4.1Логические операции
- •2.4.2Сравнение вычислительной мощности эвм
- •2.4.3Операции сдвига
- •2.4.4Арифметические операции
- •2.5 Связь с другими устройствами
- •2.5.1Связь через контроллер
- •2.5.2Строение шины
- •2.5.3Скорость передачи данных
- •2.6 Другие архитектуры
- •2.6.1Конвейерная обработка
- •3Операционные системы и организация сетей
- •3.13.1. Эволюция операционных систем
- •3.1.1Однопроцессорные системы
- •3.1.2Многопроцессорные системы
- •3.2 Архитектура операционной системы
- •3.2.1Программное обеспечение
- •3.2.2Полезное единообразие или вредная монополия?
- •3.2.3Компоненты операционной системы
- •3.2.4Операционная система linux
- •3.2.5Начало работы операционной системы
- •3.3 Координирование действий машины
- •3.3.1Понятие процесса
- •3.3.2Управление процессами
- •3.3.3Модель «клиент-сервер»
- •3.4 Обработка конкуренции между процессами
- •3.4.1Семафор
- •3.4.2Взаимная блокировка
- •3.5 Сети
- •3.5.1Основы организации сетей
- •3.5.2Интернет
- •3.5.3Топология сети Интернет
- •3.5.4Система адресов Интернета
- •3.5.5Электронная почта
- •3.5.6Всемирная паутина
- •3.6 Сетевые протоколы
- •3.6.1Управление правом отправки сообщений
- •3.6.2Сеть ethernet
- •3.6.3Javascript, апплеты, cgi и сервлеты
- •3.6.4Многоуровневый принцип программного обеспечения Интернета
- •3.6.5Комплект протоколов tcp/ip
- •3.6.6Протоколы рорз и imap
- •3.7 Безопасность
- •3.7.1Протокол защищенных сокетов
- •3.7.2Группа компьютерной «скорой помощи»
- •4Алгоритмы
- •4.1 Понятие алгоритма
- •4.1.1Предварительные замечания
- •4.1.2Формальное определение алгоритма
- •4.1.3Определение алгоритма
- •4.1.4Абстрактная природа алгоритма
- •4.2 Представление алгоритма
- •4.2.1Примитивы
- •4.2.2Псевдокод
- •4.3 Создание алгоритма
- •4.3.1Искусство решения задач
- •4.3.2Итеративные структуры в музыке
- •4.3.3Первый шаг в решении задачи
- •4.4 Итеративные структуры
- •4.4.1Алгоритм последовательного поиска
- •4.4.2Управление циклом
- •4.4.3Алгоритм сортировки методом вставок
- •4.5Рекурсивные структуры
- •4.5.1Поиск и сортировка
- •4.5.2Алгоритм двоичного поиска
- •4.5.3Управление рекурсивными структурами
- •4.6 Эффективность и правильность
- •4.6.1Эффективность алгоритма
- •4.6.2Проверка правильности программного обеспечения
- •4.6.3По ту сторону проверки правильности программ
- •5Языки программирования
- •5.1 Исторический обзор
- •5.1.1Ранние поколения
- •5.1.2Интерплатформенное программное обеспечение
- •5.1.3Независимость от машины
- •5.1.4Парадигмы программирования
- •5.2 Основные понятия традиционного программирования
- •5.2.1Культуры языков программирования
- •5.2.2Переменные и типы данных
- •5.2.3Структуры данных
- •5.2.4Константы и литералы
- •5.2.5Операторы присваивания
- •5.2.6Управляющие операторы
- •5.2.7Комментарии
- •5.3 Процедурные единицы
- •5.3.1Процедуры
- •5.3.2Событийно-управляемые программные системы
- •5.3.3Параметры
- •5.3.4Функции
- •5.3.5Операторы ввода-вывода
- •5.4 Реализация языка программирования
- •5.4.1Процесс трансляции программы
- •5.4.2Реализация java
- •5.4.3Компоновка и загрузка
- •5.4.4Пакеты разработки программного обеспечения
- •5.5 Объектно-ориентированное программирование
- •5.5.1Классы и объекты
- •5.5.3Конструкторы
- •5.5.4Дополнительные возможности
- •5.6 Параллельные операции
- •5.7 Декларативное программирование
- •5.7.1Логическая дедукция
- •5.7.2Язык программирования Prolog
- •6Разработка программного обеспечения
- •6.1 Разработка программного обеспечения
- •6.1.1Ассоциация по вычислительной технике
- •6.1.2Институт инженеров по электротехнике и электронике
- •6.2 Жизненный цикл программы
- •6.2.1Цикл как единое целое
- •6.2.2Разработка программного обеспечения на практике
- •6.2.3Этапы разработки программного обеспечения
- •6.2.4Анализ
- •6.2.5Проектирование
- •6.2.6Реализация
- •6.2.7Тестирование
- •6.2.8Современные тенденции
- •6.3 Модульность
- •6.3.1Модульная реализация программы
- •6.3.2Связь модулей системы
- •6.3.3Связность модуля
- •6.4 Методики проектирования
- •6.4.1Нисходящее и восходящее проектирование
- •6.4.2Модели проектирования
- •6.4.3Разработка открытых программных продуктов
- •6.5 Инструменты проектирования
- •6.6 Тестирование
- •6.7 Документация
- •6.8 Право собственности на программное обеспечение и ответственность
- •Часть 3 организация данных
- •7Структуры данных
- •7.1 Основы структур данных
- •7.1.1Опять абстракция
- •7.1.2Статические и динамические структуры
- •7.1.3Указатели
- •7.2 Массивы
- •7.3 Списки
- •7.3.1Непрерывные списки
- •7.3.2Реализация непрерывных списков
- •7.3.3Связные списки
- •7.3.4Поддержка абстрактного списка
- •7.4 Стеки
- •7.4.1Откат
- •7.4.2Реализация стека
- •7.5 Очереди
- •7.5.1Проблема указателей
- •7.6 Деревья
- •7.6.1Реализация дерева
- •7.6.2Сбор мусора
- •7.6.3Пакет бинарного дерева
- •7.7 Пользовательские типы данных
- •7.7.1Пользовательские типы
- •7.7.2Классы
- •7.7.3Описательное и процедурное знание
- •7.7.4Стандартная библиотека шаблонов
- •7.8 Указатели в машинном языке
- •8Файловые структуры
- •8.1 Роль операционной системы
- •8.1.1Таблицы размещения файлов
- •8.2 Последовательные файлы
- •8.2.1Обработка последовательных файлов
- •8.2.2Консорциум производителей программного обеспечения для www
- •8.2.3Текстовые файлы
- •8.2.4Текстовые и двоичные файлы
- •8.2.5Вопросы программирования
- •8.2.6Семантическая сеть
- •8.3 Индексация
- •8.3.1Основные положения индексации
- •8.3.2Вопросы программирования
- •8.3.3Расположение файлов на дисках
- •8.4 Хэширование
- •8.4.1Хэш-система
- •8.4.2Проблемы распределения
- •8.4.3Аутентификация посредством хэширования
- •8.4.4Вопросы программирования
- •9Структуры баз данных
- •9.1 Общие вопросы
- •9.2 Многоуровневый подход к реализации базы данных
- •9.2.1Система управления базой данных
- •9.2.2Распределенные базы данных
- •9.2.3Модели баз данных
- •9.3 Реляционная модель баз данных
- •9.3.1Вопросы реляционного проектирования
- •9.3.2Системы баз данных для персональных компьютеров
- •9.3.3Хронологические базы данных
- •9.3.4Реляционные операции
- •9.3.5Вопросы реализации
- •9.3.6Язык sql
- •9.4 Объектно-ориентированные базы данных
- •9.5 Поддержка целостности базы данных
- •9.5.1Пространственные базы данных
- •9.5.2Протоколы фиксации/отката изменений
- •9.5.3Блокировка
- •9.6 Воздействие технологий баз данных на общество
- •10Искусственный интеллект
- •10.1 Интеллект и машины
- •10.1.1Конечный результат или имитация
- •10.1.2Истоки искусственного интеллекта
- •10.1.3Тест Тьюринга
- •10.1.4Машина для решения головоломки из восьми фишек
- •10.2 Распознавание образов
- •10.3 Мышление
- •10.3.1Продукционные системы
- •10.3.2Интеллект, основанный на поведении
- •10.3.3Деревья поиска
- •10.3.4Эвристика
- •10.4 Искусственные нейронные сети
- •10.4.1Основные свойства
- •10.4.2Приложение теории
- •10.4.3Ассоциативная память
- •10.5 Генетические алгоритмы
- •10.6 Прочие области исследования
- •10.6.1Обработка лингвистической информации
- •10.6.2Рекурсия в естественных языках
- •10.6.3Роботы
- •10.6.4Системы баз данных
- •10.6.5Экспертные системы
- •10.7 Обдумывая последствия
- •10.7.1Сильный искусственный интеллект против слабого
- •11Теория вычислений
- •11.1 Функции и их вычисление
- •11.1.1Теория рекурсивных функций
- •11.2 Машины Тьюринга
- •11.2.1Основы машины Тьюринга
- •11.2.2Истоки машины Тьюринга
- •11.2.3Тезис Черча-Тьюринга
- •11.3 Универсальные языки программирования
- •11.3.1Скелетный язык
- •11.3.2Существуют ли инопланетяне?
- •11.3.3Универсальность скелетного языка
- •11.4 Невычислимая функция
- •11.4.1Проблема останова
- •11.4.2Неразрешимость проблемы останова
- •11.5 Сложность задач
- •11.5.1Измерение сложности задачи
- •11.5.2Пространственная сложность
- •11.5.3Полиномиальные и не полиномиальные задачи
- •11.5.5Детерминированность против недетерминированности
- •11.6Шифрование с открытым ключом
- •11.6.1Шифрование при помощи задачи о ранце
- •11.6.2Популярные системы шифрования
- •11.6.3Модульная арифметика
- •11.6.4Обратно к шифрованию
3Операционные системы и организация сетей
Современные прикладные задачи часто требуют от машины выполнения действий, которые могут конкурировать друг с другом за ресурсы машины. Например, компьютер может быть соединен с несколькими терминалами или рабочими станциями, с которых разные пользователи одновременно запрашивают выполнение каких-либо действий. Даже в вычислительных системах индивидуального пользования, таких как персональный компьютер, пользователь может потребовать выполнения не связанных друг с другом действий — воспроизведения музыки с компакт-диска во время редактирования документа или даже распечатывание другого документа. Для осуществления всех этих действий необходима высокая степень координации, чтобы быть уверенным, что несвязанные действия не мешают друг другу и что взаимодействие между связанными действиями эффективно и надежно. Эта координация выполняется пакетом программ, который называется операционной системой.
Похожие проблемы координации и взаимодействия возникают, когда разные компьютеры объединены в сеть. Решение этих проблем является естественным продолжением предмета операционных систем. В этой главе мы обсудим основные понятия, относящиеся к операционным системам и организации сетей.
3.13.1. Эволюция операционных систем
Мы рассмотрим операционные системы и организацию сетей в их историческом развитии, начиная с однопроцессорных систем, а затем перейдя к более современным многопроцессорным системам.
3.1.1Однопроцессорные системы
Однопроцессорные машины 40-50-х годов XX века не были ни гибкими, ни эффективными. Выполнение программ требовало трудоемких приготовлений: установление лент, помещение перфокарт в устройство для считывания, настройка переключателей и т. д. Выполнение каждой программы, которая называлась заданием, рассматривалось как отдельное действие. В случае, когда машина требовалась нескольким пользователям, были предусмотрены специальные карты входа, так что пользователь мог бронировать машину на какое-то определенное время. В течение времени, назначенного пользователю, машина была полностью под его контролем. Сеанс работы обычно начинался с установки программы, затем следовал короткий период ее исполнения. Часто выполнение программы происходило в попытке успеть сделать что-нибудь еще («Это займет только минуту»), пока следующий пользователь нетерпеливо начинал установку своей программы.
Операционные системы были созданы для упрощения процесса установки программы и ускорения переходов между заданиями. Одним из самых ранних усовершенствований было разделение пользователя и оборудования, что исключало перемещение людей по комнате, в которой находилась машина. Нанимался оператор вычислительной машины, который управлял действиями машины. Если кто-то хотел, чтобы была выполнена некоторая программа, он должен был предоставить ее оператору вместе с данными и специальными указаниями по ее исполнению, а затем вернуться позже за результатами. В свою очередь оператор загружал эти материалы в запоминающее устройство машины, откуда операционная система могла их извлечь и выполнить программу. Такая организация вычисления стала началом пакетной обработки данных (batch processing), когда все задачи собираются в один пакет, а затем выполняются без дальнейшего участия пользователя.
В системах с пакетной обработкой задания, помещенные в запоминающее устройство, ждали выполнения в очереди заданий (job queue) (рис. 3.1). Очередь — это способ организации хранения данных, при котором объекты (в нашем случае задания) упорядочены по принципу FIFO (first-in, first-out — первым вошел — первым обслужен). То есть объекты выбираются из очереди в том же порядке, в котором они помещаются в нее. В действительности большинство очередей заданий не строго следуют структуре FIFO, так как в большинстве операционных систем предусмотрены приоритеты заданий. В результате выполнение задания может быть отложено из-за другого задания, которое имеет более высокий приоритет.
В ранних системах пакетной обработки каждое задание сопровождалось набором инструкций, объясняющих, как подготавливать машину к заданию. Эти инструкции писались на языке управления заданиями (JCL — job control language) и хранились вместе с заданием в очереди заданий. Когда задание выбиралось для исполнения, операционная система распечатывала эти инструкции на принтере, чтобы их мог прочитать оператор машины. Инструкции, которые требовали действий оператора, были связаны преимущественно с периферийным оборудованием. Поскольку сегодня эти действия сведены к минимуму, языки управления заданиями стали средством коммуникации с операционной системой, а не с оператором. Оператор вычислительной машины стал не нужен.
Сегодня организации нанимают системных администраторов для того, чтобы они управляли системой вычислительных машин, контролировали установку нового оборудования и программного обеспечения, создавали учетные записи, определяли объем дискового пространства для разных пользователей, координировали усилия по разрешению возникающих в системе проблем, а не для того, чтобы они управляли непосредственно машинами.
Главным недостатком обычной пакетной обработки является то, что пользователь не имеет доступа к программе после того, как она помещается в очередь заданий. Такой подход допустим в некоторых прикладных задачах, таких как обработка платежных ведомостей, когда данные и все указания задаются заранее. Однако такой подход недопустим, когда пользователю нужно общаться с программой во время ее выполнения. В качестве примера можно привести системы резервирования, в которых о бронировании или аннулировании должно сообщаться сразу, системы редактирования текста, в которых документы строятся динамично, а также компьютерные игры, в которых взаимодействие с машиной является основным свойством.
Для удовлетворения этих потребностей были разработаны операционные системы, которые позволяли вести диалог с пользователем во время выполнения программы через отделенный терминал или рабочую станцию. Этот процесс называется интерактивной, или диалоговой, обработкой данных (interactive processing) (рис. 3.2). Интерактивные системы требуют, чтобы время, затрачиваемое машиной на выполнение задач, было совместимо с действиями аппаратных средств. (Использование программы редактирования текста было бы ужасным, если бы машина не успевала за пользователем, набирающим текст.) Для решения таких . задач используется обработка данных в реальном времени (real-time processing).
Если бы интерактивные системы единовременно обслуживали только одного пользователя, то обработка данных в реальном времени не представляла бы никаких трудностей. Но компьютеры были дорогими, поэтому с каждой машиной работали несколько пользователей. Следовательно, как правило, несколько пользователей одновременно нуждались в интерактивных услугах, и обработка в реальном времени была проблемой. Если операционная система в режиме обслуживания нескольких пользователей следует дисциплине последовательного выполнения заданий, то только один пользователь может получить удовлетворительные услуги в реальном времени.
Решением этой проблемы стала разработка новой операционной системы, чередующей выполнение разных заданий с помощью процесса, который называется разделением времени (time sharing). При такой обработке время разделяется на интервалы, или кванты, и на выполнение задания отводится только один квант времени. По истечении каждого интервала времени текущее задание откладывается и начинается выполнение другого. При быстрой смене исполняемых заданий создается эффект выполнения нескольких заданий одновременно. В зависимости от типа заданий ранние системы с разделением времени могли обслуживать в реальном времени одновременно до 30 пользователей.
Сегодня разделение времени применяется в системах индивидуального и коллективного пользования, хотя в первых оно обычно называется многозадачностью (multitasking) из-за иллюзии одновременного выполнения нескольких задач. Независимо от того, является ли среда однопользовательской или многопользовательской, применение разделения времени повышает эффективность машины. Это довольно трудно понять, поскольку процесс тасования задач, необходимый при распределении времени, включает значительные непроизводительные затраты. Однако без распределения времени вычислительная система тратит большую часть времени на ожидание, пока периферийные устройства закончат работу, или на ожидание следующего требования пользователя. В процессе распределения времени это «теряемое» время отдается на выполнение другой задачи. Следовательно, одну задачу можно выполнить, пока другая задача ждет. Поэтому несколько заданий будут выполнены быстрее в конфигурации с разделением времени, чем когда они выполняются последовательно.
