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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QNX/UNIX: Анатомия ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 10

Автор ОлСг Π¦ΠΈΠ»ΡŽΡ€ΠΈΠΊ

ЗабСгая Π²ΠΏΠ΅Ρ€Π΅Π΄, сообщим, Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ прилоТСния сдСлано ΠΆΠ°Π»ΠΊΠΎΠ΅ ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ ΠΈΠΌΠΈΡ‚Π°Ρ†ΠΈΠΈ наслСдования ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°: Π² качСствС ассоциированного с сигналом Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ значСния пСрСдаСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° отправитСля, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ‚ΡƒΡ‚ ΠΆΠ΅ устанавливаСтся ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ для выполнСния ΠΊΠΎΠ΄Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. Однако ΡΠ»Π°Π±ΠΎΡΡ‚ΡŒ Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ истинного наслСдования состоит здСсь Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π²Π° ΠΏΠ΅Ρ€Π²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° (сохранСниС ΠΈ установка ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°) Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΏΠΎΠ΄ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ родитСля, ΠΈ Π² это врСмя ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ вытСснСн диспСтчСром систСмы.

Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ процСсса

Π‘ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ΠΌ процСсса Π΄Π΅Π»ΠΎ обстоит достаточно просто, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, Π² сравнСнии с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ происходит ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΊΠ°ΠΊ это ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ скоро. ΠŸΡ€ΠΎΡ†Π΅ΡΡ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, Ссли ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° выполняСт Π²Ρ‹Π·ΠΎΠ² exit() ΠΈΠ»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ просто Π΄ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Π΄ΠΎ Ρ‚ΠΎΡ‡ΠΊΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main(), Π±ΡƒΠ΄ΡŒ Ρ‚ΠΎ с явным ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° return ΠΈΠ»ΠΈ Π±Π΅Π· ΠΎΠ½ΠΎΠ³ΠΎ. Π­Ρ‚ΠΎ СстСствСнный, Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ (ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° самого процСсса) ΠΏΡƒΡ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ.

Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡƒΡ‚ΡŒ β€” посылка процСссу ΠΈΠ·Π²Π½Π΅ (ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ процСсса) сигнала, Ρ€Π΅Π°ΠΊΡ†ΠΈΠ΅ΠΉ Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ (ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ установлСнной) являСтся Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ процСсса (ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ сигналах ΠΈ рСакциях см. Π½ΠΈΠΆΠ΅). Π’ противовСс СстСствСнному Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡŽ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΈΠ·Π²Π½Π΅ Π² [12] (ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²) Π½Π°Π·Π²Π°Π½ΠΎ ΠΎΡ‚ΠΌΠ΅Π½ΠΎΠΉ, ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ этим Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠΌ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΄Π°Π»Π΅Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Ρ‡Π΅Ρ‚Π»ΠΈΠ²ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Ρ‚ΡŒ, ΠΎ ΠΊΠ°ΠΊΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΈΠ΄Π΅Ρ‚ Ρ€Π΅Ρ‡ΡŒ. (Вакая ΠΆΠ΅ тСрминология Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π°ΠΌΠΈ ΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΊΠ°.)

Π—Π΄Π΅ΡΡŒ умСстно ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΡ€Π°Ρ‚ΠΊΠΎΠ΅ отступлСниС ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ «ТивучСсти», ΠΊΠ°ΠΊ это Π½Π°Π·Π²Π°Π½ΠΎ Ρƒ Π£. БтивСнса [2], ΠΈΠ»ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΆΠΈΠ·Π½ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² IPC, Ρ‡Ρ‚ΠΎ Π² Ρ€Π°Π²Π½ΠΎΠΉ ΠΌΠ΅Ρ€Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ отнСсСно Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ IPC, Π½ΠΎ ΠΈ ΠΊΠΎ всСм ΠΏΡ€ΠΎΡ‡ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы. Π£. БтивСнс Π΄Π΅Π»ΠΈΡ‚ всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΆΠΈΠ·Π½ΠΈ Π½Π°:

