操作系统中内存怎么管理起来的?

1,364 阅读5分钟

情景动画

0.内存管理-一个简单的内存管理器-《深入理解程序设计-使用Linux汇编语言》.gif

背景

WEB程序员常接触的是浏览器开发者选项中的js、css、image、xhr以及每一种资源的的请求时间。如下:

image-20220703075051134.png

这个时间指标在遇到问题的情况下,是表现问题最直观的地方。

在从浏览器向后端的tomcat、iis、nginx这一类中间件发送请求获得返回结果。这个阶段所经历的每一个环节中孜孜不倦的去缩短访问时间到客户能接受的范围之内。

当访问量较低的时候不会影响服务,不会引起重视。可是如果用户访问量激增的情况下可能就会带来一系列的问题。(比如促销活动进行的时候,数据被爬虫工程师盯上的时候)。

上面提到的是现象。背后可能是部署的问题、可能是磁盘的问题、亦或是CPU、内存等等。这些庞大的技术栈中为了能各个击破,这一篇文章先从“内存”着手。因为“内存”这个东西对于很多初级程序员来说,可能是个不小的障碍。

类比内存管理与“倒酒”

接下来从“内存“ 这一监控指标着手,先从操作系统层面简单介绍一下”内存“的设计思路。为深入理解“内存”关联问题奠定基础。

为了便于理解这个抽象的概念,用一个容易理解的过程去类比一下。“杯子和酒桶”对应“进程“和”内存空间“。

约定:也就是说,初始化过程中对一些基础变量进行规范,就像啤酒包装上的规格,瓶装350ml、灌装的200ml、桶装的10L,另外包括产地、配料、生产日期等这些属性

杯子:我要一杯内存,我的容量是64ml。

image-20220710093342231.png

酒桶:我有1024ml,我们只卖整杯

image-20220710093447789.png

酒桶独白:酒桶在哪儿,举起高度,倾斜角度,倾倒时间,完成一杯后。对于当前这一杯子的移出位置。从哪儿取新杯子

旁白:杯子和酒桶各自明确自己的规格,并且酒桶往杯子里倒内存

image-20220710093519722.png

类比:

  • 将酒桶类比成内存条,桶本身是没有刻度的,但是要想让它能够顺利的分配到杯中,就要知道桶的容量和杯的容量
  • 操作内存分配,就相当于杯子和酒桶申请,“麻烦给我倒一杯酒”
  • 酒桶往杯子里倒的时候就是一个边倒边问的过程,要问我自己,我还有多少,够不够倒,够的话直接倒,不够的话还能不能再申请开一桶

那么接下来需要做的是,如果用汇编语言操作器件的话,需要怎么设计?

  • 定义全局变量,全局变量就像我们在写某一个页面初始化过程中要对用到的全局变量进行定义那样。全局变量有哪些?

    • 管理内存的起始处
    • 管理的内存之后的一个内存位置
    • 内存区头空间大小
    • 头中可用标志的位置
    • 内存区头中大小字段的位置
    • 标记分配空间的数字
    • 用于标记已回收空间的数字
    • 中断系统调用的系统调用号
  • 初始化函数

  • 获取一段内存,这个过程怎么设计?

    • 查看每一个的大小以及是否已经分配
    • 如果某个内存区大于所请求的大小,且可用,该函数就获取内存区
    • 如果无法找到足够大的内存区,就向操作系统请求更多的内存
    • 移动current_break

    它看起来像一个迭代的过程。

  • 释放内存到内存池中

这就像一个Java Web的程序员去接到一个需求实现它的道理是一样的。对从产品部门接到的需求进行拆分细化。

其实内存的管理的原理,从宏观上来说就是上述的流程,它像我们平时处理业务中的供求关系的加减法是同样的道理。只不过是交互的对象是计算机主板上的内存条,讨价还价的过程交给了电路和芯片,我们需要给出的是策略。

windows上的内存指标分析

从上面的类比来说,它只能给人对“内存”这一概念有一个宏观整体的认识。先找一个例子落地一下,不至于过于空泛引起不适。

在windows上有下面这么个命令:

carbon(1).png 在windows上执行结果如下:

carbon(2).png 上图中明显能看到第一列数据是时间戳,第二列数据显示的是可用内存,第三列数据是每秒的页面调度。这个命令我是在一台server2008的windows服务器上执行。

通过它能看出来内存的什么动作呢?

可用内存开始的时候维持在902MB,第三列的页面调度的数据保持的是0。在到第五行的时候,从0突然增长到8831.173840。这说明有内存页面参与调度了。而且可用内存从900左右减少到700左右。

对应的操作是因为我打开了一个浏览器。

而这个页面是什么呢?它就相当于上述的啤酒桶中的啤酒。以64为一个单位进行分配调度。在内存中则以内存页为内存调度。

这一篇先分享到这。我是“问问计算机”。我们一起学习计算机的点点滴滴原理。

我正在参与掘金技术社区创作者签约计划招募活动,点击链接报名投稿