Как блокировка ввода-вывода влияет на многопоточное приложение / службу в Linux - PullRequest
1 голос
/ 23 сентября 2011

Я изучаю несколько концепций для веб-сканера в C на Linux.Чтобы решить, буду ли я использовать блокировку ввода-вывода, мультиплексирование ввода-вывода, AIO, определенную комбинацию и т. Д., Мне нужно знать об этом (я, вероятно, должен обнаружить это для себя практически с помощью некоторого тестового кода, но для целесообразности я предпочитаю знать от других).) когда выполняется вызов IO в режиме блокировки, это конкретный поток (при условии многопоточного приложения / svc) или весь процесс блокируется?Более конкретно, в многопоточном приложении / службе (POSIX) может ли поток, предназначенный для удаленного чтения / записи, блокировать весь процесс?Если так, как я могу разблокировать такой поток, не прерывая весь процесс?

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

Пожалуйста

1 Ответ

1 голос
/ 23 сентября 2011

Блокирующие вызовы блокируют только поток, который их создал, а не весь процесс.

Использовать ли блокирующий ввод / вывод (с одним сокетом на поток) или неблокирующий ввод / вывод (с каждым потоком, управляющим несколькими сокетами) - это то, что вам нужно для сравнения. Но, как правило, ...

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

В последнем случае для оптимальной производительности вы, вероятно, захотите использовать epoll, даже если это зависит от Linux.

...