CPU 如何从 RAM 访问应用程序和数据

2023-12-12

在应用程序加载到 RAM 并打开文件后(因此文件的数据也存储在 RAM 中),我在理解 CPU 如何从 RAM 访问应用程序和数据时遇到了一些困难。

根据我的理解,CPU 只是在程序计数器滴答时从 RAM 获取指令或在中断后执行任务。那么它如何访问应用程序和数据。它是否没有并且仍然只是获取指令(例如,在硬盘驱动器上加载要在应用程序中打开的文件)并处理应用程序发出的任何请求,这些请求随后作为指令存储在 RAM 中(例如保存文件)。或者,与打开的文件相关的应用程序和数据(例如)是否仅保留在 RAM 中,根本不被 CPU 访问。

同样,读过一篇文章后,它说操作系统的副本存储在RAM中。然后CPU就可以访问操作系统了。 (我以为CPU只是根据RAM中的指令工作)。然后,它如何与操作系统通信,以及如何将中断从 RAM 中的操作系统副本或硬盘驱动器中的操作系统发送到 CPU。

抱歉,如果这真的很令人困惑,很多我不明白。


你的问题的根源:计算机硬件和计算机软件之间缺乏明确的区别。


计算机系统的组成部分

为了让我们清楚地了解它们并了解它们的本质,让我声明如下:

  • 硬件:它包括CPU、RAM、磁盘、寄存器、显卡、网卡、内存总线以及所有你可以触摸并称为“计算机”的东西。它是身体。
  • 软件:它包括操作系统、程序、CPU指令、编译器、编程语言以及几乎所有关于计算机的无形的东西。这是灵魂。
  • 固件:这些基本代码对于硬件的工作来说是绝对必要的。它存储在硬件本身安装的只读存储器中。该软件对于硬件至关重要,因此被认为处于硬件和软件中间,因此被称为固件。

我们将从当我们说计算机已启动并运行并正确执行我们的指令时开始理解。但那个时候你会说——我是怎么到达这里的?所以我就提一下关于电脑启动的几点。


当按下电源按钮时...

……最原始、最基本输入输出系统(因此称为BIOS),硬写在计算机硬件上开始执行。这是写在只读存储器上的,这会启动让机器独立运行的过程。它将软件(操作系统)从一个硬件(磁盘)加载到另一块硬件(RAM 和 CPU 寄存器)中,使软件能够与硬件正常工作。

现在身体和灵魂在一起了,个体(机器)可以工作了。


到目前为止,操作系统已经在 RAM 和 CPU 中。 (读When the power button is pressed如果您对此表示怀疑。)现在让我们逐段处理您的问题 -


第一段

我在理解应用程序和数据如何 加载应用程序后,CPU 从 RAM 访问 写入 RAM 并打开一个文件(因此文件的数据也存储在 内存)。



解释如下:

  1. 这里的确切问题是您认为是 CPU 和 RAM 访问数据。 CPU和RAM只是执行单元。
  2. 操作系统(软件)通过CPU和RAM(硬件)来访问数据。它位于执行应用程序的操作系统领域。
  3. 这就是为什么您可以在同一硬件上安装 Linux 和 Windows,但无法在 Linux 中执行 .exe 文件,因为操作系统执行而不是 RAM/CPU。
  4. 此外,CPU、RAM 和磁盘如何物理交互以引入数据、执行数据、保存数据等属于硬件领域。这需要解释,其中涉及逻辑门(AND、OR、NOT...)、二极管、电路以及电子人员可以解释的许多其他东西。

第二段

根据我的理解,CPU 只是从 RAM 获取指令 程序计数器在中断后计时或执行任务。如何 然后它访问应用程序和数据。难道不是吗 并且仍然只是获取指令(例如加载文件 硬盘驱动器在应用程序中打开)并处理任何 应用程序发出的请求存储在 RAM 中 随后的说明(如保存文件)。



