# 操作系统相关
# 虚拟地址空间
在 32 位机器下,虚拟地址空间大小为 4G。这些虚拟地址通过页表 (Page Table) 映射到物理内存,页表由操作系统维护,并被处理器的内存管理单元 (MMU) 硬件引用。每个进程都拥有一套属于它自己的页表,因此对于每个进程而言都好像独享了整个虚拟地址空间。
Linux 将这 4G 的空间分为两个部分:
- Kernel space 内核空间。
- User Mode Space 用户空间。
每个进程的 4G 地址空间中,最高 1G 都是一样的,即内核空间。只有剩余的 3G 才归进程自己使用。
换句话说就是, 最高 1G 的内核空间是被所有进程共享的!
而上面进程虚拟地址空间中的栈区,正指的是我们所说的进程栈。进程栈的实时大小并不固定,它也有最大限制 RLIMIT_STACK (一般为 8M)。
一个进程至少有一个线程,主线程有自己的栈,64 位 Linux rust 程序主线程栈是 8M。其他程序线程默认是 2M。
# 进程、线程
- 从 Linux 内核的角度来说,其实它并没有线程的概念。线程仅仅被视为一个与其他进程共享某些资源的进程,而是否共享地址空间几乎是进程和 Linux 中所谓线程的唯一区别。
- 线程的内存描述符 将直接指向 父进程的内存描述符。
- 线程一旦创建就无法在修改其栈大小了,一旦用尽就没了,由于线程栈是从进程的地址空间中 map 出来的一块内存区域,原则上是线程私有的。
- 由于进程间是隔离的,各自拥有自己的内存资源。
# 进程
- 进程是系统分配资源的最小单位
- 线程是 CPU 调度的最小单位
- 由于默认进程内只有一个线程,所以多核 CPU 处理多进程就像是一个进程一个核心
# 线程
- 线程属于进程
- 线程共享进程的内存地址空间
- 线程几乎不占有系统资源
# Memory segment: 内存段
# text segment: 代码段
用于存放程序代码的区域,编译时确定,只读。更进一步讲是存放处理器的机器指令
# data segment: 数据段
用于存放在编译阶段(而非运行时)就能确定的数据,可读可写。也是通常所说的静态存储区,赋了初值的全局变量、常量和静态变量都存放在这个域。
# bss: segment
即: block started by symbol segment
通常是指用来存放程序中未初始化的全局变量,初始化时 bss 部分将会清零。
# heap
存放进程运行中动态 分配的内存段,大小不固定。
同一进程中的所有线程共享这一块内存。