社区
Linux/Unix社区
帖子详情
linux中如何用shmget在共享内存中分配一个Map类型的空间?
OracleJ
2012-04-17 05:12:33
在共享内存中分配这种类型的空间主要是为了其它进程使用。其它进程要在这个共享map中查找元素,如果存在就进行修改,不存在插入,然后在一定的时间内把Map中得数据存入到数据库中。
只所以在共享内存中设计成map类型就是为了查找元素快,方便各个进程都可以操作这个变量。
请高手帮忙如何在共享内存中分配Map类型的空间?(或者有其它高效方案也行,针对这样的需求。)谢谢!
...全文
459
7
打赏
收藏
linux中如何用shmget在共享内存中分配一个Map类型的空间?
在共享内存中分配这种类型的空间主要是为了其它进程使用。其它进程要在这个共享map中查找元素,如果存在就进行修改,不存在插入,然后在一定的时间内把Map中得数据存入到数据库中。 只所以在共享内存中设计成map类型就是为了查找元素快,方便各个进程都可以操作这个变量。 请高手帮忙如何在共享内存中分配Map类型的空间?(或者有其它高效方案也行,针对这样的需求。)谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
bulijun1987
2012-04-20
打赏
举报
回复
LZ上面的该过之后的代码中:
dataInfo[0-count]的值都是一样的。
后面的代码:
//初始化 结构体数组
for(int i = 0;i < count;i++){
//初始化共享内存 这里为什么不能用dataInfo[i]这个(对这个进行初始化,最后dataInfo[i]
都是同一个值),改成tempDataInfo[i] 值的初始化就正确,请高手讲解?
strcpy(tempDataInfo[i].instrumentID,"IF1201");//IF1201 还有其他的值 这里只是一个代表。每一个值都不相同。
}
如果此处要用dataInfo[i]的话只会初始化内存中的第一个结构
OracleJ
2012-04-18
打赏
举报
回复
对上面的代码进行了修改,目前是执行成功,接下来就是对这个结构体数组进行管理了。
typedef struct _KLineInfo{
char instrumentID[32];//把这个看成key键
double OpenPrice;
double HighestPrice;
_KLineInfo(){
memset(instrumentID,0,sizeof(instrumentID));
OpenPrice = 0.f;
HighestPrice = 0.f;
}
}KLineInfo;
int count = 255;//结构体数组的长度。
//定义指针数组
KLineInfo *dataInfo[count];
int shmid;
//分配内存空间
if((shmid = shmget((key_t)1234,sizeof(KLineInfo)*count,0666|IPC_CREAT)) == -1){
perror("shmget is error!");
}
for(int i = 0;i < count;i++){
dataInfo[i] = (KLineInfo *)shmat(shmid,0,0);
}
KLineInfo *tempDataInfo;
//把内存的首地址给这个指针变量
tempDataInfo = (KLineInfo *)shmat(shmid,0,0);
//初始化 结构体数组
for(int i = 0;i < count;i++){
//
初始化共享内存 这里为什么不能用dataInfo[i]这个(对这个进行初始化,最后dataInfo[i]
都是同一个值),改成tempDataInfo[i] 值的初始化就正确,请高手讲解?
strcpy(tempDataInfo[i].instrumentID,"IF1201");//IF1201 还有其他的值 这里只是一个代表。每一个值都不相同。
}
OracleJ
2012-04-18
打赏
举报
回复
非常感谢楼上2位的解释。根据楼上2位的思路,目前我设计了一个结构体,首先创建这个结构体数组,因为这个数组的最大长度,还有所谓的key键的值已经固定。所以我就提前初始化这个结构体的长度和key值。在编译的时候没有问题,当运行的时候出现了问题。
typedef struct _KLineInfo{
char instrumentID[32];//把这个看成key键
double OpenPrice;
double HighestPrice;
_KLineInfo(){
memset(instrumentID,0,sizeof(instrumentID));
OpenPrice = 0.f;
HighestPrice = 0.f;
}
}KLineInfo;
int count = 255;//结构体数组的长度。
KLineInfo *dataInfo;
int shmid;
if((shmid = shmget((key_t)1234,sizeof(dataInfo)*count,0666|IPC_CREAT)) == -1){
perror("shmget is error!");
}
dataInfo = (KLineInfo *)shmat(shmid,0,0);
//初始化 结构体数组
for(int i = 0;i < count;i++){
//只要对结构体中的instrumentID进行下面的初始化就在运行时出现错误?
strcpy(dataInfo[i].instrumentID,"IF1201");//IF1201 还有其他的值 这里只是一个代表。
}
//然后对这个初始化玩的数组进行排序。
//进行查找的时候用的时2分查找,毕竟数据量最多也就600.
OracleJ
2012-04-18
打赏
举报
回复
楼上的高手能给一个详细的实例吗?或者提供一个参考的文章地址也行。谢谢
qq120848369
2012-04-18
打赏
举报
回复
以前封装的共享内存哈希表是采取多级哈希的办法,整个线性内存分为3段,每一段内有多块,每一块的大小固定,足够容纳你的key-val即可。三段的快数都取素数,并且递增。
之后插入数据就是按照1段快数散列,冲突则散列到2段,2段冲突散列到3段,删除操作也类似了,自己设计。
这样做的好处就是高效,不用移动内存,只需要每次计算偏移量即可,其他设计方案都是可行的,比如就是一段哈希表,冲突了往后找都行,记住用偏移量就可以了,甚至可以做成链表或者树都是可以的,只要你不嫌麻烦,指针换成偏移量而已,初始化将所有的块串成free链表,需要结点就从free链里取。
gettext
2012-04-17
打赏
举报
回复
map数据存一个文件里, 在用mmap映射到共享内存。 关键是数据结构如何定,共享内存中不能用指针。
昵称很不好取
2012-04-17
打赏
举报
回复
用shmat取得内存地址之后如何解释是程序的事情,程序按照map内存管理的方式解释就是了
关键是设计好map
Linux
进程间通信:
共享内存
函数(
shm
get、
shm
at、
shm
dt、
shm
ctl)及其范例
共享内存
函数由
shm
get、
shm
at、
shm
dt、
shm
ctl四个函数组成。下面的表格列出了这四个...函数说明得到
一个
共享内存
标识符或创建
一个
共享内存
对象并返回
共享内存
标识符函数原型int
shm
get(key_t key, size_t size, int sh
Linux
IPC
共享内存
,System V
共享内存
机制:
shm
get,
shm
at,
shm
dt,
shm
ctl
System V
共享内存
机制 ...这样
一个
使用
共享内存
的进程可以将信息写入该
空间
, 而另
一个
使用
共享内存
的进程又可以通过简单的内存读操作获取刚才写入的信息, 使得两个不同进程之间进行了一次信息交换, ...
linux
共享内存
查看和删除
在使用
共享内存
的程序异常退出时...
Linux
中
通过API函数
shm
get创建的
共享内存
一般都是在程序
中
使用
shm
ctl来释放的,但是有时为了调试程序,开发人员可能通过Ctrl + C等方式发送
中
断信号来结束程序,此时程序申请的共享内
Linux
共享内存
和Qt
共享内存
QSharedMemory的使用,今天你会了吗
Linux
共享内存
和Qt
共享内存
SharedMemory简介
Linux
共享内存
使用Qt
共享内存
SharedMemory使用 简介
Linux
系统下进程通信的方式有很多: 管道(pipe) 命名管道(FIFO) 内存映射(
map
ped memeory) 消息队列(message queue) ...
shm
get物理内存_一文解析
Linux
内存系统
本文主要介绍
Linux
内存组织结构和页面布局,内存碎片产生原因和优化算法,
Linux
内核几种内存管理的方法,内存使用场景以及内存使用的那些坑。从内存的原理和结构,到内存的算法优化,再到使用场景,去探寻内存管理的...
Linux/Unix社区
23,121
社区成员
74,508
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章