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的优势在于上下文切换在完全用户态进行,无需像线程一样频繁在用户态与内核态之间切换,节约了资源消耗
相关文章推荐
- ONS(RocketMQ)为什么能够比Kafka支持更多的分区数量?
- nginx为什么比Apache支持高并发???
- nginx为什么比Apache支持高并发???
- Tomcat能够稳定支持的最大用户并发数
- Tomcat能够稳定支持的最大用户并发数
- 解惑:为什么300的并发能把支持最大连接数4000数据库压死?
- Tomcat能够稳定支持的最大用户并发数
- 【nginx笔记】系统参数设置-使Nginx支持更多并发请求的TCP网络参数
- ConcurrentHashMap为什么支持完全并发的读
- 为什么32位的win2003服务器系统支持超过4G甚至更多的内存
- 单进程单线程的Redis如何能够高并发,redis是个单线程的程序,为什么会这么快呢?
- 配置开发支持高并发TCP连接的Linux应用程序全攻略
- Android 支持刷新、加载更多、带反弹效果的RecyclerView
- 从Nginx优秀的核心架构设计,揭秘其为何能支持高并发
- 配置开发支持高并发TCP连接的Linux应用程序全攻略zz
- Android_支持下拉刷新和加载更多的ExpandableListView
- 为什么在定义能够使用函数适配器的函数的时候要继承一下std::unary_function或者std::binary_function
- 华生详解万科董事会:我为什么不支持大股东意见(中)
- 让CentOS6 yum源支持更多rpm包的升级(使用第三方软件库EPEL、RPMForge与RPMFusion)
- WebKitGTK 2.23.90增加了对JPEG2000及更多触摸板手势的支持