什么是寄存器

本文是转载,原文地址:技术奇异点

什么是寄存器

寄存器 (register) 似乎是初学计算机结构的人多少有所了解的概念 —— 成本最高也是速度最快的存储单元。不过,有时事物还可以从完全不同的角度重新阐述一遍。这段时间在看 SICP 和 Lua 虚拟机,其中两个常被并列提及的概念是 stack-based 虚拟机和 reigster 虚拟机。即使在深入了解虚拟机理论前,也可以想像语言虚拟机结构不太可能与 CPU 硬件 register 有直接对应关系。「Register 虚拟机」这个名称引起我对 register 进行重新认识的兴趣。

接触虚拟机之前还考虑过另一个和 register 相关的问题。一般的常识是函数调用时的参数通过 stack 传递。但是很多编译器从 90 年代起就实现了一种优化:通过 CPU register 传递参数。这样做的优点固然显而易见,但同时引出新的疑问:原本用 stack 传递参数不仅解决了数据传递问题,也解决了多层嵌套的函数调用时上层数据的保存问题;而 register 数量有限,如何解决多层嵌套调用时的状态问题?答案其实也简单,当一个函数 A 调用另一个函数 B 时,那些正在存储 A 本身的参数或者 A 本身的局部变量的 register 如果又要被用于向 B 传递参数,那么这些 register 的内容在被更改为传递给 B 的参数之前会先被压入 stack,B 返回之后这些 register 的内容会从 stack 中恢复。也就是说,register 并不是替代 stack 的传参功能,而是对 stack 的使用延迟了一个调用层次。根据「局部性原理」延迟使用主存中的 stack 得到速度优化。

由此可见,register[1]虽然经常被称为比主存更快的存储单元,但是它的作用并不是给任意用途的主存单元提供高速替代品,而是和 stack 这种特定用途的存储区域有更紧密的联系。若感觉如此得出结论过于仓促,可以再观察几个例子。比如说,操作系统进行线程切换时,需要切换当前 stack 以及 —— 所有 register 内容。看,register 就像 stack 的延展。我们可以说 register 是 stack 最顶一段的硬件加速机制。

接下来再看 Lua 虚拟机的实现,它的 VM register 就是实现在 VM stack[2]上。也就是说,Lua 使用 VM stack 的方式其实和一般的 C 编译器产生的代码使用 CPU stack 的方式没有区别。那么究竟为何 Lua 之类的虚拟机区别于 stack-based 虚拟机而特地被称为 register 虚拟机呢?通过 stack-base 虚拟机的指令可以发现,这种虚拟机是基本严格按照后入先出的方式使用 stack,每条指令基本上只操作 stack top 的一两条数据。而 register 虚拟机只在大的调用层次上遵循后入先出,在每层函数运行中是完全随机地使用本层函数的 stack (即当前 stack-frame [3],函数返回地址部分除外)。

全新的 register 的本质定义是:可被随机访问的最顶层 stack-frame。由此可以看出,主流编译语言几乎都可以称为 register 虚拟机 [4] 实现,即使在使用 register 传参这个优化流行之前。CPU 的硬件 register 是对一般 register 的硬件优化。

脚注:

[1] :更确切地说是通用寄存器,general-purpose registers 。
[2]:Lua 的 VM stack 和其虚拟机实现本身的 C runtime stack (或者说硬件 CPU 的 stack) 是分开的。
[3]:按照函数调用层次,stack 可以被看作一组 frame,每层函数调用占据一个 frame。
[4]:这里的「虚拟机」是真实的 CPU。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容