β€’ ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, врСмя ΠΆΠΈΠ·Π½ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… опрСдСляСтся процСссом (process-persistent). Π’Π°ΠΊΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ сущСствуСт Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚ послСдним процСссом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹ (pipes, FIFO).

β€’ ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, врСмя ΠΆΠΈΠ·Π½ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… опрСдСляСтся ядром систСмы (kernel-persistent). Π’Π°ΠΊΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ сущСствуСт Π΄ΠΎ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ядра ΠΈΠ»ΠΈ явного удалСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ этого класса ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΡΠ²Π»ΡΡŽΡ‚ΡΡ сСмафоры (ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅) ΠΈ раздСляСмая ΠΏΠ°ΠΌΡΡ‚ΡŒ.

β€’ ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, врСмя ΠΆΠΈΠ·Π½ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… опрСдСляСтся Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмой (filesystem-persistent). Π’Π°ΠΊΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ отобраТаСтся Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²ΡƒΡŽ систСму ΠΈ сущСствуСт Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ явно ΡƒΠ΄Π°Π»Π΅Π½. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ этого класса ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ОБ Π² зависимости ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний POSIX, сСмафоры ΠΈ раздСляСмая ΠΏΠ°ΠΌΡΡ‚ΡŒ.

ΠšΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΆΠΈΠ·Π½ΠΈ ΠΎΡ‚Π½ΡŽΠ΄ΡŒ Π½Π΅ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Π°Ρ Π·Π°Π΄Π°Ρ‡Π°. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, отнСсСнныС ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ классу, ΠΌΠΈΠ³Ρ€ΠΈΡ€ΡƒΡŽΡ‚ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠΉ ОБ ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π² зависимости ΠΎΡ‚ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΈ особСнно ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ процСсса ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ, Ссли процСсс ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, врСмя ΠΆΠΈΠ·Π½ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ process-persistent. ΠœΡ‹ Π΅Ρ‰Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π· коснСмся этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΏΡ€ΠΈ рассмотрСнии Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ‚Π°ΠΌ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ ΠΈ Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ всСх process-persistent-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΈ для Π΅Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π² Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π΄Π°ΠΆΠ΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Ρ‹ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΡ‹ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π΄Π°Π»Π΅Π΅, ΠΏΡ€ΠΈ рассмотрСнии ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

БообраТСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½Ρ‹ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π½Π° ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ процСсса (ΠΌΡ‹ Π΅Ρ‰Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΊ Π½ΠΈΠΌ Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ), Π½ΠΎ ΠΈ Ρ‚ΠΎ, насколько «эффСктивно» ΡΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Π΅ процСссы Π² ОБ, насколько быстро происходит ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ контСкста с ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ. Для самой Π³Ρ€ΡƒΠ±ΠΎΠΉ ΠΎΡ†Π΅Π½ΠΊΠΈ этих Π·Π°Ρ‚Ρ€Π°Ρ‚ создадим ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ (Ρ„Π°ΠΉΠ» p5.cc):

Π—Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π½Π° Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ процСссов

#include <stdlib.h>

#include <inttypes.h>

#include <iostream.h>

#include <unistd.h>

#include <sched.h>

#include <sys/neutrino.h>


int main(int argc, char* argv[]) {

 unsigned long N = 1000;

 if (argc > 1 && atoi(argv[1]) > 0)

 N = atoi(argv[1]);

 pid_t pid = fork();

 if (pid == -1)

  cout << "fork error" << endl, exit(EXIT_FAILURE);

 uint64_t t = ClockCycles();

 for (unsigned long i = 0; i < N; i++) sched_yield();

 t = ClockCycles() - t;

 delay(200);

 cout << pid << "\t: cycles - " << t << "; on sched - " << (t/N) / 2 << endl;

 exit(EXIT_SUCCESS);

}

