进程和多线程内存分配
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
   |               process              multi threads
                                                                           / PC (program counter)                                                                         /  IP (instruction porinter)                                                            register => |   : 0xff ==> ------------------      -----------------       /              \  :            | stack          |      | stack1         |  => |                \ :          ------------------      ==================      \              |   :            |      | stack2         |        call stack  =>  ----------------------------- \          |   :            |      ------------------                        | locals of subroutine      |  \          |   :            |      |   :            |                        -----------------------------   |          |   :            |      |   :            |                        | return address            |   stack frame          ------------------      ------------------                        -----------------------------   |          | heap           |  =>  | heap           |                        | parameters for subroutine |  /          ------------------      ------------------                        ----------------------------- /          | (static) data  |  =>  | (static) data  |                        |       caller routine      |             ------------------      ------------------                        |       stack frame         |             | code           |  =>  | code           |                        |                           |    0x00 ==> ------------------      ------------------                        -----------------------------
   | 
 
(单线程)进程的内存分配:(地址由低到高)
- code
代码段。存储进程机器码 
- (static) data
数据段。主要是静态数据,在任何函数以外的变量或函数中用 static 声明的变量 
- heap
堆。进程内动态申请空间。地址由低到高。 
- stack
栈。程序函数调用栈,及与函数调用相关的一些信息。地址由高到低。 
多线程进程的内存分配:
- code,(stack) data,heap 所有线程共享,与(单线程)进程的内存分配方式一致
 
- stack
每个线程有自己独立的栈空间,主要由 register,call stack 等部分组成 
register 寄存器
程序运行时用到的寄存器,当前函数若调用其他函数,需”保存现场”,将当前用到的寄存器的值全部暂存起来,待被调用函数返回控制权后,恢复寄存器的值,继续执行。常见的寄存器的值有 PC, IP等。
- PC (program counter)
记录下一条待执行指令的地址 
- IP (instruction porinter)
当前正在执行的指令    
call stack 调用栈
call stack 调用栈由多个 stack frame 组成。每个 stack frame 大致由 locals of subroutine, return address, parameters for subroutine 三部分组成。
- locals of subroutine
当前函数的局部变量 
- return address
当前函数退出时,返回其调用者。返回的具体地址 
- parameters for subroutine
当前函数被调用时,调用者传递给当前函数的参数 
Reference & Thanks