美文网首页
Golang高阶:Golang协程实现原理

Golang高阶:Golang协程实现原理

作者: veeeeeeeeeeee | 来源:发表于2019-05-15 10:12 被阅读0次

版权所有,转载请注明:http://www.lenggirl.com/go/goroutine.html

引言

实现并发编程有进程,线程,IO多路复用的方式。(并发和并行我们这里不区分,如果CPU是多核的,可能在多个核同时进行,我们叫并行,如果是单核,需要排队切换,我们叫并发)

进程是计算机资源分配的最小单位,进程是对处理器资源,虚拟内存(1)的抽象,而虚拟内存是对主存资源和文件(2)的抽象,文件是对I/O设备的抽象。线程是计算机调度的最小单位,共享同个进程分配的计算机资源。

上面这些是在深入理解计算机系统说的,如果有错来咬我呀。

总上所述,实际实现并发的是线程。首先,每个进程都有一个主线程,因为线程是调度的最小单位,你可以只有一个线程,但是你也可以创建多几个线程,线程调度需要CPU来切换,需要内核层的上下文切换,如果你跑了A线程,然后切到B线程,内核调用开始,CPU需要对A线程的上下文保留,然后切到B线程,然后把控制权交给你的应用层调度。进程切换也需要内核来切换,因为从C进程的主线程切换到D进程的主线程。。。

那么进程间要通讯呀,而且他们资源不共享,这个时候需要用IPC(Inter-Process Communication,进程间通信),常用的有信号量,共享内存,套接字,实际百度上说有六种耶,而同个进程的多个线程共享资源,通讯起来比进程容易多了,现在很多Java等编程语言都有这种线程交互实现。

至于IO多路复用,其实就是维持一个队列,然后让一个线程或多个线程,去队列里面拿任务去完成。为什么呢?因为线程的数量是有限的,而且线程间通讯需要点资源,内核也要频繁切换上下文。

一个线程的IO多路复用,典型的就是Redis和Nodejs了,根本不需要切换上下文,一个线程走天下。而多个线程的IP多路复用,就是Golang协程的实现方式了,协程,自己管理线程,把线程控制到一定的数量,然后构造一个规则状态机来调度任务。

详解

待写

相关文章

  • Golang高阶:Golang协程实现原理

    版权所有,转载请注明:http://www.lenggirl.com/go/goroutine.html 引言 实...

  • 浅谈GoLang协程

    GoLang协程 学习golang也有一段时间了,这里讲一下自己对golang协程的使用理解,golang很多人都...

  • golang

    golang携程调度,runtime包 golang内存模型 csp原理 context的原理 slice底层结构...

  • Golang的并发编程

    Golang中的并发编程 Golang语言中,并发使用的协程的机制,实现起来也是十分的方便,使用go关键字即可。 ...

  • tbox协程使用之切换与等待

    tbox的协程实现,是stackfull模式的,需要指定独立堆栈和协程函数,目前暂时还不能像golang那样实现堆...

  • golang中最大协程数的限制(线程)

    golang中最大协程数的限制 golang中有最大协程数的限制吗?如果有的话,是通过什么参数控制呢?还是通过每个...

  • 知识分享之Golang——协程与线程的简单对比

    知识分享之Golang——协程与线程的简单对比 背景 知识分享之Golang篇是我在日常使用Golang时学习到的...

  • go-ethereum事件机制设计与实现

    总体介绍 以太坊内部有大量协程,协程间的调度驱动通过事件机制来完成;具体实现使用golang的chan机制。主要方...

  • Golang之Defer

    引用 golang defer实现原理 Golang之轻松化解defer的温柔陷阱 Golang中defer、re...

  • go 协程的实现笔记

    看到有一篇写得很清楚的博客,做个笔记。 原文在此:Golang源码探索(二) 协程的实现原理 有时候G需要调用一些...

网友评论

      本文标题:Golang高阶:Golang协程实现原理

      本文链接:https://www.haomeiwen.com/subject/bxbuaqtx.html