ΠΠ°ΠΊ ΡΠ΄ΡΠΎ Π²ΠΈΠ΄ΠΈΡ ΡΠΎΡΡΠ°Π²Π½ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅.
Π―Π΄ΡΠΎ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΎ ΠΊΠΎΠΏΠΈΡΡΠ΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΠ°ΡΡΠΈ Π²Π΅ΠΊΡΠΎΡΠ° 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(), Π΄Π»Ρ Π½Π΅Π³ΠΎ Π½Π°ΡΡΡΠΏΠ°Π΅Ρ ΡΠΈΡ ΠΈΠΉ ΡΠ°Ρ. ΠΠ»ΠΈΠ΅Π½Ρ ΠΎΡΠ΄ΡΡ Π°Π΅Ρ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΡΠ΅ΡΠ²Π΅Ρ Π½Π΅ ΠΎΡΠ²Π΅ΡΠΈΡ Π½Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅.
ΠΠ΄Π½Π°ΠΊΠΎ Π΅ΡΡΡ ΡΠΈΡΡΠ°ΡΠΈΠΈ, Π³Π΄Π΅ ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΡΠ΅Π±Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡΡΡ. ΠΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· Π½ΠΈΡ Π² Π³Π»Π°Π²Π°Ρ Β«ΠΡΠ΅ΡΡΠ²Π°Π½ΠΈΡΒ» ΠΈ Β«Π§Π°ΡΡ, ΡΠ°ΠΉΠΌΠ΅ΡΡ ΠΈ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡΒ», Π° ΡΠ΅ΠΉΡΠ°Ρ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠΎΠ½ΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.