PJM软件数据结构分析(怎样有效地避免内存泄露)

来源:互联网 发布:用英文介绍人工智能 编辑:程序博客网 时间:2024/04/28 22:46
 

PJM 软件数据结构方面组织的还是不错的;

typedef struct PjmsPktHeader {

    int msgcode;                /*!< 銉°儍銈汇兗銈搞偝銉笺儔*/

    int errcode;                /*!< 銈ㄣ儵銉笺偝銉笺儔*/

    int16_t rscunit_id;         /*!< 銉︺儖銉冦儓ID*/

    int16_t reserved[3];        /*!< 浜堢磩*/

    struct timespec send_date;  /*!< 閫佷俊鏅傚埢*/

    struct timespec recv_date;  /*!< 鍙椾俊鏅傚埢*/

    ssize_t data_size;          /*!< 銉囥兗銈裤偟銈ゃ偤 */

    uint64_t data[0];           /*!< 銉囥兗銈块牁鍩?*/

} PjmsPktHeader_t;

里面的data种类多了;

PjmsPktHeader_t *pktdata_p

PjmsReqJobStart_t *job_start_p = NULL;

job_start_p = (PjmsReqJobStart_t *)pktdata_p->data;

 

typedef struct PjmsReqJobStart {       

    RmSjid_t       subjobid;            /*!< 銈搞儳銉朓D*/

    uint32_t       job_type;            /*!< 銈搞儳銉栥偪銈ゃ儣*/

    int32_t        reserved;            /*!< 浜堢磩*/

    PjmsVparam_t   vparam;              /*!< 灞炴€ф儏鍫?/

    PjmsExecUnit_t execunit;            /*!< 瀹熻鍗樹綅鎯呭牨銇搞伄銈儠銈汇儍銉?/

    int            num_fshare;          /*!< 銉曘偋銈偡銈с偄鎯呭牨鏁?*/

    int32_t        num_gionode;         /*!< 浣跨敤銇欍倠GIO銉庛兗銉夋暟. 銈广儐銉笺偢銉炽偘銈搞儳銉栦互澶栥伅0*/

    off_t          fshare_off;          /*!< 銉曘偋銈偡銈с偄鎯呭牨銇搞伄銈儠銈汇儍銉?*/

    off_t          gionode_list_off;    /*!< GIO銉庛兗銉塈D銇儶銈广儓銇搞伄銈儠銈汇儍銉? 銈广儐銉笺偢銉炽偘銈搞儳銉栦互澶栥伅0*/

} PjmsReqJobStart_t;

这样的话,有几个好处:(注意:其中1的好处是靠FJ那边能实现个功能,即把结构体里的off_t变量指向的内存空间都释放了,只有这个功能实现了,才能谈得上正确的内存释放

1:释放内存操作很简便的,直接释放pktdata_p就行了,后面的PjmsReqJobStart_t 结构体以及它附带的一些结构体内存分配(靠off_t实现的)可以被跟随着就释放了,从而避免担心内存泄露问题;

2:统一的报头格式PjmsPktHeader_t

3:利用off_t 形式可以将紧跟着PjmsReqJobStart_t后面的内存分配空间跟PjmsReqJobStart_t中的off型变量连接在一块,通过该off型变量就可以直接引用到PjmsReqJobStart_t后面的内存分配空间中的东西

4:这种结构体后带有后缀内存分配区域形式可以使内存利用更加紧凑;

5:PJMD和PJSD的通信就是这些数据包的传递来进行的,而这些数据包利用完后,又可以及时的释放,从而回收了内存,利用数据包的传递来进行PJSD的工作,也可以避免在PJSD中的零散小内存泄露

 

内存泄露现象怎么避免,有时感觉是架构设计方面的问题;

比如在running_exec函数及其调用子函数中

是两个数据在流动的,target_p 和 PjmsPktHeader_t型数据

靠这两个数据的流动,来完成函数主要功能和避免内存泄露(因为释放内存只要考虑着这两个数据就行了)

 

内存泄露可以通过集中数据的通信流来避免,就是不要随意的calloc出独立(要calloc出和其他结构体相关联的内存空间)的内存空间,通过将内存分配集中到几个主要数据结构体,并靠着这几大数据结构体来完成PJSD的主要功能,通过这种形式来避免内存泄露现象发生

 

虽然黑体部分的现象发现的晚,但感觉靠着数据通信的相互作用来促使完成PJSD功能的办法,是能够避免内存泄露的。

 

PJM软件的内存泄露主要集中在off_t型的变量没办法释放这一块。

 

又看了一遍,感觉那个黑体部分是不会出现内存泄露问题,因为

Free的原型是这样的:

void free(void *ptr);   

void *calloc(size_t nmemb, size_t size);

void *malloc(size_t size);

 

所以黑体部分的担心是多余的,所以PJM软件的这种数据结构组织还是不错的

上网查了查malloc函数的实现,搜到信息说如果用malloc分配的空间size这个值为2的整数倍的话,就会以后malloc的内存分配速度会大大加快,真的如此吗,还有待考证

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 肾结石因运动引起尿血怎么办 宝宝大便镜检阳性潜血怎么办 尿不尽刺痛带血怎么办 狗狗拉肚子拉血怎么办 肾血肿怎么办才吸收快 体检尿蛋白高3怎么办 肾炎会引起脸肿怎么办 12小孩尿蛋白3是怎么办 肝癌介入手术后肝功能不好怎么办 屁多且臭便秘怎么办 肝癌术1年后复发怎么办 怀孕便秘怎么办或大便太干拉不出 肠鸣便秘怎么办多尿 奥司他韦过量怎么办 憋的时间长尿痛怎么办 手过敏了怎么办最简单 肾结石不痛但是有血尿怎么办 儿童医院血液科挂不到号怎么办 搬完重物手抖怎么办 弯腰搬重物腰疼怎么办 搬了重物后腰疼怎么办 例假不走公务员体检血尿怎么办 憋尿久了尿不出来怎么办 憋尿引起的总有尿意怎么办 如果孕妇憋尿了怎么办 孕妇憋尿半个月怎么办 尿憋久了排空后膀胱疼怎么办 胸疼肚子疼不规则流血怎么办 上小便下面会痛怎么办 两岁宝贝憋尿怎么办 打激素脸胖了怎么办 医生写的病历看不懂怎么办 怀孕尿蛋白3个加怎么办 两周岁宝宝牙齿坏掉怎么办 前列缐炎引起尿血怎么办 牙齿牙根长在神经里怎么办 牙齿杀完神经牙根发炎怎么办 牙齿有大洞好疼怎么办 大门牙有蛀牙了怎么办 大门牙蛀牙黑了怎么办 大门牙蛀牙有洞怎么办