0%

Process vs Threads(进程和多线程内存分配)

进程和多线程内存分配

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 ==> ------------------ ------------------ -----------------------------

(单线程)进程的内存分配:(地址由低到高)

  1. code
    代码段。存储进程机器码
  2. (static) data
    数据段。主要是静态数据,在任何函数以外的变量或函数中用 static 声明的变量
  3. heap
    堆。进程内动态申请空间。地址由低到高。
  4. 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