Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² QNX/Neutrino 2. Руководство ΠΏΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² QNX Realtime PlatformΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 32

Автор Π ΠΎΠ± ΠšΡ‘Ρ€Ρ‚Π΅Π½

Как ядро Π²ΠΈΠ΄ΠΈΡ‚ составноС сообщСниС.

Π―Π΄Ρ€ΠΎ просто ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· ΠΊΠ°ΠΆΠ΄ΠΎΠΉ части Π²Π΅ΠΊΡ‚ΠΎΡ€Π° IOV ΠΈΠ· адрСсного пространства ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π² адрСсноС пространство сСрвСра (ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ, ΠΏΡ€ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Π΅ Π½Π° сообщСниС). ЀактичСски, ΠΏΡ€ΠΈ этом ядро выполняСт ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ/Π΄Π΅Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ сообщСния (scatter/gather).

НСсколько ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ:

β€’ Π§ΠΈΡΠ»ΠΎ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 231 (большС, Ρ‡Π΅ΠΌ Π²Π°ΠΌ придСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ!); число 2 Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ β€” Ρ‚ΠΈΠΏΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

β€’ Π―Π΄Ρ€ΠΎ просто ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ IOV, ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ адрСсного пространства Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅.

β€’ Π’Π΅ΠΊΡ‚ΠΎΡ€-источник ΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€-ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ послСдний ΠΏΡƒΠ½ΠΊΡ‚ Ρ‚Π°ΠΊ Π²Π°ΠΆΠ΅Π½? Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ, рассмотрим всС ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅. Π‘ΠΎ стороны ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, скаТСм, ΠΌΡ‹ Π²Ρ‹Π΄Π°Π»ΠΈ:

write(fd, buf, 12000);

Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ Π±Ρ‹Π» создан Π²Π΅ΠΊΡ‚ΠΎΡ€ IOV ΠΈΠ· Π΄Π²ΡƒΡ… частСй:

β€’ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ (12 Π±Π°ΠΉΡ‚);

β€’ Π΄Π°Π½Π½Ρ‹Π΅ (12000 Π±Π°ΠΉΡ‚);

На сторонС сСрвСра (скаТСм, сСрвСра Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы fs-qnx4) ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ Π±Π»ΠΎΠΊΠΈ памяти кэша Π΄ΠΎ 4Кб ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ, ΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ эффСктивно ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ сообщСниС нСпосрСдствСнно Π² эти Π±Π»ΠΎΠΊΠΈ. Π’ ΠΈΠ΄Π΅Π°Π»Π΅ ΠΌΡ‹ Π±Ρ‹ написали Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Ρ‚ΠΈΠΏΠ°:

// ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ структуру IOV для ΠΏΡ€ΠΈΠ΅ΠΌΠ°:

SETIOV(iov + 0, &header, sizeof(header.io_write));

SETIOV(iov + 1, &cache_buffer[37], 4096);

SETIOV(iov + 2, &cache_buffer[16], 4096);

SETIOV(iov + 3, &cache_buffer[22], 4096);

rcvid = MsgReceivev(chid, iov, 4, NULL);

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄Π΅Π»Π°Π΅Ρ‚ Π² Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ стСпСни Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΈ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚Π΅: ΠΎΠ½Π° Π·Π°Π΄Π°Π΅Ρ‚ Π²Π΅ΠΊΡ‚ΠΎΡ€ IOV ΠΈΠ· 4 частСй, пСрвая ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ, Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Ρ€ΠΈ части β€” Π½Π° Π±Π»ΠΎΠΊΠΈ кэш-памяти с Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌΠΈ 37, 16 ΠΈ 22. (ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ эти Π±Π»ΠΎΠΊΠΈ случайно оказались доступными Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚.) НиТС это ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ графичСски.

РаспрСдСлСниС Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π±ΡƒΡ„Π΅Ρ€Π°ΠΌ.