正如您所猜测的 - CPU 不获取指令,操作系统通过 CPU 获取指令。还,就像大脑不直接指示手和腿移动而是使用神经进行交互一样,CPU 也不告诉磁盘提供/获取数据。 CPU 仅与 RAM 和寄存器一起工作。多个硬件单元协同工作,为数据和指令的传输提供路径。涉及的重要硬件包括:

  1. 处理器(CPU和CPU内置的寄存器)
  2. Cache
  3. 内存(RAM)
  4. Disk
  5. Tape

我喜欢中提供的图像这个答案。该图不仅列出了硬件部件,还说明了这些部件在执行速度上的巨大差异。

让我们继续...


第三段

同样,读完一篇文章后,它说 操作系统存储在RAM中。然后CPU就可以访问 操作系统。 (我以为CPU只是按照指令工作 来自内存)。它如何与操作系统进行通信? 中断如何从 RAM 中操作系统的副本发送到 CPU,或者 来自硬盘驱动器中的操作系统。



现在您已经知道操作系统确实存在于 RAM 和 CPU 寄存器中。那就是它居住的地方。这是它告诉 CPU 如何工作的地方。如果操作系统足够小(或者如果寄存器和高速缓存足够大),操作系统就会离 CPU 更近。

  • CPU 不与操作系统通信。不可以。受老板控制的是工人。操作系统就是那个老板。
  • 中央处理器不能access操作系统。CPU是身体,OS是灵魂。灵魂告诉身体该做什么,而不是相反。
  • CPU 不支持 RAM 中的指令。它仅执行操作系统(可能位于 RAM 中)给出的指令。因此,即使有一条指令将操作系统的某些模块加载到 RAM 中,发出该指令的也不是 RAM/CPU,而是操作系统本身。
  • 中断有两种类型 - 硬件和软件 - 您的查询与软件中断有关。由于操作系统的执行部分位于 RAM 中,简单来说,我们可以说中断是从 RAM 中的操作系统发送到 CPU 的。

结论

