CLR中的堆栈管理

时间:2011-03-05 15:19:39

标签: clr

我理解堆栈和堆的基本概念,但如果any1可以解决以下混淆,那就很好了:

  1. 是否有整个应用程序进程的单个堆栈,或者在项目中开始创建新堆栈的每个线程?

  2. 是否有整个应用程序进程的单个堆或者在项目中开始创建新堆栈的每个线程?

  3. 如果为每个线程创建了堆栈,那么进程如何管理线程的顺序流(以及堆栈)

3 个答案:

答案 0 :(得分:4)

  1. 每个线程都有一个单独的堆栈。这不仅适用于CLR,不仅适用于Windows,而且适用于所有操作系统或平台。

  2. 每个Application Domain都有一个堆。单个进程可以同时运行多个应用程序域。单个应用程序域可以运行多个线程 更确切地说,每个域通常有两个堆:一个是常规的,一个是非常大的对象(例如,64K阵列)。

  3. 我不明白“顺序线程流”是什么意思。

答案 1 :(得分:4)

每个线程一个堆栈,所有线程共享相同的堆。

没有'顺序流'的线程。线程是一个操作系统对象,用于存储处理器状态的副本。处理器状态包括寄存器值。其中一个是ESP,堆栈指针。另一个非常重要的是EIP,即指令指针。当操作系统在线程之间切换时,它将处理器状态存储在当前线程对象中,并从线程对象中重新加载状态,以便选择下一个运行的线程。处理器现在只是继续执行它之前停止的位置。

启动线程也许现在也很容易理解。操作系统为堆栈分配一兆字节的内存。并初始化ESP寄存器值以指向该存储器。并将EIP寄存器的值设置为线程应开始执行的方法的地址。 C#中ThreadStart委托的值。

答案 2 :(得分:0)

每个线程必须拥有自己的堆栈,这是保存局部变量和参数的地方,以及前面函数的返回地址。