著录项信息
专利名称 | 一种高效的内存访问方法 |
申请号 | CN200910109444.8 | 申请日期 | 2009-08-18 |
法律状态 | 权利终止 | 申报国家 | 中国 |
公开/公告日 | 2010-01-20 | 公开/公告号 | CN101630276 |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | G06F9/50 | IPC分类号 | G;0;6;F;9;/;5;0;;;G;0;6;F;1;2;/;0;8查看分类表>
|
申请人 | 深圳市融创天下科技发展有限公司 | 申请人地址 | 上海市杨浦区伟德路6号502-8室
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 融创天下(上海)科技发展有限公司 | 当前权利人 | 融创天下(上海)科技发展有限公司 |
发明人 | 刘骁 |
代理机构 | 暂无 | 代理人 | 暂无 |
摘要
本发明涉及一种高效的内存池访问方法,该方法具体步骤如下:S1:建立内存池,所述内存池由若干内存块组成,启动一个具多线程的应用程序,首先保证占用内存的两线程读写方向相同;S2:当第一线程去访问第二线程的当前块内写指针时,一定要确保第一线程对当前块内写指针的改变在汇编层上是最后一条指令,也就是此指令执行后,后面的指令将不会在有任何与内存块相关的写操作了,即要保证第一线程写完数据后,再让第二线程来读取该数据;S3:当第一线程访问第二线程的读指针时,第二线程一定要确保第二线程对当前块内读指针的改变在汇编层上是最后一条指令,也就是此指令执行后,后面的指令将不会在有任何与内存块相关的读操作了。
1.一种高效的内存池访问方法,其特征在于,该方法具体步骤如下:
S1:建立内存池,所述内存池由若干内存块组成,启动一个具多线程的应用程序,首先保证占用内存的两线程读写方向相同;
S2:当第一线程去访问第二线程的当前块内写指针时,一定要确保第一线程对当前块内写指针的改变在汇编层上是最后一条指令,也就是此指令执行后,后面的指令将不会在有任何与内存块相关的写操作了,即要保证第一线程写完数据后,再让第二线程来读取该数据;
S3:当第一线程访问第二线程的读指针时,第二线程一定要确保第二线程对当前块内读指针的改变在汇编层上是最后一条指令,也就是此指令执行后,后面的指令将不会在有任何与内存块相关的读操作了。
2.如权利要求1所述的高效的内存池访问方法,其特征在于,所述“保证占用内存的两线程读写方向相同”具体为:
建立循环链表,并确定所述循环链表的指针方向,保证占用内存的两线程读写方向相同。
3.如权利要求1所述的高效的内存池访问方法,其特征在于,所述步骤S2与S3中汇编层上是最后一条指令即为原子操作,即在步骤S2可以保证写操作不会被中断,以及可以保证在步骤S3中的读操作不会被中断。
4.如权利要求2所述的高效的内存池访问方法,其特征在于,所述步骤S3中确保第一线程的写指针不同于第二线程的读指针所在的内存块。
5.如权利要求2所述的高效的内存池访问方法,其特征在于,所述步骤S3中第二线程至少读完第一个内存块后,所述第二线程才开始进行写操作。
6.如权利要求5所述的高效的内存池访问方法,其特征在于,步骤S3中若判断出第一线程的写指针将写入第二线程的读指针所在的内存块时,则申请一个新空闲内存块插入于第一线程的写指针所在的内存块以及与该内存块相邻的下一内存块之间。
7.如权利要求1所述的高效的内存池访问方法,其特征在于,每一内存块大小为64kb大小。
8.如权利要求1所述的高效的内存池访问方法,其特征在于,CPU进行循环访问内存或缓存的拷贝操作,保证地址边界对齐,能发挥CPU数据访问的最大潜力,从而提高块拷贝性能。
一种高效的内存访问方法\n技术领域\n[0001] 本发明涉及数据处理领域,具体地说,涉及一种高效的内存访问方法。\n背景技术\n[0002] 对应用程序来说,进程就像一个大容器。在应用程序被运行后,就相当于将应用程序装进容器里了,你可以往容器里加其他东两(如:应用程序在运行时所需的变量数据、需要引用的DLL文件等),当应用程序被运行两次时,容器里的东两并不会被倒掉,系统会找一个新的进程容器来容纳它。\n[0003] 进程是由进程控制块、程序段、数据段三部分组成。一个进程可以包含若干线程(ThreS1d),线程可以帮助应用程序同时做几件事(比如一个线程向磁盘写入文件,另一个则接收用户的按键操作并及时做出反应,互相不干扰),在程序被运行后中,系统首先要做的就是为该程序进程建立一个默认线程,然后程序可以根据需要自行添加或删除相关的线程。是可并发执行的程序。在一个数据集合上的运行过程,是系统进行资源分配和调度的一个独立单位,也是称活动、路径或任务,它有两方面性质:活动性、并发性。进程可以划分为运行、阻塞、就绪三种状态,并随一定条件而相互转化:就绪--运行,运行--阻塞,阻塞--就绪。\n[0004] 进程是操作系统结构的基础;是一个正在执行的程序;计算机中正在运行的程序实例;可以分配给处理器并由处理器执行的一个实体;由单一顺序的执行显示,一个当前状态和一组相关的系统资源所描述的活动单元。\n[0005] 进程为应用程序的运行实例,是应用程序的一次动态执行。我们可以简单地理解为:它是操作系统当前运行的执行程序。在系统当前运行的执行程序里包括:系统管理计算机个体和完成各种操作所必需的程序;用户开启、执行的额外程序,当然也包括用户不知道,而自动运行的非法程序(它们就有可能是病毒程序)。\n[0006] 进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。显然,程序是死的(静态的),进程是活的(动态的)。进程可以分为系统进程和用户进程。凡是用于完成操作系统的各种功能的进程就是系统进程,它们就是处于运行状态下的操作系统本身;用户进程就是所有由你启动的进程。进程是操作系统进行资源分配的单位。\n[0007] 线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。\n[0008] 线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程。\n[0009] 线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文。多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定。线程的运行中需要使用计算机的内存资源和CPU。\n[0010] 目前嵌入式操作系统的一个特点:内核支持多线程抢占。在两个线程访问同一个内存池时通俗的方法是加入互斥锁来防止数据访问出错,如果两个线程对内存池的访问频率极高,那么因为互斥带来的系统消耗是很高的。测试表明会将低5倍性能,经过一段时间的考究和钻研,目前可以把互斥锁去掉,节约了额外的系统消耗。这将在提高了手机流媒体系统的性能。\n[0011] 另外,内存拷贝通常既频繁又量大,如果源内存块和目标内存块的选择很随意,将会造成拷贝性能大大降低。\n[0012] 鉴于此,实有必要提出一种改进的方法以克服现有技术的缺陷。\n发明内容\n[0013] 本发明提供一种高效的内存池访问方法,该方法具体步骤如下:\n[0014] S1.建立内存池,所述内存池由若干内存块组成,启动一个具多线程的应用程序,首先保证占用内存的两线程读写方向相同;\n[0015] S2.当第一线程去访问第二线程的当前块内写指针时,一定要确保第一线程对当前块内写指针的改变在汇编层上是最后一条指令,也就是此指令执行后,后面的指令将不会在有任何与内存块相关的写操作了,即要保证第一线程写完数据后,再让第二线程来读取该数据;\n[0016] S3.当第一线程访问第二线程的读指针时,第二线程一定要确保第二线程对当前块内读指针的改变在汇编层上是最后一条指令,也就是此指令执行后,后面的指令将不会在有任何与内存块相关的读操作了。\n[0017] 本发明的有益效果在于,测试表明会将低5倍性能,经过一段时间的考究和钻研,目前可以把互斥锁去掉,节约了额外的系统消耗。这将在提高了手机流媒体系统的性能。嵌入式系统最重要的就是资源和性能的提高,同时也是判断一个高质量产品的关键因素,以上两点体现了针对性能的提高和CPU资源的节省。\n附图说明\n[0018] 图1为本发明方法流程示意图;\n[0019] 图2为本发明方法实施例中第一线程读指针访问第二线程写指针的示意图;\n[0020] 图3为本发明方法实施例中第一线程写指针访问第二线程读指针的示意图。\n具体实施方式\n[0021] 下面结合附图来说明本发明具体实施。\n[0022] 如图1所示为本发明方法流程框图,具体步骤如下:\n[0023] S1:建立内存池,所述内存池由若干内存块组成,启动一个具多线程的应用程序,首先保证占用内存的两线程读写方向相同;\n[0024] S2:当第一线程读指针去访问第二线程的当前块内写指针时,一定要确保第一线程对当前块内写指针的改变在汇编层上是最后一条指令,也就是此指令执行后,后面的指令将不会在有任何与内存块相关的写操作了,即要保证第一线程写完数据后,再让第二线程来读取该数据;\n[0025] S3:当第一线程访问第二线程的读指针时,第二线程一定要确保第二线程对当前块内读指针的改变在汇编层上是最后一条指令,也就是此指令执行后,后面的指令将不会在有任何与内存块相关的读操作了。\n[0026] 请参照图2,具体地说明步骤S2中第一线程的读指针访问第二线程的写指针,也即当第二线程完成写操作后,第一线程在于相同的共享内存进行读操作的过程,首先建立由内存块10、11、12、13、14以及15以链表的形式组成的内存池,每一内存块大小为64kb,在这里以链表的形式组成内存池是公知的,但并不对本发明造成限制,图中w表示第二线程的写指针,r表示第一线程的读指针,在这里相当于第二线程先写入数据后,第一线程再进行读数据,第二线程每次写数据以及第一线程每次读数据都是以一个数据包的大小为周期,例如,首先第二线程写入一个大小为10kb字节的数据包,则第二线程不写入数据,等待第一线程将这个大小为10kb字节的数据包读完再进行写入数据,另外图中20表示在链表中w指针以及r指针的移动方向,为了区别于现有技术中通过加入互斥锁来给定某一线程具有对内存的访问权限,本方法在第二线程先写入一个完整的数据包后,写指针的改变在汇编层上是最后一条指令,例如,开始时写指针w与读指重合,首先第二线程在内存块10写入一个数据包后,内存块使用的空间实际移到了w’所指示的位置,但还需通过一条汇编层上的指令将指针w移动至w’,也即将w’的指针值赋于w,由于指针w改变至w’是一个汇编层上的指令即为原子操作,步骤S2可以保证写操作不会被中断,此后第一线程开始读数据,第一线程的读指针r从开始位置移至w’位置,同理,当第一线程的读完一个数据包,即r从开始位置移至w’位置,第一线程的读取动停止,第二线程开始写入另一个数据包,写完后写指针的改变通过一条汇编指令从w’移至w”,即将w”指针值赋给第二线程的读指针w,接着第一线程开始读第二个数据包,以此类推。在这里写和读都是相同大小的数据包。\n[0027] 请参照图3,具体地说明步骤S3中第一线程的写指针访问第二线程的读指针,此过程恰好与步骤S2相反,也即当第二线程完成读操作后,第一线程在于相同的共享内存进行写操作的过程,与步骤S2不同的是,第二线程读完一个数据包后即释放该数据包占有的内存空间,例如图3中第二线程的读指针w从开始位置w(r)即第一线程的w指针与第二线程的r指针重合位置移动至r’位置,代表第二线程读完一个数据包,而r改变为r’也是通过一条汇编指令,因此读操作不会被中断,当释放一个数据包的空间后,第一线程在被释放的内存空间进行写操作,由于第一线程写操作写入的数据大小为未知的,写入的数据有可能比第二线程释放的空间大,也可能比释放的空间小,这不同于步骤S2中先写后读的过程,因此有必要作出改进,如果第一线程要写入的数据比第二线程释放的空间大则造成无法写入,因此本方案中可以设计在第一线程写入数据包时先判断当前写入的内存块是否是第二线程读指针所在的内存块,如图3中所示,第一线程将写入数据包所在的块以及第二线程读指针所在的内存块均为内存块10,则此时首先在内存块10中已经释放的空间写入数据,再申请一个新的内存块16插入于内存块10与11之间,在内存块10写不下的数据则继续在新内存块16中写入,对于第二线程读操作则不受影响,其仍然按照链表顺序在读完内存块10的数据后依次读取内存块11、12、13、14、15中的数据,因此可以将确保第一线程的写指针不同于第二线程的读指针所在的内存块。\n[0028] 另外,也可以设计成第二线程至少读完第一个内存块后,所述第二线程才开始进行写操作,例如在第二线程读完内存块10的数据后,第一线程才开始从内存块10释放的空间开始写入数据,这样可以不通过申请新的内存块,也可以保证第一线程写入数据保证完成而不出错。\n[0029] 本发明把互斥锁去掉,节约了额外的系统消耗。嵌入式系统最重要的就是资源和性能的提高,同时也是判断一个高质量产品的关键因素,以上两点体现了针对性能的提高和CPU资源的节省。将本发明方法应用这手机流媒体系统,将在提高了手机流媒体系统的性能。\n[0030] 通常进行拷贝操作对CPU来说就是一个循环访问内存或缓存,保证地址边界对齐,能发挥CPU数据访问的最大潜力,从而提高块拷贝性能,基于32位(数据总线带款32位)的CPU系统上,一次RS1M访问可以达到32位(字大小),又因为访问32位的数据要保证32位地址边界对齐,才不会使访问到的数据因位置问题而要进行额外的寄存器逻辑操作。这样可以进一步提高拷贝操作的速度。\n[0031] 以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
法律信息
- 2017-10-10
未缴年费专利权终止
IPC(主分类): G06F 9/50
专利号: ZL 200910109444.8
申请日: 2009.08.18
授权公告日: 2012.12.19
- 2015-07-01
专利权的转移
登记生效日: 2015.06.10
专利权人由深圳市融创天下科技有限公司变更为融创天下(上海)科技发展有限公司
地址由518057 广东省深圳市南山区高新区南区科技南十二路18号长虹科技大厦19楼变更为200433 上海市杨浦区伟德路6号502-8室
- 2014-12-17
专利权人的姓名或者名称、地址的变更
专利权人由深圳市融创天下科技股份有限公司变更为深圳市融创天下科技有限公司
地址由518057 广东省深圳市南山区高新区南区科技南十二路18号长虹科技大厦19楼变更为518057 广东省深圳市南山区高新区南区科技南十二路18号长虹科技大厦19楼
- 2012-12-19
- 2010-07-14
实质审查的生效
IPC(主分类): G06F 9/50
专利申请号: 200910109444.8
申请日: 2009.08.18
- 2010-01-20
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2008-10-22
|
2008-06-03
| | |
2
| |
2008-01-23
|
2006-07-20
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |