ΠpoΠ³ΡaΠΌΠΌa ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ Π΄Π»Ρ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Posix ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ Π.15.
ΠΠΈΡΡΠΈΠ½Π³ Π. 15. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ Π΄Π»Ρ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Posix//bench/lat_pxmsg.Ρ
1 #include "unpipc.h"
2 #define NAME1 "lat_pxmsg1"
3 #define NAME2 "lat_pxmsg2"
4 #define MAXMSG 4 /* ΠΌΠ΅ΡΡΠΎ Π΄Π»Ρ 4096 Π±Π°ΠΉΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ */
5 #define MSGSIZE 1024
6 void
7 doit(mqd_t mqsend, mqd_t mqrecv)
8 {
9 char buff[MSGSIZE];
10 Mq_send(mqsend, buff, 1.0);
11 if (Mq_receive(mqrecv, buff, MSGSIZE, NULL) != 1)
12 err_quit("mq_receive error");
13 }
14 int
15 main(int argc, char **argv)
16 {
17 int i, nloop;
18 mqd_t mq1, mq2;
19 char buff[MSGSIZE];
20 pid_t childpid;
21 struct mq_attr attr;
22 if (argc != 2)
23 err_quit("usage: lat_pxmsg <#loops>");
24 nloop = atoi(argv[1]);
25 attr.mq_maxmsg = MAXMSG;
26 attr.mq_msgsize = MSGSIZE;
27 mq1 = Mq_open(Px_ipc_name(NAME1), O_RDWR | O_CREAT, FILE_MODE, &attr);
28 mq2 = Mq_open(Px_ipc_name(NAME2), O_RDWR | O_CREAT, FILE_MODE, &attr);
29 if ((childpid = Fork()) == 0) {
30 for(;;) { /* Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ */
31 if (Mq_receive(mq1, buff, MSGSIZE, NULL) != 1)
32 err_quit("mq_receive error");
33 Mq_send(mq2, buff, 1.0);
34 }
35 exit(0);
36 }
37 /* ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ */
38 doit(mq1, mq2);
39 Start_time();
40 for (i = 0; i < nloop; i++)
41 doit(mq1, mq2);
42 printf("latency: %.3f usec\n", Stop_time() / nloop);
43 Kill(childpid, SIGTERM);
44 Mq_close(mq1);
45 Mq_close(mq2);
46 Mq_unlink(Px_ipc_name(NAMED);
47 Mq_unlink(Px_ipc_name (NAME2));
48 exit(0);
49 }
25-28 Π‘ΠΎΠ·Π΄Π°ΡΡΡΡ Π΄Π²Π΅ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, ΠΊΠ°ΠΆΠ΄Π°Ρ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π΄Π°Π½Π½ΡΡ Π² ΠΎΠ΄Π½Ρ ΡΡΠΎΡΠΎΠ½Ρ. Π₯ΠΎΡΡ Π΄Π»Ρ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ Posix ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, ΡΡΠ½ΠΊΡΠΈΡ mq_receive Π²ΡΠ΅Π³Π΄Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Ρ Π½Π°ΠΈΠ²ΡΡΡΠΈΠΌ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠΌ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΠΈΡΡ ΠΎΠ΄Π½Ρ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ System V
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ Π.16 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ Π΄Π»Ρ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ System V.
ΠΠΈΡΡΠΈΠ½Π³ Π.16. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ Π΄Π»Ρ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ System V//bench/lat_svmsg.c
1 #include "unpipc.h"
2 struct msgbuf p2child = { 1, { 0 } }; /* type = 1 */
3 struct msgbuf child2p = { 2, { 0 } }; /* type = 2 */
4 struct msgbuf inbuf;
5 void
6 doit(int msgid)
7 {
8 Msgsnd(msgid, &p2child, 0, 0);
9 if (Msgrcv(msgid, &inbuf, sizeof(inbuf.mtext), 2, 0) != 0)
10 err_quit("msgrcv error");
11 }
12 int
13 main(int argc, char **argv)
14 {
15 int i, nloop, msgid;
16 pid_t childpid;
17 if (argc != 2)
18 err_quit("usage: lat_svmsg <#loops>");
19 nloop = atoi(argv[1]);
20 msgid = Msgget(IPC_PRIVATE, IPC_CREAT | SVMSG_MODE);
21 if ((childpid = Fork()) == 0) {
22 for(;;) { /* Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ */
23 if (Msgrcv(msgid, &inbuf, sizeof(inbuf.mtext), 1, 0) != 0)
24 err_quit("msgrcv error");
25 Msgsnd(msgid, &child2p, 0, 0);
26 }
27 exit(0);
28 }
29 /* ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ */
30 doit(msgid);
31 Start_time();
32 for (i = 0; i < nloop; i++)
33 doit(msgid);
34 printf("latency: %.3f usec\n", Stop_time() / nloop);
35 Kill(childpid, SIGTERM);
36 Msgctl(msgid, IPC_RMID, NULL);
37 exit(0);
38 }
ΠΡ ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠ΄Π½Ρ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ Π² ΠΎΠ±ΠΎΠΈΡ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡΡ . Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Ρ ΡΠΈΠΏΠΎΠΌ 1 ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΎΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π΄ΠΎΡΠ΅ΡΠ½Π΅ΠΌΡ, Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Ρ ΡΠΈΠΏΠΎΠΌ 2 β Π² ΠΎΠ±ΡΠ°ΡΠ½ΡΡ ΡΡΠΎΡΠΎΠ½Ρ. Π§Π΅ΡΠ²Π΅ΡΡΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ msgrcv Π² ΡΡΠ½ΠΊΡΠΈΠΈ doit ΠΈΠΌΠ΅Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 2, ΡΡΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°. ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ Π² Π΄ΠΎΡΠ΅ΡΠ½Π΅ΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΠ΅ΡΠ²Π΅ΡΡΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ msgrcv ΠΈΠΌΠ΅Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 1.
ΠΠ ΠΠΠΠ§ΠΠΠΠ
Π ΡΠ°Π·Π΄Π΅Π»Π°Ρ 9.3 ΠΈ 11.3 ΠΌΡ ΠΎΡΠΌΠ΅ΡΠ°Π»ΠΈ, ΡΡΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΡΡΡΡΠΊΡΡΡΡ, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ Π² ΡΠ΄ΡΠ΅, Π½Π΅Π»ΡΠ·Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠ°Π½Π΄Π°ΡΡΡ Posix.1 ΠΈ Unix 98 Π³Π°ΡΠ°Π½ΡΠΈΡΡΡΡ Π»ΠΈΡΡ Π½Π°Π»ΠΈΡΠΈΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ ΠΏΠΎΠ»Π΅ΠΉ Π² ΡΡΠΈΡ ΡΡΡΡΠΊΡΡΡΠ°Ρ , Π½ΠΎ Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ Π½ΠΈ ΠΈΡ ΠΏΠΎΡΡΠ΄ΠΎΠΊ, Π½ΠΈ Π½Π°Π»ΠΈΡΠΈΠ΅ Π΄ΡΡΠ³ΠΈΡ ΠΏΠΎΠ»Π΅ΠΉ. Π ΡΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΌΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΡΡΡΡΠΊΡΡΡΡ msgbuf ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ System V Π³Π°ΡΠ°Π½ΡΠΈΡΡΡΡ, ΡΡΠΎ ΡΡΠ° ΡΡΡΡΠΊΡΡΡΠ° ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΏΠΎΠ»Π΅ ΡΠΈΠΏΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ long, Π·Π° ΠΊΠΎΡΠΎΡΡΠΌ ΡΠ»Π΅Π΄ΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΠ΅ Π΄Π°Π½Π½ΡΠ΅.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π΄Π²Π΅ΡΠ΅ΠΉ
ΠpoΠ³ΡaΠΌΠΌa ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ Π΄Π»Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π΄Π²Π΅ΡΠ΅ΠΉ Π΄Π°Π½Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ Π.17. ΠΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠΎΠ·Π΄Π°Π΅Ρ Π΄Π²Π΅ΡΡ ΠΈ ΡΠ²ΡΠ·ΡΠ²Π°Π΅Ρ Ρ Π½Π΅ΠΉ ΡΡΠ½ΠΊΡΠΈΡ server. Π ΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ Π΄Π²Π΅ΡΡ ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅Ρ door_call Π² ΡΠΈΠΊΠ»Π΅. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ 1 Π±Π°ΠΉΡ Π΄Π°Π½Π½ΡΡ , ΠΈ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ.
ΠΠΈΡΡΠΈΠ½Π³ Π.17. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π΄Π²Π΅ΡΠ΅ΠΉ//bench/lat_door.c
1 #include "unpipc.h"
2 void
3 server(void *cookie, char *argp, size_t arg_size,
4 door_desc_t *dp, size_t n_descriptors)
5 {
6 char c;
7 Door_return(&c, sizeof(char), NULL, 0);
8 }
9 int
10 main(int argc, char **argv)
11 {
12 int i, nloop, doorfd, contpipe[2];
13 char c;
14 pid_t childpid;
15 door_arg_t arg;
16 if (argc != 3)
17 err_quit("usage: lat_door <pathname> <#loops>");
18 nloop = atoi(argv[2]);
19 unlink(argv[1]);
20 Close(Open(argv[1], O_CREAT | O_EXCL | O_RDWR, FILE_MODE));
21 Pipe(contpipe);
22 if ((childpid = Fork()) == 0) {
23 doorfd = Door_create(server, NULL, 0);
24 Fattach(doorfd, argv[1]);
25 Write(contpipe[1], &c, 1);
26 for(;;) /* Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ = ΡΠ΅ΡΠ²Π΅Ρ */
27 pause();
28 exit(0);
29 }
30 arg.data_ptr = &c; /* ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ = ΠΊΠ»ΠΈΠ΅Π½Ρ */
31 arg.data_size = sizeof(char);
32 arg.desc_ptr = NULL;
33 arg.desc_num = 0;
34 arg.rbuf = &c;
35 arg.rsize = sizeof(char);
36 if (Read(contpipe[0], &c, 1) != 1) /* ΠΆΠ΄Π΅ΠΌ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ */
37 err_quit("pipe read error");
38 doorfd = Open(argv[1], O_RDWR);
39 Door_call(doorfd, &arg); /* Π·Π°ΠΏΡΡΠΊ */
40 Start_time();
41 for (i = 0; i < nloop; i++)
42 Door_call(doorfd, &arg);
43 printf("latency: %.3f usec\n", Stop_time() / nloop);
44 Kill(childpid, SIGTERM);
45 unlink(argv[1]);
46 exit(0);
47 }
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ Sun RPC
ΠΠ»Ρ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ Sun RPC ΠΌΡ Π½Π°ΠΏΠΈΡΠ΅ΠΌ Π΄Π²Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ: ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΈ ΡΠ΅ΡΠ²Π΅Ρ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ»ΠΎΡΡ ΠΏΡΠΎΠΏΡΡΠΊΠ°Π½ΠΈΡ. ΠΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΡΠ°ΡΡΠΉ ΡΠ°ΠΉΠ» ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ RPC, Π½ΠΎ Π½Π° ΡΡΠΎΡ ΡΠ°Π· ΠΊΠ»ΠΈΠ΅Π½Ρ Π²ΡΠ·ΡΠ²Π°Π΅Ρ Π½ΡΠ»Π΅Π²ΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ°. ΠΡΠΏΠΎΠΌΠ½ΠΈΡΠ΅ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.11: ΡΡΠ° ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° Π½Π΅ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΈΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΈ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ. ΠΡΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠΎ, ΡΡΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ, ΡΡΠΎΠ±Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π·Π°Π΄Π΅ΡΠΆΠΊΡ. Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ Π.18 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΠ°ΠΊ ΠΈ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΡ 16.11, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ clnt_call Π΄Π»Ρ Π²ΡΠ·ΠΎΠ²Π° Π½ΡΠ»Π΅Π²ΠΎΠΉ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ; Π² Π·Π°Π³Π»ΡΡΠΊΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ°Ρ Π·Π°Π³Π»ΡΡΠΊΠ° Π΄Π»Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ.
ΠΠΈΡΡΠΈΠ½Π³ Π.18. ΠΠ»ΠΈΠ΅Π½Ρ Sun RPC Π΄Π»Ρ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ//bench/lat_sunrpc_client.Ρ
1 #include "unpipc.h"
2 #include "lat_sunrpc.h"
3 int
4 main(int argc, char **argv)
5 {
6 int i, nloop;
7 CLIENT *cl;
8 struct timeval tv;
9 if (argc != 4)
10 err_quit("usage: lat_sunrpc_client <hostname> <#loops> <protocol>");
11 nloop = atoi(argv[2]);
12 cl = Clnt_create(argv[1], BW_SUNRPC_PROG, BW_SUNRPC_VERS, argv[3]);
13 tv.tv_sec = 10;
14 tv.tv_usec = 0;
15 Start_time();
16 for (i = 0; i < nloop; i++) {
17 if (clnt_call(cl, NULLPROC, xdr_void, NULL,
18 xdr_void, NULL, tv) != RPC_SUCCESS)
19 err_quit("%s", clnt_sperror(cl, argv[1]));
20 }
21 printf("latency: %.3f usec\n", Stop_time() / nloop);
22 exit(0);
23 }
ΠΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΠΌ ΡΠ΅ΡΠ²Π΅Ρ Ρ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ Π.13, Π½ΠΎ ΠΎΠ½Π° Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ Π½Π΅ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ rpcgen Π΄Π»Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ°, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Ρ ΠΎΡΡ Π±Ρ ΠΎΠ΄Π½Ρ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ°, Π½ΠΎ ΠΌΡ Π½Π΅ ΠΎΠ±ΡΠ·Π°Π½Ρ Π΅Π΅ Π²ΡΠ·ΡΠ²Π°ΡΡ. ΠΡΠΈΡΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ rpcgen, Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΎΠ½Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ main ΡΠ΅ΡΠ²Π΅ΡΠ° Ρ Π½ΡΠ»Π΅Π²ΠΎΠΉ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠΎΠΉ, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π°ΠΌ Π½ΡΠΆΠ½Π°.
Π.5. Π‘ΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ²: ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ
ΠΠ»Ρ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΡΡ ΠΎΠ΄ΡΡΠ΅Π³ΠΎ Π½Π° ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΡΠ΅Π΄ΡΡΠ², ΠΌΡ ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ² (ΠΎΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π΄ΠΎ ΠΏΡΡΠΈ, ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ ΡΠ°Π±Π». Π.4 ΠΈ Π.5), ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅Ρ ΡΡΠ΅ΡΡΠΈΠΊ Π² ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ°Π·, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠΎΡΠΌΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΡΠ΅ΡΡΠΈΠΊΡ.
ΠΠ·Π°ΠΈΠΌΠ½ΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Posix