当前位置: 技术问答>linux和unix
关于linux共享内存请教熟悉内核的高手
来源: 互联网 发布时间:2014-12-25
本文导语: 我们做一个课题用软件实现CACHE,需用到内存机制 好像linux只能1M的共享内存,不知能不能修改其大小,并且有没有大小限 制,请高手指点,或者能告诉我哪里有可查的资料 我的可用分只有39分了,全部献上,如果...
我们做一个课题用软件实现CACHE,需用到内存机制
好像linux只能1M的共享内存,不知能不能修改其大小,并且有没有大小限
制,请高手指点,或者能告诉我哪里有可查的资料
我的可用分只有39分了,全部献上,如果能帮我解决,以后等我有分了再赠100分。
好像linux只能1M的共享内存,不知能不能修改其大小,并且有没有大小限
制,请高手指点,或者能告诉我哪里有可查的资料
我的可用分只有39分了,全部献上,如果能帮我解决,以后等我有分了再赠100分。
|
给你一个例子,分配20M共享内存。
主线程往内存中写数据,thread_proc从共享内存中毒数据
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define SHM_SIZE (20 * 1024 * 1024) // 20M
static key_t SHM_KEY = 12345;
static int shm_id = -1;
static int running = 1;
void * thread_proc(void *p)
{
char *buf;
int shmid = shmget(SHM_KEY, SHM_SIZE, 0666);
if (shm_id == -1)
{
perror("get share memory");
return NULL;
}
buf = (char *)shmat(shmid, NULL, 0);
while(running)
{
sleep(1);
printf("%sn", buf);
}
return 0;
}
void exit_do()
{
if (shm_id != -1)
{
if (shmctl(shm_id, IPC_RMID, 0) == -1)
{
perror("delete share memory");
}
}
}
void sig_do(int sig)
{
running = 0;
exit(0);
}
int main()
{
pthread_t pid;
char *buf;
int i = 0;
atexit(exit_do);
signal(SIGINT, sig_do);
shm_id = shmget(SHM_KEY, SHM_SIZE, IPC_CREAT|0666);
if (shm_id == -1)
{
perror("create share memory");
return -1;
}
buf = shmat(shm_id, NULL, 0);
pthread_create(&pid, NULL, thread_proc, NULL);
while(1)
{
sprintf(buf, "This is a test! times: %d", i++);
sleep(1);
}
return 0;
}
主线程往内存中写数据,thread_proc从共享内存中毒数据
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define SHM_SIZE (20 * 1024 * 1024) // 20M
static key_t SHM_KEY = 12345;
static int shm_id = -1;
static int running = 1;
void * thread_proc(void *p)
{
char *buf;
int shmid = shmget(SHM_KEY, SHM_SIZE, 0666);
if (shm_id == -1)
{
perror("get share memory");
return NULL;
}
buf = (char *)shmat(shmid, NULL, 0);
while(running)
{
sleep(1);
printf("%sn", buf);
}
return 0;
}
void exit_do()
{
if (shm_id != -1)
{
if (shmctl(shm_id, IPC_RMID, 0) == -1)
{
perror("delete share memory");
}
}
}
void sig_do(int sig)
{
running = 0;
exit(0);
}
int main()
{
pthread_t pid;
char *buf;
int i = 0;
atexit(exit_do);
signal(SIGINT, sig_do);
shm_id = shmget(SHM_KEY, SHM_SIZE, IPC_CREAT|0666);
if (shm_id == -1)
{
perror("create share memory");
return -1;
}
buf = shmat(shm_id, NULL, 0);
pthread_create(&pid, NULL, thread_proc, NULL);
while(1)
{
sprintf(buf, "This is a test! times: %d", i++);
sleep(1);
}
return 0;
}
|
如果只是要增加共享内存,可以在/usr/src下重新修改原码,
我现在在window下,没法告诉你程序名,但是所用的内存大小是个宏定义,
好象是SHM_MAX,MAX_SHM,MAXSHM,SHMMAX中的一个,肯定有SHM和MAX两个字
,你适当增加一下吧,我为了装数据库,增加到了20M,改完了别忘了重新编译。
我现在在window下,没法告诉你程序名,但是所用的内存大小是个宏定义,
好象是SHM_MAX,MAX_SHM,MAXSHM,SHMMAX中的一个,肯定有SHM和MAX两个字
,你适当增加一下吧,我为了装数据库,增加到了20M,改完了别忘了重新编译。
|
linux的很大好处:你可以自己跟改很多东西,然后重新编译内核即可!
比如:一次可以打开的文件数,文件名的长度等等。
不过在你进行这样的工作时,你必须考虑的目前的系统能否给你提供足够的
系统资源。
特别时涉及到内存的问题,你必须首先判断资源是否够用!
祝你好运!
接分!
比如:一次可以打开的文件数,文件名的长度等等。
不过在你进行这样的工作时,你必须考虑的目前的系统能否给你提供足够的
系统资源。
特别时涉及到内存的问题,你必须首先判断资源是否够用!
祝你好运!
接分!