Но не все так просто – окружающая среда воздействует на передаваемый сигнал.
Медный провод – наименьшее удельное сопротивление.
При увеличении длины растет сопротивление провода и, следовательно, падает уровень сигнала. Как сделать, чтобы не было зависимости от длины?
Надо использовать “Токовую Петлю”.
При работе на больших расстояниях надо использовать источники тока – блок питания, который поддерживает в цепи одинаковую силу тока, меняя свое напряжение.
Передача информации напряжением – механизм, использующий напряжение.
Передача информации током – механизм, использующий ток.
Активное сопротивление влияет на амплитуду сигнала. А индуктивность и паразитная емкость проводов влияют на фазу сигнала – намного хуже.
Чем выше частота сигнала, тем больше его искажают по фазе индуктивность и емкость – будут завалены фронты у меандра.
По Фурье: можно разложить любой периодический сигнал на сумму синусоид, а затем собрать обратно.
Еще луч имеет толщину, и даже у лазера луч немного конический.
Происходит искажение длин – вот и сдвиг по фазе. Еще и вибрация вызывает жуткие помехи. Так что проблем не меньше, чем при передаче по проводу, только природа другая.
У радиосигнала поглощение пропорционально квадрату расстояния, а не линейно, как у провода.
Невозможно реализовать дуплексные соединения.
Мертвая зона: при мощности, свыше определенной, приемник “слепнет”. Если мы излучаем 10 Вт, а придет сигнал 0.2 Вт, мы его не поймем.
Выход – разделение частотных диапазонов. Еще – применение направленных
антенн (излучают не по сфере, а пучком). Тогда возможно координатное разделение. Если этого нет – остается только временное разделение.
Спутниковая связь
Тут два варианта – спутники с высокой орбитой и спутники с низкой орбитой.
А американцы используют низкие орбиты
Недостатки:
1. Сложный центр управления спутниками
2. Спутники задевают верхние слои атмосферы, постепенно снижаются, затем падают на Землю. Живут один-два года.
Зато такие спутники дешевые и легкие.
Цель любой программы – обработка данных, т.е. надо грамотно построить структуры данных и написать алгоритмы их обработки.
Структуры данных, которыми оперирует язык:
- Array[] A
- String B
- Struct C
Можем прочитать откуда-то эти структуры:
read( #канала, A, B, C )
Отсюда исходят следующие действия:
read( #канала, Address, Len )
О длинах структур данных и куда их помещать знает только компилятор, следовательно, он и вычисляет Address и Len.
Файл может быть последовательного или произвольного доступа. В файле последовательного доступа есть так называемая текущая позиция.
Чтобы выполнить операции доступа к файлу, нужна начальная инициализация:
#канала = open( имя_файла, тип_доступа )
При открытии файла происходит следующее:
- контролируются права доступа для данного пользователя с данным типом доступа
- формируется структура FCB (FileControlBlock)
- файловый процессор заполняет ее поля.
По-русски – Система Управления Записями (СУЗ).
Она имеет FCB и буфера ввода/вывода, через которые и происходит реальный обмен данными.
RMS рассматривает любой файл как набор кластеров. Каждый кластер на уровне файла называется VBN (VirtualBlockNumber).
При закрытии файла ( close ) все буфера сбрасываются на диск. По команде Flush все буфера просто сбрасываются на диск без закрытия файла.
При необходимости обмена с диском RMS взаимодействует с файловым процессором.Конкретное блочное устройство рассматривается как плоский массив блоков фиксированного размера.
Для символьных устройств нет буферов, но есть FCB, где содержатся параметры устройства.
При запросе ОС должна проверить указатели на корректность, т.е. указатель должен быть в области user’а и под ним должна быть отображена физическая память. Еще надо проверить, весь ли буфер попал в отображенную память.
Пока идет обработка на уровне ядра, передиспетчеризация процессов запрещена. Нужно где-то сохранять параметры ввода/вывода, для этих целей у ОС есть pool (кусок памяти для размещения динамических данных ОС).
Запросы ввода/вывода оформляются как IORP (Input/OutputRequestPacket). Поскольку к моменту выполнения запроса произойдет передиспетчеризация, то необходимо отобразить буфера ввода/вывода в ядро. Для этого производится двойное преобразование адреса:
1. Преобразование линейного адреса буфера процесса в физический адрес.
2. Отобразить в область ОС полученную область физической памяти.
Еще нужно запретить перемещение физических страниц памяти.
Монитор ввода/вывода должен по базе данных драйверов найти нужный драйвер, создать IORP в невыгружаемом пуле, поставить его в очередь к драйверу.
Для выбора драйвера используется база данных внешних устройств, сложность которой определяется:
- сложностью ОС
- сложностью конфигурации железа.
Драйвер – программа, которая делает ОС независимую от железа.
Внешнее устройство – разделяемый ресурс, доступ к которому осуществляет драйвер.
Идеология BIOS – часть аппаратных функций, реализованных разработчиком, являются системно-независимыми.
1. Устройства, которые отображаются в прикладные программы, называются Device.
2. Устройства, которые не отображаются в прикладные программы, называются Bus.
3. Потоковые драйверы/фильтры.
База данных – списки блоков управления CB (ControlBlock), которые отражают физическую структуру системы.
BCB | Bus Control Block |
DCB | Device Control Block |
UCB | Unit Control Block |
ICB | Interrupt Control Block |
SCB | Synchronization Control Block ? |
IORP можно передать самому драйверу или поместить в очередь, прицепленную к DCB.
Преобразование ALBA®FA®KLBA может быть невозможно, т.к. страницы могут быть не выделены.
Стратегии организации последовательности IORP:
- возлагается на ОС
- драйвер сам решает, куда вставить IORP.
Если у драйвера очередь не пуста, то остается надеяться на обслуживание драйвером.
Вернуть управление программе, только если запрос был успешно обслужен (если запрос синхронный). Номер флага, который ожидает программа, помещается в IORP. Как только запрос выполняется – флаг сбрасывается и возобновляется программа, ожидавшая на этом флаге.
RPC | Remote Procedure Call |
LPC | Local Procedure Call |
APC | Asynchronous Procedure Call |
DPC | отложенный |
На DPC запрещена передиспетчеризация, на APC запрещена обработка асинхронных запросов, на Apps все разрешено.
Если очередь запросов пуста, то драйвер надо разбудить.
Проблема: из прерывания нельзя непосредственно вызвать IO$END, поскольку можем не находиться в режиме ядра.
Выход – механизм отложенных прерываний.
Необходимо перевести систему в состояния ядра так, чтобы данный фрагмент кода обладал исключительными правами на этот контекст, и при этом передать управление в заданную точку.
Ядро не повторновходимо. Если мы владеем контекстом ядра, никто другой не может им владеть.
Единственное место, в котором начинается и заканчивается транзакция обращения к ядру – место переключения из UserMode в KernelMode. Только в этой точке передаются права на контекст ядра.
Для реализации используется XCHGAX,[BX], это семафор, реализованный на процессоре.
mov AX,1
xchg AX,[BX]
Если в результате в AX будет 0, то значит, семафор был свободен, и мы его заняли, а если 1 – значит был занят и надо еще подождать.
ОС вынимает из ловушки первый адрес и по call передает туда управление, когда управление вернется, ОС продолжает просмотр ловушки.
Мы можем завершить запрос ввода/вывода (выполнить соответствующие действия). Потом делаем jmp, как будто бы ОС заставила драйвер обработать новый запрос. Все будет так же, как и в первый раз, но после команды старт попадем опять на границу U/S.
Есть соблазн запихнуть в режим ядра как можно больше всего: работу с окнами, графикой, файловый процессор и т.д. для повышения быстродействия. Но тогда время обработки запросов приложений в режиме ядра будет слишком большим, а то и вообще система перестанет работать. Выход – идеология микроядра.