Linux 中的信号量介绍

文章的翻译是在课程开始前夕准备的 “管理员 Linux.Basic”.

Linux 中的信号量介绍

信号量是一种允许竞争进程和线程共享资源并帮助解决各种同步问题的机制,例如竞争、死锁(互锁)和行为不当的线程。

为了解决这些问题,内核提供了互斥锁、信号量、信号和屏障等工具。

信号量分为三种类型:

  1. 二进制信号量
  2. Semaphores-counters(计数信号量)
  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 中的信号量介绍

来源: habr.com

添加评论