zoukankan      html  css  js  c++  java
  • 类型,对象,线程栈和托管堆在运行时的相互关系(一)。

       当系统加载一个CLR的进程,进程里面可能有多个线程,这时候系统会给这个进程创建一个大小为1M的线程栈。这个线程栈用来存放方法调用的实参,和方法内部定义的局部变量。下图展示了一个线程栈的栈内存。线程栈的存储是从高位内存地址向地位内存地址构建的。现在假设线程栈执行的代码要调用M1方法。

    在这个很简单的方法中,应该包含一些初始化这个方法的“序幕”代码,和一些“尾声”代码,负责在方法调用完成之后对方法进行清理。然后才返回给这个方法的调用者。M1方法调用开始时,M1的序幕代码在线程栈上分配局部变量name的内存。如下图

    然后M1调用M2方法,将name作为一个实参来传递。这造成name局部变量中的地址被压入栈。如下图:在M2方法内部,将使用名为s的参数变量来表示栈位置。另外调用一个方法时还要将一个返回地址压入栈。被调用的方法结束后,应该返回到这个位置。如下图:M1调用M2的时候将实参和返回地址压入栈。

    M2方法开始执行时,同样它的“序幕”代码在线程栈中为局部变量length和tally分配内存。如下图,然后M2中的内部代码开始执行。最终方法内部的代码开始执行,最终到达return语句,此时CPU的指令指针被设置成线程栈中的返回地址。而且M2的栈帧会被展开。(我理解栈帧被展开的意思就是在线程栈中就M2方法的痕迹给消除,应该是被尾声代码所为),这点不是很理解,肯定不能是在清楚M2方法法的痕迹之后在返回,那样返回地址已经不存在了,那就是程序在返回给调用者之后猜进行清理的?请教牛人。,之后M1会执行M2方法调用后面的代码。最后M1会同M2一样返回给调用者。

    参考clr via C#

    说的不对的地方,口下留情,疑惑地方请指点。

      

  • 相关阅读:
    Eclipse 导入外部项目无法识别为web项目并且无法在部署到tomcat下
    Android开发-API指南-<activity-alias>[原创译文]
    深入WeakHashMap
    寻找第K大数的方法总结
    overridePendingTransition的简介
    Oracle执行CreateTableAs报ORA-600错误
    HahaMil数据库(数据库操作组件)
    List(支持按笔画排序的List类)
    关于我的网站(八零家园三周年)
    走出象牙塔之Final(2014.07.07)
  • 原文地址:https://www.cnblogs.com/fantiantian/p/2513435.html
Copyright © 2011-2022 走看看