|
|
|
Размер буфера fifo ограничен?
|
|||
|---|---|---|---|
|
#18+
Нигде не встречал, но обнаружил что буфер pipe в ядре 2.6.9 два килобайта. А как с fifo, кто-нибудь в курсе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 13:22 |
|
||
|
Размер буфера fifo ограничен?
|
|||
|---|---|---|---|
|
#18+
Размер буфера fifo точно такой же как у pipe. Вообще когда мне приходилось в fifo писать достаточно большой объем данных у меня возникло много довольно проблем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 14:28 |
|
||
|
Размер буфера fifo ограничен?
|
|||
|---|---|---|---|
|
#18+
Ну, для пипе 2К это еще нормально, можно указатели передовать, но для fifo маловато будет. 2К для межпроцесового взаимодействия это даже не размер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 14:31 |
|
||
|
Размер буфера fifo ограничен?
|
|||
|---|---|---|---|
|
#18+
Sandro_KВообще когда мне приходилось в fifo писать достаточно большой объем данных у меня возникло много довольно проблем. Что тогда использовал вместо fifo? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 14:32 |
|
||
|
Размер буфера fifo ограничен?
|
|||
|---|---|---|---|
|
#18+
AkhНу, для пипе 2К это еще нормально, можно указатели передовать, но для fifo маловато будет. 2К для межпроцесового взаимодействия это даже не размер. Да, действительно маловато :( Когда мне надо было передавать через FIFO видео, то у меня 1 кадр не не мог поместиться в этот буфер. FIFO можно еще открывать в блокируемом режиме, тогда потери данных не будет, но функция write не завершится до тех пор пока все данные не будут считаны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 14:37 |
|
||
|
Размер буфера fifo ограничен?
|
|||
|---|---|---|---|
|
#18+
Akh Sandro_KВообще когда мне приходилось в fifo писать достаточно большой объем данных у меня возникло много довольно проблем. Что тогда использовал вместо fifo? Я открывал fifo в блокируемом режиме, но в отдельном потоке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 14:39 |
|
||
|
Размер буфера fifo ограничен?
|
|||
|---|---|---|---|
|
#18+
В исходниках ядра можно поменять это ограничение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 14:40 |
|
||
|
Размер буфера fifo ограничен?
|
|||
|---|---|---|---|
|
#18+
RanckontВ исходниках ядра можно поменять это ограничение. В исходника ядра конечно можно, но не заставишь же пользователей программы менять исходники ядра и перекомпилировать его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 14:41 |
|
||
|
Размер буфера fifo ограничен?
|
|||
|---|---|---|---|
|
#18+
Используй программу, которая будет активно читать из пайпа в какой-нибудь другую память ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 14:44 |
|
||
|
Размер буфера fifo ограничен?
|
|||
|---|---|---|---|
|
#18+
Akh Sandro_KВообще когда мне приходилось в fifo писать достаточно большой объем данных у меня возникло много довольно проблем. Что тогда использовал вместо fifo? Можно пробовать отправлять сообщения. почитай man msgget, msgctl, msgrcv, msgsnd. Там размеры регулируются параметрами ядра, но они тоже не безграничны. (MSGMAX MSGMNB ) Вполне может быть, что и fifo буффер тоже регулируется параметрами ядра, но я не знаю как. Можно через разделяемую память. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 14:44 |
|
||
|
Размер буфера fifo ограничен?
|
|||
|---|---|---|---|
|
#18+
RanckontИспользуй программу, которая будет активно читать из пайпа в какой-нибудь другую память У меня будет несколько клиентов отсылающих данные, а на приеме простые ворота к базе данных. На этой же машине уже две программы с 12 и 5-ю потоками со слипами не более 1ms. Так что ищу решение, чтобы не городит огород и не плодить потоки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 14:48 |
|
||
|
Размер буфера fifo ограничен?
|
|||
|---|---|---|---|
|
#18+
onstat- Akh Sandro_KВообще когда мне приходилось в fifo писать достаточно большой объем данных у меня возникло много довольно проблем. Что тогда использовал вместо fifo? Можно пробовать отправлять сообщения. почитай man msgget, msgctl, msgrcv, msgsnd. Там размеры регулируются параметрами ядра, но они тоже не безграничны. (MSGMAX MSGMNB ) Уже начинаю подумывать. Размер сообщения мне не критичен, на крайняк буду бить сообщения на части. Тут встает тот же самый вопрос - сколько сообщений в очередь можно будет поместить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 14:51 |
|
||
|
Размер буфера fifo ограничен?
|
|||
|---|---|---|---|
|
#18+
Akh onstat- Akh Sandro_KВообще когда мне приходилось в fifo писать достаточно большой объем данных у меня возникло много довольно проблем. Что тогда использовал вместо fifo? Можно пробовать отправлять сообщения. почитай man msgget, msgctl, msgrcv, msgsnd. Там размеры регулируются параметрами ядра, но они тоже не безграничны. (MSGMAX MSGMNB ) Уже начинаю подумывать. Размер сообщения мне не критичен, на крайняк буду бить сообщения на части. Тут встает тот же самый вопрос - сколько сообщений в очередь можно будет поместить? man msgsnd The followings are system limits affecting a msgsnd system call: MSGMAX Maximum size for a message text: the implementation set this value to 8192 bytes. MSGMNB Default maximum size in bytes of a message queue: 16384 bytes. The super-user can increase the size of a message queue beyond MSGMNB by a msgctl system call. The implementation has no intrinsic limits for the system wide maximum number of message headers (MSGTQL) and for the system wide maximum size in bytes of the message pool (MSGPOOL). ps Насколько я помню из других топиков прога пишется под Linux. Если программа работает не от рута, параметры ядра можно поменять глобально по системе через /etc/sysctl.conf раз и навсегда и даже на лету. pss Еще подумай о передаче через разделяемую память. Работать должно быстрее и с ограничениями на обьем попроще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 15:11 |
|
||
|
Размер буфера fifo ограничен?
|
|||
|---|---|---|---|
|
#18+
onstat- man msgsnd The followings are system limits affecting a msgsnd system call: MSGMAX Maximum size for a message text: the implementation set this value to 8192 bytes. MSGMNB Default maximum size in bytes of a message queue: 16384 bytes. The super-user can increase the size of a message queue beyond MSGMNB by a msgctl system call. The implementation has no intrinsic limits for the system wide maximum number of message headers (MSGTQL) and for the system wide maximum size in bytes of the message pool (MSGPOOL). ps Насколько я помню из других топиков прога пишется под Linux. Если программа работает не от рута, параметры ядра можно поменять глобально по системе через /etc/sysctl.conf раз и навсегда и даже на лету. pss Еще подумай о передаче через разделяемую память. Работать должно быстрее и с ограничениями на обьем попроще. linux, linux. Наверное при создании очереди буду устанавливать ее длину в msg_qbytes. Через разделяемую память боюсь из-за синхранизации (процессы, передающие данные, в разных программах). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 15:29 |
|
||
|
Размер буфера fifo ограничен?
|
|||
|---|---|---|---|
|
#18+
Akh onstat- man msgsnd The followings are system limits affecting a msgsnd system call: MSGMAX Maximum size for a message text: the implementation set this value to 8192 bytes. MSGMNB Default maximum size in bytes of a message queue: 16384 bytes. The super-user can increase the size of a message queue beyond MSGMNB by a msgctl system call. The implementation has no intrinsic limits for the system wide maximum number of message headers (MSGTQL) and for the system wide maximum size in bytes of the message pool (MSGPOOL). ps Насколько я помню из других топиков прога пишется под Linux. Если программа работает не от рута, параметры ядра можно поменять глобально по системе через /etc/sysctl.conf раз и навсегда и даже на лету. pss Еще подумай о передаче через разделяемую память. Работать должно быстрее и с ограничениями на обьем попроще. linux, linux. Наверное при создании очереди буду устанавливать ее длину в msg_qbytes. Через разделяемую память боюсь из-за синхранизации (процессы, передающие данные, в разных программах). Бояться тут нечего. ИХМО Самое короткое и доходчивое описание правил синхронизации: http://www.lib.ru/BACH/chapend.txt seмор ______________________________ semop(id,ops,num) int id,num; struct sembuf **ops; Функция semop выполняет набор операций, содержащихся в структуре ops, над массивом семафоров , связанных с идентификатором id. Параметр num содер- жит количество записей, составляющих структуру ops. Структура sembuf опреде- лена следующим образом: struct sembuf { short sem_num; /* номер семафора */ short sem_op; /* тип операции над семафором */ short sem_flg; /* флаг */ }; Переменная sem_num содержит указатель в массиве семафоров , ассоциирован- ный с данной операцией, а переменная sem_flg - флаги для данной операции. Переменная sem_op может принимать следующие значения: отрицательное если сумма значения семафора и значения sem_op >= 0, значение семафора изменяется на величину sem_op; в противном случае, функция приостанавливает свое выполнение, если это разрешено флагом положительное увеличить значение семафора на величину sem_op нулевое если значение семафора равно 0, продол- жить выполнение; в противном случае, при- остановить выполнение, если это разреша- ется флагом Если для данной операции в переменной sem_flg установлен флаг IPC_NOWAIT, функция semop возвращает управление немедленно в тех случаях, когда она должна была бы приостановиться. Если установлен флаг SEM_UNDO, восстанавливается предыдущее значение семафора (sem_op вычитается из текущей суммы типов операций). Когда процесс завершится, значение семафора будет увеличено на эту сумму. Функция semop возвращает значение последней операции над семафором. Плюс поиск разбор нескольких примеров через ГуГлю. Я в свои времена потратил 2-3 часа и этим очень облегчил себе дальнейшую програмистскую жизнь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 16:52 |
|
||
|
Размер буфера fifo ограничен?
|
|||
|---|---|---|---|
|
#18+
onstat- Бояться тут нечего. ИХМО Самое короткое и доходчивое описание правил синхронизации: Межпрограммный мьютекс? Спасибо врубился. Ничего сложного. Тогда второй вопрос, какие средства используются для разделяемой памяти? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 17:20 |
|
||
|
Размер буфера fifo ограничен?
|
|||
|---|---|---|---|
|
#18+
Akh onstat- Бояться тут нечего. ИХМО Самое короткое и доходчивое описание правил синхронизации: Межпрограммный мьютекс? Спасибо врубился. Ничего сложного. Тогда второй вопрос, какие средства используются для разделяемой памяти? :) Все сам нашел тамже. shmget, ... . onstat-, Пасибо, не знал. Буду пробовать, надеюсь, что понравится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 17:23 |
|
||
|
Размер буфера fifo ограничен?
|
|||
|---|---|---|---|
|
#18+
Akh onstat- Бояться тут нечего. ИХМО Самое короткое и доходчивое описание правил синхронизации: Межпрограммный мьютекс? Спасибо врубился. Ничего сложного. Тогда второй вопрос, какие средства используются для разделяемой памяти? :) Я не зря выделил слово массив иногда для синхронизации потребуется несколько семафоров, некоторые нужно изменять некоторые просто проверять. Для абсолютно точной синхронизациив все это(и изменение и проверку) обязательно нужно делать за один вызов semop. Иначе можно получить большой геморой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 17:52 |
|
||
|
Размер буфера fifo ограничен?
|
|||
|---|---|---|---|
|
#18+
onstat- Akh onstat- Бояться тут нечего. ИХМО Самое короткое и доходчивое описание правил синхронизации: Межпрограммный мьютекс? Спасибо врубился. Ничего сложного. Тогда второй вопрос, какие средства используются для разделяемой памяти? :) Я не зря выделил слово массив иногда для синхронизации потребуется несколько семафоров, некоторые нужно изменять некоторые просто проверять. Для абсолютно точной синхронизациив все это(и изменение и проверку) обязательно нужно делать за один вызов semop. Иначе можно получить большой геморой. Как я понимаю, самый простой способ, это установить симофор в единичку и вызывать в semop с -1, со сброшеным NOWAIT и установленным UNDO. А уже сложнее случаи представить сложно. И, как мне кажется, программирование семафороми - увлекательное занятие. :) Хотя, вообще-то, тут, наверное, те же дедлоки, что и мьютексов, так что надо использовать либо, как ты подметил, целыми массивами, или расставлять логические приоритеты симофоров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 17:59 |
|
||
|
Размер буфера fifo ограничен?
|
|||
|---|---|---|---|
|
#18+
Akh onstat- Akh onstat- Бояться тут нечего. ИХМО Самое короткое и доходчивое описание правил синхронизации: Межпрограммный мьютекс? Спасибо врубился. Ничего сложного. Тогда второй вопрос, какие средства используются для разделяемой памяти? :) Я не зря выделил слово массив иногда для синхронизации потребуется несколько семафоров, некоторые нужно изменять некоторые просто проверять. Для абсолютно точной синхронизациив все это(и изменение и проверку) обязательно нужно делать за один вызов semop. Иначе можно получить большой геморой. Как я понимаю, самый простой способ, это установить симофор в единичку и вызывать в semop с -1, со сброшеным NOWAIT и установленным UNDO. А уже сложнее случаи представить сложно. И, как мне кажется, программирование семафороми - увлекательное занятие. :) Немного не так, Вот пример который я разбирал, и который мне очень сильно помог в понимании процесса. Akh Хотя, вообще-то, тут, наверное, те же дедлоки, что и мьютексов, так что надо использовать либо, как ты подметил, целыми массивами, или расставлять логические приоритеты симофоров. Я не совсем понимаю зачем нужны отдельные приоритеты если семафор может принимать значение типа int. То есть он сам себе приоритет. От того с каким значение его приходят менять он либо меняется либо процесс спит пока приоритет семафора не достгнет нужного значения путем его изменения другими процессами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 18:35 |
|
||
|
Размер буфера fifo ограничен?
|
|||
|---|---|---|---|
|
#18+
onstat-Для абсолютно точной синхронизациив все это(и изменение и проверку) обязательно нужно делать за один вызов semop. Иначе можно получить большой геморой. Да и вообще лучше semop не пользовать, он малость геморройный да и таймаута нету, а semtimedop не везде есть... shmget дело понятное, а для синхронизации лучче pthread все таки. Ну разумеется с PTHREAD_PROCESS_SHARED ежели interprocess communication. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 01:02 |
|
||
|
Размер буфера fifo ограничен?
|
|||
|---|---|---|---|
|
#18+
ska onstat-Для абсолютно точной синхронизациив все это(и изменение и проверку) обязательно нужно делать за один вызов semop. Иначе можно получить большой геморой. Да и вообще лучше semop не пользовать, он малость геморройный да и таймаута нету, а semtimedop не везде есть... shmget дело понятное, а для синхронизации лучче pthread все таки. Ну разумеется с PTHREAD_PROCESS_SHARED ежели interprocess communication. Вы меня убедите, если подскажете как взвести 5 мутексов одновременно, чтобы избежать дедлоков между процессами. Я, к сожалению, простого способа не знаю. Способ одним мутексом закрыть пять других, есть не совсем простым. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 18:09 |
|
||
|
Размер буфера fifo ограничен?
|
|||
|---|---|---|---|
|
#18+
onstat-Вы меня убедите, если подскажете как взвести 5 мутексов одновременно, чтобы избежать дедлоков между процессами. Я, к сожалению, простого способа не знаю. Я честно сказать не представляю задачу для которой это было бы жизненно необходимо. Опишите вкратце цель - может просто найдутся другие варианты реализации. Работа с общей памятью мутексами не ограничивается, а в pthread еще rwlock полезен бывает, да и поэффективнее. К тому же есть очч большие нюансы ежели имеете дело со всякими динозаврами. Проблема может заключаться в том что не все threadы лайтвейт :-)) pthread равно как и всякая жава проблему зту решает через симуляцию, а вот изза одного semop-а все ваши потоки и подмерзнут... onstat-Способ одним мутексом закрыть пять других, есть не совсем простым. Ничего сложного в этом не вижу, просто как правило это не надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2006, 05:40 |
|
||
|
Размер буфера fifo ограничен?
|
|||
|---|---|---|---|
|
#18+
onstat- Akh Хотя, вообще-то, тут, наверное, те же дедлоки, что и мьютексов, так что надо использовать либо, как ты подметил, целыми массивами, или расставлять логические приоритеты симофоров. Я не совсем понимаю зачем нужны отдельные приоритеты если семафор может принимать значение типа int. То есть он сам себе приоритет. От того с каким значение его приходят менять он либо меняется либо процесс спит пока приоритет семафора не достгнет нужного значения путем его изменения другими процессами. Ниже следующее я имел ввиду (т.е. иерархия): Каким образом можно решить проблему тупиков? Во-первых, можно использовать подход, основанный на применении иерархии mutex'ов. При этом подходе мы устанавливаем некое отношение старшинства между всеми mutex'ами в нашей программе, и в любой ситуации, когда нам необходимо захватить несколько mutex'ов одновременно, мы захватываем строго по старшинству, то есть сначала самый старший, потом mutex который младше первого, но старше остальных и т.п. Если строго соблюдать это правило то тупиков не возникнет. Оставляя в стороне формальное доказательство этого факта, рассмотрим, как действует этот подход, на нашем примере с двумя mutex'ами и двумя нитями. Согласно правилу обе нити должны будут захватывать сначала mutex A, и только потом B, ясно, что тогда тупиковой ситуации не возникнет, так как после того как первая нить захватит первый mutex, второй либо будет свободен [если вторая нить нуждается в обоих mutex'ах, то она остановится на захвате первого], либо будет захвачен, но на конечный отрезок времени / в случае если вторая нить хочет работать только со вторым mutex'ом, то ничто не помешает ей его захватить, но тупика не возникнет, так как она не имеет права пытаться захватить первый, и, следовательно, обязана освободить захваченный mutex в течение конечного периода времени /. Стоит заметить, что часто не надо устанавливать отношения иерархии между всеми mutex'ами, так, например, если логика программы нам гарантирует что два mutex'а никогда не будет захватываться последовательно одной нитью, то нас не интересует отношение старшинства меду ними / иногда его можно вывести на основании правила транзитивности из отношений старшинства между этими и другими mutex'ами, а иногда и нельзя /. Может возникнуть вопрос - а как именно устанавливать это самое отношение старшинства? Часто это отношение обусловлено самой структурой данных, которые защищают mutex'ы. Например, очевидно, что если мы имеем контейнер, который защищен mutex'ом и который содержит объекты каждый из которых сам защищен mutex'ом, то логично сначала захватывать mutex контейнера, а потом mutex объекта / при этом mutex контейнера можно освободить, дав другим нитям возможность работать с другими объектами в данном контейнере /. В случае если мы не можем просто задать иерархию опираясь на свойства данных, например, если мы имеем некоторое неизвестное заранее количество динамически создаваемых объектов, то можно воспользоваться следующим искусственным приемом для наведения иерархии. Этот прием заключается в том что мы определяем что первый mutex старше второго, если абсолютное значение адреса первого mutex'а больше соответствующего значения для второго [а можно использовать адреса защищаемых объектов или более того ввести нумерацию выдавая последовательный номер для каждого mutex'а при его инициализации]. Замечу что в реальных приложениях мы скорее всего будем использовать некую комбинацию этих двух подходов установления отношения старшинства. Иногда подход предотвращения тупиков основанный на установлении иерархии mutex'ов неудобен. Так в случае если мы наперед не знаем к каким именно объектам нам потребуется получить доступ и соответственно мы не можем сказать какие mutex'ы мы захотим захватить до того как захватим ряд из них, нам придется при каждом захвате более старшего чем ранее захваченные mutex'ы освобождать эти mutex'ы чтобы вскоре снова захватить их начав с этого старшего. Опять же крайне неудобной при таком подходе представляется работа с двунаправленными списками с защищенными mutex'ами элементами обход по которым необходимо осуществлять в обоих направлениях. В этих случаях имеет смысл использовать второй подход к предотвращению тупиков. Он основывается на использовании неблокирующего варианта операции захвата mutex'а, то есть pthread_mutex_trylock и называется "попытка и откат" / try and back-off /. Идея этого подхода очень проста: мы можем захватываем mutex'ы в произвольном порядке, но используем при этом операцию pthread_mutex_trylock, если эта операция в некоторый момент нам возвращает EBUSY / то есть если один из mutex'ов который мы пытаемся захватить уже захвачен /, то мы освобождаем все захваченные mutex'ы, как бы уступая дорогу нашему конкуренту. Ясно, что при таком подходе тупиков не возникает, с другой стороны сразу виден основной недостаток этого метода, а именно дополнительные накладные расходы, которые появляются из-за многократных попыток захвата и многократного освобождения mutex'ов. Кроме того, легко себе представить ситуацию, когда две нити пытаются захватить один и тот же набор mutex'ов A и B, но в разном порядке, и при этом ни одна из них не может сделать этого, так как все время натыкается на соперничающую нить / несмотря на то, что та регулярно освобождает свой mutex /. То есть нет теоретической гарантии работы схемы. Практически же в ситуациях, когда конкуренция за ресурсы не высока, данный подход работает вполне эффективно и надежно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2006, 10:03 |
|
||
|
Размер буфера fifo ограничен?
|
|||
|---|---|---|---|
|
#18+
onstat- Немного не так, Вот пример который я разбирал, и который мне очень сильно помог в понимании процесса. Даже с первого взгляда видно, что хороший пример. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2006, 10:05 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34071069&tid=2030200]: |
0ms |
get settings: |
11ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
178ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
86ms |
get tp. blocked users: |
2ms |
| others: | 253ms |
| total: | 570ms |

| 0 / 0 |
