powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Размер буфера fifo ограничен?
34 сообщений из 34, показаны все 2 страниц
Размер буфера fifo ограничен?
    #34069606
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нигде не встречал, но обнаружил что буфер pipe в ядре 2.6.9 два килобайта.

А как с fifo, кто-нибудь в курсе?
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34069950
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Размер буфера fifo точно такой же как у pipe.

Вообще когда мне приходилось в fifo писать достаточно большой объем данных у меня возникло много довольно проблем.
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34069960
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, для пипе 2К это еще нормально, можно указатели передовать, но для fifo маловато будет. 2К для межпроцесового взаимодействия это даже не размер.
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34069963
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandro_KВообще когда мне приходилось в fifo писать достаточно большой объем данных у меня возникло много довольно проблем.

Что тогда использовал вместо fifo?
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34069990
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhНу, для пипе 2К это еще нормально, можно указатели передовать, но для fifo маловато будет. 2К для межпроцесового взаимодействия это даже не размер.

Да, действительно маловато :( Когда мне надо было передавать через FIFO видео, то у меня 1 кадр не не мог поместиться в этот буфер.
FIFO можно еще открывать в блокируемом режиме, тогда потери данных не будет, но функция write не завершится до тех пор пока все данные не будут считаны.
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34069995
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh Sandro_KВообще когда мне приходилось в fifo писать достаточно большой объем данных у меня возникло много довольно проблем.

Что тогда использовал вместо fifo?

Я открывал fifo в блокируемом режиме, но в отдельном потоке.
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34070003
Фотография Ranckont
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В исходниках ядра можно поменять это ограничение.
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34070018
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RanckontВ исходниках ядра можно поменять это ограничение.
В исходника ядра конечно можно, но не заставишь же пользователей программы менять исходники ядра и перекомпилировать его.
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34070028
Фотография Ranckont
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используй программу, которая будет активно читать из пайпа в какой-нибудь другую память
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34070036
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh Sandro_KВообще когда мне приходилось в fifo писать достаточно большой объем данных у меня возникло много довольно проблем.

Что тогда использовал вместо fifo?

Можно пробовать отправлять сообщения.
почитай man msgget, msgctl, msgrcv, msgsnd.

Там размеры регулируются параметрами ядра, но они тоже не безграничны.
(MSGMAX MSGMNB )



Вполне может быть, что и fifo буффер тоже регулируется параметрами ядра,
но я не знаю как.


Можно через разделяемую память.
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34070057
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RanckontИспользуй программу, которая будет активно читать из пайпа в какой-нибудь другую память

У меня будет несколько клиентов отсылающих данные, а на приеме простые ворота к базе данных. На этой же машине уже две программы с 12 и 5-ю потоками со слипами не более 1ms. Так что ищу решение, чтобы не городит огород и не плодить потоки.
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34070066
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat- Akh Sandro_KВообще когда мне приходилось в fifo писать достаточно большой объем данных у меня возникло много довольно проблем.
Что тогда использовал вместо fifo?

Можно пробовать отправлять сообщения.
почитай man msgget, msgctl, msgrcv, msgsnd.

Там размеры регулируются параметрами ядра, но они тоже не безграничны.
(MSGMAX MSGMNB )


Уже начинаю подумывать. Размер сообщения мне не критичен, на крайняк буду бить сообщения на части. Тут встает тот же самый вопрос - сколько сообщений в очередь можно будет поместить?
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34070189
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 Еще подумай о передаче через разделяемую память.
Работать должно быстрее и с ограничениями на обьем попроще.
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34070292
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.
Через разделяемую память боюсь из-за синхранизации (процессы, передающие данные, в разных программах).
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34070683
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 часа и этим очень облегчил себе дальнейшую
програмистскую жизнь.
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34070802
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-
Бояться тут нечего.

ИХМО Самое короткое и доходчивое описание правил синхронизации:


Межпрограммный мьютекс? Спасибо врубился. Ничего сложного.
Тогда второй вопрос, какие средства используются для разделяемой памяти? :)
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34070815
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh onstat-
Бояться тут нечего.

