一种高效的内存访问方法

文档序号:6576528阅读:153来源:国知局
专利名称:一种高效的内存访问方法
技术领域
本发明涉及数据处理领域,具体地说,涉及一种高效的内存访问方法。
背景技术
对应用程序来说,进程就像一个大容器。在应用程序被运行后,就相当于
将应用程序装进容器里了,你可以往容器里加其他东西(如:应用程序在运行时 所需的变量数据、需要引用的DLL文件等),当应用程序被运行两次时,容器 里的东西并不会被倒掉,系统会找一个新的进程容器来容纳它。
进程是由进程控制块、程序段、数据段三部分组成。 一个进程可以包含若 干线程(ThreSld),线程可以帮助应用程序同时做几件事(比如一个线程向磁盘 写入文件,另一个则接收用户的按键操作并及时做出反应,互相不干扰),在 程序被运行后中,系统首先要做的就是为该程序进程建立一个默认线程,然后 程序可以根据需要自行添加或删除相关的线程。是可并发执行的程序。在一个 数据集合上的运行过程,是系统进行资源分配和调度的一个独立单位,也是称 活动、路径或任务,它有两方面性质活动性、并发性。进程可以划分为运行、 阻塞、就绪三种状态,并随一定条件而相互转化就绪-运行,运行-阻塞, 阻塞--就绪。
进程是操作系统结构的基础;是一个正在执行的程序;计算机中正在运行 的程序实例;可以分配给处理器并由处理器执行的一个实体;由单一顺序的执 行显示, 一个当前状态和一组相关的系统资源所描述的活动单元。
进程为应用程序的运行实例,是应用程序的一次动态执行。我们可以简单 地理解为它是操作系统当前运行的执行程序。在系统当前运行的执行程序里 包括系统管理计算机个体和完成各种操作所必需的程序;用户开启、执行的 额外程序,当然也包括用户不知道,而自动运行的非法程序(它们就有可能是 病毒程序)。
进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动 了一个进程。显然,程序是死的(静态的),进程是活的(动态的)。进程可以分为系统进程和用户进程。凡是用于完成操作系统的各种功能的进程就是系统进
程,它们就是处于运行状态下的操作系统本身;用户进程就是所有由你启动的 进程。进程是操作系统进行资源分配的单位。
线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自 己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个 进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个 线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约, 致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。
线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程 完成不同的工作,称为多线程。
线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个 线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下 文。多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定。线程 的运行中需要使用计算机的内存资源和CPU。
目前嵌入式操作系统的一个特点内核支持多线程抢占。在两个线程访问 同一个内存池时通俗的方法是加入互斥锁来防止数据访问出错,如果两个线程 对内存池的访问频率极高,那么因为互斥带来的系统消耗是很高的。测试表明 会将低5倍性能,经过一段时间的考究和钻研,目前可以把互斥锁去掉,节约 了额外的系统消耗。这将在提高了手机流媒体系统的性能。
另外,内存拷贝通常既频繁又量大,如果源内存块和目标内存块的选择很 随意,将会造成拷贝性能大大降低。
鉴于此,实有必要提出一种改进的方法以克服现有技术的缺陷。

发明内容
本发明提供一种高效的内存池访问方法,该方法具体步骤如下
51. 建立内存池,所述内存池由若干内存块组成,启动一个具多线程的应 用程序,首先保证占用内存的两线程读写方向相同;
52. 当第一线程去访问第二线程的当前块内写指针时, 一定要确保第一线 程对当前块内写指针的改变在汇编层上是最后一条指令,也就是此指令执行 后,后面的指令将不会在有任何与内存块相关的写操作了,即要保证第一线程 写完数据后,再让第二线程来读取该数据;
5S3.当第一线程访问第二线程的读指针时,第二线程一定要确保第二线程 对当前块内读指针的改变在汇编层上是最后一条指令,也就是此指令执行后, 后面的指令将不会在有任何与内存块相关的读操作了。
本发明的有益效果在于,测试表明会将低5倍性能,经过一段时间的考究 和钻研,目前可以把互斥锁去掉,节约了额外的系统消耗。这将在提高了手机 流媒体系统的性能。嵌入式系统最重要的就是资源和性能的提高,同时也是判 断一个高质量产品的关键因素,以上两点体现了针对性能的提高和CPU资源 的节省。


