Select (форум)
допустимо, є два процеси - п1 і п2. Пов'язані між собою через unix доменний сокет. п1 пише в п2 деякі дані і чекає результат Р1 виконання, який п2 повинен закинути в цей сокет. п1 чекає цей результат за допомогою select з таймаут.
У підсумку, після закінчення часу очікування п1 виконує деяку іншу роботу (а в цей момент допустимо п2 все таки запише результат Р1 в сокет) і буде потрібно допустимо ще раз відправити вже якісь інші дані потоку п2 і отримати від п2 вже результат Р2 обробки нових даних.
Що буде коли п1 викличе select з таймаут вдруге:
- 1) select відразу поверне управління і recv прочитає «протухнули» дані з сокета, тобто Р1? - 2) що прочитає п2 з сокета - то що він туди записав Р1 або нові дані від п1 (припустимо читання йде однаковими розмірами)?
І питання ще - як це побороти? може є якийсь усталений механізм або справа просто в доопрацюванні протоколу обміну між п1 і п2?
питання 2 в підсумку до тупого питання можна звести - якщо процес п2 записав в сокет 16 байт, але ніхто цей сокет не читав, і процес п1 записав в сокет ще 16 байт, то потім якщо процес п2 буде вважати шматком 16 байт - які дані він отримає?
Візьмемо nginx vs apache в якості проксі.
Викликаємо select (epoll_wait / kevent / whatever) - контекст перемикається. Отримуємо дескриптор (и). Далі викликаємо read - контекст перемикається. Викликаємо write - контекст перемикається. Тобто маємо перемикання контексту на кожен read / write + на select.
Маємо купу потоків, кожен з яких спить чекаючи запису / читання з / в сокета. Приходять дані - контекст перемикається. Які додаткові переходу від одного виклику блокуючих функцій вкрай малоймовірні.
Тобто за інших рівних, по _колічеству_ перемикань треди навіть трохи краще, тому що немає додаткового виклику select.
Тисячі тредов сплячих в очікуванні завершення операції введення / виводу для операційки мало чим отлічіются від тисяч гнізд в мультиплексоре роблять те ж саме. Ні?
Виходить у апача дорожчий тільки прийом нового з'єднання, а все інше не більше ніж міф?
Є процес, який працює з графічним інтерфейсом. Може бути бути в залежності від збірки як android-процесом, так і в X11 / wayland або будь-якого іншого графічкского сервера. При цьому може працювати з мережею і символьними пристроями безпосередньо.
Чи можна якимось чином безпечно провести select / poll по всьому дескрипторів, за якими може бути проведений введення?
Доброго часу. Не виходить вирішити тривіальну проблемму. Потрібно скласти запит який би видавав середнє значення кількості елементів належать кожній підгрупі які так само розділені на різні групи. Тобто є три таблиці в першій наприклад у нас студенти і номера їх груп, в другій номер групи і шифр факультету до кторой вони належать, в третій найменування факультету і відповідний шифр факультету. Потрібно отримати середню чисельність груп на кожному факультеті.
Я спробував скласти запит (не виходить скласти сіснтаксіс правильний):
Я спробував переробити:
Так як дана логіка по ідеї дає мені необхідний результат, не викладаю попередні спроби.
Доброго дня. Терніруюсь - пишу асинхронний сервер на select.
Вишу я в select, далі браузером або telnet'ом підключаюся до сервера і після підключення моє нове підключення не в read_fd_set, а в write_fd_set
Тобто я підключився telnet'ом, але нічого не записав, accept відпрацював, це не він. Ось я нічого не записав і спрацював select, і якогось біса мій сокет у write_fd_set. Це ж означає що мені туди щось записати треба? Або що це значить? Хто-небудь знає що відбувається і що мені робити?
56,6% - це завантаження процесора.
При тому маршрутизації черг в RabbitMQ не так багато.
По пам'яті не так і багато:
Якийсь erlang'овскій rpmd-daemon відвисає на таких системних виховах:
Process 1017 attached - interrupt to quit select (7, [3 5], NULL, NULL,) = 0 (Timeout) gettimeofday (, NULL) = 0 select (7, [3 5], NULL, NULL,) = 0 ( Timeout) gettimeofday (, NULL) = 0 select (7, [3 5], NULL, NULL,) = 0 (Timeout)
Але рідко і ресурсів не їсть майже.
А ось beam.smp в самому верху top'a.
В чому може бути проблема?