ИХМО Самое короткое и доходчивое описание правил синхронизации:


Межпрограммный мьютекс? Спасибо врубился. Ничего сложного.
Тогда второй вопрос, какие средства используются для разделяемой памяти? :)

Все сам нашел тамже. shmget, ... .

onstat-, Пасибо, не знал. Буду пробовать, надеюсь, что понравится.
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34070924
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh onstat-
Бояться тут нечего.

ИХМО Самое короткое и доходчивое описание правил синхронизации:


Межпрограммный мьютекс? Спасибо врубился. Ничего сложного.
Тогда второй вопрос, какие средства используются для разделяемой памяти? :)

Я не зря выделил слово массив иногда для синхронизации потребуется
несколько семафоров, некоторые нужно изменять некоторые
просто проверять.

Для абсолютно точной синхронизациив все это(и изменение и проверку) обязательно нужно делать за один вызов semop.
Иначе можно получить большой геморой.
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34070948
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat- Akh onstat-
Бояться тут нечего.

ИХМО Самое короткое и доходчивое описание правил синхронизации:


Межпрограммный мьютекс? Спасибо врубился. Ничего сложного.
Тогда второй вопрос, какие средства используются для разделяемой памяти? :)

Я не зря выделил слово массив иногда для синхронизации потребуется
несколько семафоров, некоторые нужно изменять некоторые
просто проверять.

Для абсолютно точной синхронизациив все это(и изменение и проверку) обязательно нужно делать за один вызов semop.
Иначе можно получить большой геморой.

Как я понимаю, самый простой способ, это установить симофор в единичку и вызывать в semop с -1, со сброшеным NOWAIT и установленным UNDO. А уже сложнее случаи представить сложно. И, как мне кажется, программирование семафороми - увлекательное занятие. :)

Хотя, вообще-то, тут, наверное, те же дедлоки, что и мьютексов, так что надо использовать либо, как ты подметил, целыми массивами, или расставлять логические приоритеты симофоров.
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34071069
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh onstat- Akh onstat-
Бояться тут нечего.

ИХМО Самое короткое и доходчивое описание правил синхронизации:


Межпрограммный мьютекс? Спасибо врубился. Ничего сложного.
Тогда второй вопрос, какие средства используются для разделяемой памяти? :)

Я не зря выделил слово массив иногда для синхронизации потребуется
несколько семафоров, некоторые нужно изменять некоторые
просто проверять.

Для абсолютно точной синхронизациив все это(и изменение и проверку) обязательно нужно делать за один вызов semop.
Иначе можно получить большой геморой.

Как я понимаю, самый простой способ, это установить симофор в единичку и вызывать в semop с -1, со сброшеным NOWAIT и установленным UNDO. А уже сложнее случаи представить сложно. И, как мне кажется, программирование семафороми - увлекательное занятие. :)


Немного не так,

Вот пример
который я разбирал, и который мне очень сильно помог в понимании
процесса.

Akh
Хотя, вообще-то, тут, наверное, те же дедлоки, что и мьютексов, так что надо использовать либо, как ты подметил, целыми массивами, или расставлять логические приоритеты симофоров.

Я не совсем понимаю зачем нужны отдельные приоритеты если
семафор может принимать значение типа int.
То есть он сам себе приоритет.
От того с каким значение его приходят менять он либо меняется
либо процесс спит пока приоритет семафора не достгнет нужного
значения путем его изменения другими процессами.
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34071458
ska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-Для абсолютно точной синхронизациив все это(и изменение и проверку) обязательно нужно делать за один вызов semop.
Иначе можно получить большой геморой.

Да и вообще лучше semop не пользовать, он малость геморройный да и таймаута нету, а semtimedop не везде есть...
shmget дело понятное, а для синхронизации лучче pthread все таки. Ну разумеется с PTHREAD_PROCESS_SHARED ежели interprocess communication.
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34071938
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ska onstat-Для абсолютно точной синхронизациив все это(и изменение и проверку) обязательно нужно делать за один вызов semop.
Иначе можно получить большой геморой.

