C语言博客(3)编程基础之内存的理解?

如果你的电脑上安装了QQ,你希望和好友聊天,会双击QQ图标,打开QQ软件,输入账号和密码,然后登录就可以了。那么,QQ是怎么运行起来的呢?首先,有一点你要明确,你安装的QQ软件是保存在硬盘中的。双击QQ图标,操作系统就会知道你要运行这个软件,它会在硬盘中找到你安装的QQ软件,将数据(安装的软件本质上就是很多数据的集合)复制到内存。对!就是复制到内存!QQ不是在硬盘中运行的,而是在内存中运行的。

为什么呢?因为内存的读写速度比硬盘快很多。对于读写速度,内存 > 固态硬盘 > 机械硬盘。机械硬盘是靠电机带动盘片转动来读写数据的,而内存条通过电路来读写数据,电机的转速肯定没有电的传输速度(几乎是光速)快。虽然固态硬盘也是通过电路来读写数据,但是因为与内存的控制方式不一样,速度也不及内存。所以,不管是运行QQ还是编辑Word文档,都是先将硬盘上的数据复制到内存,才能让CPU来处理,这个过程就叫作载入内存(Load into Memory)。完成这个过程需要一个特殊的程序(软件),这个程序就叫做加载器(Loader)。

CPU直接与内存打交道,它会读取内存中的数据进行处理,并将结果保存到内存。如果需要保存到硬盘,才会将内存中的数据复制到硬盘。例如,打开Word文档,输入一些文字,虽然我们看到的不一样了,但是硬盘中的文档没有改变,新增的文字暂时保存到了内存,Ctrl+S才会保存到硬盘。因为内存断电后会丢失数据,所以如果你编辑完Word文档忘记保存就关机了,那么你将永远无法找回这些内容。

如果我们运行的程序较多,占用的空间就会超过内存(内存条)容量。例如计算机的内存容量为2G,却运行着10个程序,这10个程序共占用3G的空间,也就意味着需要从硬盘复制 3G 的数据到内存,这显然是不可能的。操作系统(Operating System,简称 OS)为我们解决了这个问题:当程序运行需要的空间大于内存容量时,会将内存中暂时不用的数据再写回硬盘;需要这些数据时再从硬盘中读取,并将另外一部分不用的数据写入硬盘。这样,硬盘中就会有一部分空间用来存放内存中暂时不用的数据。这一部分空间就叫做虚拟内存(Virtual Memory)。3G - 2G = 1G,上面的情况需要在硬盘上分配 1G 的虚拟内存。硬盘的读写速度比内存慢很多,反复交换数据会消耗很多时间,所以如果你的内存太小,会严重影响计算机的运行速度,甚至会出现”卡死“现象,即使CPU强劲,也不会有大的改观。如果经济条件允许,建议将内存升级为 4G,在 win7、win8 下运行软件就会比较流畅了。

总结:CPU直接从内存中读取数据,处理完成后将结果再写入内存。

图1:CPU、内存、硬盘和主板的关系

时间: 2024-08-05 17:03:43

C语言博客(3)编程基础之内存的理解?的相关文章

C语言博客(5)编程基础之怎样理解八进制和十六进制?

在C语言的学习编程过程中,除了二进制,编程中也经常使用八进制和十六进制.这些也同样是编程基础的教学,要想成为C语言大神,这是一定要了解清楚的. 八进制有0~7共8个数字,基数为8,逢八进一,借一当八:十六进制中,用A来表示10,B表示11,C表示12,D表示13,E表示14,F表示15,因此有0~F共16个数字,基数为16,逢16进1,借1当16.例如: 八进制 3072 = 3×83 + 0×82 + 7×81 + 2×80 = 1536 + 0 + 56 + 2 = 1594 十六进制 E3

C语言博客(6)编程基础之进制之间的转换

在本人的C语言博客的内容中,前面两篇随笔对二进制.八进制和十六进制进行了说明,接下来讲一下不同进制之间的数字是如何转换的,这在编程中经常会用到,尤其是C语言. 其他进制向十进制转换 在C语言学习中,二进制.八进制和十六进制向十进制转换都是非常容易的,就是"按权相加". 所谓"权",也即"位权".例如,十进制第1位的位权为100=1,第2位的位权为101=10,第3位的位权为102=100:而二进制第1位的位权为20=1,第2位的位权为21=2,第