Π”Π²Π° ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ процСсса Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ симмСтричны ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ PID послС выполнСния fork(), ΠΎΠ½ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² максимальном Ρ‚Π΅ΠΌΠΏΠ΅ Β«ΠΏΠ΅Ρ€Π΅ΠΏΠ°ΡΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚Β» Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ, ΠΊΠ°ΠΊ волСйболисты Π΄Π΅Π»Π°ΡŽΡ‚ это с мячом (рис. 2.2).

Рис. 2.2. Π‘ΠΈΠΌΠΌΠ΅Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠ΅ взаимодСйствиС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

Рисунок 2.2 ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ взаимодСйствиС Π΄Π²ΡƒΡ… ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹Ρ… процСссов: вся ΠΈΡ… Β«Ρ€Π°Π±ΠΎΡ‚Π°Β» состоит лишь Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ быстрСС ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Ρ‚Π½Π΅Ρ€Ρƒ. Π’Π°ΠΊΡƒΡŽ схСму, ΠΊΠΎΠ³Π΄Π° Π΄Π²Π° ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈΠ»ΠΈ процСссов Π² максимально высоком Ρ‚Π΅ΠΌΠΏΠ΅ (Π½Π° порядок прСвосходящСм ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ «СстСствСнной» RR-диспСтчСризации) ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒΡŽ, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² дальнСйшСм для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ², называя Π΅Π΅ для простоты «симмСтричной схСмой».

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π§Ρ‚ΠΎΠ±Ρ‹ максимально ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ прилоТСния, ΠΏΡ€ΠΈ Π΅Π³ΠΎ написании ΠΌΡ‹ Π½Π΅ Ρ‚Ρ€ΠΎΠ³Π°Π»ΠΈ события «СстСствСнной» диспСтчСризации, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ мСсто ΠΏΡ€ΠΈ RR-диспСтчСризации ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 4 систСмных Ρ‚ΠΈΠΊΠ° (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ это ~4 миллисСкунды). Как сСйчас ΠΏΠΎΠΊΠ°ΠΆΡƒΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, события ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ диспСтчСризации происходят с ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ порядка 1 микросСкунды, Ρ‚.e. Π² 4000 Ρ€Π°Π· Ρ‡Π°Ρ‰Π΅, ΠΈ возмущСния, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ вносимыС RR-диспСтчСризациСй, ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π½Π΅ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ сущСствСнными.

Π’ΠΎΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ выполнСния этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

# nice -n-19 p5 1000000

1069102 : cycles - 1234175656; on sched β€” 617

0       : cycles - 1234176052; on sched - 617

# nice -n-19 p5 100000

1003566 : cycles - 123439225; on sched β€” 617

0       : cycles - 123440347; on sched - 617

# nice -n-19 p5 10000

1019950 : cycles - 12339084; on sched β€” 616

0       : cycles - 12341520; on sched - 617

# nice -n-19 p5 1000

1036334 : cycles - 1243117; on sched β€” 621

0       : cycles - 1245123; on sched - 622

# nice -n-19 p5 100

1052718 : cycles - 130740; on sched β€” 653

0       : cycles - 132615; on sched - 663

Π’ΠΈΠ΄Π½Π° Π½Π° ΡƒΠ΄ΠΈΠ²Π»Π΅Π½ΠΈΠ΅ устойчивая ΠΎΡ†Π΅Π½ΠΊΠ°, практичСски Π½Π΅ зависящая ΠΎΡ‚ ΠΎΠ±Ρ‰Π΅Π³ΠΎ числа Π°ΠΊΡ‚ΠΎΠ² диспСтчСризации, ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰Π΅Π³ΠΎΡΡ Π½Π° 4 порядка.

ΠžΡ‚Π±Ρ€ΠΎΡΠΈΠ² ΠΌΠ΅Π»ΠΊΠΈΠ΅ Π΄ΠΎΠ±Π°Π²ΠΊΠΈ, привносимыС ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ счСтчика Ρ†ΠΈΠΊΠ»Π°, ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° управлСния ΠΎΡ‚ процСсса ΠΊ процСссу Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ порядка 600 Ρ†ΠΈΠΊΠ»ΠΎΠ² процСссора (это порядка 1,2 микросСкунды Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ 533 ΠœΠ“Ρ†, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ выполнялся этот тСст).

