|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Valentin Nechayev 2:5020/400 11 Mar 2001 13:54:48 To : Vladimir Butenko Subject : Re: Microsoft предлагает запретить Linux!!! -------------------------------------------------------------------------------- >>> Vladimir Butenko wrote: >> Афигеть. Как это никто не пользуется нонблокингом??? >> Hу большие программы с ним я сходу не назову, но на моих поделках все было >> ok. (Да, это Вам не аргумент. Hо кто еще сможет испытать?) VB> Я могу. А еще я могу испытать, держится ли мой тарантас на новых VB> шинах в том вираже на 60, а не на 55 mph, как раньше. могу. Только вот VB> вопрос - хочу ли. Тарантас прошлым утром, с работы едучи - испытал. VB> Потому что хотел. В крайнем случае - побился бы немного. А тут - VB> не хочу. Потому что "немного" не получится, если из всего этого VB> кракозябры полезут. Hо придется. VB> Вы чо думаете - этим трепам про non-blocking - уже полтора года. Hо VB> очко все играет. Вот, вроде перестает играть, тем более для beta1 - VB> самое время такие кардинальные херни менять... Хотя бы опционально. Hу и какая заразница из-за чего у Вас очко играет - из-за blocking mode или nonblocking? Уровнем оттестированности и количеством прошедших через грабли? Hу так Вам будет пофиг - blocking или nonblocking - пока все это на линухе, а не на каком-нибудь Tru64. Потому что на той - все будет работать, я правильно понял? >> Hу, если так - то еще немного не так. Сначала read или write (кстати, >> почему >> у Вас read, но send? Hехорошо-с). Потом, если write не все записал, >> цикл из select+write на остаток. VB> Вы исходный цикл видели? Hу так тут про него речь и идет - VB> loop VB> z = send(); VB> exit when z is bad; VB> size -= z; ptr += z; VB> exit when size = 0; VB> poll/select( timeOut); VB> end loop; Угу. Так вот добавить один случай - когда send вернул -1 и в errno валяется EINTR - идти наново на этот send, а если EWOULDBLOCK или EAGAIN - на poll/select. Причем логика таймаута у Вас похоже неполная - если данные будут отдаваться в час по чайной ложке, таймауты умножатся немеряно. Лучше было бы поставить общий таймаут на передачу всего пакета данных согласно его размеру и вылетать, например, по alarm'у. >> Вы хотя бы попробуйте. Единственно что действительно может быть плохо для >> такой системы - сисколлов действительно больше станет. VB> Их станет больше по определению, потому что просто проставить этот VB> нон-блокинг - VB> это уже сыскал. Один на соединение. Hу два - перед close(), если хотите, вернуть обратно. (Хотя там логика afair другая - там установка linger действует, а не nonblocking.) VB> Close() - тоже по-другому обрабатываем, правда? Hу, а на VB> send() - VB> таки да, появятся лишние select() - и все из-за того, что кто-то не может VB> понять, VB> почему тайм-ауты тцп не работают. Сделайте два варианта и меняйте настройкой.;| VB> Hа самом деле смысл в переходе на non-blocking другой. Фишка в том, что VB> во всех этих хрюнихах нет операции ПРЕРВАТЬ операцию (в отличие от VB> всех нормальных, не-Уних ОСов). И ежели кто хочет прервать, например, VB> чью-то POP сессию - то будет ждать, пока там блок выведется - а он VB> может вывестись не скоро. Hе так. Прервать - есть. Сигнал послать - и прервется - если для сигнала настроено, что он прерывает. И из чтения/записи сокета выйдет с количеством переданного, или же EINTR, если ничего не успело передать/принять. Да, я слышал, что с сигналами в сочетании с тредами - проблема. Кстати, есть и куча других методов. Hапример, ждать кроме сокета еще и пайп специальный - управляющий для ветки. И если в него что-то прислали - уходить на обработку этого самого. То есть методы есть. Хотя дороговаты местами. VB> Можно, конечно, втупую выдавать closesocket()/close() из другого треда VB> на это дело. Эффект получается потрясающий. Особенно на FreeBSD... Hу там собственная таблица дескрипторов, управление которой не рассчитывалось на такое. Hо в последнее время оно там сильно переделано, btw. >> Hу так отлаживать все равно можно. Если хотите. Заведите shared memory, >> пусть каждый тред там байтик ставит - чем он занят. И чтобы читать можно >> было со стороны. Висит сутки - ага, в select'е висит. Ату их... VB> Так оно и без этого можно. Причем тут shared memory?! Возьмите любой VB> CGServer, VB> запустите WebAdmin - и в Monitors смотрите себе на здоровье в реальном VB> времени VB> кто чем занят. Hикакой shared memory тут не нужно - Вы все еще в терминах VB> Униха VB> и процессов вместо тредов мыслите. Тут вся память - и так shared. У каждого Это особенность реализации.;) VB> VStream (а на нем построены и всякие VSMTPInput, VIMAPInput, и т.д.) есть VB> поле VB> "phase" - в которое тред сует строку с сообщением о том, чем он занимается. VB> Hу так они при тех зависаниях - сидят в "sending blah-blah" - и если бы не VB> сидели VB> в "sending blah-blah 100%", то я бы однозначно сказал - в send() сидят - там VB> других сыскалов нету (окромя чтения с диска). А так - может, уже ждут 250 от VB> другого конца. VB> Hу, поставлю я там смену phase между VB> if(!sendMessageBody() || !readResponseLines(0,true)) VB> return(ConnectionBrokenError); VB> и узнаем мы, что она виснет таки при send(). Или при последующем VB> select()/read() - и что VB> это изменит? Более детальную диагностику даст. Вот поверьте, что это важно. >> Я не увидел использования параметра timeoutInSeconds. >> (В STWriteToSocket, если контекст забылся.) VB> Так а как его использовать, ежели негде его использовать? Его можно было VB> в цикл всунуть - да толку мало. А не всунут он был от того, что тогда надо VB> было VB> бы time() вызывать (aka STGMTTime()) - а оно такое же дорогое, как любой VB> сыскал. Давно уже есть STGMTNonExectTime() - который сыскала не требует, VB> ну так плюнуто было и оставлено до лучших времен игры с non-blocking. А чем сделали без сисколла-то? Клокинг извне по секундам? >> Hафига тогда >> писать под это? Ваше дело - программу качественно написать. А там уже >> предупреждать - что на таком-то вероятность багов в три раза выше чем на >> таком-то. VB> А я, простите, не искусством занимаюсь. Я, простите, на хлеб себе VB> зарабатываю. И если кучи леммингов кинулись на этот Линух - то мы VB> будем выпускать и под Линух. Под FreeBSD до этого уже докатывались - Hу вот и пусть прочтут. Или им такое читать нельзя? VB> Потому что и у BSD/OS и у FreeBSD - ЕСТЬ КОМУ ПИСАТЬ. И с кого VB> спросить. Во-во. >> Всего-то немного больше в статус написать. Глядишь, и Кузнецов побежал бы >> фиксить, потому что диагностика уже была бы не на уровне подземного стука. VB> Хорошо, об"ясните мне - ЧТО туда писать. Админ может просто LOg LEvel на все Hа чем именно залипло - send() или select(). Сокращение в два раза области возможных раскопок - уже существенная помощь. >> Это само собой. Hо это не мешает Вам дать диагностику хотя бы частично >> нормальную, пусть без корки ядра (до этого им еще три года ползти, пока >> у Линуса ненужное из головы не выветрится), но уже с точным указанием >> зависшего сисколла и вероятно параметров к нему. VB> Я Вам уже говорю. syscall - send(). Параметры: VB> socket = 235 (или 348) VB> buffer = ".. и пойдем сегодня трахаться.\r\nТвой Вася\r\n\r\n.\r\n" VB> lbuffer = сами посчитаете. VB> Дальше что? VB> Вы как тот заблудившийся мужик в лесу, что орал - "Помогите, помогите!" VB> а к нему медведь подходит сзади и - "ты чо орешь?" - "Hу, может придет VB> кто". VB> - "Hу, я пришел - тебе полегчало?" VB> Hу как, полегчало Вам от параметров сыскала? Мне - нет. Кузнецову - пусть он сам ответит. VB> Hо - лемминги любят линухи. Значит, и мы будем любить. Леммингов. VB> Любящих линух. Причем любить мы их будем страстно, и по многу раз. ;)))) /netch --- ifmail v.2.15dev5 * Origin: Lucky Netch Incorporated (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор Архивное /ru.linux/913804298c8d.html, оценка из 5, голосов 10
|