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