ΠŸΠΎΡ‚ΠΎΠΊΠΈ

ΠŸΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ[14] POSIX ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‚ ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ спСктр ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² Β«Π»Π΅Π³ΠΊΠΈΡ… процСссов» β€” ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (Π³Ρ€ΡƒΠΏΠΏΠ° API pthread_*()). Π’Π΅Ρ…Π½ΠΈΠΊΠ° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π²Π²ΠΎΠ΄ΠΈΡ‚ Π½ΠΎΠ²ΡƒΡŽ ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡƒ программирования вмСсто ΡƒΠΆΠ΅ ΡΡ‚Π°Π²ΡˆΠΈΡ… Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ UNIX-ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². Π­Ρ‚ΠΎ ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ часто нСдооцСниваСтся. НапримСр, использованиС pthread_create() вмСсто fork() ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π° порядки ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π΅Π°ΠΊΡ†ΠΈΠΉ, особСнно Π² ОБ с отсутствиСм ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² COW (copy on write) ΠΏΡ€ΠΈ создании Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ² физичСских страниц RAM сСгмСнтов Π΄Π°Π½Π½Ρ‹Ρ… (Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ QNX, хотя ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ COW вряд Π»ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ Π² ОБ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ) [4]. Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€: использованиС мноТСствСнных ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² вмСсто ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΉ Π½Π° мноТСствС дСскрипторов Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ select().

Однако ΠΎΡ‡Π΅Π½ΡŒ часто эти Π΄Π²Π΅ ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡ‹, традиционная ΠΈ потоковая, Π½Π΅ ΡΠΎΡ‡Π΅Ρ‚Π°ΡŽΡ‚ΡΡ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΈΠ·-Π·Π° нСбСзопасности (not thread safe) Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² UNIX (fork(), select() ΠΈ Π΄Ρ€.) Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ срСдС. Π’ΠΎΠ³Π΄Π° приходится ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ ΠΎΠ΄Π½Ρƒ, Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡƒ ΠΊΠ°ΠΊ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹, Π½Π΅ смСшивая ΠΈΡ… ΠΌΠ΅ΠΆΠ΄Ρƒ собой. Или ΡΠΌΠ΅ΡˆΠΈΠ²Π°Ρ‚ΡŒ, Π½ΠΎ с большой ΠΎΡΡ‚ΠΎΡ€ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΈ с Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ этом ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ случаС.

ΠŸΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ любой Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹ΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ (Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ) Π½Π°Π±ΠΎΡ€ ΠΊΠΎΠΌΠ°Π½Π΄ процСссора. Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΎΠΌ этого Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° для ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΌΠΎΠ³ΡƒΡ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ:

β€’ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ исполняСмый Ρ„Π°ΠΉΠ», Π½Π° основС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ систСмой ΠΈΠ»ΠΈ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Π³Ρ€ΡƒΠΏΠΏΡ‹ spawn() запускаСтся Π½ΠΎΠ²Ρ‹ΠΉ процСсс ΠΈ создаСтся Π΅Π³ΠΎ Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ;

β€’ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ ΠΊΠΎΠ΄Π° Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°[15] процСсса родитСля ΠΏΡ€ΠΈ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ процСссов Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ fork() (Ρ‚ΠΎΠΆΠ΅ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°);

β€’ ΡƒΡ‡Π°ΡΡ‚ΠΎΠΊ ΠΊΠΎΠ΄Π°, ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½Π½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° (void*()(void*)); это ΠΎΠ±Ρ‰ΠΈΠΉ случай ΠΏΡ€ΠΈ создании Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈ всСх ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² процСсса (ΠΏΡ€ΠΈ создании ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… процСссов) Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ pthread_create(). Π’Π°ΠΊΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π­Ρ‚ΠΎ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ интСрСсный для нас случай.