OberonCore
https://forum.oberoncore.ru/

Как устроен конвейер (pipe)?
https://forum.oberoncore.ru/viewtopic.php?f=86&t=3753
Страница 1 из 1

Автор:  Роман М. [ Воскресенье, 08 Январь, 2012 11:53 ]
Заголовок сообщения:  Как устроен конвейер (pipe)?

Где можно почитать как устроен конвейер (pipe или "труба")?
Вплоть до того сколько байтов считывать и куда помещать. Мне нужно для реализации на КП.

Автор:  Евгений Темиргалеев [ Воскресенье, 08 Январь, 2012 15:24 ]
Заголовок сообщения:  Re: Как устроен конвейер (pipe)?

Мне кажется, нужна более конкретная постановка вопроса. Устройство в общем тут вроде неплохо разъяснено http://en.wikipedia.org/wiki/Redirectio ... mputing%29 :)

Автор:  Роман М. [ Воскресенье, 08 Январь, 2012 15:40 ]
Заголовок сообщения:  Re: Как устроен конвейер (pipe)?

Уже просматривал. Не разглядел я там пояснения. Везде описываются команды. А мне хочется узнать как оно действует изнутри.

Хочу сэмулировать работу unix pipe с помощью ООП. Но мне нужен простой вариант: без обработки кодов ошибок и сигналов. Только обработка потоков данных.

Автор:  Евгений Темиргалеев [ Воскресенье, 08 Январь, 2012 15:51 ]
Заголовок сообщения:  Re: Как устроен конвейер (pipe)?

Когда человек говорит "Хочу сэмулировать работу unix pipe с помощью ООП" первый вопрос --- для чего? Ну ведь не просто чтобы было? Или так сразу и скажите, что условия задачи --- секрет.

Вдруг кто-нибудь альтернативное решение предложит?

Автор:  Евгений Темиргалеев [ Воскресенье, 08 Январь, 2012 16:09 ]
Заголовок сообщения:  Re: Как устроен конвейер (pipe)?

Роман М. писал(а):
А мне хочется узнать как оно действует изнутри.
Поглядите 1.7.2 "Буферизация последовательностей" и 1.7.3 "Буферизация обмена между параллельными процессами" в Вирт Н. Алгоритмы и структуры данных

Автор:  Роман М. [ Воскресенье, 08 Январь, 2012 16:22 ]
Заголовок сообщения:  Re: Как устроен конвейер (pipe)?

Евгений Темиргалеев писал(а):
Когда человек говорит "Хочу сэмулировать работу unix pipe с помощью ООП" первый вопрос --- для чего? Ну ведь не просто чтобы было? Или так сразу и скажите, что условия задачи --- секрет.

Вдруг кто-нибудь альтернативное решение предложит?

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

Имеется командная строка UNIX. В ней при помощи конвейера (именуемого pipe) мы можем последовательно обрабатывать блоки информации с помощью стандартного ввода/вывода. Допустим,
Код:
$ cat /var/log/boot.log | cut -d' ' -f1 | uniq

Источники и получатели данных абстрактны (stdin, stdout). У потоков есть операции считывания и записи последовательности байтов.

Поток только в одном направлении. Как пешки в шахматах. Причём, у источника можно только считывать, а получателю только записывать.

Автор:  Роман М. [ Воскресенье, 08 Январь, 2012 16:27 ]
Заголовок сообщения:  Re: Как устроен конвейер (pipe)?

Евгений Темиргалеев писал(а):
Роман М. писал(а):
А мне хочется узнать как оно действует изнутри.
Поглядите 1.7.2 "Буферизация последовательностей" и 1.7.3 "Буферизация обмена между параллельными процессами" в Вирт Н. Алгоритмы и структуры данных

Спасибо. Посмотрю.

Автор:  Валерий Лаптев [ Воскресенье, 08 Январь, 2012 23:50 ]
Заголовок сообщения:  Re: Как устроен конвейер (pipe)?

Самый простой вариант - последовательный контейнер на 2^n элементов

Автор:  Владислав Жаринов [ Понедельник, 09 Январь, 2012 10:19 ]
Заголовок сообщения:  Re: Как устроен конвейер (pipe)?

Есть этот фрагмент и из русского перевода: viewtopic.php?f=75&t=2380&start=60#p57526 - хотя Вам, наверное, не сильно потребно... :)

Автор:  Роман М. [ Понедельник, 09 Январь, 2012 12:15 ]
Заголовок сообщения:  Re: Как устроен конвейер (pipe)?

Правильно ли я понимаю, что конвейеры unix действуют именно так, как описано в книге Вирта (глава 1.7.3)? Или же есть принципиальные отличия в подходах?
Я полагал, что можно обойтись без сигналов. Наподобие этого (черновик):
Код:
   PROCEDURE ProcessChain (seq: StreamSequencer);
   BEGIN
      IF seq # NIL THEN
         REPEAT
            seq.processor.ReadStreamBlock; (* считываем в буфер *)
            seq.processor.ProcessStreamBlock; (*обрабатываем *)
            ProcessChain(seq.next); (* отдаём обработку следующему процессу *)
         UNTIL seq.processor.streamIn.EndOfStream(); (* пока на закончился поток у процесса *)
      END
   END ProcessChain;

Автор:  Valery Solovey [ Среда, 11 Январь, 2012 00:46 ]
Заголовок сообщения:  Re: Как устроен конвейер (pipe)?