图1为本发明方法流程示意图2为本发明方法实施例中第一线程读指针访问第二线程写指针的示意
图3为本发明方法实施例中第一线程写指针访问第二线程读指针的示意图。
具体实施例方式
下面结合附图来说明本发明具体实施。
如图1所示为本发明方法流程框图,具体步骤如下
Sl:建立内存池,所述内存池由若干内存块组成,启动一个具多线程的应 用程序,首先保证占用内存的两线程读写方向相同;
S2:当第一线程读指针去访问第二线程的当前块内写指针时, 一定要确保 第一线程对当前块内写指针的改变在汇编层上是最后一条指令,也就是此指令 执行后,后面的指令将不会在有任何与内存块相关的写操作了,即要保证第一 线程写完数据后,再让第二线程来读取该数据;
S3:当第一线程访问第二线程的读指针时,第二线程一定要确保第二线程 对当前块内读指针的改变在汇编层上是最后一条指令,也就是此指令执行后, 后面的指令将不会在有任何与内存块相关的读操作了。
请参照图2,具体地说明步骤S2中第一线程的读指针访问第二线程的写 指针,也即当第二线程完成写操作后,第一线程在于相同的共享内存进行读操 作的过程,首先建立由内存块IO、 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, 接着第一线程开始读第二个数据包,以此类推。在这里写和读都是相同大小的 数据包。
请参照图3,具体地说明步骤S3中第一线程的写指针访问第二线程的读 指针,此过程恰好与步骤S2相反,也即当第二线程完成读操作后,第一线程 在于相同的共享内存进行写操作的过程,与步骤S2不同的是,第二线程读完 一个数据包后即释放该数据包占有的内存空间,例如图3中第二线程的读指针 w从开始位置w(r)即第一线程的w指针与第二线程的r指针重合位置移动至r' 位置,代表第二线程读完一个数据包,而r改变为r,也是通过一条汇编指令, 因此读操作不会被中断,当释放一个数据包的空间后,第一线程在被释放的内 存空间进行写操作,由于第一线程写操作写入的数据大小为未知的,写入的数 据有可能比第二线程释放的空间大,也可能比释放的空间小,这不同于步骤 S2中先写后读的过程,因此有必要作出改进,如果第一线程要写入的数据比 第二线程释放的空间大则造成无法写入,因此本方案中可以设计在第一线程写 入数据包时先判断当前写入的内存块是否是第二线程读指针所在的内存块,如图3中所示,第一线程将写入数据包所在的块以及第二线程读指针所在的内存 块均为内存块IO,则此时首先在内存块10中已经释放的空间写入数据,再申 请一个新的内存块16插入于内存块10与11之间,在内存块10写不下的数据 则继续在新内存块16中写入,对于第二线程读操作则不受影响,其仍然按照 链表顺序在读完内存块10的数据后依次读取内存块11、 12、 13、 14、 15中的 数据,因此可以将确保第一线程的写指针不同于第二线程的读指针所在的内存 块。
另外,也可以设计成第二线程至少读完第一个内存块后,所述第二线程才 开始进行写操作,例如在第二线程读完内存块10的数据后,第一线程才开始 从内存块IO释放的空间开始写入数据,这样可以不通过申请新的内存块,也 可以保证第一线程写入数据保证完成而不出错。
本发明把互斥锁去掉,节约了额外的系统消耗。嵌入式系统最重要的就是 资源和性能的提高,同时也是判断一个高质量产品的关键因素,以上两点体现 了针对性能的提高和CPU资源的节省。将本发明方法应用这手机流媒体系统, 将在提高了手机流媒体系统的性能。
通常进行拷贝操作对CPU来说就是一个循环访问内存或缓存,保证好地 址边界对齐可以发挥CPU数据访问的最大潜力,从而提高块拷贝性能,基于 32位(数据总线带款32位)的CPU系统上, 一次RS1M访问可以达到32位 (字大小),又因为访问32位的数据要保证32位地址边界对齐,才不会使访 问到的数据因位置问题而要进行额外的寄存器逻辑操作。这样可以进一步提高 拷贝操作的速度。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发 明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明 的保护范围之内。
权利要求
1、一种高效的内存池访问方法,其特征在于,该方法具体步骤如下S1建立内存池,所述内存池由若干内存块组成,启动一个具多线程的应用程序,首先保证占用内存的两线程读写方向相同;S2当第一线程去访问第二线程的当前块内写指针时,一定要确保第一线程对当前块内写指针的改变在汇编层上是最后一条指令,也就是此指令执行后,后面的指令将不会在有任何与内存块相关的写操作了,即要保证第一线程写完数据后,再让第二线程来读取该数据;S3当第一线程访问第二线程的读指针时,第二线程一定要确保第二线程对当前块内读指针的改变在汇编层上是最后一条指令,也就是此指令执行后,后面的指令将不会在有任何与内存块相关的读操作了。
2、 如权利要求l所述的高效的内存池访问方法,其特征在于,所述保证两 线程读写方向相同通过循环链表的建立可以定向。
3、 如权利要求l所述的高效的内存池访问方法,其特征在于,所述步骤S2 与S3中汇编层上是最后一条指令即为原子操作,即在步骤S2可以保证写操作 不会被中断,以及可以保证在步骤S3中的读操作不会被中断。
4、 如权利要求2所述的高效的内存池访问方法,其特征在于,所述步骤S3 中确保第一线程的写指针不同于第二线程的读指针所在的内存块。
5、 如权利要求2所述的高效的内存池访问方法,其特征在于,所述步骤S3 中第线程至少读完第一个内存块后,所述第二线程才开始进行写操作。
6、 如权利要求5所述的高效的内存池访问方法,其特征在于,步骤S3中 若判断出第一线程的写指针将写入第二线程的读指针所在的内存块时,则申请 一个新空闲内存块插入于第一线程的写指针所在的内存块以及与该内存块相邻 的下一内存块之间。
7、 如权利要求l所述的高效的内存池访问方法,其特征在于,每一内存块 大小为64kb大小。
8、 如权利要求l所述的高效的内存池访问方法,其特征在于,进行拷贝操 作对CPU来说就是一个循环访问内存或缓存,保证好地址边界对齐可以发挥 CPU数据访问的最大潜力,从而提高块拷贝性能。
9、 如权利要求8所述的高效的内存池访问方法,其特征在于,基于32位 的CPU系统上, 一次RS1M访问可以达到32位字大小,又因为访问32位的数 据要保证32位地址边界对齐,才不会使访问到的数据因位置问题而要进行额外 的寄存器逻辑操作。
全文摘要
本发明涉及一种高效的内存池访问方法,该方法具体步骤如下S1建立内存池,所述内存池由若干内存块组成,启动一个具多线程的应用程序,首先保证占用内存的两线程读写方向相同;S2当第一线程去访问第二线程的当前块内写指针时,一定要确保第一线程对当前块内写指针的改变在汇编层上是最后一条指令,也就是此指令执行后,后面的指令将不会在有任何与内存块相关的写操作了,既要保证第一线程写完数据后,再让第二线程来读取该数据;S3当第一线程访问第二线程的读指针时,第二线程一定要确保第二线程对当前块内读指针的改变在汇编层上是最后一条指令,也就是此指令执行后,后面的指令将不会在有任何与内存块相关的读操作了。
文档编号G06F9/50GK101630276SQ20091010944
公开日2010年1月20日 申请日期2009年8月18日 优先权日2009年8月18日
发明者骁 刘 申请人:深圳市融创天下科技发展有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1