linux修改共享内存命令
学习啦在线学习网linux修改共享内存命令
一般的以为修改系统共享内存需要修改内核程序,然后make,很麻烦。下面由学习啦小编为大家整理了简单的linux修改共享内存的命令的相关知识,希望大家喜欢!
linux修改共享内存的命令和方法
其实,只要在rc.local的加入一点东西,就可以免去修改内核的麻烦。修改方法如下:修改/etc/rc.d/rc.local文件。
学习啦在线学习网 在文件的前面注释的后面加入以下行:
#修改内核共享内存大小;
echo 134217728 > /proc/sys/kernel/shmmax;
#说明:这里的值为内存的一半;
学习啦在线学习网 #如果系统内存是256M,则值为134217728 ;
学习啦在线学习网 #如果系统内存是512M,则值为268435456;
修改完成以后,重起机器就搞定。
linxu默认情况下的共享内存大小好像是32M,我的机器修改前用ipcs查看,oracle分段是10个,修改以后,只有1个。oracle在一个内存分段内,使得数据交换的速度有所提高。
扩展:linux如何实现共享内存同步
linux实现共享内存方法一、利用POSIX有名信号灯实现共享内存的同步
有名信号量既可用于线程间的同步,又可用于进程间的同步。
学习啦在线学习网 两个进程,对同一个共享内存读写,可利用有名信号量来进行同步。一个进程写,另一个进程读,利用两个有名信号量semr, semw。semr信号量控制能否读,初始化为0。 semw信号量控制能否写,初始为1。
读共享内存的程序示例代码如下
学习啦在线学习网 semr = sem_open("mysem_r", O_CREAT | O_RDWR , 0666, 0);
if (semr == SEM_FAILED)
{
printf("errno=%d\n", errno);
学习啦在线学习网 return -1;
}
semw = sem_open("mysem_w", O_CREAT | O_RDWR, 0666, 1);
学习啦在线学习网 if (semw == SEM_FAILED)
{
printf("errno=%d\n", errno);
return -1;
}
if ((shmid = shmget(key, MAXSIZE, 0666 | IPC_CREAT)) == -1)
{
perror("semget");
学习啦在线学习网 exit(-1);
}
if ((shmadd = (char *)shmat(shmid, NULL, 0)) == (char *)(-1))
{
学习啦在线学习网 perror("shmat");
学习啦在线学习网 exit(-1);
}
学习啦在线学习网 while (1)
{
em_wait(semr);
printf("%s\n", shmadd);
学习啦在线学习网 sem_post(semw);
}
写共享内存的程序示例代码如下
。。。。。。
//同读的程序
学习啦在线学习网 while (1)
{
sem_wait(semw);
学习啦在线学习网 printf(">");
学习啦在线学习网 fgets(shmadd, MAXSIZE, stdin);
sem_post(semr);
}
学习啦在线学习网 方法二、利用POSIX无名信号灯实现共享内存的同步
POSIX无名信号量是基于内存的信号量,可以用于线程间同步也可以用于进程间同步。若实现进程间同步,需要在共享内存中来创建无名信号量。
学习啦在线学习网 因此,共享内存需要定义以下的结构体。
typedef struct
{
sem_t semr;
学习啦在线学习网 sem_t semw;
char buf[MAXSIZE];
}SHM;
学习啦在线学习网 读、写程序流程如下图所示。
学习啦在线学习网 方法三、利用System V的信号灯实现共享内存的同步
System V的信号灯是一个或者多个信号灯的一个集合。其中的每一个都是单独的计数信号灯。而Posix信号灯指的是单个计数信号灯
System V 信号灯由内核维护,主要函数semget,semop,semctl 。
学习啦在线学习网 一个进程写,另一个进程读,信号灯集中有两个信号灯,下标0代表能否读,初始化为0。 下标1代表能否写,初始为1。
程序流程如下:
学习啦在线学习网 写的流程和前边的类似。
学习啦在线学习网 方法四、利用信号实现共享内存的同步
信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式。利用信号也可以实现共享内存的同步。
思路:
学习啦在线学习网 reader和writer通过信号通信必须获取对方的进程号,可利用共享内存保存双方的进程号。
reader和writer运行的顺序不确定,可约定先运行的进程创建共享内存并初始化。
学习啦在线学习网 利用pause, kill, signal等函数可以实现该程序(流程和前边类似)。