8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

1.现代操作系统内存管理主流的操作系统(Windows,Linux)都采用虚拟内存管理的方式,具体说就是:页式管理、段式管理、段页式管理。

操作系统分配资源的单位是进程,所以,内存管理的过程也是以进程为单位的。

进程的地址空间这里的地址空间指的都是虚拟地址空间。

要将进程的地址空间分为两部分:用户空间和内核空间。内核空间中存放内核的代码和数据,这个是用户空间不能随意访问的,只能通过系统调用陷入内核空间。用户空间存放用户的代码和数据。

在Linux32位系统下,将1G用作内核空间,3G用于用户空间。虚拟的,虚拟的,虚拟的。

C++典型的内存分配

一个C++程序运行的时候,操作系统自动为其生成一个PCB,将程序的内容链接到此PCB的虚拟空间中,用户空间的内存模型刚好对应C++程序的内存。

一个C程序对应的内存模型:代码区:存放程序执行的二进制代码,只读。

数据区:已初始化的静态变量和全局变量。编译时就分配好内存

未初始化的静态变量和全局变量。

有的系统将常量放在代码区,而有的放在数据区。

栈区:这就是所说的栈内存,由高地址向低地址增长。

堆区:堆内存,由低地址向高地址增长。

一个C++对应的内存模型

1.栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。

2.堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

3.自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。

4.全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。

5.常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改)

内存分配栈内存分配:

栈内存分配一般由编译器负责分配和释放,栈上存放的是:局部变量,函数返回地址等。

堆内存分配

堆内存的操作,一般由使用者来操作,系统提供了操作堆内存的借口,而且,编程语言也提供了操作堆内存的方法。

堆内存一般是由(malloc/free/new/delete)来操作的。

堆内存的管理

堆内存由大小的限制,而且,操作不需要程序员关心,只需要确保不会栈溢出就好。申请堆内存的过程:

通过malloc第一次申请内存,会触发一个缺页中断,然后陷入内核,通过调用brk系统调用,申请一片大的连续内存地址空间,放到空闲链表。然后,再执行一次刚才引起缺页中断的命令,即(malloc)。

假设操作系统或者一个进程已经获得了一块连续地址的内存,系统或进程在执行过程中需要利用这块内存来满足各种内存请求。由于内存请求存在动态性,即每次请求的内存大小可能不相同,甚至差异很大,并且这些小内存块的生命周期也不尽相同,所以,系统需要提供合适的算法来尽可能地满足这些动态的内存请求。在现代计算机系统中,堆(heap )正是这样一个提供动态内存分配能力的内存抽象。操作系统使用堆来满足各种动态内存请求,应用程序通过堆获得内存。

操作系统对于堆内存的管理,主要有两种方式:位图法

使用这种方法,内存被分为很多以字节划分的单元,然后,用一个类似于数组的东西,用每一位0/1来标记这个内存块空闲或者已被使用。

缺点:位图要占用内存。需要大内存,搜索连续的0较为费时。

空闲链表法

在初始化时,整个空闲的内存被当做一个一个大的链表块,加入到空闲链表中,每当申请内存时,从空闲链表中找一块空的链表并且合适的可满足要求的内存块,取出所需要大小的内存交给申请者。然后,将已分配出去的内存加入到已分配链表中,当此块内存释放的时候,再将其加入到空闲链表中。

所以,针对这种分配法,提出了很多算法最先匹配法(first-fit ),从空闲链表中找到第一个满足客户请求的空闲块。

最佳匹配法(best-fit ),从空闲链表中找到最接近于客户请求大小的空闲块。

最差匹配法(worst-fit),从空闲链表中找到最大的空闲块。

下一个匹配法(next-fit ),从空闲链表的当前位置往后扫描,找到第一个满足客户请求的空闲块。

缺点:通过较多次的分配后,产生大量的内存碎片(因为,每次分配的内存大小不同)。内存碎片又分为外碎片(两块)

而且,实现的时候,一般都是双链表,方便检查两块是否可以合并。

Slab算法

伙伴系统

需要注意的是,1.上述都是针对于虚拟内存的,虚拟内存到物理内存的映射,由一个硬件称为MMU的单元管理。

2.操作系统并没有提供内存管理的这些方法,这些操作都是由库函数完成的。

堆内存和栈内存的区别大小的区别

栈内存,大小限制一般为1MB-2MB

堆内存,普通程序没有限制(2GB-3GB)

增长方向的区别

栈,由高地址向低地址增长

堆,低地址向高地址增长

空间管理的区别

栈,由编译器自动管理,弹栈和压栈,不会产生内存碎片。

堆,手动申请和释放,会产生大量内存碎片。

效率的区别

栈的效率高。现代机器有直接支持栈的指令,寄存器等

堆,是在库函数层面实现的,效率低。而且,栈是进程初始化就分配好的,而堆是动态分配的。

分配方式的区别

