Π’ΡŠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² сСмафоритС Π² Linux

ΠŸΡ€Π΅Π²ΠΎΠ΄ΡŠΡ‚ Π½Π° статията бСшС ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²Π΅Π½ Π² Π½Π°Π²Π΅Ρ‡Π΅Ρ€ΠΈΠ΅Ρ‚ΠΎ Π½Π° Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ Π½Π° курса β€žΠΠ΄ΠΌΠΈΠ½ΠΈΡΡ‚Ρ€Π°Ρ‚ΠΎΡ€ Linux.Basicβ€œ.

Π’ΡŠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² сСмафоритС Π² Linux

Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€ΡŠΡ‚ Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ, ΠΊΠΎΠΉΡ‚ΠΎ позволява Π½Π° ΠΊΠΎΠ½ΠΊΡƒΡ€ΠΈΡ€Π°Ρ‰ΠΈ сС процСси ΠΈ нишки Π΄Π° сподСлят рСсурси ΠΈ ΠΏΠΎΠΌΠ°Π³Π° ΠΏΡ€ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ със синхронизацията, ΠΊΠ°Ρ‚ΠΎ ΡΡŠΡΡ‚Π΅Π·Π°Π½ΠΈΡ, блокирания (Π²Π·Π°ΠΈΠΌΠ½ΠΈ Π·Π°ΠΊΠ»ΡŽΡ‡Π²Π°Π½ΠΈΡ) ΠΈ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰ΠΈ нишки.

Π—Π° Π΄Π° Ρ€Π΅ΡˆΠΈ Ρ‚Π΅Π·ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ, ядрото прСдоставя инструмСнти ΠΊΠ°Ρ‚ΠΎ мутСкси, сСмафори, сигнали ΠΈ Π±Π°Ρ€ΠΈΠ΅Ρ€ΠΈ.

Има Ρ‚Ρ€ΠΈ Π²ΠΈΠ΄Π° сСмафори:

  1. Π”Π²ΠΎΠΈΡ‡Π½ΠΈ сСмафори
  2. Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€ΠΈ-броячи (сСмафор Π·Π° Π±Ρ€ΠΎΠ΅Π½Π΅)
  3. Масиви ΠΎΡ‚ сСмафори (сСмафорСн Π½Π°Π±ΠΎΡ€)

Π’ΠΈΠΆΡ‚Π΅ ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅Ρ‚ΠΎ Π½Π° IPC

Π‘Π»Π΅Π΄Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ прСдоставят информация Π·Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΎΡ‚ΠΎ ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅ Π½Π° мСТдупроцСсна комуникация (IPC).

# ipcs
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 65536 root 600 393216 2 dest
0x00000000 98305 root 600 393216 2 dest
0x00000000 131074 root 600 393216 2 dest
0x00000000 163843 root 600 393216 2 dest
0x00000000 196612 root 600 393216 2 dest
0x00000000 229381 root 600 393216 2 dest
0x00000000 262150 root 600 393216 2 dest
0x00000000 294919 root 600 393216 2 dest
0x00000000 327688 root 600 393216 2 dest
------ Semaphore Arrays --------

key semid owner perms nsems

------ Message Queues --------
key msqid owner perms used-bytes messages

Активни масиви ΠΎΡ‚ сСмафори

ПоказванС Π½Π° информация Π·Π° Π°ΠΊΡ‚ΠΈΠ²Π½ΠΈ сСмафорни масиви.

# ipcs -s
------ Semaphore Arrays --------
key semid owner perms nsems

Π‘ΠΏΠΎΠ΄Π΅Π»Π΅Π½ΠΈ сСгмСнти ΠΎΡ‚ ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π°

Π’ΠΈΠΆΡ‚Π΅ информация Π·Π° Π°ΠΊΡ‚ΠΈΠ²Π½ΠΈ сСгмСнти ΠΎΡ‚ сподСлСна ΠΏΠ°ΠΌΠ΅Ρ‚.

# ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 65536 root 600 393216 2 dest
0x00000000 98305 root 600 393216 2 dest

Π“Ρ€Π°Π½ΠΈΡ†ΠΈ

ΠžΡ‚Π±ΠΎΡ€ ipcs -l ΠΏΠΎΠΊΠ°Π·Π²Π° Π»ΠΈΠΌΠΈΡ‚ΠΈΡ‚Π΅ Π½Π° сподСлСна ΠΏΠ°ΠΌΠ΅Ρ‚, сСмафор ΠΈ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ.

# ipcs -l
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 4194303
max total shared memory (kbytes) = 1073741824
min seg size (bytes) = 1

------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767

------ Messages: Limits --------
max queues system wide = 16
max size of message (bytes) = 65536
default max size of queue (bytes) = 65536

Π‘ΠΏΠΎΠ΄Π΅Π»Π΅Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚

ΠšΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ ΠΏΠΎΠΊΠ°Π·Π²Π° сподСлСната ΠΏΠ°ΠΌΠ΅Ρ‚.

# ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 65536 root 600 393216 2 dest
0x00000000 98305 root 600 393216 2 dest
0x00000000 131074 root 600 393216 2 dest
0x00000000 163843 root 600 393216 2 dest
0x00000000 196612 root 600 393216 2 dest
0x00000000 229381 root 600 393216 2 dest
0x00000000 262150 root 600 393216 2 dest
0x00000000 294919 root 600 393216 2 dest
0x00000000 327688 root 600 393216 2 dest

Π‘ΡŠΠ·Π΄Π°Ρ‚Π΅Π»ΠΈ Π½Π° рСсурси

ΠšΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° ΠΏΠΎΠΊΠ°Π·Π²Π° потрСбитСля ΠΈ Π³Ρ€ΡƒΠΏΠ°Ρ‚Π° Π½Π° собствСника ΠΈ ΡΡŠΠ·Π΄Π°Ρ‚Π΅Π»Ρ Π½Π° рСсурса.

# ipcs -m -c

------ Shared Memory Segment Creators/Owners --------
shmid perms cuid cgid uid gid
65536 600 root root root root
98305 600 root root root root
131074 600 root root root root
163843 600 root root root root
196612 600 root root root root
229381 600 root root root root
262150 600 root root root root
294919 600 root root root root
327688 600 root root root root

ИзползванС Π½Π° IPC инструмСнти

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ΡŠΡ‚ -u ΠΏΠΎΠΊΠ°Π·Π²Π° ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π° информация Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° всички IPC инструмСнти.

# ipcs -u

------ Shared Memory Status --------
segments allocated 9
pages allocated 864
pages resident 477
pages swapped 0
Swap performance: 0 attempts 0 successes

------ Semaphore Status --------
used arrays = 0
allocated semaphores = 0

------ Messages: Status --------
allocated queues = 0
used headers = 0
used space = 0 bytes

ΠšΠΎΠ³Π°Ρ‚ΠΎ услугитС са спрСни, сСмафоритС ΠΈ сподСлСнитС сСгмСнти ΠΎΡ‚ ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° ΡΡŠΡ‰ΠΎ трябва Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΈΠ·Ρ‚Ρ€ΠΈΡ‚ΠΈ. Ако Π½Π΅ са ΠΏΡ€Π΅ΠΌΠ°Ρ…Π½Π°Ρ‚ΠΈ, Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° станС с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° ipcrm, ΠΊΠ°Ρ‚ΠΎ сС ΠΏΠΎΠ΄Π°Π΄Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΡŠΡ‚ Π½Π° IPC ΠΎΠ±Π΅ΠΊΡ‚Π°.

# ipcs -a
# ipcrm -s < sem id>

ΠœΠΎΠΆΠ΅Ρ‚Π΅ ΡΡŠΡ‰ΠΎ Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ ограничСнията Π½Π° сСмафора, ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ sysctl.

# /sbin/sysctl -w kernel.sem=250

Π’ΡŠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² сСмафоритС Π² Linux

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€