0%

Go语言GMP模型

事情要一点儿一点儿地做,本事要一点儿一点儿地学,才能一步一步把成功的本领学到手。 —— 褚时健

一、基础

  1. 进程,是计算机中正在运行的程序的实体,是操作系统资源进行分配和调度的基本单位。在当代面向线程设计的计算机结构中,进程是线程的容器。

    • 在程序启动时,对32位系统中,操作系统会为每个进程分配4G(2^32次方)虚拟内存空间
      • 4G虚拟内存空间又被分为两部分:用户空间和内核空间
        • 用户空间只用于用户程序的执行,若要执行各种IO操作就要通过系统调用等进入内核空间进行操作
    • 操作系统分配和管理内存时是以页为单位进行的,虚拟和物理内存都是被划分为大小相同的页,页大小一般为4K
    • CPU执行时,发送虚拟地址给内存管理单元(MMU),MMU将虚拟地址翻译为物理地址,具体实现是通过查页表
    • 每个进程都有自己的页表存放于物理内存中,虚拟内存空间和物理内存空间是通过页表映射实现关联的
      • 页表实际上是一个数组,数组中的每个元素称为页表项
    • 操作系统分配给进程的虚拟内存空间一般包含五种段:数据段、代码段、BSS、堆、栈
      • 数据段:存放程序中的静态变量和已初始化且不为零的全局变量
      • 代码段:存放可执行文件的操作指令,代码段是只读的,不可进行写操作,这部分的区域在运行前已知其大小
      • BSS段(Block Started By Symbol):存放未初始化的全局变量,在变量使用前由运行时初始化为零
      • 堆:存放进程运行中被动态分配的内存,其大小不固定
      • 栈:存放程序中的临时的局部变量和函数的参数值
    • 每个进程的虚拟内存空间都是独立且连续的,由操作系统将虚拟内存空间映射到物理内存空间
      • 实际上分配的是被分隔成多个物理内存的碎片,还有部分暂时存储在外部磁盘存储器上,通过缺中断处理把物理内存和磁盘中的数据进行置换
  2. 线程,是操作系统能够进行调度的最小单位,它被包含在进程之中,一般一个进程最少拥有一个主线程。

    • 同一进程中的多个线程共享该进程中的全部系统资源
    • 同一进程中的多个线程共享代码段(代码和常量)、数据段(全局变量和静态变量)、堆,但是每个线程拥有自己的栈用来存放局部变量和临时变量
  3. 协程coroutine

二、GMP

三、参考

  1. 参考一
  2. 参考二
  3. 参考三
  4. 参考四