【发布时间】:2021-12-05 12:59:58
【问题描述】:
我正在比较具有 Linux ubuntu 4.15.0-112 的 ARM8 服务器上的许多进程的性能,每个进程都试图获取信号量(信号量始终处于争用状态)
首先我使用了一个命名的 posix 信号量,然后使用了一个 system v 信号量,其中信号量集有 1 个信号量。
使用 system v 信号量时,性能降低了 8%。我知道当信号量没有争用时它的性能会更差,但我不明白有时性能会受到什么影响。 在 intel 上运行相同的程序时,我看不出性能有任何差异,但我相信在 intel 上运行时还有其他的瓶颈。
我想使用 System V Semaphore 有两个原因,释放信号量以防其中一个进程崩溃,并且可以按任何值而不是 +-1 递增/递减
这是我为 system v semaphore 编写的代码(仅从 1 个进程调用初始化,并且在等待和发布中没有撤消标志的情况下,我得到了相同的性能影响)
void init_semaphore(bool initialize, int initCount, int& semId)
{
key_t key;
char* file_path = "/tmp/semv";
char proj_id ='p';
if (initialize)
{
key = ftok(file_path, proj_id);
if (key == -1) {
perror("ftok");
exit(EXIT_FAILURE);
}
int flags = IPC_CREAT | 0666;
semId = semget(key, 1, flags);
if (semId == -1) {
perror("semget");
exit(EXIT_FAILURE);
}
i = semctl(semId, 0, SETVAL, initCount);
if (i == -1) {
perror("semctl");
exit(EXIT_FAILURE);
}
i = semctl(semId, 0, GETVAL);
printf("current value of %d is %d\n", semId, i);
}
else
{
key = ftok(file_path, proj_id);
if (key == -1) {
perror("ftok");
exit(EXIT_FAILURE);
}
semId = semget(key, 1, 0);
if (semId == -1) {
perror("semget");
exit(EXIT_FAILURE);
}
}
}
void release_semaphore(int semId)
{
int i = semctl(semId, 0, IPC_RMID);
if (i == -1) {
perror("semctl: semctl failed");
exit(1);
}
}
void post(int semId)
{
sembuf sops_post[1];
sops_post[0].sem_num = 0;
sops_post[0].sem_op = 1;
sops_post[0].sem_flg = SEM_UNDO;
semop(semId, sops_post, 1);
}
void wait(int semId)
{
sembuf sops_wait[1];
sops_wait[0].sem_num = 0;
sops_wait[0].sem_op = -1;
sops_wait[0].sem_flg = SEM_UNDO;
semop(semId, sops_wait, 1);
}
【问题讨论】:
标签: performance semaphore arm64