C语言博客(4)编程基础之怎样理解二进制思想以及数据的存储?

本次我要描述的编程基础的内容是怎样理解二进制思想以及数据的存储,这也是许多初学者需要的编程基础. 我们平时使用的数字都是由 0~9 共十个数字组成的,例如 1.9.10.297.952 等,一个数字最多能表示九,如果要表示十.十一.二十九.一百等,就需要多个数字组合起来. 例如表示 5+8 的结果,一个数字不够,只能"进位",用 13 来表示:这时"进一位"相当于十,"进两位"相当于二十. 因为逢十进一,也因为只有 0~9 共十个数字,所以叫做十

C语言博客作业—一二维数组

一.PTA实验作业 题目1:7-2 求整数序列中出现次数最多的数 1. 本题PTA提交列表 2. 设计思路 Begin 输入整数个数N 定义数组a[N] 输入数组a for(i 0 to N-1){//进行N次判断 for(j 0 to N-1) if(a[i]和a[j]相等) count加一 i等于0//第一次判断 使max=count; n=i;//n放下标,max放次数 i不等于0且count大于max 使max=count; n=i;//重新赋值 count为0//每次循环count为0

C语言博客(2)为什么选择C语言入门?

相信大部分的程序员都是会写一些C语言的,首先接触的也可能是C.可说到底为什么要从C语言开始学编程呢,为什么把C语言作为编程基础呢.是因为C语言除了能让你了解编程的相关概念,带你走进编程的大门,还能让你明白程序的运行原理,比如,计算机的各个部件是如何交互的,程序在内存中是一种怎样的状态,操作系统和用户程序之间有着怎样的"爱恨情仇",这些底层知识决定了你的发展高度,也决定了你的职业生涯. 所以如果你想在程序猿这条路上走得远,走向更高处,那么编程基础就一定要打好.所以可以从C语言入门开始学习

C语言博客作业--一二维数组

一.PTA实验作业 题目1:7-2 求整数序列中出现次数最多的数 1. 本题PTA提交列表 2. 设计思路 定义变量n,i,j,max等于0,a[]10用于存放输入的值,b[10]用于存放a[]中各个数有多少个; 输入n的值 i从0开始,每次加1,输入a[i]的值,直到i==n结束循环 i从0开始,判断i是否<n,,进入下一步,每次加一,直到条件不满足 j从0开始,判断j是否<n,,进入下一步,每次加一,直到条件不满足 如果a[i]==a[j],b[i]加一 i从0开始,判断i是否 输出a[j

值得关注的10个python语言博客(转)

大家好,还记得我当时学习python的时候,我一直努力地寻找关于python的博客,但我发现它们的数量很少.这也是我建立这个博客的原因,向大家分享我自己学到的新知识.今天我向大家推荐10个值得我们关注的python博客,这些博客的博主都会定期的更新而且他们的文章都很不错.下面是博客列表: 1.首先第一个肯定是毋庸置疑的Planet Python这是最出名的python博客其中之一,快去看看,我希望你能找到对你有用的东西,昨天它还更新了呢! 2.第二个博客是lucumr,博主是flask的创始人(

值得关注的10个python语言博客 - WEB开发者

1.首先第一个肯定是毋庸置疑的Planet Python这是最出名的python博客其中之一,快去看看,我希望你能找到对你有用的东西,昨天它还更新了呢! 2.第二个博客是lucumr,博主是flask的创始人(一个python micro web framework) 3.第三个博客是love-python,我不知道我是怎么被它吸引的,但是我真得很喜欢这个博客,它有很多有用的知识和代码 4.第四个博客是Doug Hellmann,博主是PYMOTW(Python Module Of the We

值得关注的10个python语言博客

大家好,还记得我当时学习python的时候,我一直努力地寻找关于python的博客,但我发现它们的数量很少.这也是我建立这个博客的原因,向大家分享我自己学到的新知识.今天我向大家推荐10个值得我们关注的python博客,这些博客的博主都会定期的更新而且他们的文章都很不错.下面是博客列表: 1.首先第一个肯定是毋庸置疑的Planet Python这是最出名的python博客其中之一,快去看看,我希望你能找到对你有用的东西,昨天它还更新了呢! 2.第二个博客是lucumr,博主是flask的创始人(