进程和多线程内存分配
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