栈是编译时分配空间,而堆是动态分配(运行时分配空间)

c语言栈内存和堆内存大小,堆内存和栈内存及C++内存分配相关推荐

  1. C语言程序里全局变量、局部变量、堆、栈内存地址分配

    C语言程序里全局变量.局部变量.堆.栈内存地址分配 1 名词解读 2 基于ubuntu编程,调试验证 2.1 编写文件 2.2 结果分析 3 基于stm32编程,调试验证 3.1 编写代码 3.2 运 ...

  2. JAVA基础-栈与堆,static、final修饰符、内部类和Java内存分配

    JAVA基础-栈与堆,static.final修饰符.内部类和Java内存分配 发布时间: 2013/01/12 22:29 QQ空间 新浪微博 腾讯微博 人人网 豆瓣网 百度空间 百度搜藏 开心网 ...

  3. C/C++ 全局变量和局部变量在内存里的区别?堆和栈

    一.预备知识-程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分  1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈 ...

  4. 一步步优化JVM四:决定Java堆的大小以及内存占用

    到目前为止,还没有做明确的优化工作.只是做了初始化选择工作,比如说:JVM部署模型.JVM运行环境.收集哪些垃圾回收器的信息以及需要遵守垃圾回收原则.这一步将介绍如何评估应用需要的内存大小以及Java ...

  5. 什么是内存中的堆和栈?与数据结构中的堆和栈有什么区别?

    内存中的堆和栈 一直使用堆和栈的相关概念,对内存中(操作系统)中的堆与栈和数据结构中的堆与栈一直不求甚解,这次,突然想起这个问题,在此进行一个简单梳理归纳,如有错误,恳请读者指出. 栈(stack) ...

  6. JVM优化:决定Java堆的大小以及内存占用

    转载:https://blog.csdn.net/zhoutao198712/article/details/7783070    到目前为止,还没有做明确的优化工作.只是做了初始化选择工作,比如说: ...

  7. java为什么内存会无限增大_Java进程的内存无限增长,但是MemoryMXBean报告稳定堆和非堆大小...

    我正在与一个开发在1GB Linux目标系统上运行的Java GUI应用程序的团队合作. 我们有一个问题,我们的java进程使用的内存无限期地增长,直到Linux终于杀死了java进程. 我们的堆内存 ...

  8. 五种内存溢出案例总结:涵盖栈深度溢出、永久代内存溢出、本地方法栈溢出、JVM栈内存溢出和堆溢出

    大家好,我是冰河~~ 相信小伙伴们在平时工作的过程中,或多或少都会遇到一个场景:内存溢出.如果你没有遇到过这个场景,那就说明你是个假的程序员.哈哈,开个玩笑,平时工作过程中,我们确实会遇到这个问题.今 ...

  9. c语言之 malloc函数详解 在堆中动态分配内存malloc和new的区别

    一.原型:extern void *malloc(unsigned int num_bytes); 头文件:#include <malloc.h> 或 #include <alloc ...

最新文章

  1. 每天一个linux命令(20):find命令之exec
  2. IFE JavaScript Task0002-1 小练习1:处理用户输入
  3. Android自定义View探索—生命周期
  4. golang中的优雅中止
  5. rsync 更改配置后, 无需手动重启
  6. CVPR 2018 Siam-RPN:《High Performance Visual Tracking with Siamese Region Proposal Network》论文笔记
  7. java url 处理,URL处理-Java架构师必看
  8. 前端学习(1842):前端面试题之vue组件调用方式
  9. LeetCode 413. 等差数列划分(DP)
  10. java异常处理机制_Java编程中的异常机制
  11. STM32 - CubeMX 的使用实例详细(01.1)- ST-LINK V2 的配置
  12. linux系统里route -n不起作用,Linux系统中的route解析
  13. 如何设计出高端大气、有黑科技感的可视化大屏?
  14. 前端学习之touch.js与swiper学习
  15. Style Report 培训开始啦!!
  16. 高通android刷机工具,步步高工具高通版刷机救砖教程图解
  17. 【88.4】HTTP权威指南
  18. Helen人脸数据集生成人脸分割
  19. 最好用的两个oracle数据库客户端(OB11+osqledit)
  20. 如何在ANSYS 2022R1版本中使用SCDM

热门文章

  1. PHP简单的前后端交互
  2. 明白放心买 看看水货手机有哪些版本
  3. 财政大数据方案市场快速增长,2017年市场规模达8.5亿元
  4. idea如何创建c语言项目,IDEA下创建Spring项目
  5. 关于wifi 同时做ap, sta 问题
  6. 面试笔记:Java反射原理
  7. CAD下载完成之后想更大限度提高效率?这七个工具组合大有用处
  8. 知名在线音乐网站音悦Tai疑似倒闭
  9. JavaScript实现控制台输出九九乘法表
  10. 行内块元素之间的空白间隙