OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Воскресенье, 15 Сентябрь, 2019 19:39

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 19 ] 
Автор Сообщение
 Заголовок сообщения: Как устроен конвейер (pipe)?
СообщениеДобавлено: Воскресенье, 08 Январь, 2012 11:53 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1162
Откуда: Tel-Aviv
Где можно почитать как устроен конвейер (pipe или "труба")?
Вплоть до того сколько байтов считывать и куда помещать. Мне нужно для реализации на КП.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как устроен конвейер (pipe)?
СообщениеДобавлено: Воскресенье, 08 Январь, 2012 15:24 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Мне кажется, нужна более конкретная постановка вопроса. Устройство в общем тут вроде неплохо разъяснено http://en.wikipedia.org/wiki/Redirectio ... mputing%29 :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как устроен конвейер (pipe)?
СообщениеДобавлено: Воскресенье, 08 Январь, 2012 15:40 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1162
Откуда: Tel-Aviv
Уже просматривал. Не разглядел я там пояснения. Везде описываются команды. А мне хочется узнать как оно действует изнутри.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как устроен конвейер (pipe)?
СообщениеДобавлено: Воскресенье, 08 Январь, 2012 15:51 
Модератор
Аватара пользователя

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как устроен конвейер (pipe)?
СообщениеДобавлено: Воскресенье, 08 Январь, 2012 16:09 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Роман М. писал(а):
А мне хочется узнать как оно действует изнутри.
Поглядите 1.7.2 "Буферизация последовательностей" и 1.7.3 "Буферизация обмена между параллельными процессами" в Вирт Н. Алгоритмы и структуры данных


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как устроен конвейер (pipe)?
СообщениеДобавлено: Воскресенье, 08 Январь, 2012 16:22 
Аватара пользователя

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

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

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

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как устроен конвейер (pipe)?
СообщениеДобавлено: Воскресенье, 08 Январь, 2012 16:27 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1162
Откуда: Tel-Aviv
Евгений Темиргалеев писал(а):
Роман М. писал(а):
А мне хочется узнать как оно действует изнутри.
Поглядите 1.7.2 "Буферизация последовательностей" и 1.7.3 "Буферизация обмена между параллельными процессами" в Вирт Н. Алгоритмы и структуры данных

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как устроен конвейер (pipe)?
СообщениеДобавлено: Воскресенье, 08 Январь, 2012 23:50 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3062
Откуда: Астрахань
Самый простой вариант - последовательный контейнер на 2^n элементов


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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как устроен конвейер (pipe)?
СообщениеДобавлено: Понедельник, 09 Январь, 2012 12:15 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1162
Откуда: Tel-Aviv
Правильно ли я понимаю, что конвейеры 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;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как устроен конвейер (pipe)?
СообщениеДобавлено: Среда, 11 Январь, 2012 00:46 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Как устроено в юниксе - не знаю. Но мне кажется, что можно считать корректным следующий подход. Для начала - схема, как это работает в юниксе на уровне пользователя.
Код:
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. Надеюсь, я понятно описал, а то так поздно, что я уже не уверен, что изъясняюсь внятно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как устроен конвейер (pipe)?
СообщениеДобавлено: Среда, 11 Январь, 2012 06:06 

Зарегистрирован: Пятница, 20 Июль, 2007 17:26
Сообщения: 693
Откуда: Псков
Не пробовали почитать книги Ричарда Стивенса, например:
UNIX Network Programming, Volume 2, Interprocess Communications
http://gen.lib.rus.ec/book/index.php?md5=13B276831712B942D5E39AD370B4A2E1

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


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

Зарегистрирован: Воскресенье, 01 Ноябрь, 2009 05:13
Сообщения: 2046
Ещё Танненбаум - "Операционные системы".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как устроен конвейер (pipe)?
СообщениеДобавлено: Среда, 11 Январь, 2012 08:21 

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


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как устроен конвейер (pipe)?
СообщениеДобавлено: Среда, 11 Январь, 2012 08:31 

Зарегистрирован: Пятница, 20 Июль, 2007 17:26
Сообщения: 693
Откуда: Псков
Trurl писал(а):
Роман М. писал(а):
Правильно ли я понимаю, что конвейеры unix действуют именно так, как описано в книге Вирта (глава 1.7.3)? Или же есть принципиальные отличия в подходах?


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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как устроен конвейер (pipe)?
СообщениеДобавлено: Среда, 11 Январь, 2012 13:15 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1162
Откуда: Tel-Aviv
Спасибо albobin за ссылки на литературу.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как устроен конвейер (pipe)?
СообщениеДобавлено: Среда, 11 Январь, 2012 18:51 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Конвееры в unix, если я не ошибась, часть ОС, даже часть ядра. Желание эмулировать это на КП выглядит, на мой взгляд, несколько странным, т.к. арсенал средств совсем разный.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как устроен конвейер (pipe)?
СообщениеДобавлено: Среда, 11 Январь, 2012 19:55 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1200
albobin писал(а):
Именованый канал и сейчас как файл (специальный)

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как устроен конвейер (pipe)?
СообщениеДобавлено: Понедельник, 11 Июнь, 2012 18:43 

Зарегистрирован: Среда, 31 Октябрь, 2007 18:58
Сообщения: 213
Откуда: Austria, Bruck
См. 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 искать проще.
Это минимальные реализации Никсов. Разобраться легко.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 19 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB