0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

程序在计算机中究竟是如何运行起来的?

Linux爱好者 来源:飞天小牛肉 作者:飞天小牛肉 2021-05-03 14:12 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文并不会深入底层寄存器指令与硬件等内容,只是借此主题为后续内存管理章节作扫盲,并帮助各位对分层存储体系有一个整体的把握,以及一个程序在这样的存储体系上,究竟是如何运行起来的,这些存储器在这个过程又分别扮演了什么角色。

为什么设计了分层存储体系其实早在操作系统系列开篇的那篇文章中,我就简单介绍过分层存储体系(Memory Hierarchy),先来回顾下(这里我参考的是《现代操作系统 — 第三版》这本书,其他有些资料可能会划分的更为细致,不过在理解本文的目的上,以下划分已经足够清晰了):

213db7aa-a534-11eb-aece-12bb97331649.png

各位不妨想一想,为什么需要设计出这样一个分层的存储体系来供计算机使用呢?

首先,有一个观点不用多说,每个人都希望自己的计算机拥有这样一个存储器:它容量无限大,CPU 访问它的速度无限快,并且能够永久性的存储数据(断电不会丢失数据),而且价格不能太高昂。

But,遗憾的是,现阶段的技术仍然满足不了我们的幻想。

为此,经过多年的探索,人们提出了分层存储体系的概念,把我们的幻想一个一个拆开对应到不同的存储器上。

在这个体系中,计算机拥有若干 KB 超级快速、超级昂贵且易失性的寄存器;若干 MB 快速、昂贵且易失性的高速缓存(cache);若干 GB 的速度与价格都适中、且同样易失性的内存;以及若干 TB 低速、廉价、非易失性的磁盘存储;另外还有诸如磁带等可移动的存储装置。

至于为什么这些存储器的造价不同,那就和它们的成本、材料、制作工艺等息息相关了。寄存器超级快速且超级昂贵的原因就是它和 CPU 的制作材料是相同的,所以 CPU 访问起来几乎是没有时延的。

另外,这里多提一嘴内存,关于内存的分类众说纷纭,我觉得各位对内存的概念有大体的把握就行,不必过度死扣细节。

内存也经常被人们称为主存和随机访问存储器(Random Access Memory,RAM),还有我们上文说到内存是易失性的,其实这都不是绝对正确的,只不过是通俗的说法并且被大众所认可。

现在许多计算机都已经在使用少量的非易失性随机访问存储器,也就是只读存储器(Read Only Memory,ROM),它在工厂中就被编程完毕,然后再也不能被修改。ROM 速度快并且造价低廉,很多开发商都会把用于启动计算机的引导加载模块存放在 ROM 中。

装入内存,让程序跑起来这里我先开门见山的总结一下内存和磁盘的区别,也方便大家更好的理解下面的例子。通俗来说,内存决定了你的计算机能够同时流畅运行多少个应用程序,而磁盘决定了你的计算机能够下载安装多少个应用程序。

举个例子,这里面涉及到一个很重要的概念,各位认真看哈:

比方说你的计算机上安装了 WeChat,你双击了 WeChat 快捷方式,操作系统就会打开 WeChat 软件。

那么,各位有没有想过,在分层的存储体系上,WeChat 或者各种应用程序在你的计算机上究竟是怎么跑起来的呢?这些存储器在这个过程又分别扮演了什么角色呢?

首先,有一点你要明确,你安装的 WeChat 软件是保存在磁盘中的。软件安装的本质是什么?各位应该也都明白,就是将很多数据的集合存储到磁盘上。

双击 WeChat 快捷方式,操作系统就会知道你要运行这个软件,它会在磁盘中找到你安装的 WeChat 软件,将运行所需要的数据从磁盘中复制到内存里。注意这里!WeChat 不是直接磁盘中运行的,而是在内存中运行的。

至于原因,那当然是内存的读写速度比磁盘快得多。

所以,为了缓和磁盘之间的速度不匹配问题,程序执行前必须将硬盘上的数据复制到内存,CPU 才能够着手处理,这个过程就叫作载入内存(Load into Memory),完成这个过程需要一个不可或缺的程序:载入器或者说加载器(Loader)。

CPU 直接与内存进行交互,它会读取内存中的数据进行处理,并将结果返回并保存到内存。当然,如果你还需要将数据保存到磁盘,复制操作也会在内存和磁盘直接发生一次。

比如说,我们打开了某个 Word 文档,并输入了一些文字,虽然我们直观看到的已经发生变化了,但是磁盘中存储的文档仍然没有改变,它仍然是之前的数据,新增的文字只是暂时保存到了内存,只有我们手动保存了这篇文档比如 Ctrl + s 才会将修改保存到磁盘中。

而由于内存是易失性的,也就是说断电后数据就丢失了,所以如果你编辑完 Word 文档忘记保存或者断电导致关机了,那么你将永远无法找回这些内容(悲剧 )。

寄存器与高速缓存去哪里了读到这里,各位肯定会有所困惑,上面不是说了还有高速缓存吗?还有寄存器吗?它们不是也用来存储的吗,在这个过程中它们去哪里了?

OK,从 CPU 的角度来说,内存是什么?就是一个笨逼,它仅仅是一个存放指令和数据的地方,计算机并不能在内存中完成计算功能。

若把 CPU 比作人类的灵魂,内存和磁盘就是人类的躯体。没有了 CPU,内存和磁盘就沦为一具行尸走肉。当然,没有了内存和磁盘也不行,毕竟 CPU 的存储能力非常可怜。

比如说我们要计算 a = b + c,必须将变量 a、b、c 从内存中读取到 CPU 内部才能进行加法运算,而在 CPU 中执行运算工作的部件,就是运算单元,可以说运算单元就是 CPU 的大脑。

我们不妨来看一下 CPU 的结构:

21644eb0-a534-11eb-aece-12bb97331649.png

可以看出,寄存器(Register)和高速缓存都直接内嵌在 CPU 中。

先说寄存器,其造价高昂且容量有限,功能涵括数学运算、控制程序的执行流程、标记 CPU 运行状态等。

有些同学可能认为寄存器就是一个部件,其实不然,现代的 CPU 基本都内置了几十个甚至上百个寄存器,根据功能的不同,这些寄存器也拥有不同的名字。

例如,EAX 寄存器通常被用在加法运算中,用来保存某个加数或运算结果;EIP 寄存器中存储的值是下一条指令的地址,CPU 执行完当前指令后,就会根据 EIP 的值去寻找下一条指令,也就是说如果我们改变 EIP 寄存器的值,也就会相应的改变程序的执行流程。

另外,寄存器存放的是二进制数据,我们常常说 32 位或者 64 位的 CPU,其实指的就是寄存器的位数。

再来看缓存,为啥 CPU 里面还要弄个缓存呢?那当然还是离不开读写速度的问题,虽然 CPU 访问内存的速度相比于磁盘来说已经足够快了,But,真要和高速缓存做个对比,那根本就不是一个数量级的,蚍蜉撼树罢了。

如果 CPU 每次都从内存中读取数据,会严重拖慢其运行速度,CPU 不得不浪费大量的时间来等待内存中数据操作的结束。为此,我们在 CPU 内部设置一个缓存,将使用频繁的数据暂时从内存中读取到缓存里来,这样,如果缓存命中,就直接从缓存中读取即可,不必访问内存了。

所以很显然,缓存容量越大的 CPU 其性能就越好。当然,毕竟造价高昂,搞不起超大容量的缓存,大小有限,所以对于缓存中数据取舍的种种算法又是一门值得深究的话题。

另外,缓存的概念其实并不仅仅局限于此。只要存在大量的资源可以划分成小的部分,那么,这些资源中的某些部分就会比其他部分更频繁的得到使用,使用缓存就可以带来性能上的改善。在操作系统中,除了 CPU 中的缓存,内存和硬盘之间其实也有缓存的概念,也就是下面我们将要讨论的虚拟内存。

虚拟内存和局部性原理虚拟内存(Virtual Memory)、虚拟存储器,这俩其实是一个东西,只不过网络上各种博客说法不一样,没有统一起来,容易让萌新摸不着头脑。

上文说的种种只是在运行一个 WeChat 程序的情况下,各位不妨想一下,如果你的电脑内存只有 4G,你同时运行了 WeChat、QQ、网易云音乐、Chrome 等等很多应用程序,假设它们加起来一共需要 5G 的内存空间,也就意味着需要从磁盘复制 5G 的数据到只有 4G 存储空间的内存,显然,这是不可能的。

217e4e8c-a534-11eb-aece-12bb97331649.png

为此,操作系统中引入了虚拟内存的概念。当程序运行需要的存储空间大于内存的容量时,会将内存中暂时不用的数据写回磁盘,当需要这些数据时再从磁盘中重新读取,而内存中存放的数据也就是所谓的热点数据。这样,磁盘中就会有一部分空间用来存放内存中暂时不用的数据,这一部分空间就叫做虚拟内存。我们上面所说的情况就需要在磁盘上分配(5 - 4 = 1G)的虚拟内存。

219a7d32-a534-11eb-aece-12bb97331649.png

这样,虚拟内存中 “虚拟” 二字的含义也就不言而喻了。只有 4G 内存,但是可以正常运行占用内存超过 4G 的应用程序,在用户看来他似乎拥有了一个比实际内存大得多的内存。当然,实际的物理内存大小并没有发生改变,只是在逻辑上进行了扩充。

可以这么理解,引入虚拟内存的概念后,在内存和磁盘之间,内存就充当了缓存的作用。CPU 优先从内存中获取数据,如果命中,就不需要去访问磁盘。这里和我们上文所说的 CPU 中的缓存和内存之间的关系是不是一模一样?

当然,我们为什么可以这样做?这些数据为啥就能被调入缓存/内存呢?虚拟内存存在的理论支撑是什么?这就是著名的局部性原理。局部性原理包含两种,时间局部性和空间局部性:

1)时间局部性原理:如果 CPU 执行了程序中的某条指令,那么不久后这条指令很有可能再次执行;如果某个数据被访问过,不久之后该数据很可能再次被访问;

2)空间局部性原理:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问,因为很多数据在内存中都是连续存放的,并且程序的指令也是顺序地在内存中存放的。

原文标题:五分钟扫盲:程序在计算机中是如何运行起来的

文章出处:【微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    11332

    浏览量

    225975
  • 计算机
    +关注

    关注

    19

    文章

    7841

    浏览量

    93489
  • 程序
    +关注

    关注

    117

    文章

    3849

    浏览量

    85489

