Главная страница Взаимодействие нетривиальных процессов с 4 на 8 в Solaris 2,6 никак не влияет на величины, приведенные в табл, А.2, но в Digital Unix 4,0В производительность уменьшается на 12%, Мы могли ожидать, что производительность возрастет с увеличением количества сообщений в очереди, поскольку требуется в два раза меньше переключений контекста. Однако если используется отображение файла в память, это увеличивает размер отображаемого файла в два раза, как и требуемое количество памяти. Листинг А.5. Функция main для измерения полосы пропускания очереди сообщений Posix bench/bwjDxmsg.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 maindnt argc. char **argv) 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: bwjDxmsg <#loops> <#mbytes> <#bytes/write> ): 16 nloop = atoi(argv[l]): 17 totalnbytes = atoi(argv[2]) * 1024 * 1024: 18 xfersize = atoi(argv[3]): 19 buf = Vanoc(xfersize): 20 Touch(buf. xfersize); 21 Pipe(contpipe): 22 mq unlink(PxJpc name(NAME)): /* error OK */ 23 attr.mq maxmsg = 4: 24 attr.mq msgsize - xfersize: 25 mq = Mq open(PxJpc name(NAME), 0 RDWR 0 CREAT. FILE MODE, Sattr): 26 if ( (childpid = ForkO) == 0) { 27 writer(contpipe[0]. mq); /* child */ 28 exit(O): 29 } 30 /* 4parent */ 31 Start time(): 32 for (i = 0: i < nloop: i++) 33 reader(contpipe[l], mq. totalnbytes); 34 printfCbandwidth: .3f MB/sec\n , 35 totalnbytes / Stop time() * nloop): 36 kill(childpid, SIGTERM): 37 Mq close(mq): 38 Mq unli nk(Px i pc name(NAME)): 39 exitCO): 40 } Листинг A.6. Функции reader и writer bench/bw pxmsg.c 41 void 42 writerCint contfd. mqd t mqsend) 43 { 44 int ntowrite: 45 for ( : : ) { 46 ReadCcontfd, Sntowrite. 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. Snbytes. 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 writerdnt, int); 4 struct msgbuf *buf: 5 int totalnbytes, xfersize: \ 6 int 7 maindnt argc. char **argv) Листинг А.7 (продолжение) 9 int 1. 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[l]); 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 = ForkO) == 0) { 22 writer(contpipe[0]. msqid): /* дочерний процесс */ 23 exit(O); 24 } 25 Start time(); 26 for (i = 0; i < nloop; i++) 27 reader(contpipe[l]. msqid. totalnbytes): 28 printf( bandwidth: .3f MB/sec\n . 29 totalnbytes / Stop time() * nloop): 30 kilKchildpid, SIGTERM): 31 Msgcti(msqid, IPC RMID, NULL): 32 exit(O); 33 } Листинг A.8. Функции reader и writer bench/bw svmsg.c 34 void 35 writer(int contfd, int msqid) 36 { 37 int ntowrite; 38 for ( : : ) { 39 Read(contfd, Sntowrite, sizeof(ntowrite)); 40 while (ntowrite > 0) { 41 Msgsnd(msqid, buf. xfersize - sizeof(long), 0): 42 ntowrite -= xfersize: 43 } 44 } 45 } 46 void 47 readerOnt contfd, int msqid. int nbytes) 48 { 49 ssize t П: 50 Write(contfd. Snbytes. sizeof(nbytes)): 51 while ((nbytes > 0) &&
|
© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования. |