Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX: Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 236

Автор Уильям БтивСнс

Π’ листингС 30.25 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° функция main.

Листинг 30.25. Ѐункция main для сСрвСра с ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

//server/serv08.c

 1 #include "unpthread.h"

 2 #include "pthread08.h"


 3 static int nthreads;

 4 pthread_mutex_t clifd_mutex = PTHREAD_MUTEX_INITIALIZER;

 5 pthread_cond_t clifd_cond = PTHREAD_COND_INITIALIZER;


 6 int

 7 main(int argc, char **argv)

 8 {

 9  int i, listenfd, connfd;

10  void sig_int(int), thread_make(int);

11  socklen_t addrlen, clilen;

12  struct sockaddr *cliaddr;


13  if (argc == 3)

14   listenfd = Tcp_listen(NULL, argv[1], &addrlen);

15  else if (argc == 4)

16   listenfd = Tcp_listen(argv[1], argv[2], &addrlen);

17  else

18   err_quit("usage: serv08 [ <host> ] <port#> <#threads>");

19  cliaddr = Malloc(addrlen);


20  nthreads = atoi(argv[argc - 1]);

21  tptr = Calloc(nthreads, sizeof(Thread));

22  iget = iput = 0;


23  /* созданиС всСх ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² */

24  for (i = 0; i < nthreads; i++)

25   thread_make(i); /* Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ основной ΠΏΠΎΡ‚ΠΎΠΊ */


26  Signal(SIGINT, sig_int);


27  for (;;) {

28   clilen = addrlen;

29   connfd = Accept(listenfd, cliaddr, &clilen);


30   Pthread_mutex_lock(&clifd_mutex);

31   clifd[iput] = connfd;

32   if (++iput == MAXNCLI)

33    iput = 0;

34   if (iput == iget)

35    err_quit("iput = iget = %d", iput);

36   Pthread_cond_signal(&clifd_cond);

37   Pthread_mutex_unlock(&clifd_mutex);

38  }

39 }

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

23-25 Π€ΡƒΠ½ΠΊΡ†ΠΈΡ thread_make создаСт всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ.

ОТиданиС ΠΏΡ€ΠΈΡ…ΠΎΠ΄Π° клиСнтского соСдинСния

27-38 ΠžΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ блокируСтся Π² Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ accept, оТидая появлСния Π½ΠΎΠ²ΠΎΠ³ΠΎ соСдинСния. ΠŸΡ€ΠΈ появлСнии этого соСдинСния дСскриптор присоСдинСнного сокСта записываСтся Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт массива clifd послС блокирования Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ слСдим, Ρ‡Ρ‚ΠΎΠ±Ρ‹ индСкс iget Π½Π΅ совпал со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ индСкса iput, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°ΠΆΠ΅Ρ‚ Π½Π° нСдостаточно большой Ρ€Π°Π·ΠΌΠ΅Ρ€ массива. Условная пСрСмСнная сигнализируСт ΠΎ ΠΏΡ€ΠΈΠ±Ρ‹Ρ‚ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ запроса, ΠΈ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ разблокируСтся, позволяя ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΡƒΠ»Π° ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ±Ρ‹Π²ΡˆΠΈΠΉ запрос.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ thread_make ΠΈ thread_main ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Π² листингС 30.26. ΠŸΠ΅Ρ€Π²Π°Ρ ΠΈΠ· Π½ΠΈΡ… ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π² листингС 30.23.

Листинг 30.26. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ thread_make ΠΈ thread_main

//server/pthread08.c

 1 #include "unpthread.h"

 2 #include "pthread08.h"


 3 void

 4 thread_make(int i)

 5 {

 6  void *thread_main(void*);


 7  Pthread_create(&tptr[i].thread_tid, NULL, &thread_main, (void*)i);

 8  return; /* Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ основной ΠΏΠΎΡ‚ΠΎΠΊ */

 9 }


10 void*

11 thread_main(void *arg)

12 {

13  int connfd;

14  void web_child(int);


15  printf("thread %d starting\n", (int)arg);

16  for (;;) {

17   Pthread_mutex_lock(&clifd_mutex);

18   while (iget == iput)

19    Pthread_cond_wait(&clifd_cond, &clifd_mutex);

20   connfd = clifd[iget]; /* присоСдинСнный сокСт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ трСбуСтся

                              ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ */

21   if (++iget == MAXNCLI)

22    iget = 0;

23   Pthread_mutex_unlock(&clifd_mutex);

24   tptr[(int)arg].thread_count++;


25   web_child(connfd); /* ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° запроса */

26   Close(connfd);

27  }

28 }

ОТиданиС присоСдинСнного сокСта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ обслуТивания

17-26 ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠ· ΠΏΡƒΠ»Π° пытаСтся Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ доступ ΠΊ массиву clifd. Если послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΎ, оказываСтся, Ρ‡Ρ‚ΠΎ индСксы iput ΠΈ iget Ρ€Π°Π²Π½Ρ‹, Ρ‚ΠΎ вызываСтся функция pthread_cond_wait, ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состояниС оТидания, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π΅ΠΌΡƒ ΠΏΠΎΠΊΠ° Π½Π΅Ρ‡Π΅Π³ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ. ПослС прибытия ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ клиСнтского запроса основной ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ pthread_cond_signal, выводя Ρ‚Π΅ΠΌ самым ΠΈΠ· состояния оТидания ΠΏΠΎΡ‚ΠΎΠΊ, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π²ΡˆΠΈΠΉ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. Когда этот ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ соСдинСниС, ΠΎΠ½ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ web_child.

ЗначСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ процСссора, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π² Ρ‚Π°Π±Π». 30.1, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ эта вСрсия сСрвСра ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ рассмотрСнной Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ (ΠΊΠΎΠ³Π΄Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠ· ΠΏΡƒΠ»Π° сам Π²Ρ‹Π·Ρ‹Π²Π°Π» Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ accept). ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ рассматриваСмая Π² Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ вСрсия ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠ°ΠΊ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Ρ‚Π°ΠΊ ΠΈ ΡƒΡΠ»ΠΎΠ²Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ случаС (см. листинг 30.23) ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ»ΠΎΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

Если ΠΌΡ‹ рассмотрим гистограмму количСства ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ², обслуТиваСмых ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΈΠ· ΠΏΡƒΠ»Π°, Ρ‚ΠΎ окаТСтся, Ρ‡Ρ‚ΠΎ распрСдСлСниС клиСнтских запросов ΠΏΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² послСднСм столбцС Ρ‚Π°Π±Π». 30.2. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ссли основной ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ pthread_cond_signal, Ρ‚ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ ΠΈΠ· состояния оТидания для обслуТивания клиСнтского запроса, осущСствляСтся ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ всСх ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ…ΡΡ свободных ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

30.13. РСзюмС

Π’ этой Π³Π»Π°Π²Π΅ ΠΌΡ‹ рассмотрСли 9 Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… вСрсий сСрвСра ΠΈ ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ Π²Π΅Π±-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ значСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ процСссора, Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ процСссом.

0. ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ сСрвСр (Ρ‚ΠΎΡ‡ΠΊΠ° отсчСта β€” ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ процСссом отсутствуСт).

1. ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ сСрвСр, ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π²Ρ‹Π·ΠΎΠ²Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fork для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

2. ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… процСссов, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ accept.

3. ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… процСссов с Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ Ρ„Π°ΠΉΠ»Π° для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ accept.

4. ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… процСссов с Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌΠΈ процСссами для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ accept.

5. ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… процСссов с ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ дСскриптора ΠΎΡ‚ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСсса Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅ΠΌΡƒ.

6. ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ сСрвСр, ΠΏΠΎΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ΅ созданиС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ поступлСния клиСнтских запросов.

7. ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² с Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ accept.

8. ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², основной ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ accept.

Π Π΅Π·ΡŽΠΌΠΈΡ€ΡƒΡ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» этой Π³Π»Π°Π²Ρ‹, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ нСсколько ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π².

β–  Π•сли сСрвСр Π½Π΅ слишком Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½, Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ традиционная модСль ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ сСрвСра, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈ поступлСнии ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ клиСнтского запроса вызываСтся функция fork для создания Π½ΠΎΠ²ΠΎΠ³ΠΎ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ процСсса. Π­Ρ‚ΠΎΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ допускаСт ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ с Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ inetd, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΌ всС клиСнтскиС запросы. ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ вСрсии ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ Π² случаС Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… сСрвСров, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Π²Π΅Π±-сСрвСры.

β–  Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡƒΠ»Π° Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… процСссов ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² сокращаСт Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ процСссора ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠΉ модСлью (ΠΎΠ΄ΠΈΠ½ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fork для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ запроса) Π² 10 ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π·. ΠŸΡ€ΠΈ этом Π½Π΅ слишком услоТняСтся ΠΊΠΎΠ΄, Π½ΠΎ становится Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ (ΠΊΠ°ΠΊ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ ΠΏΡ€ΠΈ обсуТдСнии ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ²) ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ количСство свободных Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… процСссов ΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ количСство клиСнтских запросов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ трСбуСтся ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ, динамичСски измСняСтся.

β–  ΠΠ΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈΠ»ΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… процСссов Π² Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ accept, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ использования Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ accept. МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для этого Π»ΠΈΠ±ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Ρ„Π°ΠΉΠ»Π°, Π»ΠΈΠ±ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Pthreads.

β–  ΠšΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, вСрсия, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠ»ΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ accept, ΠΏΡ€ΠΎΡ‰Π΅ ΠΈ быстрСС, Ρ‡Π΅ΠΌ вСрсия, Π³Π΄Π΅ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ accept осущСствляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ основным ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ (ΠΈΠ»ΠΈ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ процСссом), впослСдствии ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‰ΠΈΠΌ дСскриптор присоСдинСнного сокСта Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ ΠΈΠ»ΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅ΠΌΡƒ процСссу.

β–  Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° всСх Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… процСссов ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ accept ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅, Ρ‡Π΅ΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π² Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ select, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ появлСния ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ select.

β–  Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π΄Π°Π΅Ρ‚ больший Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‡Π΅ΠΌ использованиС процСссов. Но Π²Ρ‹Π±ΠΎΡ€ ΠΌΠ΅ΠΆΠ΄Ρƒ вСрсиями 1 ΠΈ 6 (ΠΎΠ΄ΠΈΠ½ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ запрос ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ запрос) зависит ΠΎΡ‚ свойств ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы ΠΈ ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ Π΅Ρ‰Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ задСйствованы Π² обслуТивании клиСнтских запросов. НапримСр, Ссли сСрвСр, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉ клиСнтскоС соСдинСниС, Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fork ΠΈ exec, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ быстрСС ΠΏΠΎΡ€ΠΎΠ΄ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fork процСсс с ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Ρ‡Π΅ΠΌ процСсс с нСсколькими ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ.