Автор хотел бы отратить внимание на вопиющие разброд и шатание в нашей индустрии, что отливается нашим кошелькам огромными расходами. Сегодня для соединения почти любых двух устройств применяется отдельный протокол, не совместимый с передачей между парой любых других устройств. Это приводит к необходимости перекодировки на каждом шагу. Разумеется, мы не хотим за это платить. Автор предлагает возможный выход из ситуации и хотел бы услышать мнения и комментарии общественности.
Способ, каким процессор общается с ОЗУ, несовместим с винчестером, а оба они в свою очередь неприменимы для обмена с платами интерфейсов или сопроцессорами - и это без какой-либо объективной надобности в таком расхождении. Отсюда такой "зоопарк" протоколов: HyperTransport, Infiniband, PCI Express, RapidIO, SDRAM, PATA, SATA. Язык так называемых "внутренних устройств" не совпадает с языком так называемых "внешних", в первую очередь SCSI и USB. Мы на пороге одной из тайн, скрытых от общественного сознания - для чего предназначена материнская плата. Гражданин, который ответит, что делают процессор, ОЗУ и винчестер, начинает запинаться, когда его спрашивают, чем занимается чипсет. Здравый смысл не может подобрать никакой осмысленной роли, а предположить массовое помещательство конформизм не позволяет. В действительности материнская плата является драйвером, реализованным аппаратно, и по-существу совершенно бесполезным созданием (ныне все больше интегрированном в процессоры). Вот за что платит, например, потребитель IBM PC: перекодировкой между "внутренними устройствами" занят северный мост, между "внешними" - южный. Вместе мосты составляют чипсет материнской платы.
Не какой-то конкретной длиной кабеля (сигнал издается в определенном диапазоне спектра, и разные участки этого диапазона [моды] движутся с разной скоростью, вызывая уширение сигнала и наложение пакетов информации друг на друга), а совершенно искусственно было проведено разделение устройств на "внешние" и "сетевые" - разумеется, с отдельным форматом сообщений для последних. Например, форматы для проводных сетевых устройств - Ethernet, Infiniband, IPv4/IPv6+TCP/UDP; для стационарных беспроводных - WiFi, Bluetooth, NFC; для подвижных беспроводных - GSM, UMTS, LTE. Тут уже драйвера реализованы программно. Адреса компьютеров-пересыльщиков могут быть заданы в пересылаемом пакете, как например в IPv6, или в самих пересыльщиках - в маршрутизаторах, в их таблицах роутинга (конечно, пересыльщик может не подчиниться адресу в пакете и отправить на другой адрес, если линия с указанным следующим пересыльщиком оборвана). Протоколы могут ждать окончания выполнения команды или полагать, что устройство само отошлет ответ (или уведомление о его готовности). Ждущими являются HTTP, FTP, SMTP/POP3, BitTorrent, X11; полагающимися - NCQ и DTN ("delay tolerant network", он же "disruption tolerant networking", он же "космический интернет"). Существуют даже шифрование - IPsec, SSH - и нецензурируемые сети - Tor, Mixminion, I2P (Invisible Inet Project).
Вся совокупность протоколов и практик их использования (вложений друг в друга) являет собой многомерное пространство со следующими осями и отсчетами по ним. Главным образом внутри компьютера:
Преимущественно между компьютерами:
Унификация приводит к следующим решениям. Кодирование адреса - числовым идентификатором. Отправка пакета без расчленения на части "адрес-данные" означает пересылку и адреса, и данных между процессором и ОЗУ по одной шине - таким образом шины адреса и данных превращаются в одну шину. Для современных многоядерных CPU, GPU, PPU, которым не хватает отдельных шин для каждой платы памяти, такое мультиплексирование является преимуществом. В пакете допустимо любое количество адресов любого размера каждый. Адреса должны не содержать какие-то две последовательности бит, чтобы использовать одну как разделитель между адресами, другую - как отделитель адресов от данных. Например, 9-й бит после каждого байта указывает, принадлежит ли следующий байт предыдущему или следующему числу; если следующему, то добавляется 10-й бит, указывающий, есть ли в этом месте отделитель [2]. Считая даже вместе с разделителями и отделителем, средняя длина адреса ячеек ОЗУ и секторов винчестера уменьшается (т.к. длина становится переменной) - это полезно для дальнейшего сокращения количества проводов в шинах. Все пересыльщики (аппаратура компьютера-отправителя, компьютеры-пересыльщики, программные единицы компьютера-получателя, аппаратура компьютера-получателя) пересылают пакет, выбрасывая первый адрес, т.к. он их собственный.
Предсказание конца пакета - числом произвольной длины "количество байт данных". Оно должно находится перед данными, поэтому расположим его перед адресами, отделив от них разделителем, чтобы добавив еще данных (разные шумы в каналах делают оптимальной разную длину пакета), можно было заменить его большим, затерев ячейки памяти, ранее не принадлежавшие пакету. ОЗУ и кэш, будучи последними в траектории и получив пакет вида "длина данных-разделитель-единственный адрес-отделитель-данные" располагают данные, начиная со смещения, равного адресу [3].
Для прохождения интернета "в графе адреса" указываются интернет-адрес, приоритет, время жизни, контрольная сумма, идентификатор транзакции. Даже контрольная сумма не может быть числом фиксированного размера, если выйти за рамки нашего исторического периода. Поэтому все числа перемежаются разделителями. Сетевое устройство автоматически удаляет все, кроме идентификатора транзакции, из пришедших пакетов.
Итого получаем возможность сборки компьютера как детского конструктора и сквозной проход сообщений от регистров до космического интернета. До настоящего времени открытая архитектура являлась мифом.
Дмитрий Тюрин (DmitryTurin.narod.ru):
dima.turin@centrum.cz
(все письма из домена .ru попадают в спам),
dima.turin@gmail.com
[2] Было бы ошибочным использовать Фибоначчиевую систему счисления (с весами битов {i-1}+{i-2}={i}, {1}={2}) или подобную. В ней 1=000001, 2=000011=000100, 3=000101=000110=001000, 4=001001=001010, 5=001011=001100=010000, 6=010001=010010, 7=010011=010100, 8=010101=010110=011000=100000, т.е. без изменения величины числа комбинация 011 заменяется на 100 от младших разрядов к старшим, после чего 11 не встречается (и последовательности 0110 и 01110 могут использоваться как отделитель и разделитель). Для полноты картины: в обратном направлении от старших разрядов к младщим, также без изменения величины числа комбинация 100 может быть заменена на 011 - после чего не встречается 00. Видно, что Фибоначчиевая система счисления и ей подобные требуют в разы большего количества бит, чем двоичная; преобразователь Фибоначчиевой в двоичную и обратно уже сравним с АЛУ; а построение сумматоров и Фурье-преобразователей (а кроме них в процессоре только коммутатор блоков памяти и тредов) непосредственно на Фибоначчиевой удваивает сложность этих устройств.
[3] Пакеты, которые мы описываем, формируются программно в ОЗУ или кэш, и кроме них стоило бы также ввести пакеты-машинные команды, чтобы процессору не нужно было адрес устройства-получателя (например, сектора винчестера) отправлять сначала в устройство-отправитель (ОЗУ), чтобы то переслало его в устройство-получатель.