Π—Π°Ρ‚Π΅ΠΌ осущСствляСтся Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ MsgReceivev(), ΠΈ Π΅ΠΉ указываСтся, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Ρ‹ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ сообщСниС ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ ΠΊΠ°Π½Π°Π»Ρƒ (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ chid), ΠΈ Ρ‡Ρ‚ΠΎ Π²Π΅ΠΊΡ‚ΠΎΡ€ IOV для этой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ состоит ΠΈΠ· 4 частСй.

(ΠšΡ€ΠΎΠΌΠ΅ возмоТности Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ IOV, функция MsgReceivev() дСйствуСт Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ MsgReceive().)

Опа! ΠœΡ‹ сдСлали Ρ‚Ρƒ ΠΆΠ΅ ΡΠ°ΠΌΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΆΠ΅ Π΄Π΅Π»Π°Π»ΠΈ ΠΊ Ρ€Π°Π½ΡŒΡˆΠ΅, ΠΊΠΎΠ³Π΄Π° знакомились с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ MsgReceive(). Как ΠΌΡ‹ ΡƒΠ·Π½Π°Π΅ΠΌ, сообщСниС ΠΊΠ°ΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΌΡ‹ собираСмся ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ ΠΈ сколько Π² Π½Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΡ€ΠΈΠΌΠ΅ΠΌ всС сообщСниС Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ?

ΠœΡ‹ смоТСм Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Ρ‚Π΅ΠΌ ΠΆΠ΅ способом, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΡ€Π΅ΠΆΠ΄Π΅:

rcvid = MsgReceive(chid, &header, sizeof(header), NULL);

