Я изучаю методы межпроцессного взаимодействия в курсе «Концепция операционной системы».

Я не очень понимаю механизм передачи данных. В случае метода конвейера между двумя процессами будет создан канал для передачи байтовых потоков, верно?

А как насчет сериализации? Я знаю, что сериализация - это метод преобразования объекта в поток байтов для передачи, и мы можем перестроить объект, когда он достигнет места назначения.

Итак, в каком случае мы используем сериализацию или конвейер для передачи данных? Какие преимущества и недостатки между ними?

Может ли кто-нибудь объяснить мне очень глубокий механизм передачи данных этих методов? И отличаются ли эти механизмы между Java и C? , или это то же самое?

Заранее спасибо.

-1
xtiger 29 Сен 2014 в 17:51

2 ответа

Лучший ответ

В UNIX / Linux существует два основных типа каналов: именованный канал и анонимный.

Анонимный канал создается системным вызовом pipe (), который возвращает 2 файловых дескриптора, связанных с вновь созданным конвейером, один для записи данных, другой для чтения из него. Оболочка использует анонимные каналы для соединения стандартного вывода одного процесса со стандартным вводом другого, когда вы соединяете два процесса с помощью символа "|" оператор.

Именованный канал отображается как файл в файловой системе и может быть открыт с помощью обычного системного вызова open ().

В режиме блокировки (по умолчанию) процесс, считывающий из конвейера, будет блокироваться до тех пор, пока в нем не появятся данные; затем писатель может отправить данные, которые будут отображаться как поток байтов для считывателя.

Важным фактом здесь является то, что передаваемые данные представляют собой поток байтов. Отправитель и получатель данных должны согласовать протокол, чтобы определить, как интерпретировать байты. Один из типичных методов для этого - сериализация. Рассмотрим 32-битное целое число ... 4 байта. Некоторые системы хранят эти байты со старшим битом в первом байте (известный как big-endian), некоторые хранят младший бит в первом байте (система с прямым порядком байтов, например x86). При передаче таких данных по сети важна сериализация таких данных, поскольку вполне возможно, что каждый конец хранит данные в разном порядке.

Но даже при передаче данных между двумя процессами на одном хосте сериализация помогает. Его можно использовать для инкапсуляции объектов, чтобы получатель знал, когда он все получил. Например, с нашим 32-битным целым числом, если получатель не знает, что он ожидает целое число, и получает 3 байта (четвертый был задержан некоторым расписанием), он должен знать, что ему нужно подождать, прежде чем продолжить.

Ничто из этого не зависит от конкретного языка, за исключением того, что некоторые языки имеют встроенную поддержку сериализации. Java - один из таких языков (см. ObjectInputStream и ObjectOutputStream). Если вы пытаетесь перемещать данные между программами Java и C, а на стороне Java вы хотите использовать эти классы, вам необходимо понимать используемый ими протокол сериализации.

Другой распространенный метод сериализации - это JSON (объектная нотация JavaScript), для которого существует несколько хороших библиотек на языках C и Java.

3
Nick Stoughton 29 Сен 2014 в 14:23

Я не очень понимаю механизм передачи данных. В случае метода конвейера между двумя процессами будет создан канал для передачи байтовых потоков, верно?

Именованный или анонимный канал - это поток, скорее похожий на соединение сокета через возвратный цикл. Фактически в некоторых ОС это реализовано теми же драйверами / библиотекой.

А как насчет сериализации?

То, как выполняется сериализация, не зависит от языка, и вы можете сериализовать данные таким образом, чтобы они были общими для C и Java.

Какие преимущества и недостатки между ними?

Существует множество форм сериализации, и это слишком широкая тема, чтобы охватить ее одним ответом. Вы могли бы написать по этому поводу целую диссертацию.

Можно мне объяснить очень глубокий механизм передачи данных этими методами?

В этом нет ничего особенного. Блок данных копируется в память, управляемую ОС, и эти буферизованные данные могут быть прочитаны другой программой (или той же самой).

И отличаются ли эти механизмы между Java и C? , или это то же самое?

Оба они используют одни и те же вызовы ОС для выполнения реальной работы. API Java скрывает от вас этот факт и делает его более дружественным к Java, но они остаются неизменными.

1
Peter Lawrey 29 Сен 2014 в 13:56