内核空间和虚拟空间
地址空间被分为内核空间和用户空间,为虚拟地址空间,内核维护虚拟地址空间到物理地址空间的映射。内核空间的访问比较严格,操作系统限制对其的访问,但是向外暴露了一些必要的接口访问。cpu权限被分为两种:内核态和用户态,如果需要调用内核接口就需要内核态权限,称为系统调用。系统调用就是操作系统内部定义的一些函数。
用户级线程和内核级线程
用户级线程
用户级线程由应用级别的线程库进行生成和管理,其不属于内核部分,线程的存在是内核无法感知的,其优点在于不需要内核的参与,没有内核态切换的开销。但是也造成了这种模型并不能实现真正的并发,假设进程中由一个线程阻塞,那么会造成整个进程的阻塞,即使由多个CPU可以使用。
内核级线程
内核级线程由内核直接创建和进行管理,对内核是可见的,可以对每一个线程进行调度,如果一个线程进行阻塞也不会影响其他线程的运行,但是开销相比用户级线程大的多,创建、切换、同步宪曾都需要更大的内核资源
两级线程
目前常用的线程模型就是采用两级线程的方式,Go中的实现方式就是goroutine。结合内核级线程和用户级线程的优点,由内核创建多个内核级线程对用户级线程进行管理,线程库对管理线程实现动态的内核级线程的关联。此种模型设计难度更大、编码难度更高,但是有效降低了内核开销,并且使多线程优点得到了发挥。