# 操作系统相关

# 虚拟地址空间

在 32 位机器下,虚拟地址空间大小为 4G。这些虚拟地址通过页表 (Page Table) 映射到物理内存,页表由操作系统维护,并被处理器的内存管理单元 (MMU) 硬件引用。每个进程都拥有一套属于它自己的页表,因此对于每个进程而言都好像独享了整个虚拟地址空间。

Linux 将这 4G 的空间分为两个部分:

  1. Kernel space 内核空间。
  2. User Mode Space 用户空间。

每个进程的 4G 地址空间中,最高 1G 都是一样的,即内核空间。只有剩余的 3G 才归进程自己使用。

换句话说就是, 最高 1G 的内核空间是被所有进程共享的!

而上面进程虚拟地址空间中的栈区,正指的是我们所说的进程栈。进程栈的实时大小并不固定,它也有最大限制 RLIMIT_STACK (一般为 8M)。

一个进程至少有一个线程,主线程有自己的栈,64 位 Linux rust 程序主线程栈是 8M。其他程序线程默认是 2M。

# 进程、线程

  1. 从 Linux 内核的角度来说,其实它并没有线程的概念。线程仅仅被视为一个与其他进程共享某些资源的进程,而是否共享地址空间几乎是进程和 Linux 中所谓线程的唯一区别。
  2. 线程的内存描述符 将直接指向 父进程的内存描述符。
  3. 线程一旦创建就无法在修改其栈大小了,一旦用尽就没了,由于线程栈是从进程的地址空间中 map 出来的一块内存区域,原则上是线程私有的
  4. 由于进程间是隔离的,各自拥有自己的内存资源。

# 进程

  1. 进程是系统分配资源的最小单位
  2. 线程是 CPU 调度的最小单位
  3. 由于默认进程内只有一个线程,所以多核 CPU 处理多进程就像是一个进程一个核心

# 线程

  1. 线程属于进程
  2. 线程共享进程的内存地址空间
  3. 线程几乎不占有系统资源

# Memory segment: 内存段

# text segment: 代码段

用于存放程序代码的区域,编译时确定,只读。更进一步讲是存放处理器的机器指令

# data segment: 数据段

用于存放在编译阶段(而非运行时)就能确定的数据,可读可写。也是通常所说的静态存储区赋了初值的全局变量、常量和静态变量都存放在这个域。

# bss: segment

即: block started by symbol segment

通常是指用来存放程序中未初始化的全局变量,初始化时 bss 部分将会清零。

# heap

存放进程运行中动态 分配的内存段,大小不固定。

同一进程中的所有线程共享这一块内存。

# stack

Last Updated: 2/8/2023, 2:30:06 AM