Читаем UNIX: разработка сетевых приложений полностью

//server/pr_cpu_time.c

 1 #include "unp.h"

 2 #include sys/resource.h

 3 #ifndef HAVE_GETRUSAGE_PROTO

 4 int getrusage(int, struct rusage*);

 5 #endif

 6 void

 7 pr_cpu_time(void)

 8 {

 9  double user, sys;

10  struct rusage myusage, childusage;

11  if (getrusage(RUSAGE_SELF, myusage) 0)

12   err_sys("getrusage error");

13  if (getrusage(RUSAGE_CHILDREN, childusage) 0)

14   err_sys("getrusage error");

15  user = (double)myusage.ru_utime.tv_sec +

16   myusage.ru_utime.tv_usec / 1000000.0;

17  user += (double)childusage.ru_utime.tv_sec +

18   childusage.ru_utime.tv_usec / 1000000.0;

19  sys = (double)myusage.ru_stime.tv_sec +

20   myusage.ru_stime.tv_usec / 1000000.0;

21  sys += (double)childusage.ru_stime.tv_sec +

22   childusage.ru_stime.tv_usec / 1000000.0;

21  printf("\nuser time = %g, sys time = %g\n", user, sys);

22 }

Функция getrusageвызывается дважды: она позволяет получить данные об использовании ресурсов вызывающим процессом ( RUSAGE_SELF) и всеми его дочерними процессами, которые завершили свое выполнение ( RUSAGE_CHILDREN). Выводится время, затраченное центральным процессором на выполнение пользовательского процесса (общее пользовательское время, total user time), и время, которое центральный процессор затратил внутри ядра на выполнение задач, заданных вызывающим процессом (общее системное время, total system time).

Возвращаясь к листингу 30.2, мы видим, что для обработки каждого клиентского запроса вызывается функция web_child. Эта функция показана в листинге 30.5.

Листинг 30.5. Функция web_child: обработка каждого клиентского запроса

//server/web_child.c

 1 #include "unp.h"

 2 #define MAXN 16384 /* максимальное количество байтов, которое клиент

может запросить */

 3 void

 4 web_child(int sockfd)

 5 {

 6  int ntowrite;

 7  ssize_t nread;

 8  char line[MAXLINE], result[MAXN];

 9  for (;;) {

10   if ((nread = Readline(sockfd, line, MAXLINE)) == 0)

11    return; /* соединение закрыто другим концом */

12   /* line задает, сколько байтов следует отправлять обратно */

13   ntowrite = atol(line);

14   if ((ntowrite = 0) || (ntowrite MAXN))

15    err_quit("client request for bytes", ntowrite);

16   Writen(sockfd, result, ntowrite);

17  }

18 }

Установив соединение с сервером, клиент записывает одну строку, задающую количество байтов, которое сервер должен вернуть. Это отчасти похоже на HTTP: клиент отправляет небольшой запрос, а сервер в ответ отправляет требуемую информацию (часто это файл HTML или изображение GIF). В случае HTTP сервер обычно закрывает соединение после отправки клиенту затребованных данных, хотя более новые версии используют постоянные соединения( persistent connection), оставляя соединения TCP открытыми для дополнительных клиентских запросов. В нашей функции web_childсервер допускает дополнительные запросы от клиента, но, как мы видели в листинге 24.1, клиент посылает серверу только по одному запросу на каждое соединение, а по получении ответа от сервера это соединение закрывается.

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

Перейти на страницу:

Похожие книги

1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера. Приведен необходимый минимум технических сведений, позволяющий принять осознанное решение.Компакт-диск прилагается только к печатному изданию книги.

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT
Access 2002: Самоучитель
Access 2002: Самоучитель

В книге рассматривается широкий круг вопросов, связанных с использованием программной среды Access 2002, которая является составной частью пакета Office 2002 и предназначена для создания банка данных в самых различных предметных областях.Подробно описывается методика проектирования объектов базы данных (таблицы, формы, отчеты, страницы доступа к данным, запросы, модули).Детально обсуждаются вопросы создания интегрированной базы данных в единой среде Access 2002: формирование БД с нуля, конвертирование в программную среду баз данных, созданных в ином программном окружении – Clarion, FoxPro.Особое внимание уделяется формированию разнообразных запросов к интегрированной базе данных Access 2002 с использованием языков программирования SQL, VBA и макросов.Приводятся общие сведения о возможностях языка обмена данными между различными компьютерами и приложениями (XML). Описываются возможности использования гиперссылок, связывающих базу данных с другими программными продуктами. Объясняется, как можно работать с базой данных Access 2002 без установки ее на компьютер, используя технологию ODBC (Open Data Base Connectivity). В приложениях приводятся количественные параметры Access 2002 и связанная с этой СУБД терминология.Предлагаемая книга будет полезна специалистам, занимающимся практической разработкой банков данных и приложений на их основе, а также студентам вузов, изучающим информатику.

Павел Юрьевич Дубнов

Программирование, программы, базы данных / ОС и Сети / Книги по IT