Interprocess Communication
отказывались участвовать в реализации этого проекта из-за невозможности
корректно его спроектировать, потому что система обладала гигантским
потоком входных данных, на основе которых должны были быть приняты
однозначные решения, ответственность за которые оценить весьма сложно. На
самом деле эта проблема подтолкнула к развитию с одной стороны - языков
программирования, которые обладали надежностью, в частности, язык Ада,
одной из целью которого было создание безошибочного ПО. В таких языках
накладывались ограничения на места, где наиболее вероятно возникновение
ошибки (межмодульные интерфейсы; выражения, где присутствуют разные типы
данных и т.п.) Заметим, что язык C не удовлетворяет требованиям
безопасности. С другой стороны - к детальному проектированию, которое бы
позволяло некоторым формальным образом описывать создаваемый проект и
работать с проектом в части его детализации. Причем, переход от детализации
к кодированию не имел бы четкой границы. Понятно, что это есть некоторая
задача не сегодняшнего, а завтрашнего дня, но реально разработчики программ
находятся на пути создания таких средств, которые позволили бы совместить
проектирование и кодирование. Сегодняшние системы программирования, которые
строятся на объектно-ориентированном подходе, частично решают эту проблему.
Следующая проблема проектирования. Мы продекларировали модули,
объявили их взаимосвязи, как-то описали семантику модулей (это тоже
проблема). Но никто не даст гарантии, что этот проект правилен. Для решения
этой проблемы используется моделирование программных систем. То есть, когда
вместе с построением проекта, который декларирует все интерфейсы,
функциональность и прочее, мы можем каким-то образом промоделировать работу
всей или частей создаваемой системы. Реально при создании больших
программных систем на сегодняшний день нет единых инструментариев для таких
действий. Каждые из существующих систем имеют разные подходы. Иногда эти
подходы (как и у нас, так и за рубежом) достаточно архаичны.
Но тем не менее следует понимать, что период проектирования есть
очень важный момент.
Кодирование
Если составлен нормальный проект, то с кодированием проблем нет. Но
следует обратить внимание на то, что специалист в программировании это не
тот, кто быстро пишет на С, а тот, кто хорошо и подробно сможет
спроектировать задачу. При современном развитии инструментальных средств
закодировать сможет любой школьник, а спроектировать систему - это и есть
профессиональная задача людей, занимающихся программированием - выбрать
инструментальные средства, составить проект, промоделировать решение.
Основной компонент системы кодирования - язык программирования. В
голове каждого программиста лежит иерархия языков программирования - от
машинного кода и ассемблера до универсальных языков программирования
(FORTRAN, Algol, Pascal, C и т.д.), специализированных языков (SQL, HTML,
Java и т.д.)
Мы имеем ЯП и программу, которая написана в нотации этого языка.
Система программирования обеспечивает перевод исходной программы в
объектный язык. Этот процесс перевода называется трансляцией. Объектный
язык может быть как некоторым языком программирования высокого уровня
(трансляция), так и машинный язык (компиляция). Мы можем говорить о
трансляторах-компиляторах и трансляторах-интерпретаторах.
Компилятор - это транслятор, переводящий текст программы в машинный
код.
Интерпретатор - это транслятор, который обычно совмещает процесс
перевода и выполнения программы (компилятор сначала переводит программу, а
только затем ее можно выполнить). Он, грубо говоря, выполняет каждую
строчку, при этом машинный код не генерируется, а происходит обращение к
некоторой стандартной библиотеке программ интерпретатора. Если результат
работы компилятора - код программы на машинном языке, то результат работы
транслятора - последовательность обращений к функциям интерпретации. При
этом, также как и при компиляции, когда создается оттранслированная
программа, у нас тоже может быть создана программа, но в этом
интепретируемом коде (последовательности обращений к функциям
интерпретации).
Понятна разница - компиляторы более эффективны, так как в
интерпретаторах невозможна оптимизация и постоянные вызовы функций также не
эффективны. Но интерпретаторы более удобны за счет того, что при
интерпретации возможно включать в функции интерпретации множество сервисных
средств: отладки, возможность интеграции интерпретатора и языкового
редактора (компиляция это делать не позволяет).
На сегодняшний день каждый из методов - и компиляция и интерпретация
занимают свои определенные ниши.
Лекция №20
На прошлой лекции мы начали рассматривать системы программирования. На
самом деле эта тема может быть основанием целого курса, потому что эта тема
включает в себя все то, что может быть в современной науке о компьютерах -
это и хорошие практические решения, и разработанные, реально применяемые,
теоретические решения, и многое другое. Мы говорили, что система
программирования - это комплекс программ, обеспечивающий жизненный цикл
программы в системе. Жизненный цикл создаваемого программного обеспечения
содержит следующие этапы:
проектирование
кодирование
тестирование
отладка
Мы с вами говорили о важности этапа проектирования, о том что
программный продукт представляет из себя сложнейший объект, имеющий
огромное число связей между своими компонентами. Пропустить этап
проектирования нельзя. Для проектирования программных систем, необходимы
специализированные средства, которые позволили бы (в идеале) описывать
проект некоторым формальным образом, и последовательно уточняя его,
приводить формальное описание проекта в реальный код программы.
Мы говорили, что важным этапом проектирования, является этап
моделирования системы, т.е. тот этап, когда мы берем внешние нагрузки,
которые могут поступать на систему, приписываем свойству потока событий,
связанных с этими внешними нагрузками, определенный статистический закон, и
рассматриваем предположительное поведение системы при такой эмуляции
внешней среды. Понятно, что без этапа моделирования тоже трудно создать
какой-либо программный продукт.
Этап кодирования
Мы также говорили, что важной частью системы программирования являются
средства кодирования. Этап кодирования в жизненном цикле программы
традиционно (и обычно не правильно) однозначно связывается с понятием
системы программирования. Очень многие, когда начинают говорить о системе
программирования, подразумевают под этим транслятор языка программирования.
Хотелось бы этими лекциями вам показать, что система программирования - это
нечто существенно более широкое, чем транслятор. Все компоненты одинаково
необходимы.
Транслятор - это программа, которая переводит программу в нотации
одного языка, в нотацию другого языка. Компилятор - это транслятор, который
переводит программу из нотации одного языка в нотацию машинного языка.
Машинным языком может быть либо код конкретной машины, либо объектный код.
Трансляторы могут быть интерпретаторами, т.е. совмещать анализ исходной
программы с ее выполнением. Результатом работы интерпретатора является не
машинный код, а последовательность обращений к библиотеке функций
интерпретатора. Интерпретатор, в отличие от транслятора, может выбирать
одну за одной инструкции и сразу их выполнять. При интерпретации (в отличие
от трансляции или компиляции), может быть начато выполнение программы
которая имеет синтаксические ошибки.
Кросс-трансляторы. Если рассматривать системы трансляции, то есть еще
один вид трансляторов - кросс-трансляторы (и кросс-компиляторы). Кросс
транслятор работает на некотором типе вычислительной системы, которая
называется инструментальная ЭВМ. Инструментальная ЭВМ может
характеризоваться своей архитектурой и/или операционным окружением, которое
функционирует на ней. Кросс-транслятор обеспечивает перевод программы,
записанной в нотации некоторого языка, в код вычислительной системы,
отличной от инструментальной ЭВМ. Та вычислительная система, для которой
генерируется код, называется объектной ЭВМ, и соответственно, тот код,
который мы получаем, называется объектным кодом (это не тоже, что объектный
модуль). Например, компьютеру, который управляет двигательной установкой
самолета, совершенно не нужно иметь операционную среду, которая обеспечит
работу пользователя по разработке программ для него. Ему совершенно не
нужно иметь средства редактирования текста, трансляции и т.д., потому что у
него одна функция - управлять двигательной установкой. На этом компьютере
будет работать операционная система реального времени. Для создания
программ для такого рода компьютеров и используются системы кросс-
программирования и кросс-трансляторы. На обычной машине типа PC может быть
размещен транслятор, который будет генерировать код для заданного
компьютера.
[pic]
На самом деле, бывают ситуации, когда тип объектной машины совпадает с
типом инструментальной машины, но отличаются операционные среды, которые
функционируют на данных машинах. В этом случае также нужна система кросс-
программирования.
Кросс-трансляторы также нужны разработчикам новых машин, которые хотят
параллельно с ее появлением создать программное обеспечение, которое будет
работать на этой машине.
Обработка модульной программы. С точки зрения этапа кодирования можно
рассмотреть последовательность обработки программы более крупноблочно, чем
с точки зрения трансляции. Мы с вами говорили на начальных лекциях о том
что современные языки программирования поддерживают модульность (программа
представляется в виде группы модулей и взаимосвязь между этими модулями
осуществляется за счет соответствующих объявлений в них). Давайте
посмотрим, что происходит на этапе обработки программы, написанной на одном
из модульных языков.
[pic]
Пусть есть некоторая группа модулей и есть соответствующие этим
модулям тексты программ, на языках, используемых для программирования.
Языковыми средствами определены связи между модулями.
Первый этап, который происходит - это этап трансляции (либо
компиляции) каждого из модулей. После трансляции модуля в виде исходного
текста мы получаем объектный модуль - это есть машинно-ориентированное
представление программы, в котором присутствуют фрагменты программы в
машинном коде, а также информация о необходимых внешних связях (ссылки на
объекты в других модулях). Информация о необходимых внешних связях (помимо
информации о местонахождении внешних объектов) также включает в себя ссылки
на те места машинного кода, которые пытаются использовать адреса внешних
объектов, т.е. на те недообработанные команды, которые нельзя обработать из-
за того, что при трансляции модуля еще не известно где какие объекты
находятся. Т.е. объектный модуль - это машинное представление программного
кода, в котором еще не разрешены внешние связи. Объектный модуль может
содержать дополнительную информацию (например, информацию, необходимую для
отладки - таблицы имен и т.д.).
Для каждого из исходных модулей мы получим объектный модуль. После
этого все объектные модули, которые составляют нашу программу, а также
модули требуемых библиотек функций, поступают на вход редактору внешних
связей. Редактор внешних связей моделирует размещение объектных модулей в
оперативной памяти и разрешает все связи между ними. В итоге мы получаем
исполняемый модуль, который может быть запущен как процесс. Иногда
трансляторы в качестве результата трансляции выдают модуль на ассемблере
соответствующей машины.
В эту же схему также часто добавляется этап оптимизации программы,
причем оптимизация может происходить до этапа трансляции (т.е. в терминах
исходного языка) или/и после трансляции (в терминах машинного кода).
Например до трансляции можно вычислить все константные подвыражения и т.д.
Для машин типа PC этап оптимизации может быть не столь важен, потому что
этот вопрос обычно разрешается покупкой какого-нибудь более быстрого
компонента, но есть класс машин (mainframe), для которых этот этап
необходим.
Давайте посмотрим на проблему кодирования с другой стороны. Мы
посмотрим как устроен этап трансляции.
Каждый транслятор при обработке программы выполняет следующие
действия.
I. Лексический анализ.
II. Синтаксический анализ.
III. Семантический анализ и генерация кода.
Лексический анализ. Лексический анализатор производит анализ исходного
текста на предмет правильности записи лексических единиц входного языка.
Затем он переводит программу из нотации исходного текста в нотацию лексем.
Лексические единицы - это минимальные конструкции, которые могут быть
продекларированы языком. К лексическим единицам относятся:
идентификаторы
ключевые слова
код операции
разделители
константы
Вещественные константы в некоторых трансляторах могут представляться в
виде группы лексических единиц, каждая из которых является целочисленной
константой.
После этого исходная программа переводится в вид лексем. Лексема - это
некоторая конструкция, содержащая два значения - тип лексемы и номер
лексемы.
|Тип лексемы |№ лексемы |
Тип лексемы - это код, который говорит о том, что данная лексема
принадлежит одной из обозначенных нами групп. к примеру лексема может быть
ключевым словом, тогда в поле типа будет стоять соответствующий номер.
Номер лексемы уточняет конкретное значение этой лексемы. Если, к примеру,
было ключевое слово begin, то номер лексемы будет содержать число,
соответствующее ключевому слову begin. Если тип лексемы - идентификатор, то
номер лексемы будет номером идентификатора в таблице имен которую создаст
лексический анализатор. Если тип лексемы - константа, то номер лексемы тоже
будет ссылкой на таблицу с константами.
После лексического анализатора мы получаем компактную программу, в
которой нет уже ничего лишнего (пробелов, комментариев, и т.д.). Вся
программа составлена в виде таких лексем, и поэтому она более компактна и
проста.
Синтаксический анализ. Программа в виде лексем поступает на вход
синтаксическому анализатору, который осуществляет проверку программы на
предмет правильности с точки зрения синтаксических правил. Результатом
работы синтаксического анализатора является либо информация о том, что в
программе имеются синтаксические ошибки и указание координат этих ошибок и
их диагностика, либо представление программы в некотором промежуточном
виде. Этим промежуточным видом может быть, предположим, бесскобочная
запись, либо запись в виде деревьев (хотя одно однозначно сводится к
другому). Это промежуточное представление, которое является синтаксически и
лексически правильной программой, поступает на вход семантическому
анализатору.
Семантический анализ. Семантика - это все то, что не описывается
синтаксисом и лексикой языка. К примеру, лексикой и синтаксисом языка
сложно описать то, что нехорошо передавать управление в тело цикла не через
начало цикла. Выявление таких ошибок - одна из функций семантического
анализа. при этом семантический анализатор ставит в соответствие
синтаксически и семантически правильным конструкциям объектный код, т.е.
происходит генерация кода.
Система программирования и трансляции - очень наукоемкая область
программного обеспечения. Организация трансляторов - это было первое
применение теоретических достижений науки, которые заключались в следующем.
За счет возможности использования тех или иных грамматик (наборов
формальных правил построения лексических конструкций и синтаксических
правил), можно разделить программную реализацию лексических и
синтаксических анализаторов на два компонента. Первый компонент - это
программа, которая в общем случае ничего не знает о том языке, который она
будет анализировать. Второй компонент - это набор данных, представляющий из
себя формальное описание свойств языка, который мы анализируем. Совмещение
этих двух компонентов, позволяет автоматизировать процесс построения
лексических и синтаксических анализаторов, а также генераторов кода, для
различных языков программирования. Современные системы программирования в
своем составе имеют средства автоматизации построения компиляторов. Для ОС
UNIX есть пакет LEX - пакет генерации лексических анализаторов, и есть
пакет YACC - для генерации синтаксических анализаторов. Это все достигается
за счет возможности формализации свойств языка, и использования этого
формального описания, как параметров для тех или иных инструментальных
средств.
Проходы трансляторов. Мы с вами посмотрели на транслятор с точки
зрения функциональных этапов. Но очень часто мы слышим об однопроходных
трансляторах, двухпроходных, трехпроходных, и т.д. С проблемой трансляции
связано понятие "проход". Проход - это полный просмотр некоторого
представления исходного текста программы.
Есть трансляторы однопроходные. Это означает, что транслятор
просматривает исходный текст от начала и до конца, и к концу просмотра (в
случае правильности программы) он получает объектный модуль.
Если мы посмотрим Си-компилятор, с которым вы работаете, то скорее
всего он двухпроходный. Первый проход - это работа препроцессора. После
первого прохода появляется чистая Си-программа без всяких препроцессорных
команд. На Втором проходе происходит лексический, синтаксический и
семантический анализ, и в итоге вы получаете объектную программу в виде
ассемблера.
Количество проходов в некоторых трансляторах связано с количеством
этапов, т.е. бывают реализации, для которых удобно сделать отдельный проход
для лексического анализа, отдельный проход для синтаксического анализа и
отдельный проход для семантического анализа. Если транслятор
многопроходный, то возникает проблема сохранения промежуточной нотации
программы между проходами.
Make-файл. К этой же проблеме кодирования относится средство поддержки
разработки программных проектов. Одним из популярных средств,
ориентированных на работу одного или нескольких программистов, является
т.н. make-средство. Название происходит от соответствующей команды ОС UNIX.
C make-командой связан т.н. make-файл, в котором построчно указываются
взаимосвязи всевозможных файлов, получаемых при трансляции, редактировании
связей, и т.д., и те действия, которые надо выполнить, если эти взаимосвязи
нарушаются. В частности можно сказать, что некоторый исполняемый файл
зависит от группы объектных файлов, и если эта связь нарушена, то надо
выполнить команду редактирования связей (link ...). Что значит нарушение
зависимости и что значит связь? Make-команда проверяет существование этих
объектных файлов. Если они существуют, то времена их создания должны быть
более ранние, чем время создания исполняемого файла. В том случае, если это
правило будет нарушено (а это проверяет make-команда), то будет запущен
редактор связей (link), который заново создаст исполняемый файл. Тем самым
такое средство позволяет нам работать с программой, состоящей из большого
количества модулей, и не заботиться о том, соответствует ли в данный момент
времени исполняемый файл набору объектных файлов или не соответствует
(можно просто запустить make-файл).
Make-файлы могут содержать большое количество такого рода строчек,
которые таким образом свяжут не только объектные и исполняемые файлы, но и
каждый из исходных файлов с соответствующим объектным файлом, и т.д. Т.е.
суть такова, что после работы не надо каждый раз для каждого файла
запускать компилятор, редактор связей, а можно просто запустить make-файл,
а он уже сам определит и выберет те файлы, которые нужно корректировать, и
выполнит необходимые действия. На самом деле такими средствами сейчас
обладают почти все системы программирования.
Система контроля версий. Если make-файл - это система, предназначенная
для одного программиста, в лучшем случае, для нескольких программистов, то
если у нас существует большой коллектив, который делает большой программный
проект, то используется т.н. система контроля версий, которая позволяет
организовывать корректную работу больших коллективов людей над одним и тем
же проектом, которая основана на возможности декларации версий и
осуществлении контроля за этими версиями.
Этапы тестирования и отладки
Тестирование - это поиск ситуации, в которой программный продукт не
работает. При этом используются наборы тестов, определяющих внешнюю
нагрузку на программный продукт. Можно сказать, что программа оттестирована
на определенном наборе тестов. Утверждение, что программа оттестирована
вообще в общем случае некорректно.
Отладка - это процесс поиска, локализации и исправления ошибки.
Отладка осуществляется, когда мы имеем программную систему, и знаем, что
она не работает на каком-то из тестов.
Проблемы тестирования и отладки - это есть проблемы крайней важности.
По оценкам, на тестирование и отладку затрачивается порядка 30% времени
разработки проекта. Сложность тестирования и отладки зависит от качества
проектирования и кодирования. Тестирования зачастую выполнить сложно и
часто для тестирования используются модельные нагрузки, например мы
тестируем бортовую сеть самолета, что-то мы сможем сделать на земле, а что-
то так или иначе делается уже на реальном полете, когда собираются данные и
фиксируется работает система или не работает.
Лекция №21
Тема, которую мы с вами начнем рассматривать будет короткой и простой,
и мы обозначим основные болевые точки. Детали и подробности вы должны
изучить сами.
Командный язык ОС UNIX CSHELL (CSH)
Для многих пользователей программного обеспечения основным и
единственным свойством, на которое обращает внимание пользователь, является
не внутреннее устройство системы, а тот интерфейс, который предоставляется
системой пользователю. Почти каждая система имеет средства интерактивного
взаимодействия с пользователем, т.е. средства, которые позволяют в той или
иной форме вводить запросы на выполнение действий. С этой точки зрения UNIX
поддерживает возможность работы с произвольным количеством интерпретаторов
команд. В файле /etc/passwd/ одно из полей, относящихся к данному
пользователю, содержит полное имя интерпретатора команд, который должен
быть запущен при входе пользователя в систему. В общем случае, при входе
пользователя в систему может быть запущена абсолютно любая программа.
Традиционными интерпретаторами команд в системе UNIX являются SH, CSH
и BASH. Давайте рассмотрим на концептуальном уровне что такое СSH (в
принципе все интерпретаторы команд похожи друг на друга и являются
некоторым расширением SH).
Интерпретатор команд определяет структуру вводимой команды. Команда
(для CSH) - это последовательность символов, заканчивающаяся некоторым
кодом, и которая состоит из слов. Слова - это последовательности символов,
не содержащих разделители. Разделители - это набор фиксированных символов,
в частности привычным для нас разделителем является пробел. Кроме пробела
разделителями служат запятые, знаки < >, и т.д. Каждый из этих разделителей
имеет свою интерпретацию. В частности, символ "|" означает создание
конвейера. Например команда ls|more позволит избежать быстрый вывод текста
на экран и за экран, и позволит пролистать его.
Система UNIX поддерживает набор специальных символов, которые
называются метасимволами. Метасимволы обычно встречаются в словах команды и
интерпретируются по заранее определенным правилам. Метасимволов существует
много, в частности среди них есть знакомые нам * и ?. Команда rm *
удалит все файлы не начинающиеся с точки в текущем каталоге. ? означает,
что на месте этого символа может быть один любой знак. Метасимволы могут
быть парными. Например внутри квадратных скобок указывается альтернативная
группа, предположим, [abc] означает, что вместо этой квадратной скобки
может быть один из перечисленных в ней символов (любую цифру можно задать
так [0-9]).
CSH позволяет объединять команды. Для этого также используются
метасимволы. Если внутри круглых скобок перечислены некоторые команды, то
запустится еще один интерпретатор, который выполнит эту последовательность
команд. Например команда (cd /etc; ls -la|grep pas) сменит каталог и
осуществит поиск в этом каталоге строки pas.
В чем разнится между тем, выполнилась ли эта команда в интерпретаторе
с которым мы работаем, или если был запущен еще один интерпретатор. Разница
в том что, в этом случае не изменится текущий каталог, несмотря на то, что
выполнилась команда смены каталога.
Имеется возможность объединять команды с использованием {}. Все
команды, перечисленные в фигурных скобках будут запущены слева направо, но
при этом на стандартный вывод будет положена объединенная
последовательность стандартных выводов всех команд. {more t.b; more
t.c}>tt.b - в файле tt.b окажется стандартный вывод одной команды, а затем
стандартный вывод другой, эта команда без фигурных скобок поместила бы туда
стандартный вывод только второй команды.
Интерпретатор команд имеет набор встроенных команд. Все команды
подразделяются на два типа:
1. Команды, которые реализованы в виде отдельных файлов. Это те
команды, которые можно модифицировать или добавлять новые.
2. Команды, которые встроены в интерпретатор команд, т.е. те команды,
которые выполняет сам интерпретатор. К таким командам относится
команда kill, по которой осуществляется передача соответствующего
сигнала от имени интерпретатора. Есть также полезная команда alias,
которая используется для переименования существующих команд.
Интерпретатор команд CSH позволяет осуществлять работу с предысторией.
Он может организовать буферизацию N последних команд и организует доступ к
списку последних команд. В частности, можно выполнять и редактировать
командные строки из списка предыстории и снова их выполнять. CSH имеет
возможность именовать строки из списка предыстории. Ссылка на
соответствующую строку осуществляется с помощью команды, которая
начинается с символа ! , за которым следует некоторая суффиксная часть .
Ссылка !! выполняет последнюю команду. Ссылка вида !!N , где N -
некоторое число, выполняет строку из с писка предыстории с номером N. Если
N отрицательно, то номер строки отсчитывается с конца, к примеру, !!-1
означает выполнение последней команды. Кроме того, могут быть некоторые
контекстные ссылки вида !.
Переменные CSH
Интерпретатор команд предоставляет возможность программирования на
уровне CSH. Для этого предусмотрена декларация переменных и возможность
присвоения им значения, а также набор высокоуровневых операторов, которые
по своей семантике похожи на операторы языка Си (отсюда и название
интерпретатора CSH). CSH фактически есть высокоуровневый язык с операторами
языка Си. Оперируя с переменными CSH можно составлять программы, которые
выполняют некоторые действия.
Кроме всего прочего, имеются предопределенные имена, которые отвечают
за настройку системы, в частности, о том, сколько строк предыстории
сохраняются. Сохранение происходит в двух ипостасях: первое - это
оперативное сохранение, есть параметр (переменная history), который
определяет, сколько строк должно быть сохранено в течении последнего сеанса
работы. Второе - есть возможность сохранения предыстории между сеансами,
т.е. при очередном входе систему уже будет определен некоторый список
предыстории (размер списка - в переменной savehistory).
Кроме переменных, с помощью которых осуществляется настройка, и имена
которых определены, есть еще один класс переменных CSH - это т.н.
внутренние переменные, которые также являются зарезервированными. Это
переменные, которые имеют предопределенные имена и определяют свое значение
через внутренние функции интерпретатора команд. В частности, есть
переменная path, это есть текстовый массив, в котором находятся текстовые
строки, содержащие полные имена некоторых каталогов. В соответствии с
содержимым переменной path, CSH осуществляет поиск файлов, которые являются
командами, введенными пользователями. Мы с вами говорили, что в UNIX (кроме
встроенных команд) специальных команд нет, командой является любой
исполняемый файл. Если пользователь ввел некоторое имя NAME, поиск
исполняемого файла с именем NAME будет осуществляться, во-первых, в текущем
каталоге, а во вторых, в каталогах, указанных в переменной path, в
соответствующем порядке.
Переменная home - содержит имя домашнего каталога.
Переменная ignoreeof - это переменная, установка которой блокирует
завершение сеанса работы по вводу символа ^D (Ctrl-D).
В системе можно варьировать вид приглашения (к вводу) с помощью
переменной prompt, причем это приглашение может быть достаточно
интеллектуальным. В нем, например, может присутствовать дата и т.п.
Мы с вами рассмотрели переменную path, она может определять много
директорий. Представьте себе, что я ввожу некоторую командную строку NAME и
в текущем каталоге соответствующего файла нет. Это означает, что будет
осуществлен поиск файла с именем NAME по всем каталогам, записанным в
переменной path (со всеми вытекающими последствиями). Это может быть долго.
А если еще учесть, что вы работаете в многопользовательской системе, и
каждый постоянно вводит какие-то команды, то накладные расходы получаются
сумасшедшими. Система UNIX разумная система, и одним из правил, которых
придерживались ее разработчики было то, что если где-то что-то можно
оптимизировать, то надо это сделать. При входе пользователя в систему на
основании значения переменной path формируется hash-таблица имен
исполняемых файлов, находящихся во всех перечисленных каталогах
(естественно, учитывается порядок каталогов). Поиск команды (если она не
найдена в текущем каталоге) будет заключаться в просмотре этой быстрой hash-
таблицы. За счет этого достигается ускорение доступа к команде, хотя при
входе в систему возможна значительная задержка, которая вызвана
формированием этой hash-таблицы.
Предположим, пользователь вошел в систему, а потом администратор
добавил команду, которая этому пользователю необходима. Но за счет того,
что hash-таблица уже сформировалась, доступ к ней (без набора полного
имени) закрыт, хотя она есть в каталоге, указанном в path. В этом случае
можно переформировать hash-таблицу с помощью команды rehash.
Кроме всех этих переменных, CSH имеет еще одну категорию переменных,
которые называются переменными окружения. Если вы вспомните, то при запуске
процесса функции main передаются несколько параметров, среди которых есть
массив значений переменных окружения. В процесс можно передать те
параметры, которые характеризуют сеанс работы пользователя в данный момент
времени. В частности можно передать имя домашнего каталога, имя текущего
каталога, имя терминала, с которого вызван данный процесс и т.д.
CSH имеет возможность работы с переменными окружения (можно их
просматривать, устанавливать и т.п.).
С помощью средств CSH можно составлять программы. В этих программах
могут фигурировать имена переменных CSH, которые мы можем интерпретировать
как имена файлов. Средствами CSH можно определять ряд свойств, связанных с
именем, которое мы интерпретируем как имя файла. В частности, есть
возможности проверки, существует ли такой-то файл. Есть возможность
проверки, является ли такой-то файл каталогом или не является. Есть
возможность проверки всех прав доступа. Есть возможность определения
размера файла. И, наконец, есть возможность запуска файла как команды.
Кстати, с помощью этих средств реализовано множество команд системы.
Программы на CSH можно вводить построчно, в этом случае CSH играет роль
транслятора-интерпретатора, а можно программу на CSH записать в некоторый
файл и исполнять его как командный файл (Но все равно будет происходить
процесс интерпретации).
Специальные файлы
Любой командный язык имеет набор т.н. профайлов, или стартовых файлов.
CSH имеет две разновидности этих файлов: это файлы, которые могут
выполняться при старте CSH, и файлы, которые выполняются при завершении
работы.
При старте CSH работает с двумя файлами - .cshrc и .login. Файл .cshrc
- это командный файл, в котором пользователь по своему усмотрению может
размещать произвольное количество команд на CSH, которые будут выполняться
сразу после запуска CSH (например, в этом файле может находиться команда
тестирования файловой системы и т.д.). Файл .login запускается при входе
пользователя в систему. В этом файле также может находиться любая
последовательность команд, например там может быть переопределение имен
команд, наиболее приемлемое для данного пользователя (потому что мнемоника
команд в UNIX достаточно тяжелая, да и параметров у каждой команды много).
При завершении работы с CSH запускается файл с именем .logout в
котором также может находиться некоторый набор команд.
Есть стандартный файл, который может образоваться в процессе работы -
это файл .history. Если у вас определена возможность сохранения истории, то
как раз в этом файле буферизуется предыстория вашей работы.
Теперь подведем итог, и я напомню в чем вы должны разобраться сами:
1. CSH - как язык программирования. Типы переменных CSH.
Программирование на CSH.
1. Соглашения, которые определяет CSH при работе со строками.
Разбиение командной строки на слова. Интерпретация
метасимволов. Возможность ссылки на командные строки
предыстории.
2. Встроенные команды CSH.
3. Специальные переменные CSH: внутренние переменные и переменные
окружения.
4. Специальные командные файлы CSH.
Лекция №22
Многомашинные ассоциации
Терминальные комплексы
Первые многомашинные ассоциации появились в начале 60-х годов и это
было связано с двумя проблемами. Первая проблема - проблема обеспечения
массового доступа к вычислительным ресурсам некоторой вычислительной
системы. Второе - появление задач, требовавших возможности привлечения для
их решения более чем одной вычислительной системы. С точки зрения
интеллектуализации многомашинных ассоциаций, первым типом многомашинных
комплексов был терминальный комплекс. Терминальный комплекс можно
определить как набор программных и аппаратных средств, предназначенных для
взаимодействия пользователей с вычислительной установкой, через телефонную
или телеграфную сеть (или через любую другую среду, через которую можно
обеспечить связь).
Структуру терминального комплекса можно изобразить следующим образом:
Есть вычислительная система, имеется канал взаимодействия с внешним
миром, к которому подключено устройство, называемое мультиплексор. Это
устройство, которое обеспечивает взаимодействие группы внешних устройств с
вычислительной системой (ВС) через один канал ввода/вывода. К каналам
мультиплексора могут быть подключены локальные терминалы.
Кроме того может быть подключено устройство, называемое модемом. Модем
позволяет выйти в телефонную или телеграфную сеть, работающую в аналоговом
режиме, и передавать информацию (модему, в другой части сети). К модему
подключается удаленный терминал. Модем преобразует дискретный сигнал,
поступающий от ВС (или терминала), в аналоговый сигнал, который уже можно
передавать по сети; и обратно - аналоговый в дискретный.
Телефонная сеть состоит из какого-то набора телефонных станций, и она
предоставляет т.н. коммутируемый канал. Суть его заключается в том, что при
нескольких звонках к одному и тому же абоненту, раз от раза маршруты
коммутации (т.е. набор проводов, по которым идет сообщение) отличаются друг
от друга, за счет того, что каждый раз выбираются свободные каналы.
Может быть также многоуровневое мультиплексирование. Вместо удаленного
терминала, подключается удаленный мультиплексор, и начиная от него может
быть продолжение этого же уровня рисунков. Это означает, что мы, работая за
терминалом второго (или третьего, четвертого, и т.д.) уровня существенно
загружаем коммутируемую линию.
Линия связи, которая связывает один удаленный терминал с компьютером,
называется линией связи типа точка-точка. Эта линия может быть либо
арендуемой (мы договариваемся с телефонными станциями и фиксируем
коммутацию), либо коммутируемой.
Канал может быть многоточечным. При этом на входе находится удаленный
мультиплексор. Многоточечные каналы также могут быть либо арендуемыми, либо
коммутируемыми.
Типы каналов связи:
1. Симплексные каналы - каналы, по которым передача информации ведется
в одном направлении.
2. Дуплексные каналы - каналы, которые обеспечивают одновременную
передачу информации в двух направлениях.
3. Полудуплексные каналы - каналы, которые обеспечивают передачу
информации в двух направлениях, но в каждый момент времени только в
одну сторону (подобно рации).
ВС имеет комплекс программ, которые обеспечивают взаимодействие
пользователей через всю коммуникационную среду, с ВС. В качестве локальных
и удаленных терминалов могут присутствовать как реальные терминальные
устройства, так и компьютеры, которые эмулируют работу терминала.
Многомашинные вычислительные комплексы
Многомашинные вычислительные комплексы (ММВК) - это программно
аппаратное объединение группы вычислительных машин, в которых:
1. На каждой из машин работает своя операционная система (этот признак
отличает ММВК от многопроцессорного вычислительного комплекса).
2. В ММВК имеются общие физические ресурсы (а следовательно имеются
проблемы синхронизации доступа).
ММВК использовались в качестве систем сбора и обработки больших
наборов данных, и для организации глобальных терминальных комплексов. ММВК
появились в начале 60-х и сейчас продолжают успешно существовать. Одно из
основных применений ММВК - это дублирование вычислительной мощи, примером
таких систем может служить любая система управления важными
технологическими процессами.
Вычислительные сети
И терминальные комплексы, и ММВК можно считать частным случаем
вычислительных сетей, однако хронология развития многомашинных ассоциаций
была именно такой - сначала появились терминальные комплексы, потом ММВК,
потом вычислительные сети.
Предположим у нас есть некоторая группа вычислительных машин, которые
мы будем называть абонентскими машинами (АМ). Имеется некоторое
образование, которое называется коммутационной средой. Коммутационная среда
включает каналы передачи данных, обеспечивающие взаимодействие между
машинами, специальные вычислительные машины, которые мы будем называть
коммутационными машинами. Абонентские машины могут осуществлять
взаимодействие друг с другом через коммутационную среду, в рамках которой
используются каналы передачи данных и коммутационные машины.
[pic]
Существует ряд классических разновидностей сетей.
Сеть коммутации каналов. Суть ее заключается в том, что если надо
связать АМ2 с АМ3, то происходит соединение каналов и коммутационных машин
между этими АМ. Это соединение будет существовать до конца взаимодействия
АМ2 и АМ3. Достоинство этой сети в том, что скорость взаимодействия между
машинами равна скорости самого медленного компонента сети, участвующего в
связи (это максимально возможная скорость). Недостаток в том, что такая
связь может блокировать другие соединения (в данном случае АМ1 и АМ4 не
свяжутся до конца связи между АМ2 и АМ3). Уйти от этой проблемы можно
потребовав от коммутационной среды большой избыточности, т.е. организовать
дополнительные (дублирующие) каналы.
Сеть коммутации сообщений. Если коммутация каналов - это коммутация на
время всего сеанса связи, то коммутация сообщений - это связь, при которой
весь сеанс разделяется на передачу сообщений (сообщение - некоторая,
логически завершенная, порция данных), и коммутация происходит на период
передачи сообщения. В такой сети на коммуникационные машины ложатся большие
нагрузки, они должны обладать возможностью буферизации сообщений в связи с
неравномерной скоростью передачи на разных участках сети. Достоинства -
простота логическая и физическая, недостатки - снижение скорости работы в
сети, и потери, связанные с буферизацией.
Сеть коммутации пакетов. Сеанс разбивается на сообщения, сообщения
разбиваются на порции данных одинакового объема - пакеты. По сети
перемещаются не сообщения, а пакеты. Здесь действует принцип горячей
картошки: основное действие коммутационной машины - как можно быстрее
избавиться от пакета, определив кому его дальше можно перекинуть.. Т.к. все
пакеты одинакового объема, не возникает проблем с буферизацией, потому что
мы всегда можем рассчитать необходимую буферную способность коммутационных
машин. Логически происходит достаточно быстрое соединение, потому что сеть
коммутации пакетов практически не имеет ситуаций, когда какие-то каналы
заблокированы. За счет того, что происходит дробление сеанса на пакеты,
имеется возможность оптимизации обработки ошибок при передаче данных. Если
мы получаем ошибку в режиме коммутации каналов, то надо повторять весь
сеанс, если в режиме коммутации сообщений, то надо повторять сообщение,
здесь же достаточно повторить передачу пакета, в котором обнаружена ошибка.
В реальных системах используются многоуровневые сети, которые в каких-
то режимах работают в режиме коммутации каналов, в каких-то режимах
работают в режиме коммутации сообщений и т.д. На сегодняшний день можно
сказать, что сетей, принадлежащих чисто к одному из вышеперечисленных
типов, нет.
Стандарт ISO/OSI
Развитие многомашинных ассоциаций вообще, и сетей ЭВМ в частности,
определило возникновение необходимости стандартизации взаимодействия,
происходящего в сети. Поэтому в конце 70-х начале 80-х годов ISO
(International Standard Organization) предложила т.н. стандарт
взаимодействия открытых систем ISO/OSI (Open System Interface).
Была предложена семиуровневая модель организации взаимодействия
компьютеров со средой передачи данных, с программами, функционирующими на
разных компьютерах, и в общем случае организация взаимодействия в сети.
Предлагались к рассмотрению семь уровней взаимодействия:
|VII|Прикладной уровень |
|VI |Представительский |
| |уровень |
|V |Сеансовый уровень |
|IV |Транспортный уровень |
|III|Сетевой уровень |
|II |Канальный уровень |
|I |Физический уровень |
Физический уровень или уровень сопряжения с физическим каналом. На этом
уровне решаются самые земные вопросы организации взаимосвязи: это вопросы
уровней и типов сигналов, и т.д. Этот уровень определяет конкретную
физическую среду. Предположим, физической средой может быть среда, которая
называется "витая пара", или среда, которая называется "коаксиальный
провод", или средой может быть оптоволокно, и т.д. Каждая из этих
физических сред определяет свои правила общения через них.
Канальный уровень. На этом уровне формализуются правила передачи данных
через канал. Если физический уровень связан непосредственно со средой (с
каналом), то канальный уровень связан с передачей информации по этому
каналу.
Сетевой уровень. Этот уровень управляет связью в сети между машинами. Здесь
решается вопрос адресации и маршрутизации данных.
Транспортный уровень. Этот уровень иногда называют уровнем логического
канала. На этом уровне решаются проблемы управления передачей данных, и
связанные с этими проблемами задачи - локализация и обработка ошибок и
непосредственно сервис передачи данных.
Сеансовый уровень обеспечивает взаимодействие программ (понятно, что машины
сами по себе не взаимодействуют, а взаимодействуют программы). При этом
решаются проблемы синхронизации обмена данных, отмены сеанса в результате
фатального исхода, подтверждения паролей.
Представительский уровень. На этом уровне решается проблема с
представлением данных. Понятно, что разные системы имеют разные формы
представления данных.
Прикладной уровень. На прикладном уровне решаются проблемы стандартизации
взаимодействия с прикладными системами.
Итак, была предложена такая семиуровневая модель, и было предложено
использовать эту модель в двух качествах: стандартизация взаимодействия в
сети (разработка стандартов) и применение этой модель для практических
решений. Стандарты на физический уровень уже разработаны, разрабатываются
стандарты на канальный уровень. К сожалению, реальные сети не соответствуют
такой семиуровневой модели, хотя иногда можно найти некоторое соответствие.
Считается, что на каждой из ВС, функционирующих в сети, существует
набор уровней сетевого взаимодействия, соответствующий такой семиуровневой
модели. При этом считается, что гарантированно в сети существуют подряд
идущие уровни снизу вверх. Т.е. если есть сеансовый уровень, то
гарантированно есть все нижестоящие.
У нас есть две машины, на каждой из которых реализована эта
семиуровневая модель. Система взаимодействия предусматривает такое
взаимодействие между машинами, при котором каждый уровень общается с себе
подобным уровнем. Правило взаимодействия систем на одноименных уровнях,
называется протоколом передачи данных. При этом одноименные уровни реально
напрямую друг с другом оперировать не могут. Они оперируют друг с другом
через нижестоящие уровни и физическую среду. Любой уровень нашей модели
может непосредственно взаимодействовать только с соседним уровнем (либо
соседним сверху, либо снизу). Правила взаимодействия между уровнями
называются интерфейсом. Если один уровень обращается к другому (в другой
машине) через протокол передачи данных, на самом деле происходит обращение
через соответствующую последовательность интерфейсов к нижестоящим уровням,
далее происходит передача через физическую среду, и затем происходит
последовательная передача от нижестоящего уровня к нужному.
Сущность стандартизации заключается в том, что после принятия
стандарта этих уровней, можно уже менять реализации уровней либо добавлять
новые уровни, не беспокоясь об интерфейсах и протоколах. Стандартизация
определяет совместимость.
Немного об Интернет
Мы с вами поговорим немного об Интернет, но не с точки зрения того,
что нам говорят по телевизору, причем часто говорят вещи откровенно глупые,
а сточки зрения ее устройства.
Несколько слов предыстории. В конце 60-х годов американское агентство
перспективных исследований в обороне DARPA приняло решение о создании
экспериментальной сети с названием ARPANet. Основным свойством этой сети
было то, что предполагалось отсутствие какой-либо централизации. Этот
проект начал развиваться. В 70-ом году ARPANet стала считаться
действующей сетью США, и в частности, через эту сеть можно было добираться
до ведущих университетских и научных центров США. В начале 80-х годов
началась стандартизация языков программирования, а затем протоколов
взаимодействия сетей. Здесь есть два момента, повлиявших на появление
Интернет. Первый - это сам факт стандартизации. Второе - появление модели
ISO/OSI. Этогт момент можно считать началом появления Интернета.
Лекция №23
Мы начали обсуждать проблемы организации Интернет и обозначили
основное качество этой системы, заложенное изначально - что эта сеть
абсолютна симметрична с той точки зрения, что она не подразумевала какой-
либо централизации и иерархии. Это свойство, которое легло в основу сети, и
создало тот бум, который наблюдается сейчас, то есть Интернет может
свободно расширяться.
Мы с вами рассмотрели вкратце предысторию сети. Изначально сеть
подразумевала чисто экспериментальную работу и уже в дальнейшем получила
университетскую распространенность, коммерция же пришла в Интернет где-то в
1994-95 годах.
Интернет основан на протоколах TCP/IP (Transfer Control Protocol /
Internet Protocol). Иногда говорят: “протокол TCP/IP” - но это неправильно,
так как под этой аббревиатурой скрывается целый набор протоколов,
объединенных под одним названием. Кстати, здесь есть отдельно протокол TCP
и отдельно протокол IP.
Семейство TCP/IP строится по четырехуровневой схеме. Рассмотрим
таблицу соответствия TCP/IP модели ISO/OSI:
|Уровни TCP/IP |Уровни ISO/OSI |
|I. Прикладных программ |Прикладных программ |
| |Представление данных |
|II. Транспортный |Сеансовый |
| |Транспортный |
|III. Межсетевой |Сетевой |
|IV. Доступа к сети |Канальный |
| |Физический |
Уровень доступа к сети TCP/IP обеспечивают аппаратные интерфейсы и
драйверы этих аппаратных интерфейсов. К примеру, протоколами уровня доступа
к сети являются протоколы Ethernet. Их суть в следующем.
Ethernet - это система, обеспечивающая "мгновенный" доступ с
"контролем несущей" и обнаружением столкновений. Ethernet -
широковещательная сеть, это означает, что любое сообщение, выходящее из
источника становится видимым всем остальным Ethernet- устройствам. Ethernet
симметрична (нет никакого физического главенства), она предполагает наличие
некоторой физической среды (разновидности коаксиального кабеля, кабель
“витая пара”, СВЧ диапазон и др.), Ethernet-устройства, которое
осуществляет взаимодействие в рамках данной среды. Так как сеть
симметрична, то возникает проблема столкновения пакетов передающихся
данных, то есть, когда одновременно посылаются два пакета данных из разных
устройств - в этом случае происходит отказ передачи данных у обоих
устройств, после этого они замирают на некоторое время, а затем делают еще
одну попытку. Это напоминает разговор вежливых людей в темной комнате: если
один человек говорит, то остальные молчат; когда, два человека, начинают
говорить, то оба одновременно замолкают и делают паузу.
Следующее свойство Ethernet заключается в том, что каждое из Ethernet-
устройств имеет уникальный адрес, этот адрес присваивается ему при
изготовлении. Существует ряд международных правил, которые создают
невозможным появление в мире двух Ethernet-устройств с одинаковым номером,
будь-то уже сгоревшие устройства или еще находящиеся в строю. Этот адрес
можно сравнить со штрих-кодом, который встречается на различных продуктах.
Еще одно свойство Интернет - широковещательность. Реально, любое
сообщение, посланное в сеть, проходит через все Ethernet-устройства сети.
Соответственно все сообщения имеют адресацию, и сообщения могут
адресоваться всем устройствам, либо какому-то отдельному, но в любом случае
- сообщение пройдет через все устройства, а уж каждое из них само решит -
оставить его или нет.
Вот в нескольких словах о примере четвертого уровня доступа
протоколов TCP/IP, это наиболее распространенный вариант. Можно сказать о
том, что такая сеть проста, но имеет ряд недостатков, заключающихся в том,
что когда в сети возникает много активных пользователей, то учащаются
столкновения сообщений и пропускная способность существенно снижается.
Следует обратить внимание, что когда мы говорим Интернет - сеть, то
это также верно, как и то, что TCP/IP - протокол. То есть Интернет - это
объединение сетей.
С этой точки зрения можно выделить два вида компьютеров, которые
можно выделить в сети:
[pic]
Это хост-компьютеры (host) и шлюзы (gate). В двух словах покажем, что
есть что. Реально, каждый из компьютеров, который работает в сети, может
классифицироваться по двум признакам. Если в компьютере расположена только
одна сетевая карта или интерфейс, то это хост-компьютер и обычно он
принадлежит какой-нибудь одной сети. Если в компьютере находятся две и
более сетевых карт, при этом каждая из карт подключается к своей сети, то
такой компьютер называется компьютером-шлюзом. Соответственно, через шлюзы
можно объединять сети.
То есть, если смотреть с точки зрения принадлежности к сетям - хост
принадлежит одной сети, а шлюз принадлежит сразу двум или более сетям.
Через шлюзы осуществляется взаимодействие между компьютерами в различных
сетях. И этот механизм объединения и доступа является одной из
отличительных черт Интернета, которая базируется на межсетевом уровне
TCP/IP, который в свою очередь базируется на протоколе IP.
Основная функция протокола IP - уникальная межсетевая адресация.
Одним из основных свойств или качеств IP-протокола является IP-адрес. Это
адрес, который приписывается как конкретной сети, так и конкретному
компьютеру в сети. Исходя из этого, мы можем сказать, что шлюз - это
компьютер, имеющий два или более IP-адреса (адрес в одной сети и в другой
сети), хост - компьютер, имеющий один IP-адрес. Также, в функции IP входит
маршрутизация, то есть выбор пути, по которому будут передаваться
сообщения, определение базовых блоков данных (они называются дейтаграммы),
которые передаются, и взаимодействие с транспортным уровнем и уровнем
доступа к сети. Соответственно, в связи с этим взаимодействием возможна
фрагментация и дефрагментация дейтаграмм.
Два слова об IP-адресации. IP-адрес - это четырехбайтовый код, в
котором может размещаться информация об адресе сети и об адресе компьютера
в сети. Существует несколько категорий IP-адресов:
Класс А.
|0 | | | | |
|1 байт |2 байт |3 байт |4 байт |
Первый байт кодирует номер сети, при этом его старший бит является
нулевым (это признак класса А), остальные биты определяют номер сети. Сетей
класса А может быть 126 штук. Соответственно, последние три байта - номер
компьютера в сети. Сети класса А - гигантские сети, которые могут
принадлежать крупнейшим корпорациям.
Класс B.
|1 |0 | | | | |
|1 байт |2 байт |3 байт |4 байт |
Признак класса B - старшие два бита равны “10”. Для нумерации сети
используется остаток первого и целиком второй байт. 3 и 4 байты - номер
компьютера в сети. Это также большие сети, их может быть большое
количество, но также ограниченное.
Класс C.
|1 |1|0| | | | |
|1 байт |2 байт |3 байт |4 байт |
Признак класса C - старшие три бита равны “110”. Для нумерации сети
используются: остаток первого байта, второй и третий байты целиком. Номер
компьютера определяется четвертым байтом. Соответственно, класс C
представляет гигантское количество небольших сетей.
Есть еще два класса - D и Е, но они достаточно специфичны, и мы не
будем о них говорить.
Существует международная организация, которая распределяет номера
сетей. Здесь действует определенная иерархия. Организация, получившая номер
сети может распределять номера компьютеров в пределах этой сети по
собственному усмотрению.
Следует отметить, что, несмотря на огромное число адресов, которое
можно представить четырьмя байтами, существует проблема их узкости, и идут
разговоры о расширении IP адресации. Это колоссальная проблема, сравнимая
разве что с проблемой 2000 года.
На межсетевом уровне кроме протокола IP существует еще группа
вспомогательных протоколов. Часть из них зависит от того, чем мы будем
пользоваться и что мы будем делать. В любом случае - основа для них -
протокол IP.
Следующие протоколы - транспортные. Здесь присутствует два типа
протоколов - UDP (User Datagram Protocol) и TCP.
Протокол TCP обеспечивает передачу данных с контролем и исправлением
ошибок. Кроме того, TCP гарантирует логическое соединение. То есть TCP
позволяет создавать логические каналы, гарантируя отправку и прием порций
данных в определенном порядке. Протокол жесткий, так как контролирует
ошибки. Но за все надо платить, и TCP является ресурсоемким протоколом.
Протокол UDP - это быстрая доставка сообщений без осуществления
контроля доставки. Протокол TCP больше рассчитан на использование в
Интернете (для передачи на дальние расстояния, где не может гарантироваться
безошибочность передачи). UDP ориентирован на работу в локальной сети, где
гарантирован определенный уровень качества передачи данных. Протоколы
транспортного уровня общаются с прикладными протоколами и межсетевыми
протоколами.
Далее идет уровень прикладных систем. TCP/IP обладает тем свойством,
что в семействе этих протоколов стандартизованы протоколы, на которых
базируются прикладные системы. В частности, FTP (File Transfer Protocol).
Реально система FTP присутствует в каждой операционной системе и в каждой
набор FTP систем может быть значительным. Но за счет того, что имеется
стандарт FTP, все эти приложения работают единообразно. Есть сетевой
продукт Telnet - сетевая эмуляция алфавитно-цифрового терминала.
То есть в системе стандартизованы протоколы с помощью которых
организованы прикладные системы. И мы можем строить свои приложения FTP или
Telnet из предоставленных кирпичиков.
Разные прикладные системы общаются с разными протоколами - кто-то с
UDP, кто-то с TCP. FTP и Telnet, например, работают через TCP, а сетевая
файловая система NFS, которая позволяет объединять файловые системы разных
машин в одну (и видеть их, как свою локальную), основывается на UDP, потому
что NFS работает в рамках локальной сети.
Вот и все, что можно было сказать о многомашинных ассоциациях,
протоколах и по курсу в целом.
-----------------------
Вычислительная
система
Мультиплексор
М
....
М
М
у
л
ь
т
и
п
л
е
к
с
о
р
М
Телефонная
станция
Модем
Терминал
М
Страницы: 1, 2
|