文档章节

聊一聊内存管理(1)

算法与编程之美
 算法与编程之美
发布于 2017/08/18 14:28
字数 1125
阅读 78
收藏 0

 

“最近的电脑打开程序非常慢,而且运行的时候很卡,有没有什么解决办法呢?”

“去京东买个4G 的内存条加到电脑里面吧!”

在我们的生活中,经常会遇到这样的对话。当我们的电脑运行程序变得很慢很卡的时候,就会听到身边的朋友建议我们去增加电脑的内存。这是为什么呢?内存在计算机体系结构中起了什么样的作用?当我们有了4G 的内存,操作系统又是如何管理这些内存的呢?

本系列博客将和大家一起深入的探讨这些问题,主要介绍操作系统原理中的内存管理部分,从而让您更好的理解计算机。力求用最简单易懂的语言介绍相关原理及算法,即使您没有任何的专业基础,也能和我们一起来感受操作系统的魅力。

问题定义

介绍任何技术及理论之前,我们首先都需要搞明白需要解决的问题是什么,也就是问题的定义,这是极其关键的一步。很多学生在学习的时候,往往不知道我为什么要学习这个知识点,这个知识点和前后章节以及其他课程的关系是什么,这个知识点解决了什么问题,只是简单的去学某个知识点,而忽视了问题的定义以及前后关联。

每一个程序的运行都需要占用内存,每一个程序运行结束了以后,都会释放其占有的内存。这是大家首先需要了解的一个前提。

首先我们来给大家介绍下什么叫内存管理。所谓内存管理简单来说就是你要运行一个程序,就需要给这个程序分配相应的内存,那么该如何分配这些内存呢?

 

可能有些同学说,这不是很简单的事情吗?比如我有4G 的内存条,来了一个程序,我就给它多少的内存,这个程序运行结束了,我就回收这些内存,如下所示:

图1- 1  A1 A2 A3程序内存分布

 

t1时刻执行A1程序,需要512MB 内存,t2时刻执行 A2程序需要256MB内存,t3时刻执行 A3程序需要1GB 内存。按照上述图示,为每个程序分配相应的内存。

图1- 2 A1程序运行结束后内存分布

过了一段时间后,A1程序运行结束,释放之前占用的内存。

不是很简单吗?这有什么好讨论的呢?

 

事实真的如此简单吗?接下来便提出几个问题,看你该如何解决?

1)    如下图这是某时刻内存的分布情况,内存有 A1 A2 A3 A4共四个程序在运行。此时来了一个程序 A5,它需要的内存为512MB,而此时系统可用内存仅有256MB,那么 A5是否能够被执行呢?

图1- 3 某时刻内存分布情况

 

2)    如下图是某时刻的内存分布,系统可用内存有下面绿色部分总共256 + 256= 512MB 的可用内存,但是这两块内存不是连在一起的。此时来了一个程序 A5,需要512MB 的内存,请问 A5程序能够被执行吗?

图1- 4 某时刻内存分布情况

3)    内存大小总共为4GB,假设某程序需要占用6GB 的内存,请问是否可以运行该程序。

 

从上述提出的这些问题,大家可以看到,内存管理其实没有大家想象的那么简单,它需要解决的问题是非常多的。

后面的博客将带领大家一起来探索操作系统是如何解决内存管理的这些问题的,大师提出的解决方案和我们自己的有什么不同的地方。本节希望大家掌握什么是内存管理,在整体上有个认识。

 

温馨提示:

由于手机屏幕大小的限制,请大家在阅读图片时,点击图片放大查看。

本文图例中所有的绿色部分表示系统可用内存,其他颜色表示某程序占用的内存。

 

© 著作权归作者所有

共有 人打赏支持
算法与编程之美
粉丝 289
博文 89
码字总数 97411
作品 0
成都
程序员
加载中

评论(2)

算法与编程之美
算法与编程之美

引用来自“ikel”的评论

一个简单粗暴的办法:等前面的释放了再把当前的加载到内存中
非常好的想法,不错!
ikel
ikel
一个简单粗暴的办法:等前面的释放了再把当前的加载到内存中
深入理解C语言结构体成员变量内存分配

欢迎点击「算法与编程之美」↑关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列博客。 1 问题描述 在学习C语言的时候,我们都会频繁的接触到结构体,使用结...

算法与编程之美
04/05
0
0
聊一聊内存管理(2)

在上一讲我们给大家重点介绍了什么是内存管理,让大家对内存管理有了整体的认识。简单来说就是,程序的运行需要内存,你如何管理并给这些程序分配内存。 本节我们来给大家介绍最简单的一种内...

算法与编程之美
2017/08/23
55
2
2018届android校招面试总结:百度,大疆,乐视,知乎

写在前面 四月面临了人生第一次比较重大的变化:现在的公司因为融资不利,收回了我的正式offer。这一波很伤... 所以在得知消息之后,接下来差不多一个月的时间里,自己开始了的频繁的面试之旅...

MDove
04/29
0
0
聊一聊C语言的参数传递

本讲我们和大家一起来聊一聊C语言中有关参数传递的一些知识。 1. 问题引入 请写出以下程序的打印结果。 #include <stdio.h> // 将某整数加10 void addby10(int a){ a = a + 10; } int main(...

算法与编程之美
2017/04/08
37
0
投稿006期| 回忆一次美团Android校招

写在前面 今天和一同学吃饭,互相诉了一波苦。他吐槽了一下这周五去美团面试不是很顺利,我吐槽了一下,业务大改版。这一个月恐怕要疯狂加班... 他提到美团的时候,这让我想起来了2017年10月...

挚爱灬丶
07/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Ubuntu18.04 显卡GF-940MX安装NVIDIA-390.77

解决办法: 下面就给大家一个正确的姿势在Ubuntu上安装Nvidia驱动: (a)首先去N卡官网下载自己显卡对应的驱动:www.geforce.cn/drivers (b)下载后好放在英文路径的目录下,怎么简单怎么来...

AI_SKI
今天
0
0
深夜胡思乱想

魔兽世界 最近魔兽世界出了新版本, 周末两天升到了满级,比之前的版本体验好很多,做任务不用抢怪了,不用组队打怪也是共享拾取的。技能简化了很多,哪个亮按哪个。 运维 服务器 产品 之间的...

Firxiao
今天
0
0
MySQL 8 在 Windows 下安装及使用

MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Windows 下安装 MySQL 8,以及基本的 MySQL 用法。 下载 下载地址 https://dev....

waylau
今天
0
0
微信第三方平台 access_token is invalid or not latest

微信第三方开发平台code换session_key说的特别容易,但是我一使用就带来无穷无尽的烦恼,搞了一整天也无济于事. 现在记录一下解决问题的过程,方便后来人参考. 我遇到的这个问题搜索了整个网络也...

自由的开源
今天
2
0
openJDK之sun.misc.Unsafe类CAS底层实现

注:这篇文章参考了https://www.cnblogs.com/snowater/p/8303698.html 1.sun.misc.Unsafe中CAS方法 在sun.misc.Unsafe中CAS方法如下: compareAndSwapObject(java.lang.Object arg0, long a......

汉斯-冯-拉特
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部