linux修改共享內(nèi)存命令
linux修改共享內(nèi)存命令
一般的以為修改系統(tǒng)共享內(nèi)存需要修改內(nèi)核程序,然后make,很麻煩。下面由學(xué)習(xí)啦小編為大家整理了簡(jiǎn)單的linux修改共享內(nèi)存的命令的相關(guān)知識(shí),希望大家喜歡!
linux修改共享內(nèi)存的命令和方法
其實(shí),只要在rc.local的加入一點(diǎn)東西,就可以免去修改內(nèi)核的麻煩。修改方法如下:修改/etc/rc.d/rc.local文件。
在文件的前面注釋的后面加入以下行:
#修改內(nèi)核共享內(nèi)存大小;
echo 134217728 > /proc/sys/kernel/shmmax;
#說(shuō)明:這里的值為內(nèi)存的一半;
#如果系統(tǒng)內(nèi)存是256M,則值為134217728 ;
#如果系統(tǒng)內(nèi)存是512M,則值為268435456;
修改完成以后,重起機(jī)器就搞定。
linxu默認(rèn)情況下的共享內(nèi)存大小好像是32M,我的機(jī)器修改前用ipcs查看,oracle分段是10個(gè),修改以后,只有1個(gè)。oracle在一個(gè)內(nèi)存分段內(nèi),使得數(shù)據(jù)交換的速度有所提高。
擴(kuò)展:linux如何實(shí)現(xiàn)共享內(nèi)存同步
linux實(shí)現(xiàn)共享內(nèi)存方法一、利用POSIX有名信號(hào)燈實(shí)現(xiàn)共享內(nèi)存的同步
有名信號(hào)量既可用于線程間的同步,又可用于進(jìn)程間的同步。
兩個(gè)進(jìn)程,對(duì)同一個(gè)共享內(nèi)存讀寫(xiě),可利用有名信號(hào)量來(lái)進(jìn)行同步。一個(gè)進(jìn)程寫(xiě),另一個(gè)進(jìn)程讀,利用兩個(gè)有名信號(hào)量semr, semw。semr信號(hào)量控制能否讀,初始化為0。 semw信號(hào)量控制能否寫(xiě),初始為1。
讀共享內(nèi)存的程序示例代碼如下
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);
}
寫(xiě)共享內(nèi)存的程序示例代碼如下
。。。。。。
//同讀的程序
while (1)
{
sem_wait(semw);
printf(">");
fgets(shmadd, MAXSIZE, stdin);
sem_post(semr);
}
方法二、利用POSIX無(wú)名信號(hào)燈實(shí)現(xiàn)共享內(nèi)存的同步
POSIX無(wú)名信號(hào)量是基于內(nèi)存的信號(hào)量,可以用于線程間同步也可以用于進(jìn)程間同步。若實(shí)現(xiàn)進(jìn)程間同步,需要在共享內(nèi)存中來(lái)創(chuàng)建無(wú)名信號(hào)量。
因此,共享內(nèi)存需要定義以下的結(jié)構(gòu)體。
typedef struct
{
sem_t semr;
sem_t semw;
char buf[MAXSIZE];
}SHM;
讀、寫(xiě)程序流程如下圖所示。
方法三、利用System V的信號(hào)燈實(shí)現(xiàn)共享內(nèi)存的同步
System V的信號(hào)燈是一個(gè)或者多個(gè)信號(hào)燈的一個(gè)集合。其中的每一個(gè)都是單獨(dú)的計(jì)數(shù)信號(hào)燈。而Posix信號(hào)燈指的是單個(gè)計(jì)數(shù)信號(hào)燈
System V 信號(hào)燈由內(nèi)核維護(hù),主要函數(shù)semget,semop,semctl 。
一個(gè)進(jìn)程寫(xiě),另一個(gè)進(jìn)程讀,信號(hào)燈集中有兩個(gè)信號(hào)燈,下標(biāo)0代表能否讀,初始化為0。 下標(biāo)1代表能否寫(xiě),初始為1。
程序流程如下:
寫(xiě)的流程和前邊的類(lèi)似。
方法四、利用信號(hào)實(shí)現(xiàn)共享內(nèi)存的同步
信號(hào)是在軟件層次上對(duì)中斷機(jī)制的一種模擬,是一種異步通信方式。利用信號(hào)也可以實(shí)現(xiàn)共享內(nèi)存的同步。
思路:
reader和writer通過(guò)信號(hào)通信必須獲取對(duì)方的進(jìn)程號(hào),可利用共享內(nèi)存保存雙方的進(jìn)程號(hào)。
reader和writer運(yùn)行的順序不確定,可約定先運(yùn)行的進(jìn)程創(chuàng)建共享內(nèi)存并初始化。
利用pause, kill, signal等函數(shù)可以實(shí)現(xiàn)該程序(流程和前邊類(lèi)似)。