Главная страница  Взаимодействие нетривиальных процессов 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 [ 157 ] 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

с 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) &&



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 [ 157 ] 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования.