go语言模型mpg go语言gorm

Golang 线程和协程的区别线程:
多线程是为了解决CPU利用率的问题,线程则是为了减少上下文切换时的开销,进程和线程在Linux中没有本质区别,最大的不同就是进程有自己独立的内存空间,而线程是共享内存空间 。
在进程切换时需要转换内存地址空间,而线程切换没有这个动作,所以线程切换比进程切换代价要小得多 。
协程:
想要简单,又要性能高,协程就可以达到我们的目的 , 它是用户视角的一种抽象,操作系统并没有这个概念,主要思想是在用户态实现调度算法,用少量线程完成大量任务的调度 。
Goroutine是GO语言实现的协程,其特点是在语言层面就支持,使用起来十分方便,它的核心是MPG调度模型:M即内核线程;P即处理器,用来执行Goroutine , 它维护了本地可运行队列;G即Goroutine,代码和数据结构;S及调度器,维护M和P的信息 。
Python和go语言有什么区别?哪个更有优势?python和go语言的区别
1、语法
Python的语法使用缩进来指示代码块 。Go的语法基于打开和关闭括号 。
2、范例
Python是一种基于面向对象编程的多范式,命令式和函数式编程语言 。它坚持这样一种观点 , 即如果一种语言在某些情境中表现出某种特定的方式,理想情况下它应该在所有情境中都有相似的作用 。但是 , 它又不是纯粹的OOP语言,它不支持强封装,这是OOP的主要原则之一 。
Go是一种基于并发编程范式的过程编程语言 , 它与C具有表面相似性 。实际上,Go更像是C的更新版本 。
3、并发
Python没有提供内置的并发机制 , 而Go有内置的并发机制 。
4、类型化
Python是动态类型语言 , 而Go是一种静态类型语言,它实际上有助于在编译时捕获错误,这可以进一步减少生产后期的严重错误 。
5、安全性
Python是一种强类型语言 , 它是经过编译的,因此增加了一层安全性 。Go具有分配给每个变量的类型,因此,它提供了安全性 。但是 , 如果发生任何错误,用户需要自己运行整个代码 。
6、管理内存
Go允许程序员在很大程度上管理内存 。而,Python中的内存管理完全自动化并由Python VM管理;它不允许程序员对内存管理负责 。
7、库
与Go相比,Python提供的库数量要大得多 。然而,Go仍然是新的,并且还没有取得很大进展 。
8、速度:
Go的速度远远超过Python 。
【golang详解】go语言GMP(GPM)原理和调度Goroutine调度是一个很复杂的机制,下面尝试用简单的语言描述一下Goroutine调度机制 , 想要对其有更深入的了解可以去研读一下源码 。
首先介绍一下GMP什么意思:
G ----------- goroutine: 即Go协程,每个go关键字都会创建一个协程 。
M ---------- thread内核级线程 , 所有的G都要放在M上才能运行 。
P ----------- processor处理器,调度G到M上,其维护了一个队列,存储了所有需要它来调度的G 。
Goroutine 调度器P和 OS 调度器是通过 M 结合起来的,每个 M 都代表了 1 个内核线程 , OS 调度器负责把内核线程分配到 CPU 的核上执行
模型图:
避免频繁的创建、销毁线程,而是对线程的复用 。
1)work stealing机制
当本线程无可运行的G时,尝试从其他线程绑定的P偷取G , 而不是销毁线程 。
2)hand off机制
当本线程M0因为G0进行系统调用阻塞时,线程释放绑定的P,把P转移给其他空闲的线程执行 。进而某个空闲的M1获取P , 继续执行P队列中剩下的G 。而M0由于陷入系统调用而进被阻塞,M1接替M0的工作,只要P不空闲,就可以保证充分利用CPU 。M1的来源有可能是M的缓存池,也可能是新建的 。当G0系统调用结束后,根据M0是否能获取到P,将会将G0做不同的处理:

推荐阅读