next up previous contents
Next: Почему DIPC не использует Up: Как пересылаются данные и Previous: Как пересылаются данные и   Contents

Сокращение числа копирований

Очевидно, что доступ к сети обеспечить весьма непросто. В некоторых операционных системах используется переотображение адресов (с помощью блока управления памятью (Memory Management Unit - MMU) - для предоставления доступа к части памяти процесса другому процессу), следовательно, пересылки данных между адресными пространствами ядра и пользователя должны быть очень ``дешевыми''. К сожалению, Linux не поддерживает этого метода при реализации механизмов IPC System V.

Одним из возможных путей уменьшения числа копирований между адресными пространствами пользователя и ядра является воздержание от копирования данных из адресного пространства процесса в память ядра в тех случаях, когда нужный процесс на вызываемой машине еще не выполняется, а данные снова будут скопированы в адресное пространство dipcd для посылки по сети. Этот подход также помогает избегать копирований данных, поступающих из сети, в ядро, когда известно, что они будут скопированы повторно в адресное пространство пользовательского процесса.

Можно использовать и ``заглушки'' в пользовательском пространстве для перемещения обычного кода IPC System V в ядро. Код "заглушки" должен протестировать данные и цель и решить, нужно ли послать данные по сети, не беспокоясь о локальном ядре. Другой процесс на вызываемой машине должен принять эти данные, выполнить операцию и передать результаты назад, после чего они доставляются оригинальному процессу-заглушке. Для этого необходимо предоставить возможность этому процессу заменить обычные заглушки IPC. Следует также обеспечить наличие объектных файлов, которые должны прикомпоновываться к программе или, что еще лучше, изменить стандартные библиотеки C.

Эти две проблемы можно сформулировать так:

  1. Как найти ожидающий процесс? Заглушка для этого процесса будет ожидать в пользовательском пространстве, и нужно придумать механизм "свидания".
  2. Что делать, если второй процесс еще не требует данных? Посылающий процесс может продолжать исполняться до тех пор, пока передаются данные, но поскольку принимающий процесс еще не запрашивает этих данных, они должны где-то удерживаться.
Заметим, что обе вышеуказанные проблемы решены, - можно сохранить две копии между пользовательской памятью и памятью ядра.



2004-06-22