CN102508783A - 一种避免数据混乱的内存回收方法 - Google Patents

一种避免数据混乱的内存回收方法 Download PDF

Info

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
Application number
CN2011103151211A
Other languages
English (en)
Other versions
CN102508783B (zh
Inventor
殷银亮
王志波
汪澜
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Shenzhen Gongjin Electronics Co Ltd
Original Assignee
Shenzhen Gongjin Electronics Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Shenzhen Gongjin Electronics Co Ltd filed Critical Shenzhen Gongjin Electronics Co Ltd
Priority to CN201110315121.1A priority Critical patent/CN102508783B/zh
Publication of CN102508783A publication Critical patent/CN102508783A/zh
Application granted granted Critical
Publication of CN102508783B publication Critical patent/CN102508783B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

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。
CN201110315121.1A 2011-10-18 2011-10-18 一种避免数据混乱的内存回收方法 Expired - Fee Related CN102508783B (zh)

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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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重用方法及装置

Patent Citations (8)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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