硬件和软件之间缺乏区别是您感到困惑的根本原因。参加一些有关操作系统的课程Coursera or 学术地球为了更深入的理解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CPU 如何从 RAM 访问应用程序和数据 的相关文章

  • 完全用汇编语言编写操作系统有什么好处? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 MenuetOS http en wikipedia org wiki MenuetOS是完全用汇编编写的操作系统的示例 用汇编语言编写它比用
  • 当操作系统只是进程之一时,抢占式多任务处理如何工作?

    我现在正在阅读有关先发制人的多任务处理的材料 但我忘记了一件事 所有材料都暗示 操作系统以某种方式从 外部 中断了CPU上正在运行的进程 从而导致了上下文切换等 然而 我无法想象当操作系统的内核只是 CPU 上的另一个进程时 这将如何工作
  • java中获取某些进程的cpu使用率的正确命令行是什么

    给定进程 ID 在 Java 中从进程获取当前 cpu 使用情况的正确命令是什么 命令 typeperf Memory Available bytes processor total process time 不适用于特定进程 并且任何第
  • R 控制台可以支持后台任务或中断(事件处理)吗?

    在 R 控制台中工作时 我想设置一个后台任务来监视特定连接 并在发生事件时执行另一个函数 警报 或者 我可以进行设置 以便外部函数仅向 R 发送警报 但这似乎是同一个问题 有必要设置一个侦听器 我可以在 R 的专用进程中执行此操作 但我不知
  • C 标准库和 C POSIX 库的区别

    我对 C standard lib 和 C POSIX lib 有点困惑 因为我发现 C POSIX lib 中定义的许多头文件也是 C standard lib 的一部分 所以 我假设 C standard lib 是由ANSI C组织定
  • Xcode 9 - CPU 使用率高 - 风扇最大速度

    自从我升级到 Xcode 9 后 当我在 Xcode 上工作时 我的粉丝就变得疯狂了 当我使用 Storyboards 和 Interface Builder 时 尤其会发生这种情况 Xcode有时会占用100 的CPU 并且名为 Inte
  • Java - 易失性的使用仅在多处理器系统中有意义?

    易失性的使用仅在多处理器系统中才有意义 这是错误的吗 我正在尝试学习线程编程 所以如果你知道任何好的文章 pdf 我喜欢提到一些关于操作系统如何工作的东西 而不仅仅是语言的语法 否 挥发性可用于多线程应用程序 它们可能会也可能不会在多个处理
  • 如何开发才能利用64位系统?

    软件工程师 计算机科学的某些特定领域在针对 64 位系统进行开发时是否存在显着差异 我已经编码了大约 10 年 自从 64 位系统崩溃以来 我的代码没有改变过一丁点 哪些应用程序可以由单个编码员作为业余项目进行编码 并且需要您使用 64 位
  • 如何在 Verilog 中推断 Block RAM

    我在一个项目中遇到了一个非常具体的问题 这个问题已经困扰我好几天了 我有以下 RAM 模块的 Verilog 代码 module RAM param clk addr read write clear data in data out pa
  • Linux:如何对系统内存施加负载?

    我正在开发一个小功能 它可以让我的用户了解 CPU 的占用情况 我在用着cat proc loadavg 它返回众所周知的 3 个数字 我的问题是 当我正在开发时 CPU 目前没有做任何事情 有没有一种好方法可以在CPU上产生一些负载 我在
  • Linux - 嵌套中断[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Linux 是否使用嵌套中断 我的意思是 例如 当从任何设备提供中断服务时 可以允许在此例程中进一步中断吗 或者它涉及上半部和下半部 ED
  • 在 Windows 上使用 PHP 获取总可用系统内存

    使用 PHP 我想获取系统可用的总内存 而不仅仅是空闲或已用内存 在 Linux 上 这非常简单 你可以做 memory fopen proc meminfo 然后解析该文件 有人知道 Windows 的等效方法吗 我愿意接受任何建议 编辑
  • gcc -lpthread 不工作

    我的系统中安装了 ubuntu 11 我有一个使用 pthread 库的 C 程序 我收到错误Undefined reference to sem wait 即使我已经用标志编译了 lpthread 例如 gcc lpthread prog
  • 如何根据CPU能力实现渲染器

    我想知道在 JavaScript 中实现渲染器的最佳方法是什么 这里真正重要的并不是渲染的内容部分 我更想知道何时以及如何有效地运行渲染器代码 目前 我有window setInterval renderFunc 1000 20 每 50
  • 将 IntelliJ IDEA 缓存/索引目录移动到 RAM

    我正在尝试移动caches and index从 IntelliJ IDEA 配置目录到 RAM 挂载点的目录 tmp使用符号链接 我已经添加 tmpfs tmp ramdisk tmpfs defaults size 1024M x gv
  • “忙等待”与“睡眠”的权衡是什么?

    这是我之前问题的延伸 unix linux 套接字中的阻塞模式如何工作 https stackoverflow com questions 1107391 how does blocking mode in unix linux socke
  • 大师系统要求

    我们将使用 Virtuoso 来存储 RDF 三重计数一开始将为 1 亿 我需要知道典型的 RAM CPU 磁盘等应该是什么 查询将使用 SPARQL 并且查询会有点复杂 请提供您的意见 Virtuoso 版本 6 x 三元组 四元组 的平
  • 如果物理内存的大小是2^32-1,那么虚拟内存的大小是多少?

    我知道物理地址是 32 位长 但是如何通过这些信息找出虚拟内存的大小 虚拟内存地址空间的总大小为2 32x86架构和更大 目前约为 2 48 x64建筑学 然而 操作系统通常会保留一部分空间 因此 32 位应用程序不一定能一次寻址 4GB
  • 从 Java 访问文件名中带有空格的文件

    我想从java程序访问文件名中有空格的目录中的文件 但它不访问文件 场景是我在文件中有文件名 iread 从该文件中读取文件名 但无法在 java 中打开带有空格的文件 我们使用 File exist 函数来检查文件是否存在 但它返回 fa
  • 为什么x86分页没有特权环的概念?

    早在 1982 年 当 Intel 发布 80286 时 他们在分段方案中添加了 4 个特权级别 环 0 3 由全局描述符表 GDT 和局部描述符表 LDT 中的 2 位指定 在 80386 处理器中 Intel 添加了分页功能 但令人惊讶

随机推荐