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/sec\n",
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/sec\n",
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]);