linux 下的信号量参数

linux 下的信号量参数
信号量是一种锁机制用于协调进程之间互斥的访问临界资源。以确保某种共享资源不被多个进程同时
访问。数据库使用信号量来管理对操作系统资源的访问(比如内存共享段)。如果所有数据库进程所
需的信号量不足,会导致数据库不能启动或者运行时出错。这时候DBA 需要查看内核的信号量参数,
并重新进行设置。
[root@zeng ~]# cat /proc/sys/kernel/sem
250     32000   100     200
上面输出的4个值分别对应内核信号量参数:
semmsl  250    每个信号量集中的最大信号量数。
semmns  32000  整个系统中的最大信号量数。
semopm  100    每一个semop系统调用操作的最大信号量数。
semmni  200    信号量集最大数。
其中:semmns=semmsl*semmni
oracle 11gR2 在 oracle linux 6.0 安装对内核信号量参数的要求:
semmsl  250    
semmns  32000  
semopm  100   
semmni  200  
注:参照的是Oracle Linux 5 Update 2 的安装要求。因为oracle 11gR2 没有针对oracle linux 6.0
的安装文档。
修改信号量参数的值前请先查看信号量参数的值。
[root@zeng ~]# cat /proc/sys/kernel/sem
250     32000   100     200
可以使用echo、cat、sysctl -w、编辑/etc/sysctl.conf 的方式来改变内核信号量参数。写进
/etc/sysctl.conf 的内核参数应该执行sysctl -p 把刚才的修改实例化为当前的内核参数。
写进/etc/sysctl.conf 的内核参数下次重启以后依然有效。
[root@zeng ~]#  echo "kernel.sem =250 32000 100 128" >> /etc/sysctl.conf
[root@zeng ~]# sysctl -p
确认修改以后的当前信号量值
[root@zeng ~]# cat /proc/sys/kernel/sem
250     32000   100     128

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26110315/viewspace-718306/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26110315/viewspace-718306/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux下,进程之间可以通过信号量进行通信。下面是使用信号量实现进程通信的步骤: 1. 定义一个信号量集:可以使用`semget`函数创建信号量集,指定信号量集的键值、信号量数量、权限等参数。 2. 初始化信号量:可以使用`semctl`函数对信号量集中的信号量进行初始化,设置初始值。 3. 修改信号量的值:可以使用`semop`函数对信号量进行操作,包括增加、减少等操作,以达到进程间通信的目的。 4. 删除信号量集:可以使用`semctl`函数删除信号量集。 下面是一个简单的示例代码,其中包括两个进程,一个进程增加信号量的值,另一个进程减少信号量的值: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/sem.h> #define SEM_KEY 0x1234 int main() { int semid, ret; struct sembuf sops; // 创建信号量集 semid = semget(SEM_KEY, 1, IPC_CREAT | 0666); if(semid < 0) { perror("semget"); exit(1); } // 初始化信号量值为1 ret = semctl(semid, 0, SETVAL, 1); if(ret < 0) { perror("semctl"); exit(1); } // 创建子进程 pid_t pid = fork(); if(pid < 0) { perror("fork"); exit(1); } else if(pid == 0) { // 子进程:减少信号量的值 sops.sem_num = 0; sops.sem_op = -1; sops.sem_flg = 0; ret = semop(semid, &sops, 1); if(ret < 0) { perror("semop"); exit(1); } printf("Child process: semaphore value=%d\n", semctl(semid, 0, GETVAL)); } else { // 父进程:增加信号量的值 sops.sem_num = 0; sops.sem_op = 1; sops.sem_flg = 0; ret = semop(semid, &sops, 1); if(ret < 0) { perror("semop"); exit(1); } printf("Parent process: semaphore value=%d\n", semctl(semid, 0, GETVAL)); } // 删除信号量集 ret = semctl(semid, 0, IPC_RMID, 0); if(ret < 0) { perror("semctl"); exit(1); } return 0; } ``` 在这个示例中,我们使用`semget`函数创建了一个信号量集,然后使用`semctl`函数对信号量进行初始化,设置初始值为1。接着创建了一个子进程和一个父进程,子进程使用`semop`函数减少信号量的值,父进程使用`semop`函数增加信号量的值。最后使用`semctl`函数删除信号量集。 注意:信号量是多进程之间进行同步操作的一种机制,需要注意同步的正确性,避免出现死锁等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值