分配大块内存与list列表buffer关联的思考

原创 2013年07月21日 07:51:46
在wince下某软件工程中的数据流动流程大致如下,从采集到的数据,然后组包、滤波、已滤波包-->(分发)
1. 显示缓存、显示
2. 存储包、存储
3. 网络包、上传
4. 截屏
实际上要复杂些,这里只列举了主要的功能,工程中存在一个值得思考的问题,就是数据来回memory copy很频繁,IO开支不小。

因此希望分配一大块内存,它与list结构中的buffer关联,用队列方式来循环存储数据,不再过多的用memcpy,也可避免lock/unlock
主要测试代码实现如下:

二维数据内存分配:
char **darray_new(int row, int col, int size)
{
char **arr;
arr = (char **) malloc(sizeof(char *) * row + size * row * col);
TRACE(L"len = %d\n", sizeof(char *) * row + size * row * col);
if (arr != NULL)
{
char *head;
head = ((char *)arr + sizeof(char *) * row);
memset(arr, 0, sizeof(char *) * row + size * row * col);
while (row--){
arr[row] = head + size * row * col;
}
}
return arr;
}

void darray_free(char **arr)
{
if (arr != NULL)
free(arr);
}

#define ARRAY_ROW 5
#define ARRAY_COL 8 //与list个数相关
#define ARRAY_SIZE 4
struct ecgPack{
DWORD timestamp;
char **bufData;
};
list<ecgPack *> g_list;

char **g_arrayMem;

由于行业的特点,考虑到显示问题,ARRAY_ROW基本不变,实际应用中变化的是组包的个数list(用ARRAY_COL表示)

调用测试:

//包初始化

for(int i=0; i<ARRAY_COL; i++){
ecgPack *p = new ecgPack;
p->bufData = new char *[ARRAY_ROW];
g_list.push_back(p);
}
        //内存分配
g_arrayMem = darray_new(ARRAY_ROW, ARRAY_COL, ARRAY_SIZE);
int j=0;
char c = 0x0A;
list<ecgPack *>::iterator itr = g_list.begin();
while(itr!=g_list.end()){
ecgPack *p = (*itr);

for(int i=0; i<ARRAY_ROW; i++){
p->bufData[i] = &g_arrayMem[i][0+ARRAY_SIZE*j]; //buffer之间的关联
p->bufData[i][0] = c;  //测试数据
}
itr++;
j++;
c++;
}
//效果图,每一行代表的是波形显示数据,显示时只需要用知道当前数据移动的指针位置就可以, 避免数据在各个模块之间的流动,而是让各个模块在list中获取数据即可.
以上只是一个应用的初步想法,仅供参考


内核分配大块连续内存的方法

参数传递:     uboot向内核传递参数的方式分为两类。     (1)第一类是通过boot cmd 例如在uboot终端提示行使用pri命令现实出的boot arg等。     (2)第二...
  • edwardlulinux
  • edwardlulinux
  • 2015年05月21日 21:18
  • 2860

在SharePoint中使用关联列表(Related List)

使用关联列表(related list)
  • shrenk
  • shrenk
  • 2015年02月26日 01:15
  • 1064

物理内存连续内存分配

内存管理的要求: 抽象:逻辑(虚拟)地址空间; 保护:独立地址空间; 共享:访问相同内存; 虚拟化:更大的地址空间 内存管理方式: 重定位,relocation,段地址+偏移; 分段,s...
  • zhouzhou135
  • zhouzhou135
  • 2015年06月02日 15:34
  • 1454

分配连续物理内存的原因

在分配内存时,系统会尽量给我们分配连续的物理内存,这样有什么好处呢?我知道的有如下2条: 1、DMA不使用页表机制,因此必须分配连续的物理内存。 2、使用连续物理内存可以提高系统整体性能。 ...
  • wangpeihuixyz
  • wangpeihuixyz
  • 2014年05月29日 20:29
  • 1296

内存,cache,buffer

内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。内存(Memory)也被称为内存储器,其作用是用于暂时存放CPU...
  • hellojoy
  • hellojoy
  • 2015年08月19日 16:36
  • 794

innodb buffer pool管理--free list

buf_block_t*     buf_LRU_get_free_block(     buf_pool_t* buf_pool/*! ) 功能: 访问数据页的流程。获取空闲的内存块 流程: lo...
  • yanzongshuai
  • yanzongshuai
  • 2017年06月25日 08:45
  • 233

Linux系统下buffer内存与cache内存的区别

Linux系统下的内存查看命令查看的结果会有buffer和cache两个值,从字面上理解两者的含义都是缓存,但为什么要分开呢,原因是两者的用途不同。buffer缓存是针对块设备的缓存,是将磁盘中的数据...
  • victory08
  • victory08
  • 2015年08月24日 19:21
  • 571

如何在内存中申请大量内存

在内核模块中申请分配内存需要使用内核中的专用API:kmalloc、vmalloc、kzalloc、kcalloc、get_free_pages;当然,设备驱动程序也不例外; 对于提供了MMU功能的...
  • xieyihua1994
  • xieyihua1994
  • 2016年10月20日 08:58
  • 861

C++内存分配秘籍—new,malloc,GlobalAlloc详解 (害怕作者删帖所以转过来喽)

                                        C++内存分配秘籍—new,malloc,GlobalAlloc详解                          ...
  • zxxyyxf
  • zxxyyxf
  • 2011年06月17日 14:52
  • 828

list与vector容器如何处理才能避免内存增长?

Vector容器如何清理? 典型的清理方式是在栈上定义一个空的vector,然后让使用过的vector与之swap。vector容器类的元素连续存放在一块内存区域中,所以删除部分甚至是全部元...
  • batmancn
  • batmancn
  • 2015年11月26日 15:20
  • 818
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:分配大块内存与list列表buffer关联的思考
举报原因:
原因补充:

(最多只允许输入30个字)