“远古时期”,写程序是在纸带上打孔,计算机从纸带读指令,读一个指令执行一个指令,速度非常慢。

“近代”, 程序为什么非得装入内存再执行? 我们开门见山直接说原因:

原因1

首先是因为程序中有循环,循环体指令会被反复的读取。

假设有4条指令,需要循环执行1000次 ,“内存读4000次” 时间加上从外存读4条指令到内存的时间,会比外存读4000次节省大量的时间。

原因2
现代计算机的外部存储(比如磁盘),一次I/O会读入一大块数据到内存,即一次读入n条指令执行,执行n条指令只需要一次I/O,而不需要n次耗时的I/O操作。

PS:理解了上面说的原因,下面的文字就不用看了。如果不是特别理解,就接着往下看。

我们举例说明“原因1”:

假如一个程序有2条顺序指令,8条循环执行的指令,循环执行的指令执行100次,从纸带读1条指令要1秒,从内存读一条指令需要0.05秒,执行一条指令0.01秒。

问1:两种方式总的执行时间各是多少?

第1种方式:

总时间
= 纸带读(2+8*100)条指令并执行指令时间
= 802 *(1+0.01)= 810.02 秒

第2种方式:

总时间
=10条指令读入内存时间 + 内存读(2+8*100)条指令并执行指令时间
=(2+8)*1 + 802 *(0.05+0.01)=50.12

从上面的计算可以看出,第1中方式慢的本质就是循环导致了过多的I/O,且I/O太慢。

问2:如果10条指令都是顺序执行的指令,两种方式总的执行时间各是多少?

第1种方式:

总时间
= 纸带读10条指令并执行指令时间
= 10 *(1+0.01)=10.1秒

第2种方式:

总时间
=10条指令读入内存时间 + 内存读10条指令并执行指令时间
=(2+8)*1 + 10 *(0.05+0.01)=10.6

从问题2看出,如果指令从外存只能一次读一条,且都是非循环指令,读入内存再执行的方式反而更费时。

程序为什么非得装入内存再执行?相关推荐

  1. Thread:主线程等待子线程执行完毕再执行解决办法

    线程从启动到执行完毕,一般会有一些耗时操作,并不能像一般的程序语句,就能立马结束.如下代码: package com.xxx.async; public class WaitThreadDone {p ...

  2. 【OS学习笔记】十 实模式:实现一个程序加载器-程序加载器如何将用户程序加载到内存并执行

    上一篇文章学习了以下内容: 用一种不同的分段方法,从另一个不同的的角度理解处理器的分段内存访问机制 使用循环和条件转移指令来优化主引导扇区代码 点击链接查看上一篇文章:点击链接查看 对于主引导扇区部分 ...

  3. 服务器如何停止程序运行,如何让程序暂停几秒再执行

    编程方面: 可以用邀月提供的多线程方法,以Thread.Sleep(3000 还有一种方法更为简单,就是直接在代码中插入Thread.Sleep(3000),来实现暂停效果,但是这样你会感觉你的用户界 ...

  4. os引导程序boot从扇区拷贝os加载程序loader文件到内存(boot copy kernel to mem in the same method)

    [0]README 0.1) 本代码旨在演示 在boot 代码中,如何 通过 loader文件所在根目录条目 找出该文件的 在 软盘所有全局扇区号(簇号),并执行内存中的 loader 代码: 0.2 ...

  5. 第13章 程序的动态加载和执行(三,核心代码)

    这个核心代码也是本书唯一的一个核心代码,把这个读懂了,本书基本上通了,这个核心代码不难,只是前面知识的综合应用而已,所以用一到两个星期把这个三个程序读熟再进行下面的四章. 怎么样才算是读通了一个代码: ...

  6. iOS 开发中,单款应用程序的最大可用内存是多少?

    9 个回答 7赞同 反对,不会显示你的姓名 张光宇,none snow.dingc.孔庆立 等人赞同 如果你想让用户 在尽量多的iOS设备上得到比较稳定的体验, 实用过程中不Crash, 不因为GC而 ...

  7. X86汇编语言从实模式到保护模式13:保护模式程序的动态加载和执行

    目录 1. 引入保护模式对程序加载与执行的影响 1.1 对应用程序的影响 1.2 对操作系统的影响 1.3 本章程序总体结构 2. MBR加载内核过程分析 2.1 内核头部段分析 2.1.1 内核总长 ...

  8. 程序运行时的内存空间分布

    本文转载自http://blog.csdn.net/ljianhui/article/details/21666327 谢谢原文作者的辛勤付出. 我们在写程序时,既有程序的逻辑代码,也有在程序中定义的 ...

  9. java冰雹数10_生成的新的数字再执行同样的动作, 循环往复.

    生成的新的数字再执行同样的动作, 循环往复. 声明 可能本文章会有错误, 希望各位读者看到后, 记得回复留言, 提醒我, 以免误人子弟. 本人菜鸡, 还望各位大佬手下留情. 题目: 冰雹数 任意给定一 ...

最新文章

  1. 微型计算机的分类有,微型计算机的分类
  2. 数据聚合Spring Data MongoDB:嵌套结果
  3. SpringMvc-HandlerMapping/RequestCondition
  4. php底层开发框架, yaf,swoole,hiphop
  5. C#获得SQLServer服务器名、数据库名、表名、以及字段名
  6. c语言高精度算法阶乘_学了这么久的C语言,原来可以这样解决算法问题...
  7. 同时删除多个 Word 文档空白行
  8. c语言写成汇编语言程序 冒泡排序,MIPS汇编程序设计——冒泡排序
  9. 第6章 访问权限控制
  10. 最简单的人脸识别系统搭建
  11. F1 Delta Time 将停止运营,玩家的奖励如何?
  12. 关于javaBean运行后出现Name was not previously introduced as per JSP.5.3的解决方法
  13. jquery mobile外部js无法载入问题
  14. pg批量插入_postgresql大批量数据导入方法
  15. 普元 AppServer 部署时页面提示部署失败,后台报错:Unable to load class org.apache.cxf.ws.policy.AssertionBuilder
  16. [附源码]Nodejs计算机毕业设计基于JAVA的校园电车租赁系统Express(程序+LW)
  17. Jetty修改默认端口
  18. SQL掌握:添加、修改、删除、查询4个句式
  19. 分享一些写博客的实用工具
  20. 大公司 or 小公司,你要怎么选?

热门文章

  1. JS, CSS 文件压缩与反压缩工具
  2. 在CentOS6中安装Docker(新服务器不推荐)
  3. c语言缩写一个人的名字,用C语言输入一个人的英文名字统计个数输出
  4. 交叉驰豫的影响因素_墨点对uv打印机印刷质量影响
  5. ps2019布尔运算快捷键_设计师不会告诉你的ps布尔运算,你学会了吗?
  6. Python中的split()和rsplit()的使用
  7. 带负荷测试要求二次最小电流_差动保护带负荷测试
  8. android滚动条布局平分,让你的布局滚动起来—ScrollView
  9. java二叉树求权值_百度笔试题目:二叉树路径权值和【转】
  10. ftp ---- 本地用户登录(实例配置1:)