CN102508783A - 一种避免数据混乱的内存回收方法 - Google Patents
一种避免数据混乱的内存回收方法 Download PDFInfo
- Publication number
- CN102508783A CN102508783A CN2011103151211A CN201110315121A CN102508783A CN 102508783 A CN102508783 A CN 102508783A CN 2011103151211 A CN2011103151211 A CN 2011103151211A CN 201110315121 A CN201110315121 A CN 201110315121A CN 102508783 A CN102508783 A CN 102508783A
- Authority
- CN
- China
- Prior art keywords
- data
- skb
- data block
- buff
- storage area
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 238000011084 recovery Methods 0.000 title claims abstract description 23
- 238000000034 method Methods 0.000 title claims abstract description 22
- 238000013500 data storage Methods 0.000 claims description 38
- 238000004064 recycling Methods 0.000 claims description 22
- 238000013480 data collection Methods 0.000 claims description 8
- 230000015572 biosynthetic process Effects 0.000 claims description 7
- 238000007689 inspection Methods 0.000 claims description 4
- 238000005516 engineering process Methods 0.000 abstract description 5
- 241001269238 Data Species 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 230000009897 systematic effect Effects 0.000 description 1
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Memory System (AREA)
Abstract
一种避免数据混乱的内存回收方法,涉及网络设备中内存的回收技术,具体是Linux系统下SKB的回收技术,特别地,涉及一种处理经过skb_clone后的SKB的回收方法。本方法在网络设备中增设内存回收模块,在SKB数据块的sk_buff结构中增设存储数据块标志信息和指向内存回收模块的存储单元,根据标志信息分别回收SKB数据块中的sk_buff结构和数据存储区,两部分都回收后再将SKB数据块加入到数据接收队列中,这样可以避免数据混乱。
Description
技术领域
本发明涉及网络设备中内存的回收技术,具体是Linux系统下SKB的回收技术,特别地,涉及一种处理经过skb_clone后的SKB的回收方法。
背景技术
Linux作为一种通用的网络操作系统,正越来越被广泛的应用于各种终端设备中。
网络设备启动时,首先从系统中分配N块SKB数据块,N的值是根据内存多少来设定的,一般是8M内存N设定50,16M内存N设定200,32M内存N设定400。将数据块加入到网络设备的接收队列中, SKB有两部分组成,一个为sk_buff结构,用来记录报文的相关信息,另一个为数据存储区,保存报文的具体的数据。当网络设备收到一个报文时,需要申请SKB作为数据缓冲区。报文处理完成后,整个SKB数据块,包括sk_buff结构和数据存储区被回收,再次加入到网络设备的接收队列中,准备存储其他报文数据。
一般情况下,SKB的两个部分是在一起进行处理的,回收时两部分一起回收。
当同一个SKB需要由系统中不同的过程分别处理时,系统会使用另外一个sk_buff结构和数据存储区关联起来,这个过程叫做skb_clone,这时会有两个sk_buff结构和数据存储区关联,一个是原有的sk_buff结构,另一
个是通过skb_clone生成的sk_buff结构,另外数据存储区中记录被引用次数的计数器加一,为叙述方便,我们分别称之为sk_buff_orig和sk_buff_clone。sk_buff_clone由系统统一管理,不在上述SKB数据块中,不需要回收。
这时,在下面情况下会出现问题:当sk_buff_orig先释放时,SKB数据块,既sk_buff_orig和数据存储区都被回收,SKB数据块加入到网络设备的接收队列中,此时该SKB数据块的数据存储区还关联着sk_buff_clone。如果在sk_buff_clone结构释放之前该SKB数据块被再次使用,则与sk_buff_clone关联的数据存储区会被覆盖,造成数据混乱,产生错误。
更复杂的情况是,sk_buff_orig和 sk_buff_clone都有可能会被再次执行skb_clone,产生更多的sk_buff结构与数据存储区关联。
在现有的处理方式下,只能是在所有执行skb_clone所产生的sk_buff结构都释放掉以后再释放最早分配的sk_buff,否则就有可能出现数据被覆盖的问题,这也限制了程序员在编程过程中的思路。
发明内容
本发明的目的是解决上述问题,提供一种处理经过skb_clone过程的SKB的回收方法。
本发明采用的技术方案是:一种避免数据混乱的内存回收方法,本方法的实现借助于运行Linux系统的网络设备,网络设备通过接口连接到外部网络,网络设备驱动程序在内存中分配N个SKB数据块用来接收数据,SKB数据块包括sk_buff结构和数据存储区,N根据网络设备中的内存总量确定,特别是:网络设备中增设内存回收模块,在SKB数据块的sk_buff结构中增设存储数据块标志信息和指向内存回收模块的存储单元,处理时包含以下步骤:
A、网络设备收到数据时,分配一个SKB数据块,初始化该数据块的sk_buff结构,设置结构中指向内存回收模块的存储单元,将数据块标志信息设置为回收sk_buff结构和数据存储区;
B、在系统执行skb_clone时检查原有sk_buff结构中的数据块标志信息字段,判断是否包含回收数据存储区的设置,如果是则设置新的sk_buff结构中数据块标志信息字段为回收数据存储区,此时数据存储区中的计数器加一;
C、在系统释放数据时,检查数据块标志信息字段,如果设置了需要回收sk_buff结构或数据存储区的标志,则执行增设的内存回收模块,否则执行正常的释放过程;
D、增设的内存回收模块执行过程包含以下步骤:
如果当前回收的是sk_buff结构,则设置结构中的数据块标志信息,表示skb_buff结构已经回收;如果当前回收的是数据存储区,计数器减一,如果计数器为0,根据数据存储区找到该SKB的skb_buff结构,并设置该结构中的数据块标志信息,表示据存储区已经回收;判断数据块标志信息,如果据skb_buff结构和数据存储区都已回收,则将SKB数据块加入到数据接收队列中。
sk_buff结构中增设的存储数据块标志信息的存储单元是recycle_flags和recycled_flags,所述的sk_buff结构中增设的指向内存回收模块的存储单元是recycle_hook。
网络设备启动时,系统从内存中分配N块SKB数据块专门用来接收网络数据,需要时从其中分配,使用完后系统回收,准备接收其他的数据。SKB有两部分组成,一个为sk_buff结构,用来记录报文的相关信息,另一个为数据存储区,保存报文的具体的数据。
SKB数据块存储区中有一个计数器,当该SKB数据块被使用时,计数器置1,表示有一个skb_buff结构与其关联。当执行skb_clone时,计数器加1,表示增加了一个skb_buff结构与其关联。执行skb_clone产生的skb_buff结构不在分配好的N块SKB数据块中,因此不需要回收。
本发明根据SKB数据块中的skb_buff结构和数据存储区是否都已经回收来判断SKB数据块是否可以重新分配使用,避免了数据混乱,同时为程序员提供一个更好的编程环境。
附图说明
图1是SKB数据块的结构。
图2是执行skb_clone后SKB数据块的结构。
图3是内存回收模块的功能框图。
具体实施方式
一种避免数据混乱的内存回收方法,本方法的实现借助于运行Linux系统的网络设备,网络设备通过接口连接到外部网络,网络设备驱动程序在内存中分配N个SKB数据块用来接收数据,SKB数据块包括sk_buff结构和数据存储区,N根据网络设备中的内存总量确定,特别是:网络设备中增设内存回收模块,在SKB数据块的sk_buff结构中增设存储数据块标志信息和指向内存回收模块的存储单元,处理时包含以下步骤:
A、网络设备收到数据时,分配一个SKB数据块,初始化该数据块的sk_buff结构,设置结构中指向内存回收模块的存储单元,将数据块标志信息设置为回收sk_buff结构和数据存储区;
B、在系统执行skb_clone时检查原有sk_buff结构中的数据块标志信息字段,判断是否包含回收数据存储区的设置,如果是则设置新的sk_buff结构中数据块标志信息字段为回收数据存储区,此时数据存储区中的计数器加一;
C、在系统释放数据时,检查数据块标志信息字段,如果设置了需要回收sk_buff结构或数据存储区的标志,则执行增设的内存回收模块,否则执行正常的释放过程;
D、增设的内存回收模块执行过程包含以下步骤:
如果当前回收的是sk_buff结构,则设置结构中的数据块标志信息,表示skb_buff结构已经回收;如果当前回收的是数据存储区,计数器减一,如果计数器为0,根据数据存储区找到该SKB的skb_buff结构,并设置该结构中的数据块标志信息,表示据存储区已经回收;判断数据块标志信息,如果据skb_buff结构和数据存储区都已回收,则将SKB数据块加入到数据接收队列中。
sk_buff结构中增设的存储数据块标志信息的存储单元是recycle_flags和recycled_flags,所述的sk_buff结构中增设的指向内存回收模块的存储单元是recycle_hook。
下面结合附图对本实用新型进行详细说明。
在sk_buff结构中增设recycle_flags和recycled_flags,存储数据块标志
信息,增设recycle_hook,指向内存回收模块的存储单元。
本例中,内存回收模块名称为enet_recycle_skb_or_data。
网络设备收到数据时,初始化该数据块的sk_buff结构,将recycle_hook设置为enet_recycle_skb_or_data,将recycle_flags设置为需要回收sk_buff结构和数据块,清除 recycled_flags。
在系统执行skb_clone时检查旧的sk_buff的recycle_flags字段,判断是否需要回收数据块,如果是则设置新的sk_buff的recycle_flags字段,标记需要回收数据块。
因为执行skb_clone时生成的sk_buff不需要回收,因此标志字段只设置为需要回收数据存储区。
当系统释放数据块,检查数据块标志信息字段,如果没有设置需要回收sk_buff结构或数据存储区的标志,则执行系统原有的释放回收过程。
如果设置了需要回收sk_buff结构或数据存储区的标志,则执行增设内存回收模块,enet_recycle_skb_or_data:
如果参数sk_buff是原始的结构,则回收sk_buff结构和数据存储区,如果参数sk_buff是执行skb_clone生成的结构,由于这个sk_buff结构不需要回收,则只回收数据存储区。
如果当前回收的是sk_buff结构,则设置结构中的recycled_flags,表示skb_buff结构已回收;如果当前回收的是数据存储区,计数器减一,如果计数器为0,根据数据存储区找到该SKB的skb_buff结构,并设置该结构中的recycled_flags,表示据存储区已回收;判断recycled_flags,如果据skb_buff结构和数据存储区都已回收,则将SKB数据块加入到数据接收队列中。
Claims (2)
1.一种避免数据混乱的内存回收方法,本方法的实现借助于运行Linux系统的网络设备,网络设备通过接口连接到外部网络,网络设备驱动程序在内存中分配N个SKB数据块用来接收数据,SKB数据块包括sk_buff结构和数据存储区,N根据网络设备中的内存总量确定,其特征在于:网络设备中增设内存回收模块,在SKB数据块的sk_buff结构中增设存储数据块标志信息和指向内存回收模块的存储单元,处理时包含以下步骤:
A、网络设备收到数据时,分配一个SKB数据块,初始化该数据块的sk_buff结构,设置结构中指向内存回收模块的存储单元,将数据块标志信息设置为回收sk_buff结构和数据存储区;
B、在系统执行skb_clone时检查原有sk_buff结构中的数据块标志信息字段,判断是否包含回收数据存储区的设置,如果是则设置新的sk_buff结构中数据块标志信息字段为回收数据存储区,此时数据存储区中的计数器加一;
C、在系统释放数据时,检查数据块标志信息字段,如果设置了需要回收sk_buff结构或数据存储区的标志,则执行增设的内存回收模块,否则执行正常的释放过程;
D、增设的内存回收模块执行过程包含以下步骤:
如果当前回收的是sk_buff结构,则设置结构中的数据块标志信息,表示skb_buff结构已经回收;如果当前回收的是数据存储区,计数器减一,如果计数器为0,根据数据存储区找到该SKB的skb_buff结构,并设置该
结构中的数据块标志信息,表示据存储区已经回收;判断数据块标志信息,如果据skb_buff结构和数据存储区都已回收,则将SKB数据块加入到数据接收队列中。
2.据权利要求1所述的一种避免数据混乱的内存回收方法,其特征在于:所述的sk_buff结构中增设的存储数据块标志信息的存储单元是recycle_flags和recycled_flags,所述的sk_buff结构中增设的指向内存回收模块的存储单元是recycle_hook。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201110315121.1A CN102508783B (zh) | 2011-10-18 | 2011-10-18 | 一种避免数据混乱的内存回收方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201110315121.1A CN102508783B (zh) | 2011-10-18 | 2011-10-18 | 一种避免数据混乱的内存回收方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102508783A true CN102508783A (zh) | 2012-06-20 |
CN102508783B CN102508783B (zh) | 2014-04-09 |
Family
ID=46220874
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201110315121.1A Expired - Fee Related CN102508783B (zh) | 2011-10-18 | 2011-10-18 | 一种避免数据混乱的内存回收方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102508783B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2014127684A1 (zh) * | 2013-02-22 | 2014-08-28 | 华为技术有限公司 | 内存回收方法及装置 |
CN106453022A (zh) * | 2016-09-14 | 2017-02-22 | 上海斐讯数据通信技术有限公司 | 一种网络设备和数据包发送方法 |
CN106572036A (zh) * | 2016-11-09 | 2017-04-19 | 杭州迪普科技股份有限公司 | 一种套接字缓存skb管理方法及装置 |
CN112702426A (zh) * | 2020-12-23 | 2021-04-23 | 北京天融信网络安全技术有限公司 | 数据包转发方法、装置、电子设备及存储介质 |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20020106117A1 (en) * | 2000-12-13 | 2002-08-08 | Bartell Daniel M. | Systems and computer software products for comparing microarray spot intensities |
CN1545034A (zh) * | 2003-11-26 | 2004-11-10 | 中国人民解放军国防科学技术大学 | 片内多处理器局部cache一致性的双环监听方法 |
CN101135980A (zh) * | 2006-08-29 | 2008-03-05 | 飞塔信息科技(北京)有限公司 | 一种基于Linux操作系统实现零拷贝的装置和方法 |
US20080126622A1 (en) * | 2006-11-28 | 2008-05-29 | Eliezer Tamir | Method and System for Optimizing CPU Performance for Network Ingress Flow |
US20080201548A1 (en) * | 2007-02-16 | 2008-08-21 | Mosaid Technologies Incorporated | System having one or more memory devices |
US20090310611A1 (en) * | 2007-12-18 | 2009-12-17 | Marius Lazar | Method and device for communication between multiple sockets |
CN101739301A (zh) * | 2009-12-09 | 2010-06-16 | 南京联创科技集团股份有限公司 | Unix环境下进程间大量数据传输的方法 |
CN101789959A (zh) * | 2009-12-30 | 2010-07-28 | 北京天融信科技有限公司 | 一种多核系统中的skb重用方法及装置 |
-
2011
- 2011-10-18 CN CN201110315121.1A patent/CN102508783B/zh not_active Expired - Fee Related
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20020106117A1 (en) * | 2000-12-13 | 2002-08-08 | Bartell Daniel M. | Systems and computer software products for comparing microarray spot intensities |
CN1545034A (zh) * | 2003-11-26 | 2004-11-10 | 中国人民解放军国防科学技术大学 | 片内多处理器局部cache一致性的双环监听方法 |
CN101135980A (zh) * | 2006-08-29 | 2008-03-05 | 飞塔信息科技(北京)有限公司 | 一种基于Linux操作系统实现零拷贝的装置和方法 |
US20080126622A1 (en) * | 2006-11-28 | 2008-05-29 | Eliezer Tamir | Method and System for Optimizing CPU Performance for Network Ingress Flow |
US20080201548A1 (en) * | 2007-02-16 | 2008-08-21 | Mosaid Technologies Incorporated | System having one or more memory devices |
US20090310611A1 (en) * | 2007-12-18 | 2009-12-17 | Marius Lazar | Method and device for communication between multiple sockets |
CN101739301A (zh) * | 2009-12-09 | 2010-06-16 | 南京联创科技集团股份有限公司 | Unix环境下进程间大量数据传输的方法 |
CN101789959A (zh) * | 2009-12-30 | 2010-07-28 | 北京天融信科技有限公司 | 一种多核系统中的skb重用方法及装置 |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2014127684A1 (zh) * | 2013-02-22 | 2014-08-28 | 华为技术有限公司 | 内存回收方法及装置 |
CN106453022A (zh) * | 2016-09-14 | 2017-02-22 | 上海斐讯数据通信技术有限公司 | 一种网络设备和数据包发送方法 |
CN106572036A (zh) * | 2016-11-09 | 2017-04-19 | 杭州迪普科技股份有限公司 | 一种套接字缓存skb管理方法及装置 |
CN112702426A (zh) * | 2020-12-23 | 2021-04-23 | 北京天融信网络安全技术有限公司 | 数据包转发方法、装置、电子设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN102508783B (zh) | 2014-04-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102016788B (zh) | 高效地标记带有大引用集的对象 | |
CN102508783B (zh) | 一种避免数据混乱的内存回收方法 | |
WO2014127684A1 (zh) | 内存回收方法及装置 | |
CN106598725A (zh) | 一种基于Android的Handler防内存泄漏装置及方法 | |
CN112947856B (zh) | 一种内存数据的管理方法、装置、计算机设备及存储介质 | |
CN105302739A (zh) | 一种内存管理方法和装置 | |
CN110750372B (zh) | 基于共享内存的日志系统及日志管理方法 | |
CN103246549B (zh) | 一种数据转存的方法及系统 | |
CN109491606B (zh) | 一种全闪存储空间管理方法、系统、设备及计算机介质 | |
CN108932271B (zh) | 一种文件管理方法及装置 | |
CN106550014A (zh) | 服务器集群中的节点升级方法及装置 | |
CN102902561A (zh) | 数据存储方法及数据存储系统 | |
CN106325758A (zh) | 一种队列存储空间管理方法及装置 | |
CN102694878B (zh) | 一种分段式id分配方法 | |
CN104035928A (zh) | 一种tcam表空间回收的方法及装置 | |
CN105302602A (zh) | 一种云平台应用程序平滑在线升级方法 | |
CN104021085A (zh) | 一种移动终端内存清理方法和装置 | |
CN106909374B (zh) | 一种智能终端关机状态下实现闹钟的方法及智能终端 | |
CN102929676B (zh) | 基于安卓操作系统终端设备的快速适配方法 | |
CN102567377A (zh) | 电子地图数据管理系统及方法 | |
CN101894161A (zh) | 一种用于实时监控的循环事件存取方法和装置 | |
CN103593606B (zh) | 上下文信息管理方法及系统 | |
CN106055663B (zh) | 一种基于双机热备份的视频存储方法 | |
CN105488047A (zh) | 元数据读写方法和装置 | |
CN107301019A (zh) | 一种结合引用引用时间图和容器位表的垃圾回收方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20140409 |
|
CF01 | Termination of patent right due to non-payment of annual fee |