Да и вообще лучше semop не пользовать, он малость геморройный да и таймаута нету, а semtimedop не везде есть...
shmget дело понятное, а для синхронизации лучче pthread все таки. Ну разумеется с PTHREAD_PROCESS_SHARED ежели interprocess communication.

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

Способ одним мутексом закрыть пять других, есть не совсем простым.
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34072250
ska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-Вы меня убедите, если подскажете как взвести 5 мутексов
одновременно, чтобы избежать дедлоков между процессами.
Я, к сожалению, простого способа не знаю.

Я честно сказать не представляю задачу для которой это было бы жизненно необходимо. Опишите вкратце цель - может просто найдутся другие варианты реализации. Работа с общей памятью мутексами не ограничивается, а в pthread еще rwlock полезен бывает, да и поэффективнее.
К тому же есть очч большие нюансы ежели имеете дело со всякими динозаврами. Проблема может заключаться в том что не все threadы лайтвейт :-)) pthread равно как и всякая жава проблему зту решает через симуляцию, а вот изза одного semop-а все ваши потоки и подмерзнут...

onstat-Способ одним мутексом закрыть пять других, есть не совсем простым.

Ничего сложного в этом не вижу, просто как правило это не надо.
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34073065
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 /. То есть нет теоретической гарантии работы схемы. Практически же в ситуациях, когда конкуренция за ресурсы не высока, данный подход работает вполне эффективно и надежно.
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34073072
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-
Немного не так,

Вот пример
который я разбирал, и который мне очень сильно помог в понимании
процесса.


Даже с первого взгляда видно, что хороший пример. Спасибо.
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34073242
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, кстати, как корректней id для семофоров выбирать. Т.к. он будет использоваться в разных программах, то задавать его прийдется статически. Может существуют каки-либо правила, или зарезервированные интервалы?
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34073283
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ska onstat-Вы меня убедите, если подскажете как взвести 5 мутексов
одновременно, чтобы избежать дедлоков между процессами.
Я, к сожалению, простого способа не знаю.

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


Попробую.
t1, t2,t3 tn некие моменты времени

Некий процесс П1 устанавливает блокировку на ресурс А1,
но для работы с этим обьектом необходимо
установить блокировку еще на ресурс(обьект) А3.
Для работы с A3 необходимо поставить блокировку на А2.

Некий другой процесс устанавливает блокировку на ресурс A2
и ему тоже требуется работа с А3.

Третьему процессу П3 для нормальной работы достаточно блокировать
обьекты по одиночке.

т1 А1 заблокирован процессом П1.
т2 А2 заблокирован процессом П2.
т3.А3 заблокирован процессом П1.
т4 П1 ждет разблокировки ресурса А2.
т4 П2 ждет разблокировки А3.

Все ждут , никто ничего не делает.

При правильном использовании массивов семафоров все необходимые обьекты блокируются за одну операцию и в один момент веремни.
Т.Е. Один процесс может может захватить все необходимые ему ресурсы
атомарно, за один системный вызов.

To ALL: Как это зделать на мутексах?

ska
Работа с общей памятью мутексами не ограничивается, а в pthread еще rwlock полезен бывает, да и поэффективнее.


Функционал аналогичный rwlock реализуется классом в 40 сторках кода.

ska
К тому же есть очч большие нюансы ежели имеете дело со всякими динозаврами. Проблема может заключаться в том что не все threadы лайтвейт :-)) pthread равно как и всякая жава проблему зту решает через симуляцию,

Чесно , Ничего не понял.
Что имеется ввиду под динозаврами?
Смысл threadы лайтвейт :-)) ?
Причем тут Жава?

Что такое симуляция?

ska
а вот изза одного semop-а все ваши потоки и подмерзнут...


Используя IPC_NOWAIT получаем механизм подобный try_lock.

И ничего сложного, в том чтобы заказать ALARM, если не поддерживатеся
semtimedop я не вижу.


з.ы Я не спорю, что для большенства задач многонитевой процесс
будет лучше нескольких процессов. Но механизмы синхронизации
меня не совсем устраивают. Буду благодарен за наставление на путь истинный если я чего то не понимаю.
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34073305
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhДа, кстати, как корректней id для семофоров выбирать. Т.к. он будет использоваться в разных программах, то задавать его прийдется статически. Может существуют каки-либо правила, или зарезервированные интервалы?