switch (header.message_type) {

 ...

case _IO_WRITE:

 number_of_bytes = header.io_write.nbytes;

 // Π’Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ / Π½Π°ΠΉΡ‚ΠΈ элСмСнт кэша

 // Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ элСмСнтами кэша 3-элСмСнтный IOV

 MsgReadv(rcvid, iov, 3, sizeof(header.io_write));

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Β«ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽΒ» MsgReceive() (ΠΎΡ‚ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρ‚ΡƒΡ‚ ΠΌΡ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΅Π΅ Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ для сообщСния, состоящСго ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ части, Π² Π½Π΅ΠΉ просто Π½Π΅Ρ‚ нСобходимости), опрСдСляСм Ρ‚ΠΈΠΏ сообщСния ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· адрСсного пространства ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° (начиная со смСщСния sizeof(header.io_write)) Π² кэш-Π±ΡƒΡ„Π΅Ρ€Ρ‹, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ трСхэлСмСнтным Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ IOV.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΡˆΠ»ΠΈ ΠΎΡ‚ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° IOV, состоящСго ΠΈΠ· 4 частСй (ΠΊΠ°ΠΊ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅), ΠΊ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρƒ IOV ΠΈΠ· 3 частСй. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… элСмСнтов Π²Π΅ΠΊΡ‚ΠΎΡ€Π° IOV отводился ΠΏΠΎΠ΄ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π° этот Ρ€Π°Π· ΠΌΡ‹ считали нСпосрСдствСнно ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ MsgReceive(), Π° послСдниС Ρ‚Ρ€ΠΈ элСмСнта Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ трСхэлСмСнтному Π²Π΅ΠΊΡ‚ΠΎΡ€Ρƒ ΠΈΠ· Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° β€” ΠΎΠ½ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ мСсто, ΠΊΡƒΠ΄Π° ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅.

МоТно ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΠ»ΠΈ Π±Ρ‹ Π½Π° запрос чтСния:

1. ΠΠ°ΠΉΡ‚ΠΈ элСмСнты кэша, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ.

2. Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° IOV ссылками Π½Π° Π½ΠΈΡ….

3. ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ MsgWritev() (ΠΈΠ»ΠΈ MsgReplyv()) для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ.

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ссли Π΄Π°Π½Π½Ρ‹Π΅ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ Π½Π΅ нСпосрСдствСнно с Π½Π°Ρ‡Π°Π»Π° Π±Π»ΠΎΠΊΠ° кэша (ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ структуры Π΄Π°Π½Π½Ρ‹Ρ…), Ρ‚ΠΎ Π² этом Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. ΠŸΡ€ΠΎΡΡ‚ΠΎ смСститС ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π΅ΠΊΡ‚ΠΎΡ€ IOV Π½Π° Ρ‚ΠΎΡ‡ΠΊΡƒ Π½Π°Ρ‡Π°Π»Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ соотвСтствСнно ΠΎΡ‚ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠΎΠ»Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°.

Как насчСт Π΄Ρ€ΡƒΠ³ΠΈΡ… вСрсий?

ВсС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±ΠΌΠ΅Π½Π° сообщСниями, ΠΊΡ€ΠΎΠΌΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ сСмСйства MsgSend*(), ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡƒΡŽ ΠΎΠ±Ρ‰ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ: Ссли имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ суффикс Β«vΒ», Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΎΠ½Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π²Π΅ΠΊΡ‚ΠΎΡ€ IOV ΠΈ число Π΅Π³ΠΎ частСй; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС, ΠΎΠ½Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΈ Π΄Π»ΠΈΠ½Ρƒ.

БСмСйство MsgSend*() содСрТит Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ основных Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Π±ΡƒΡ„Π΅Ρ€ΠΎΠ² источника ΠΈ адрСсата, плюс Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° собствСнно систСмного Π²Ρ‹Π·ΠΎΠ²Π° β€” ΠΈΡ‚ΠΎΠ³ΠΎ восСмь.

Π’ Π½ΠΈΠΆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ свСдСны Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ сСмСйства MsgSend*().

Ѐункция Π‘ΡƒΡ„Π΅Ρ€ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π‘ΡƒΡ„Π΅Ρ€ ΠΏΡ€ΠΈΠ΅ΠΌΠ° MsgSend() Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ MsgSendnc() Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ MsgSendsv() Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ IOV MsgSendsvnc() Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ IOV MsgSendvs() IOV Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ MsgSendvsnc() IOV Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ MsgSendv() IOV IOV MsgSendvnc() IOV IOV

Под Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΌ Π±ΡƒΡ„Π΅Ρ€ΠΎΠΌ я ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°ΡŽ, Ρ‡Ρ‚ΠΎ пСрСдаСтся Π΅Π΄ΠΈΠ½Ρ‹ΠΉ Π±ΡƒΡ„Π΅Ρ€ Ρ‚ΠΈΠΏΠ° void* вмСстС с Π΅Π³ΠΎ Π΄Π»ΠΈΠ½ΠΎΠΉ. Π­Ρ‚ΠΎ Π»Π΅Π³ΠΊΠΎ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ: суффикс Β«vΒ» ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Β«Π²Π΅ΠΊΡ‚ΠΎΡ€Β», ΠΈ ΠΎΠ½ находится Π½Π° Ρ‚ΠΎΠΌ ΠΆΠ΅ самом мСстС, Ρ‡Ρ‚ΠΎ ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ β€” ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΈΠ»ΠΈ Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ, Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ Π±ΡƒΡ„Π΅Ρ€ β€” ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ° β€” ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹ΠΌ.

Π₯ΠΌΠΌ. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ MsgSendsv() ΠΈ MsgSendsvnc() ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹? Π”Π°, ΠΏΠΎ части ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊ ΠΎΠ½ΠΎ ΠΈ Π΅ΡΡ‚ΡŒ. Π Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, являСтся функция Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ (cancellation point) ΠΈΠ»ΠΈ Π½Π΅Ρ‚. ВСрсии с суффиксом Β«ncΒ» (Β«no cancellationΒ» β€” ΠΏΡ€ΠΈΠΌ. Ρ€Π΅Π΄.) Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ вСрсии Π±Π΅Π· этого суффикса β€” ΡΠ²Π»ΡΡŽΡ‚ΡΡ. (Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚ΠΎΡ‡Π΅ΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅ΠΌΠΎΡΡ‚ΠΈ (cancelability) Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² справочном руководствС ΠΏΠΎ Π‘ΠΈ-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Π² Π³Π»Π°Π²Π΅, посвящСнной pthread_cancel().)

РСализация

ВСроятно, Π²Ρ‹ ΡƒΠΆΠ΅ ΠΏΠΎΠ΄ΠΎΠ·Ρ€Π΅Π²Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ всС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ MsgRead(), MsgReceive(), MsgSend() ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ MsgWrite() тСсно связаны ΠΌΠ΅ΠΆΠ΄Ρƒ собой. (ЕдинствСнноС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ β€” функция MsgReceivePulse(); ΠΌΡ‹ Π΅Π΅ Π²ΠΊΡ€Π°Ρ‚Ρ†Π΅ рассмотрим.)

ΠšΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ слСдуСт ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ? Π’ ΠΎΠ±Ρ‰Π΅ΠΌ-Ρ‚ΠΎ вопрос этот являСтся чисто философским. Π§Ρ‚ΠΎ Π΄ΠΎ мСня Π»ΠΈΡ‡Π½ΠΎ, Ρ‚ΠΎ я ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

Если ΠΌΡ‹ посылаСм ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ одноэлСмСнтныС сообщСния, Ρ‚ΠΎ Π·Π°Ρ‡Π΅ΠΌ Π½Π°ΠΌ всС эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с настройкой Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² IOV?

НакладныС расходы (кстати, Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅) ΠΏΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ процСссора ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ зависят ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, настраиваСтС Π»ΠΈ Π²Ρ‹ всС сами ΠΈΠ»ΠΈ оставляСтС это ядру ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅. ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ с использованиСм одноэлСмСнтных сообщСний избавляСт ядро ΠΎΡ‚ нСобходимости манипуляций с адрСсным пространством ΠΈ поэтому Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ нСсколько быстрСС.

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ Π»ΠΈ Π²Π°ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ IOV? ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ! Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΈΡ… всСгда, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΌ приходится ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΠΌΠ΅Π½ многоэлСмСнтными сообщСниями. Никогда нСпосрСдствСнно Π½Π΅ ΠΊΠΎΠΏΠΈΡ€ΡƒΠΉΡ‚Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ многоэлСмСнтных сообщСний, Π΄Π°ΠΆΠ΅ Ссли для этого потрСбуСтся всСго нСсколько строк ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π­Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΈΡ‚ систСму ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ°ΠΌΠΈ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ число Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ копирования Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚ΡƒΠ΄Π°-сюда; ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ происходит Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ быстрСС, Ρ‡Π΅ΠΌ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Π±ΡƒΡ„Π΅Ρ€Π° Π² Π±ΡƒΡ„Π΅Ρ€.

БообщСния Ρ‚ΠΈΠΏΠ° Β«ΠΈΠΌΠΏΡƒΠ»ΡŒΡΒ» (pulse)

ВсС сообщСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ обсуТдали Π΄ΠΎ настоящСго Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ MsgSend(), для Π½Π΅Π³ΠΎ наступаСт Ρ‚ΠΈΡ…ΠΈΠΉ час. ΠšΠ»ΠΈΠ΅Π½Ρ‚ ΠΎΡ‚Π΄Ρ‹Ρ…Π°Π΅Ρ‚ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° сСрвСр Π½Π΅ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ Π½Π° сообщСниС.

Однако Π΅ΡΡ‚ΡŒ ситуации, Π³Π΄Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚Π΅Π»ΡŒ сообщСния Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ сСбС ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ. ΠœΡ‹ рассмотрим Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ… Π² Π³Π»Π°Π²Π°Ρ… Β«ΠŸΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΡΒ» ΠΈ «Часы, Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρ‹ ΠΈ пСриодичСскиС увСдомлСния», Π° сСйчас ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.