内存中存储的值的地址如何返回
How the address of the stored value in the memory comes back
定义变量时
let foo = 'bar';
该值通过数据总线,存储在内存中的随机位置,该位置的地址通过该地址总线发回,程序将该地址与变量一起保存在激活对象中(一个存储局部变量的对象)
相反,当调用变量时,相关地址通过地址总线发送,在该位置找到的值通过数据总线发回
我刚刚了解到地址总线是单向的,这是否意味着存储的值地址通过数据总线返回?或者我对这个过程的心理表征是完全错误的?
JavaScript 是一种高级解释型语言,因此有 非常 多层次的间接寻址,您甚至可以考虑地址和数据总线。
事实上,如果您是 运行 从 C 编译的程序,它是相当低级的,在现代操作系统上,还有 仍然 很多中间的层数(例如虚拟内存)。
无论如何:
the value goes through the data bus
首先您需要考虑值是什么。 (当前)计算机无法将字符串 "bar"
视为单个值。让我们考虑一种简单的、简化的某种准 JavaScript 实现,其中只有整数和 ASCII 字符。这里,你的 "bar"
可以表示为大约 5 个字节:一个将这个值标记为字符串,然后是它的长度(而我们的准 JavaScript 最多只能存储 255 个字符的字符串,即一个字节的值),然后是内容:01 03 61 62 72
.
JavaScript 解释器会:
- 询问它正在使用的运行时库来分配那么多内存并获取地址
- 运行时库的分配器会找出进程虚拟内存中的哪个位置space它可以容纳 5 个字节
- 如果不能,它会要求操作系统的内存分配机制给它 5 个字节(可能会要求更多,以防万一)(如果内存不足,这可能会失败)
- 现在有一个虚拟地址,在那里写那五个字节。
- OS 和处理器的虚拟内存实现会将虚拟地址映射到真实的物理内存地址,然后会使用地址和数据总线进行交易
is stored in a random location in the memory and the address of that location is sent back through that address bus
这里没有随机性。这里不能有任何随机性 :) 如上所述,OS 和 CPU 确切地知道数据在哪里以及它应该在哪里。是的,CPU 和 RAM 之间的地址总线是单向的,所以没有任何东西返回。
the program saves the address alongside the variable within the activation object (an object where local variables are stored)
这样的“激活对象”也会消耗space内存;在 JavaScript 解释器中,它可以是一个散列 table 映射字符串(变量名)到它们的内容地址(如上所述)。
inversely, when invoking a variable, the associated address is sent through the address bus and a value found at that location is sent back via the data bus
在那个时候考虑“变量”太高级了,但是,是的,“当访问内存时,...”
希望这对您有所帮助。我确定我在这里忘记了一些间接层(例如 CPU 缓存!)。
定义变量时
let foo = 'bar';
该值通过数据总线,存储在内存中的随机位置,该位置的地址通过该地址总线发回,程序将该地址与变量一起保存在激活对象中(一个存储局部变量的对象)
相反,当调用变量时,相关地址通过地址总线发送,在该位置找到的值通过数据总线发回
我刚刚了解到地址总线是单向的,这是否意味着存储的值地址通过数据总线返回?或者我对这个过程的心理表征是完全错误的?
JavaScript 是一种高级解释型语言,因此有 非常 多层次的间接寻址,您甚至可以考虑地址和数据总线。
事实上,如果您是 运行 从 C 编译的程序,它是相当低级的,在现代操作系统上,还有 仍然 很多中间的层数(例如虚拟内存)。
无论如何:
the value goes through the data bus
首先您需要考虑值是什么。 (当前)计算机无法将字符串 "bar"
视为单个值。让我们考虑一种简单的、简化的某种准 JavaScript 实现,其中只有整数和 ASCII 字符。这里,你的 "bar"
可以表示为大约 5 个字节:一个将这个值标记为字符串,然后是它的长度(而我们的准 JavaScript 最多只能存储 255 个字符的字符串,即一个字节的值),然后是内容:01 03 61 62 72
.
JavaScript 解释器会:
- 询问它正在使用的运行时库来分配那么多内存并获取地址
- 运行时库的分配器会找出进程虚拟内存中的哪个位置space它可以容纳 5 个字节
- 如果不能,它会要求操作系统的内存分配机制给它 5 个字节(可能会要求更多,以防万一)(如果内存不足,这可能会失败)
- 现在有一个虚拟地址,在那里写那五个字节。
- OS 和处理器的虚拟内存实现会将虚拟地址映射到真实的物理内存地址,然后会使用地址和数据总线进行交易
is stored in a random location in the memory and the address of that location is sent back through that address bus
这里没有随机性。这里不能有任何随机性 :) 如上所述,OS 和 CPU 确切地知道数据在哪里以及它应该在哪里。是的,CPU 和 RAM 之间的地址总线是单向的,所以没有任何东西返回。
the program saves the address alongside the variable within the activation object (an object where local variables are stored)
这样的“激活对象”也会消耗space内存;在 JavaScript 解释器中,它可以是一个散列 table 映射字符串(变量名)到它们的内容地址(如上所述)。
inversely, when invoking a variable, the associated address is sent through the address bus and a value found at that location is sent back via the data bus
在那个时候考虑“变量”太高级了,但是,是的,“当访问内存时,...”
希望这对您有所帮助。我确定我在这里忘记了一些间接层(例如 CPU 缓存!)。