Как устроено в юниксе - не знаю. Но мне кажется, что можно считать корректным следующий подход. Для начала - схема, как это работает в юниксе на уровне пользователя.
Код:
rawdata -> p1 -> stream1 -> p2 -> stream2 -> p3 -> stream3 -> data

-> stream ->
stream - участок потока, влекущий данные между двумя точками их обработки. Стрелка слева символизирует вливание в поток данных, обработанных на предыдущей точке, а справа - загрузка данных на очередную точку.

-> p ->
p - точка, на которой происходит обработка данных.
Стрелка слева символизирует получение данных из предыдущего участка потока, а стрелка справа - возвращение данных в поток на следующий его участок.

Если на конвейере точек обработки не будет, то данные на выходе окажутся такими же, как и на входе.

Как организовать подачу данных на вход и приём их на выходе - отдельная задача, которая решается однозначно не так, как в юниксе: у нас не терминал а ББ. Поэтому решайте её любым удобным для Вас способом.

А подача данных внутри решается довольно просто.
Интерфейс точки обработки данных должен быть таким:
Код:
p = RECORD
  prev : StreamSection;
  process : ...;
  next : StreamSection
END

Точка читает из участка потока данных сколько ей надо, и записывает обработанные данные в следующий участок.

Активным элементом точки должна быть команда ББ так? Она будет обрабатывать данные, пока в предыдущем участке не закончились данные или пока в следующем не закончилось место. Если команда закончила работу, то переходим к команде из следующей точки и т.д.

Ну а интерфейс конвейера такой:
Код:
pipe = RECORD
  Add(x : p);
  Start()
END
(Сюда не включены процедуры загрузки исходных данных и получения итоговых данных)
Команда Add добавляет вместе с точкой обработки ещё и участок конвейера (автоматически).

P.S. Надеюсь, я понятно описал, а то так поздно, что я уже не уверен, что изъясняюсь внятно.

Автор:  albobin [ Среда, 11 Январь, 2012 06:06 ]
Заголовок сообщения:  Re: Как устроен конвейер (pipe)?

Не пробовали почитать книги Ричарда Стивенса, например:
UNIX Network Programming, Volume 2, Interprocess Communications
http://gen.lib.rus.ec/book/index.php?md5=13B276831712B942D5E39AD370B4A2E1

или Морис Дж. Бах. Архитектура операционной системы Unix
http://lib.ru/BACH/

Автор:  Владислав Жаринов [ Среда, 11 Январь, 2012 07:01 ]
Заголовок сообщения:  Re: Как устроен конвейер (pipe)?

Ещё Танненбаум - "Операционные системы".

Автор:  Trurl [ Среда, 11 Январь, 2012 08:21 ]
Заголовок сообщения:  Re: Как устроен конвейер (pipe)?

Роман М. писал(а):
Правильно ли я понимаю, что конвейеры unix действуют именно так, как описано в книге Вирта (глава 1.7.3)? Или же есть принципиальные отличия в подходах?


В ранних версиях Unix конвейеры работали как в DOS - через временные файлы. Так что подходы могут быть самыми разными.

Автор:  albobin [ Среда, 11 Январь, 2012 08:31 ]
Заголовок сообщения:  Re: Как устроен конвейер (pipe)?

Trurl писал(а):
Роман М. писал(а):
Правильно ли я понимаю, что конвейеры unix действуют именно так, как описано в книге Вирта (глава 1.7.3)? Или же есть принципиальные отличия в подходах?


В ранних версиях Unix конвейеры работали как в DOS - через временные файлы. Так что подходы могут быть самыми разными.

Именованый канал и сейчас как файл (специальный)

Автор:  Роман М. [ Среда, 11 Январь, 2012 13:15 ]
Заголовок сообщения:  Re: Как устроен конвейер (pipe)?

Спасибо albobin за ссылки на литературу.

Валерий, в общих чертах наброски кода у меня и так есть. Мне не хватает пока понимания внутренней обработки логики конвейера.
Так что я почитаю и, если будут вопросы, спрошу.

Автор:  Евгений Темиргалеев [ Среда, 11 Январь, 2012 18:51 ]
Заголовок сообщения:  Re: Как устроен конвейер (pipe)?

Конвееры в unix, если я не ошибась, часть ОС, даже часть ядра. Желание эмулировать это на КП выглядит, на мой взгляд, несколько странным, т.к. арсенал средств совсем разный.

Тут либо использовать чего даёт ОС, либо, т.сказать, общеалгоритмический подход, для которого unix-реализация параллельна. Грубо говоря, взять кольцевой буфер, и (последовательно) гонять по нему данные между требуемыми сущностями.

Автор:  Trurl [ Среда, 11 Январь, 2012 19:55 ]
Заголовок сообщения:  Re: Как устроен конвейер (pipe)?

albobin писал(а):
Именованый канал и сейчас как файл (специальный)

Я о самом конвейере. prog1|prog2 выполнялось как prog1 >tmp1234 ; prog2 <tmp1234

Автор:  hothing [ Понедельник, 11 Июнь, 2012 18:43 ]
Заголовок сообщения:  Re: Как устроен конвейер (pipe)?

См. http://retrobsd.org/wiki/software-2/
http://pdos.csail.mit.edu/6.828/2011/xv6.html
В этом http://pdos.csail.mit.edu/6.828/2011/xv6/xv6-rev6.pdf искать проще.
Это минимальные реализации Никсов. Разобраться легко.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/