Способы обеспечения параллельной работы сервера

Опубликовано в Технологии > Серверные технологии

Поскольку в операционной системе Linux предусмотрены две формы организации параллельной работы (процессы и потоки), чаще всего применяются два способа реализации принципа работы "ведущий/ведомый". В одной реализации сервер создает несколько процессов, содержащих по одному потоку выполнения.

две реализации принципа ведущий/ведомый

Эти две реализации описаны в главах 11 и 12. В обеих главах приведены примеры сервера, соответствующего алгоритму 8.4. В реализации, описанной в главе 11, используется форма, показанная на рис. 8.3а, где каждый из потоков (один ведущий и несколько ведомых) реализован в виде однопотокового процесса. Реализация, описанная в главе 12, соответствует форме, показанной на рис. 8.36, в которой и ведущий, и ведомые потоки реализованы в одном процессе. В главе 12 приведено сравнение этих двух реализаций и описаны преимущества и недостатки каждой из них.

Применение в качестве ведомых потоков отдельных программ

Алгоритм 8.4 показывает, как в параллельном сервере создается новый ведомый поток для каждого соединения. В реализации с однопотоковыми процессами ведущий поток сервера выполняет это действие путем вызова системной функции fork. В случае простых прикладных протоколов весь код, необходимый для обеспечения работы и ведущего, и ведомого потоков, может содержаться в одной серверной программе. После вызова функции fork первоначальный процесс переходит по циклу к приему следующего входящего запроса на установление соединения, а новый процесс становится ведомым и поддерживает работу вновь созданного соединения. Однако в некоторых случаях может оказаться более удобным вызов серверным процессом на выполнение кода программы, которая была написана и оттранслирована отдельно. Такие операционные системы, как Linux, позволяют легко выполнить подобное требование, поскольку в них предусмотрена возможность вызывать в ведомом процессе функцию execve после вызова функции fork. Функция execve перекрывает код ведомого процесса кодом новой программы. Общий принцип состоит в следующем:

В реализациях многих служб код выполнения функций и ведущего, и ведомого процессов может содержаться в одной программе. Однако в некоторых случаях применение независимой программы позволяет упростить программирование или сопровождение ведомого компонента, поэтому ведущая программа включает вызов функции execve после вызова функции fork.