自学Go语言过程中摸索出的底层知识

Posted jinnan88

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自学Go语言过程中摸索出的底层知识相关的知识,希望对你有一定的参考价值。

概念约定

本文中出现的概念只是为了方便描述而假设的概念,有些概念在专业术语中并不存在; 并且所有概念在不同硬件、操作系统及编程语言下的实际表现可能会有细节上的不同。

进程时间

进程 直接从 CPU 核心分配 CPU时间 ,某 进程 分配到的 CPU时间 又称为它的 进程时间 。

线程时间

线程从它所属的 进程 的 进程时间 中分配时间,某线程分配到的 CPU时间 又称为它的 线程时间 。

协程时间

协程从它所属的 线程 的 线程时间 中分配时间,某协程分配到的 CPU时间 又称为它的 协程时间 。

内核

所谓 内核 就是操作系统的核心,这一点想必大家都知道,然而实际上 内核 所包含的知识远不止于此,本文中我们主要涉及到的是 内核封装 的概念。 大家不妨用类的封装来类比——将核心数据保护起来,使不属于 内核 的代码(或者专业一点儿叫 内核空间 之外的代码)无法直接访问,只能通过 内核 提供的接口调用 内核代码 间接访问——这就叫做 内核封装 。

内核态

运行 内核代码 的状态,或者说运行在 内核空间 的状态,叫做 内核态。 某 CPU核心 正在运行 内核代码,我们就可以说它正处于 内核态; 如某 进程 运行过程中通过 系统接口 调用了 内核代码,则此时该 进程 和它所属(分配 CPU时间 给它)的 CPU核心 都处于 内核态。

以此类推,如某 线程 调用了 内核代码,则此时它和它上级的 进程、CPU核心 都处于 内核态。

同样地,如某 协程 调用了 内核代码,则此时它和它上级的 线程、进程、CPU核心 都处于 内核态。

用户态

运行非 内核代码,即 用户代码 的状态,或者说运行在 用户空间 的状态,叫做 用户态。

某 CPU核心 正在运行 用户代码,我们就可以说它正处于 用户态; 如某 进程 正在运行 用户代码,则此时该 进程 和它所属(分配 CPU时间 给它)的 CPU核心 都处于 用户态。

以此类推,如某 线程 正在运行 用户代码,则此时它和它上级的 进程、CPU核心 都处于 用户态。

同样地,如某 协程 正在运行 用户代码,则此时它和它上级的 线程、进程、CPU核心 都处于 用户态。

CPU特权级别

Intel CPU 拥有四个特权级别,由r0r3,由 寄存器 中的两个隐藏位(bit)指定: 00r001r110r211r3

权限大小: r0>r1>r2>r3,每种特权级别所能执行的 CPU指令 都不同,r0能执行所有 指令,其它三个能执行的 指令 依次递减。

Windows 使用r0作为 内核态 特权级别,使用r3作为 用户态 特权级别,其它 CPU 和系统具体情况不了解,应该大同小异。

系统CPU时间

运行 内核代码 所消耗掉的 CPU时间,或者说在 内核空间 运行所消耗掉的 CPU时间,叫做 系统CPU时间。

用户CPU时间

运行非 内核代码 ,即 用户代码 所消耗掉的 CPU时间,或者说在 用户空间 运行所消耗掉的 CPU时间,叫做 用户CPU时间。

墙上时钟时间

或者可以简称为 时钟时间,顾名思义,就是指挂在墙上的时钟的时间; 是不受 CPU时间 分配影响的,外部的,客观的物理时间。

这个概念看似没什么深度,甚至有点儿搞笑,但实际上还是很有用的。 比如我在编译一个 JAVA 程序时,控制台反馈给我[finished in 0.8s]的信息,但是我心里默数了,从编译开始到结束,最起码有两秒多。 于是我就可以跟别人描述说: “JAVA编译反馈的编译时间应该是它消耗掉的CPU时间,而不是时钟时间,我心里默数了最起码有两秒多,它告诉我\'finished in 0.8s\'”。

以上是关于自学Go语言过程中摸索出的底层知识的主要内容,如果未能解决你的问题,请参考以下文章

Go语言底层知识总结新手必学

Go语言自学系列 | 如何编写golang代码

GO语言(十六):模糊测试入门(上)

如何自学objective c语言?

基于Go博客wblog的理解和修改。

go学习Golang底层学习笔记