原文标题:五分钟扫盲:程序在计算机中是如何运行起来的

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Renesas 3858 组单芯片 8 位 CMOS 微计算机深度解析

    Renesas 3858 组单芯片 8 位 CMOS 微计算机深度解析 电子设备不断发展的今天,微计算机作为核心部件,其性能和特性对于整个系统的运行起着至关重要的作用。今天我们就来深
    的头像 发表于 04-13 15:00 161次阅读

    计算机专业408考研科目

    408 跨考零基础:三个月入门到精通路线 站在2026年的节点回望,计算机考研408(计算机学科专业基础综合)早已超越了单纯的知识点考核,它更像是一场对逻辑思维与系统观的深度洗礼。对于跨考且零基
    发表于 04-11 16:44

    S32 Design Studio 有一些代码文件示例,但它在本地计算机中不存在,为什么?

    S32 Design Studio 有一些代码文件示例,但它在本地计算机中不存在。
    发表于 03-17 07:28

    龙芯主板让工控计算机拥有安全可信的核心

    工控计算机,是工业自动化和智能制造领域的核心设备,负责数据采集、处理、存储与传输,实现设备的监控与控制,确保生产线的稳定运行现代工业生产中,工控计算机的地位不可或缺,它如同智能制造
    的头像 发表于 01-21 09:02 487次阅读

    工控机与普通计算机的核心差异解析

    工业自动化和智能制造领域,计算机设备作为核心控制单元,其选择直接影响整个系统的稳定性与可靠性。工控机与普通计算机虽同属计算设备,但其设计目标、性能侧重和应用场景存在根本性差异。准确理
    的头像 发表于 11-25 14:45 2010次阅读
    工控机与普通<b class='flag-5'>计算机</b>的核心差异解析

    军用导航领域嵌入式计算机分析

    导航系统,嵌入式计算机的核心作用是实时处理多种传感器的数据,运行复杂的导航算法,最终计算出载体的精确位置、姿态、速度和时间信息。
    的头像 发表于 09-26 16:52 1281次阅读

    【作品合集】赛昉科技VisionFive 2单板计算机开发板测评

    、OpenSUSE、OpenKylin、OpenEuler、Deepin等,及在这些操作系统上运行的各类软件。 活动详情地址: 【RISC-V专题】VisionFive 2单板计算机免费试用 作品合集: 作者
    发表于 09-04 09:08

    工业计算机的重要性

    于管理用于产品检查、数据记录和数据分析的运动控制系统,以提高制造生产率。例如,汽车行业从工业边缘计算机中受益匪浅,这些计算机用于自动化制造汽车所涉及的各种过程。工业边
    的头像 发表于 07-28 16:07 741次阅读
    工业<b class='flag-5'>计算机</b>的重要性

    自动化计算机经过加固后有什么好处?

    让我们讨论一下部署坚固的自动化计算机的一些好处。1.温度范围宽自动化计算机经过工程设计,配备了支持宽温度范围的组件,使自动化计算解决方案能够各种不同的极端环境
    的头像 发表于 07-21 16:44 772次阅读
    自动化<b class='flag-5'>计算机</b>经过加固后有什么好处?

    自动化计算机的功能与用途

    工业自动化是指利用自动化计算机来控制工业环境的流程、机器人和机械,以制造产品或其部件。工业自动化的目的是提高生产率、增加灵活性,并提升制造过程的质量。工业自动化汽车制造中体现得最为明显,其中许多
    的头像 发表于 07-15 16:32 922次阅读
    自动化<b class='flag-5'>计算机</b>的功能与用途

    工业计算机与商用计算机的区别有哪些

    工业计算机是一种专为工厂和工业环境设计的计算系统,具有高可靠性和稳定性,能够应对恶劣环境下的自动化、制造和机器人操作。其特点包括无风扇散热技术、无电缆连接和防尘防水设计,使其各种工业自动化场景
    的头像 发表于 07-10 16:36 932次阅读
    工业<b class='flag-5'>计算机</b>与商用<b class='flag-5'>计算机</b>的区别有哪些

    Blue Lion超级计算机将在NVIDIA Vera Rubin上运行

    德国莱布尼茨超算中心(LRZ)将迎来全新超级计算机 Blue Lion,其算力比该中心现有的 SuperMUC-NG 高性能计算机提升了约 30 倍。这台新的超级计算机将在 NVIDIA Vera Rubin 架构上
    的头像 发表于 06-12 15:39 1385次阅读

    NVIDIA技术赋能欧洲最快超级计算机JUPITER

    NVIDIA 宣布,搭载 NVIDIA Grace Hopper 平台的 JUPITER 超级计算机成为欧洲最快超级计算机,其运行 HPC 和 AI 工作负载的速度是第二名的两倍以上。
    的头像 发表于 06-12 15:33 1684次阅读

    工业计算机如何设计用于冲击和振动

    工业计算机是为挑战消费级系统耐用性的环境而构建的。制造业、运输业、国防和采矿业等领域,计算机面临着持续的冲击、振动和其他物理压力。设计这些系统以在这种条件下保持可靠需要卓越的工程和创新技术。本文
    的头像 发表于 05-19 15:27 634次阅读
    工业<b class='flag-5'>计算机</b>如何设计用于冲击和振动

    FOC电机控制究竟该如何学?

    学习FOC电机控制究竟是学哪些内容? 电机知识 软件知识 纯分享贴,有需要可以直接下载附件获取完整资料! (如果内容有帮助可以关注、点赞、评论支持一下哦~)
    发表于 05-09 14:09