- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания UNIX: взаимодействие процессов - Уильям Стивенс
Шрифт:
Интервал:
Закладка:
solaris % bw_pipe 5 10 65536
bandwidth: 13.722 MB/sec
solaris % bw_pipe 5 10 65536
bandwidth: 13.781 MB/sec
solaris % bw_pipe 5 10 65536
bandwidth: 13.685 MB/sec
solaris % bw_pipe 5 10 65536
bandwidth: 13.665 MB/sec
solaris % bw_pipe 5 10 65536
bandwidth: 13.584 MB/sec
Каждый раз мы задаем пять циклов, 10 Мбайт за цикл и 65536 байт за один вызов write или read. Среднее от этих пяти результатов даст величину 13,7 Мбайт в секунду, приведенную в табл. А.2.
Измерение полосы пропускания очереди сообщений Posix
В листинге А.5 приведена функция main программы, измеряющей полосу пропускания очереди сообщений Posix. Листинг А.6 содержит функции reader и writer. Эта программа устроена аналогично предыдущей, измерявшей полосу пропускания канала.
ПРИМЕЧАНИЕ
Обратите внимание, что в программе приходится указывать максимальное количество сообщений в очереди при ее создании. Мы указываем значение 4. Размер канала IPC может влиять на производительность, потому что записывающий процесс может отправить это количество сообщений, прежде чем будет заблокирован в вызове mq_send, что приведет к переключению контекста на считывающий процесс. Следовательно, производительность программы зависит от этого магического числа. Изменение его с 4 на 8 в Solaris 2.6 никак не влияет на величины, приведенные в табл. А.2, но в Digital Unix 4.0B производительность уменьшается на 12%. Мы могли ожидать, что производительность возрастет с увеличением количества сообщений в очереди, поскольку требуется в два раза меньше переключений контекста. Однако если используется отображение файла в память, это увеличивает размер отображаемого файла в два раза, как и требуемое количество памяти.
Листинг А.5. Функция main для измерения полосы пропускания очереди сообщений Posix//bench/bw_pxmsg.c
1 #include "unpipc.h"
2 #define NAME "bw_pxmsg"
3 void reader(int, mqd_t, int);
4 void writer(int, mqd_t);
5 void *buf;
6 int totalnbytes, xfersize;
7 int
8 main(int argc, char **argv)
9 {
10 int i, nloop, contpipe[2];
11 mqd_t mq;
12 pid_t childpid;
13 struct mq_attr attr;
14 if (argc != 4)
15 err_quit("usage: bw_pxmsg <#loops> <#mbytes> <#bytes/write>");
16 nloop = atoi(argv[1]);
17 totalnbytes = atoi(argv[2]) * 1024 * 1024;
18 xfersize = atoi(argv[3]);
19 buf = Valloc(xfersize);
20 Touch(buf, xfersize);
21 Pipe(contpipe);
22 mq_unlink(Px_ipc_name(NAME)); /* error OK */
23 attr.mq_maxmsg = 4;
24 attr.mq_msgsize = xfersize;
25 mq = Mq_open(Px_ipc_name(NAME), O_RDWR | O_CREAT, FILE_MODE, &attr);
26 if ((childpid = Fork()) == 0) {
27 writer(contpipe[0], mq); /* child */
28 exit(0);
29 }
30 /* 4parent */
31 Start_time();
32 for (i = 0; i < nloop; i++)
33 reader(contpipe[1], mq, totalnbytes);
34 printf("bandwidth: %.3f MB/secn",
35 totalnbytes / Stop_time() * nloop);
36 kill(childpid, SIGTERM);
37 Mq_close(mq);
38 Mq_unlink(Px_ipc_name(NAME));
39 exit(0);
40 }
Листинг А.6. Функции reader и writer//bench/bw_pxmsg.c
41 void
42 writer(int contfd, mqd_t mqsend)
43 {
44 int ntowrite;
45 for(;;) {
46 Read(contfd, &ntowrite, sizeof(ntowrite));
47 while (ntowrite > 0) {
48 Mq_send(mqsend, buf, xfersize, 0);
49 ntowrite –= xfersize;
50 }
51 }
52 }
53 void
54 reader(int contfd, mqd_t mqrecv, int nbytes)
55 {
56 ssize_t n;
57 Write(contfd, &nbytes, sizeof(nbytes));
58 while ((nbytes > 0) &&
59 ((n = Mq_receive(mqrecv, buf, xfersize, NULL)) > 0)) {
60 nbytes –= n;
61 }
62 }
Программа измерения полосы пропускания очереди System V
В листинге А.7 приведен текст функции main, измеряющей полосу пропускания очередей сообщений System V, а в листинге А.8 —текст функций reader и writer.
Листинг А.7. Функция main для измерения полосы пропускания очереди сообщений System V//bench/bw_svmsg.c
1 #include "unpipc.h"
2 void reader(int, int, int);
3 void writer(int, int);
4 struct msgbuf *buf;
5 int totalnbytes, xfersize;
6 int
7 main(int argc, char **argv)
8 {
9 int i, nloop, contpipe[2], msqid;
10 pid_t childpid;
11 if (argc != 4)
12 err_quit("usage: bw_svmsg <#loops> <#mbytes> <#bytes/write>");
13 nloop = atoi(argv[1]);
14 totalnbytes = atoi(argv[2]) * 1024 * 1024;
15 xfersize = atoi(argv[3]);
16 buf = Valloc(xfersize);
17 Touch(buf, xfersize);
18 buf->mtype = 1;
19 Pipe(contpipe);
20 msqid = Msgget(IPC_PRIVATE, IPC_CREAT | SVMSG_MODE);
21 if ((childpid = Fork()) == 0) {
22 writer(contpipe[0], msqid); /* дочерний процесс */
23 exit(0);
24 }
25 Start_time();
26 for (i = 0; i < nloop; i++)
27 reader(contpipe[1], msqid, totalnbytes);
28 printf("bandwidth: %.3f MB/secn",
29 totalnbytes / Stop_time() * nloop);
30 kill(childpid, SIGTERM);
31 Msgctl(msqid, IPC_RMID, NULL);
32 exit(0);
33 }
Листинг А.8. Функции reader и writer//bench/bw_svmsg.c
34 void
35 writer(int contfd, int msqid)
36 {
37 int ntowrite;
38 for (;;) {
39 Read(contfd, &ntowrite, sizeof(ntowrite));
40 while (ntowrite > 0) {
41 Msgsnd(msqid, buf, xfersize – sizeof(long), 0);
42 ntowrite –= xfersize;
43 }
44 }
45 }
46 void
47 reader(int contfd, int msqid, int nbytes)
48 {
49 ssize_t n;
50 Write(contfd, &nbytes, sizeof(nbytes));
51 while ((nbytes > 0) &&
52 ((n = Msgrcv(msqid, buf, xfersize – sizeof(long), 0, 0)) > 0)) {
53 nbytes –= n + sizeof(long);
54 }
55 }
Программа измерения полосы пропускания дверей
Программа измерения полосы пропускания интерфейса дверей сложнее, чем предыдущие, поскольку нам нужно вызвать fork перед созданием двери. Родительский процесс создает дверь и с помощью канала оповещает дочерний процесс о том, что ее можно открывать.
Другое изменение заключается в том, что в отличие от рис. А.7 функция reader не принимает данные. Данные принимаются функцией server, которая является процедурой сервера для данной двери. На рис. А.8 изображена схема программы.
Рис. А.8. Схема программы измерения полосы пропускания дверей
Поскольку двери поддерживаются только в Solaris, мы упростим программу, предполагая наличие двустороннего канала (раздел 4.4).
Еще одно изменение вызвано фундаментальным различием между передачей сообщений и вызовом процедуры. В программе, работавшей с очередью сообщений Posix, например, записывающий процесс просто помещал сообщения в очередь в цикле, что осуществляется асинхронно. В какой-то момент очередь будет заполнена или записывающий процесс будет просто приостановлен, и тогда считывающий процесс получит сообщения. Если, например, в очередь помещается 8 сообщений и записывающий процесс помещал в нее 8 сообщений каждый раз, когда получал управление, а считывающий процесс считывал 8 сообщений, отправка N сообщений требовала N/4 переключения контекста. Интерфейс дверей является синхронным: вызывающий процесс блокируется каждый раз при вызове door_call и не может возобновиться до тех пор, пока сервер не завершит работу. Передача N сообщений в этом случае требует N/2 переключений контекста. С той же проблемой мы столкнемся при измерении полосы пропускания вызовов RPC. Несмотря на увеличившееся количество переключений контекста, из рис. А.1 следует, что двери обладают наибольшей полосой пропускания при размере сообщений не более 25 Кбайт.
В листинге А.9 приведен текст функции main нашей программы. Функции writer, server и reader приведены в листинге А.10.
Листинг А.9. Функция main измерения полосы пропускания интерфейса дверей//bench/bw_door.c
1 #include "unpipc.h"
2 void reader(int, int);
3 void writer(int);
4 void server(void *, char *, size_t, door_desc_t *, size_t);
5 void *buf;
6 int totalnbytes, xfersize, contpipe[2];
7 int
8 main(int argc, char **argv)
9 {
10 int i, nloop, doorfd;
11 char c;
12 pid_t childpid;
13 ssize_t n;
14 if (argc != 5)
15 err_quit("usage: bw_door <pathname> <#loops> <#mbytes> <#bytes/write>");
16 nloop = atoi(argv[2]);
17 totalnbytes = atoi(argv[3]) * 1024 * 1024;
18 xfersize = atoi(argv[4]);
19 buf = Valloc(xfersize);
20 Touch(buf, xfersize);
21 unlink(argv[1]);