register 是用来存放程序中需要暂存数据的一个寄存单元,当调用线程或者说子程序的时候这些程序都需要有自己的工作空间,所以在调用的时候要分配好运行的寄存器资源调度。这里的寄存器资源调度都是以Berkeley-risc芯片架构作为基础的。其寄存器组(register file)外观结构如下图所示为一个拥有N个M位寄存器的register file:
其输入和输出端口由input sel和两个output sel引脚状态对mux进行选择来确定的输入输出端的硬件连接结构如下所示。
在切换线程或者是调用子程序的时候,一般情况下需要将前一个寄存器的内容复制到stack中,调用结束之后又要复制回来,这就会浪费很多CPU的时间。所以为了解决这个问题,就使用硬件来解决。解决的方法就是register windowing,在这个方法的主要思路是,在组程序运行的过程中cpu不需要用到所有的寄存器,只需要用到一部分,这一部分中需要用到的寄存器可以分为这么几种:
- 全局寄存器(global reg)这个存储全局变量,这些变量是所有的子程序或者线程都用的,所以这部分在调配寄存器的时候不需要变化只需要明白归属就行了
- 输入/输出寄存器(input/output reg)这个寄存器用来放将要输入或者输出的参数,这个用于与其他的程序进行数据交换,一个程序中有一个输入一个输出
- 局部寄存器(local reg)这个寄存器用来给本线程或者说是本子程序使用,用于自己内部运算
当子程序运行完成后寄存器变化如下左图,全局寄存器不变前一个程序的输出寄存器作为后一个程序的输入寄存器,局部寄存器和输出寄存器向下取新的,这样就不需要将这些数据存到stack或者mem中了,直接硬件通道转换一下就可以解决,当寄存器用完了最后一个时,就又会调回第一个寄存器成为一个循环(这里要堆栈了吗???不的话数据怎么破。。。),图右所示:
参考资料:
https://www.usenix.org/legacy/events/sec01/full_papers/frantzen/frantzen_html/node5.html