bjmayor 发布于 2021-10-18

GMP调度器

GMP调度器

主要内容来自 潘少 的 gnet开源说。 https://github.com/gocn/opentalk

G、M、P 是什么

image-20211018161626840

G: 表示 Goroutine,每个 Goroutine 对应一个 G 结构体,G 存储 Goroutine 的运行堆栈、状态以及任务函数,可重用。G 并非执行体,每个 G 需要绑 定到 P 才能被调度执行。

P: Processor,表示逻辑处理器, 对 G 来说,P 相当于 CPU 核,G 只有绑定到 P(在 P 的 local runq 中)才能被调度。对 M 来说,P 提供了相关的执行 环境(Context),如内存分配状态(mcache),任务队列(G)等,P 的数量决定了系统内最大可并行的 G 的数量(前提:物理 CPU 核数 >= P 的数量),P 的数量由用户设置的 GOMAXPROCS 决定,但是不论 GOMAXPROCS 设置为多大,P 的数量最大为 256。

M: Machine,OS 线程抽象,代表着真正执行计算的资源,在绑定有效的 P 后,进入 schedule 循环;而 schedule 循环的机制大致是从 Global 队列、P 的 Local 队列以及 wait 队列中获取 G,切换到 G 的执行栈上并执行 G 的函数,调用 goexit 做清理工作并回到 M,如此反复。M 并不保留 G 状态,这是 G 可以跨 M 调度的基础,M 的数量是不定的,由 Go Runtime 调整,为了防止创建过多 OS 线程导致系统调度不过来,目前默认最大限制为 10000个。

阅读全文 »

bjmayor 发布于 2021-10-14

原码、补码、反码

原码、补码、反码

一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.

将带符号位的机器数对应的真正数值称为机器数的真值。如: 10000011 的真值是3。

原码: 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。原码是人脑最容易理解和计算的表示方式.

反码:反码的表示方法是: 正数的反码是其本身,负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。

补码: 补码的表示方法是:正数的补码就是其本身,负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

阅读全文 »

bjmayor 发布于 2021-10-14

大字节序 v 小字节序

端序(Endianness),又称字节序、尾序、位序。在计算机领域是指机器存放多字节数据的字节顺序。在涉及到低层数据存储和网络数据传输研究中都会涉及端序。

大端序(Big-Endian,大尾序):高位字节放在内存的低地址,低位字节放在内存的高地址。

小端序(Little-Endian,小尾序):低位字节放在内存的低地址,高位字节放在内存的高地址。

端序是与硬件的体系结构相关而与所使用的操作系统无关的概念,目前基本上所有x86系列的PC机都是小端序。

阅读全文 »

bjmayor 发布于 2021-10-14

浮点数

浮点数的存储

float可以保证十进制科学计数法小数点后6位有效精度和第7位的部分精度

double可以保证十进制科学计数法小数点后15位有效精度和第16位的部分精度。

阅读全文 »

bjmayor 发布于 2021-10-14

程序是怎样跑起来的-阅读笔记

[TOC]

程序是怎样跑起来的。

第一章 对程序员来说CPU是什么

弄清楚了负责保存指令和数据的寄存器的机制,也就理解了程序的运行机制。

CPU的内部结构解析

CPU所负责的就是解释和运行最终转换为机器语言的程序内容。

CPU和内存是由许多晶体管组成的电子部件,通常称为IC(Integrated Circuit, 集成电路)。

从功能方面看,CPU的内部由寄存器控制器运算器时钟4个部分构成,各部分之间由电流信号互相连通。

阅读全文 »