作为测试人员角度研究了很多内存相关的东西,当我在51发了博客后,通过反馈,针对我的2篇博客在这里进行补充。

CPU,进程:

http://www.51testing.com/?viewspace-832192

内存:

http://www.51testing.com/?viewspace-832362

首先先讨论内存的相关知识,当我在以上博文提到内存泄漏和频繁的使用new和delete的时候,在同事间讨论了下,实际运用中能够很好的规避方法。

我首先我研究了同事使用的Lookaside List(旁视列表):

旁视列表是一组事先分配的相同尺寸的内存块。当有内存分配请求的时候,系统会遍历这个列表寻找最近的未分配的块。如果未分配的块找到了,分配请求就很快被满足。否则系统必须从分页或不分页内存池去分配。根据列表中分配行为发生的频率,系统会自动调整未分配块的数量来满足分配请求,分配的频率越高,会有越多的块被存储在旁视列表中。当开始从旁视列表分配内存的时候,将获得这些预分配内存块的指针。 保存内存位置的方法,首先我们每次

可以将旁视列表想象成一个内存容器,在初始时,向Windows申请了一块比较大的内存,以后每次申请内存时,不是向Windows申请内存,而是向lookaside对象申请内存.lookaside会智能的避免产生内存漏洞,当其内部有大量未使用的内存时,会自动释放内存给Windows
一般在如下两种情况下使用:1、每次申请固定大小的内存;2、申请和回收操作十分频繁

而我是这么理解,new的时候,把new的地址存进声明为未使用的列表中,当我们用到内存的时候,首先去此列表里面找到没有用到的内存地址,假如有空闲的地址,就把其调来使用,同时把它从未使用的列表中删除,把他加入进声明为已使用的列表。如果未使用链表里为空,就再new一部分内存出来。这样就是一个链表是使用中的,另一个链表是未使用的 。同时我们需要注意的就是跟踪这个内存的走向,在那个地方delete。这样管理的时候需要注意当你用了列表的元素后,不改它的标识位或者不把他移动到别的列表时,就会出现野指针了。

针对内存泄漏,大多的情况就是就是new的没有delete,还有容易泄露的地方是new的一个数组,但是用delete去删除。

然后是关于我写第一个博文时候,说到的信号量的部分,因为工作中信号量用的实在很少,一般用互斥就能够完成大部分的工作。

互斥量用于线程的互斥,信号量用于线程的同步。
这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。
互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。

互斥量值只能为0/1,信号量值可以为非负整数。

也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量是,也可以完成一个资源的互斥访问。
互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。

不知道别的业务,在写性能测试脚本的时候由于很多时候会产生做同样事情的上百个线程,然后几个管理性质的线程的情况,这时候基本上除了管理线程,每个线程都是独立的,只有出现写文件,修改同一变量和访问数据库的时候会出现同时访问资源的现象,使用互斥的锁就能够让资源不会同时被2个线程修改。在更深理解了信号量和互斥的区别后,我就把信号量用在性能测试的一个概念‘集合点’上。因为我需要让很多分布式的客户端同一时间起跑去压一个资源,所以我需要服务器每个管理分布式客户端的线程都要做到尽量小误差的下发冲包命令,这样我就能很准确的知道在每个集合点的并发数对服务器的压力情况是多少了。