ф-я ftok генерирует ключи для IPC по имени файла и числу.
при вызове из разных программ, но с одинаковыми параметрами
ключи будут одинаковы.
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34073344
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh

Каким образом можно решить проблему тупиков?
..........



Спасибо, можно еще ссылку на первоисточник?
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34073448
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat- Akh

Каким образом можно решить проблему тупиков?
..........



Спасибо, можно еще ссылку на первоисточник?

вроде, отсюда
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34075328
ska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-
Некий процесс П1 устанавливает блокировку на ресурс А1,
но для работы с этим обьектом необходимо
установить блокировку еще на ресурс(обьект) А3.
Для работы с A3 необходимо поставить блокировку на А2.


Если "функция" блокировки А1 будет блокировать сначала А3 (вызывать функцию) а та в свою очередь А1 то никаких дедлоков не будет.
Хуже конечно когда есть круговая зависимость.

onstat-
При правильном использовании массивов семафоров все необходимые обьекты блокируются за одну операцию и в один момент веремни.


Это конечно да, но разблокировать может кто угодно и малейшая ошибка приводит к длительной отладке.

onstat-
Т.Е. Один процесс может может захватить все необходимые ему ресурсы
атомарно, за один системный вызов.
To ALL: Как это зделать на мутексах?


Ну например завести один мутекс, один кондишн и массив int - полностью просимулирует семафоры.

onstat-
ska
К тому же есть очч большие нюансы ежели имеете дело со всякими динозаврами. Проблема может заключаться в том что не все threadы лайтвейт :-)) pthread равно как и всякая жава проблему зту решает через симуляцию,
Чесно , Ничего не понял.
Что имеется ввиду под динозаврами?
Смысл threadы лайтвейт :-)) ?
Причем тут Жава?
Что такое симуляция?


Я имел ввиду проблемы ежели один или более процессов многопоточные (многонитевые... отстал от терминологии), а динозавр например HP Nonstop (Tandem), у которого ядро операционки не многопоточное. Ежели один из потоков вызовет semop и попадет на нем в ожидание то ВСЕ потоки этого процесса будут в ожидании.
Библиотека pthread эту проблему обходит.

onstat-
И ничего сложного, в том чтобы заказать ALARM, если не поддерживатеся
semtimedop я не вижу.


Для многопоточных процессов alarm может не отработать так как Вы хотите.

onstat-
з.ы Я не спорю, что для большенства задач многонитевой процесс
будет лучше нескольких процессов. Но механизмы синхронизации
меня не совсем устраивают. Буду благодарен за наставление на путь истинный если я чего то не понимаю.

Ну посмотрите хоть на java хоть в .NET - послабее чем pthread но хватает для всего. А с точки зрения широты употребления и полезности знаний pthread уж явно лучче чем IPCS.

Сергей
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34077419
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ska onstat-
Некий процесс П1 устанавливает блокировку на ресурс А1,
но для работы с этим обьектом необходимо
установить блокировку еще на ресурс(обьект) А3.
Для работы с A3 необходимо поставить блокировку на А2.
Некий другой процесс устанавливает блокировку на ресурс A2
и ему тоже требуется работа с А3.

Третьему процессу П3 для нормальной работы достаточно блокировать
обьекты по одиночке.

т1 А1 заблокирован процессом П1.
т2 А2 заблокирован процессом П2.
т3.А3 заблокирован процессом П1.
т4 П1 ждет разблокировки ресурса А2.
т4 П2 ждет разблокировки А3.

Все ждут , никто ничего не делает.



Если "функция" блокировки А1 будет блокировать сначала А3 (вызывать функцию) а та в свою очередь А1 то никаких дедлоков не будет.
Хуже конечно когда есть круговая зависимость.


Вот и получается круговая зависимость.

ska
onstat-
При правильном использовании массивов семафоров все необходимые обьекты блокируются за одну операцию и в один момент веремни.


