您的位置:首页 > 编程语言 > Go语言

gorountine为什么能够支持更多的并发?

2018-11-21 10:21 141 查看

首先要明白内核级线程(Kernel-Level Thread)与用户线程(User-Level Thread)的区别:

 1 .内核级线程:切换由内核控制,当线程进行切换的时候,由用户态转化为内核态。切换完毕要从内核态返回用户态;可以很好的利用smp,即利用多核cpu。java1.2之后的线程模型就是使用内核级线程,当线程上下文切换时,就会出现以上用户态到内核态的切换。

 2. 用户级线程内核的切换由用户态程序自己控制内核切换,不需要内核干涉,少了进出内核态的消耗,但不能很好的利用多核Cpu,目前Linux pthread大体是这么做的,用户级线程不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应 用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。不需要用户态/核心态切换,速度快,操作系统内核不知道多线程的存在,因此一个线 程阻塞将使得整个进程(包括它的所有线程)阻塞。由于这里的处理器时间片分配是以进程为基本单位,所以每个线程执行的时间相对减少。

goroutine使用的是轻量级线程,即M:N模型,本质是用户线程,其调用是由goroutine调度器实现,并不由内核来调用,用户线程的好处是:轻量,开销小,但问题是并不能避免一个线程阻塞使得整个进程阻塞的问题,但goroutine调度器解决了这个问题。

goroutine对系统线程(内核级线程)进行了封装,暴露了一个轻量级的协程goroutine(用户级线程)供用户使用,而用户级线程到内核级线程的调度由golang的runtime负责,调度逻辑对外透明

goroutine的优势在于上下文切换在完全用户态进行,无需像线程一样频繁在用户态与内核态之间切换,节约了资源消耗

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: