了解Linux中的信号量

时间:2020-03-05 15:29:25  来源:igfitidea点击:

信号量是一种机制,允许竞争过程或者线程来改变,监视查询和控制共享系统资源。
信号量是对多处理系统中的竞争条件的解决方案。
当多个进程尝试访问共享资源时,会发生种族条件。
如果应用程序需要多线程功能,那么它配备了一组问题,例如竞争条件,死锁和线程的不正确行为。

为了解决竞争条件,死锁,线程行为不正确,内核提供了一组工具,如互斥锁,信号,孤立在解决多线程多处理器问题中。

有三种类型的信号量

1)二进制信号量2)计数信号量3)信号量集

显示XSI间流程间通信

下面的命令显示XSI间流程间通信设施状态。

# 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

共享内存段

打印有关Active Shared Memory Seagments的信息。

# 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

列出创建者的ID

命令列出创建者的用户ID和组ID以及所有者的用户ID和组ID。

# 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

当我们停止所有服务时,必须删除信号量和共享内存段。
如果没有,我们将需要使用IPCS命令。
可以使用ipcrm命令删除段ID。

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

我们可以在Sysctl文件中增加信号量值。

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