C++内存和进程,线程学习补充(内存泄漏,信号量)相关推荐

  1. Linux进程线程学习笔记:运行新程序

    Linux进程线程学习笔记:运行新程序 周银辉 在上一篇中我们说到,当启动一个新进程以后,新进程会复制父进程的大部份上下文并接着运行父进程中的代码,如果我们使新进程不运行原父进程的代码,转而运行另外一 ...

  2. 分页池内存持续增长_鸿蒙内核源码分析(从进程/线程视角看内存)

    这篇文章说说内存,内存的管理是极其复杂的模块,涉及到非常多概念,光地址就有逻辑,线性,物理地址三个,网上文章很多,参差不齐,没有很好基础或实战经验的同学基本得懵掉,本篇最后也有这些概念介绍.系列篇打算 ...

  3. java 内存分配实例_java学习(四) —— 内存分配浅析

    前言 java中有很多类型的变量.静态变量.全局变量及对象等,这些变量在java运行的时候到底是如何分配内存的呢?接下来有必要对此进行一些探究. 基本知识概念: (1)寄存器:最快的存储区, 由编译器 ...

  4. linux 进程原理内存,linux进程通信之共享内存原理(基于linux 1.2.13)

    1 有一个全局的结构体数据,每次需要一块共享的内存时(shmget),从里面取一个结构体,记录相关的信息. struct shmid_ds { // 权限相关 struct ipc_perm shm_ ...

  5. 安装python多少内存_Python进程使用的全部内存?

    在Windows上,您可以使用WMI(主页, 芝士店):def memory(): import os    from wmi import WMI w = WMI('.') result = w.q ...

  6. 深入理解Java虚拟机(第三版)-13.Java内存模型与线程

    13.Java内存模型与线程 1.Java内存模型 Java 内存模型的主要目的是定义程序中各种变量的访问规则,即关注在虚拟机中把变量值存储到主内存和从内存中取出变量值的底层细节 该变量指的是 实例字 ...

  7. c++ fork 进程时 共享内存_c/c++ Linux 进程间通信------共享内存

    1. 什么是共享内存 共享内存(Shared Memory),指两个或多个进程共享一个给定的存储区.进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是 ...

  8. 最大进程线程数 连接数

    ======================== ========================================================= ================= ...

  9. 进程(线程)间同步互斥问题(三) 熟睡的理发师问题

    问题描述: 熟睡的理发师问题描述的是多个进程(线程)之间的通信与同步问题: 有一个理发师的椅子,和n个顾客的椅子 如果有顾客在椅子上等,那么理发师为他剪发,否则理发师就在自己的椅子上睡觉. 如果理发师 ...

最新文章

  1. 一文详解PnP算法原理
  2. python语法详解大全_笔记:Python 语法要点汇总
  3. Altium Designer 09 使用要点:电气连接工具
  4. android 网络图片查看器,Handler的用法
  5. Java基础案例教程
  6. CG CTF MISC 图种
  7. HttpWatch工具简介及使用技巧(转载)
  8. 江苏自学考试计算机网络专业,速看,江苏自考本科计算机网络专业介绍
  9. ubuntu20.04安装edge浏览器
  10. Marketing Cloud里使用了哪个版本的UI5 Odata模型?
  11. 大话设计模式读书笔记(十三) 状态模式
  12. mysql建表语句转hive sql
  13. 超级搜索术5-商业变现/生活便捷
  14. Mac中Safari浏览器转换IE各版本
  15. 西门子atch指令详解_西门子plc指令含义大全详解
  16. 机器学习模型的保存与调用
  17. 智能名片识别系统源码
  18. 实战 | 安服仔用一毛钱维修台伊拉克成色笔记本(上)
  19. 【来日复制粘贴】数据透视表分类不同账龄
  20. Java 反编译工具的使用与对比分析

热门文章

  1. 防火墙在setup进入不了
  2. JAVA 5.17习题
  3. R 中同步进行的多组比较的包:npmc
  4. hybrid环境下划分vlan一个实验 ————一故障分析
  5. kvm虚拟机块对齐问题研究
  6. 区块链共识机制优缺点对比都是什么
  7. 【SSH网上商城项目实战01】整合Struts2、Hibernate4.3和Spring4.2
  8. 传统服务化(SOA)与微服务(Micro Service)的融合之道 1
  9. 创建外网 ext_net - 每天5分钟玩转 OpenStack(104)
  10. 【BUG解析】调用PagerAdapter.notifyDataSetChanged()不更新