Это конечно да, но разблокировать может кто угодно и малейшая ошибка приводит к длительной отладке.


При любой синхронизации можно насупить комуто или самому себе на хвост :)

К семафорам нужно относится не как к блокировкам в чистом виде а как
к флагам(приоритетам) синхронизации.

Я не вижу ничего плохого в том что любой процесс имеет возможность
влиять на эти флаги.
Например:
Есть 5 процессов каждый из которых выполняет свою независимую логику.
Есть процесс манагер который обеспечивает эти процессы данными
и забирает результаты.
Процесс манагер, заполнив данные для рассчета, устанавливает
семафоры которые будят процессы обработчики и они начанают
работу, по окончании которой возвращают флаги на место.
просыпается процесс манагер и обрабатывает результаты выполнения.

По сравнению с pthread экономия как минимум на 5 системных вызовах.

Семафор не только защищает данные, а и управляет приритетами выполнения.


ska
Ну например завести один мутекс, один кондишн и массив int - полностью просимулирует семафоры.


Массив семафоров так просто проэмулировать не получится.
1. Не всегда есть необходимость менять(проверять) все семафоры в наборе, а только некотрые.
2. Заставить нить заснуть по кондишину зависящему от 1 до n элементов массива?
3. Гораздо проблематичнее ее потом будить по кондишину.

Теоретически реализовать можно, но это будет не просто.

ska
Ну посмотрите хоть на java хоть в .NET - послабее чем pthread но хватает для всего. А с точки зрения широты употребления и полезности знаний pthread уж явно лучче чем IPCS.

Сергей

По поводу лучше не согласен (это мое личное мнение).
По поводу широты употребеления полностью поддерживаю и даже использую.

С уважением, Константин
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34078576
ska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skaЕсли "функция" блокировки А1 будет блокировать сначала А3 (вызывать функцию) а та в свою очередь А1 то никаких дедлоков не будет.

Я имел ввиду А1 блокирует А3 а та А2 (согласно зависимости)
onstat-
т1 А1 заблокирован процессом П1.
т2 А2 заблокирован процессом П2.


П2 в момент т2 будет ждать пока П1 не освободит А1

onstat-
По сравнению с pthread экономия как минимум на 5 системных вызовах.


Пяти Нету. Два сэкономите - (раз)блокировка мутекса

onstat-
Семафор не только защищает данные, а и управляет приритетами выполнения.


Чего там насчет приоритетов ??? Очередностью исполнения может.

onstat-
ska
Ну например завести один мутекс, один кондишн и массив int - полностью просимулирует семафоры.

Массив семафоров так просто проэмулировать не получится.
1. Не всегда есть необходимость менять(проверять) все семафоры в наборе, а только некотрые.

Ну и не проверяйте все. Я говорю о том что просто всю semop как функцию на pthread можно написать
onstat-
2. Заставить нить заснуть по кондишину зависящему от 1 до n элементов массива?

Проверьте состояние нужных Вам элементов и если нужно ждать так и засните (по единственному кондишену)
onstat-
3. Гораздо проблематичнее ее потом будить по кондишину.

А будить всех (один единственный кондишн) нужно когда состояние семафоров меняется.
onstat-
Теоретически реализовать можно, но это будет не просто.

Реализовать то проще пареной репы (об эффективности я правда промолчу)

onstat-
По поводу лучше не согласен (это мое личное мнение).


Да нет смысла спорить. Есть задачи для которых semop намного эффективнее и удобнее. Сам его активно пользовал. А лет 20 назад ничего другого и не было :-)

С уважением, Сергей.
...
Рейтинг: 0 / 0
Размер буфера fifo ограничен?
    #34079026
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ska
Да нет смысла спорить. Есть задачи для которых semop намного эффективнее и удобнее. Сам его активно пользовал. А лет 20 назад ничего другого и не было :-)


Вот именно, лучше решите, где лучше семафоры, а где мьютексы. А в таком стиле невозможно определить о чем спор. ;)
...
Рейтинг: 0 / 0
34 сообщений из 34, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Размер буфера fifo ограничен?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]