当前位置: 首页 > news >正文

鸭梨网站建设vultr服务器做网站

鸭梨网站建设,vultr服务器做网站,十大免费cad网站入口软件,公司网站推广运营0x00.前言前面写了一篇今天来学习Go语言的Goroutine机制#xff0c;这也可能是Go语言最为吸引人的特性了#xff0c;理解它对于掌握Go语言大有裨益#xff0c;话不多说开始吧#xff01;通过本文你将了解到以下内容#xff1a;什么是协程以及横向对比优势Go语言的Goroutin…0x00.前言前面写了一篇今天来学习Go语言的Goroutine机制这也可能是Go语言最为吸引人的特性了理解它对于掌握Go语言大有裨益话不多说开始吧通过本文你将了解到以下内容什么是协程以及横向对比优势Go语言的Goroutine机制底层原理和特点0x01.聊聊协程大家对于进程、线程二位明星都很熟悉但协程就没有火了是协程不是携程哦协程并不是Go语言特有的机制相反像Lua、Ruby、Python、Kotlin、C/C等也都有协程的支持区别在于有的是从语言层面支持、有的通过插件类库支持。Go语言是原生语言层面支持本文也是从Go角度去理解协程。1.1 协程基本概念和提出者协程英文是Coroutine译为协同程序我们来看下维基百科对Coroutine的介绍Coroutines are computer program components that generalize subroutines for non-preemptive multitasking, by allowing execution to be suspended and resumed.Coroutines are well-suited for implementing familiar program components such as cooperative tasks, exceptions, event loops, iterators, infinite lists and pipes.According to Donald Knuth, Melvin Conway coined the term coroutine in 1958 when he applied it to construction of an assembly program.The first published explanation of the coroutine appeared later, in 1963.简单翻译一下协同程序是一种计算机程序组件它允许暂停和恢复执行从而可以作为通用化的非抢占式多任务处理子程序。协同程序非常适合实现例如协作任务、异常、事件循环、迭代器、管道等熟悉的程序组件。根据唐纳德·克努特的说法梅尔文·康威在1958年将Coroutine这个术语应用于装配程序的构建直到在1963年才首次发表了阐述Coroutine的论文。协程的提出者梅尔文·爱德华·康威是一位计算机科学家除了协程之外他还创造了Conways Law康威定律他基于社会学观察提出了系统设计的一些观点本文就不展开了感兴趣的可以看下作者的论文How Do Committees Invent?1.2 协程和进线程的对比我们来复习一下进线程和协程的一些基本特点吧:进程是系统资源分配的最小单位, 进程包括文本段text region、数据段data region和堆栈段stack region等。进程的创建和销毁都是系统资源级别的因此是一种比较昂贵的操作进程是抢占式调度其有三个状态:等待态、就绪态、运行态。进程之间是相互隔离的它们各自拥有自己的系统资源, 更加安全但是也存在进程间通信不便的问题。进程是线程的载体容器多个线程除了共享进程的资源还拥有自己的一少部分独立的资源因此相比进程而言更加轻量进程内的多个线程间的通信比进程容易但是也同样带来了同步和互斥的问题和线程安全问题尽管如此多线程编程仍然是当前服务端编程的主流线程也是CPU调度的最小单位多线程运行时就存在线程切换问题其状态转移如图协程在有的资料中称为微线程或者用户态轻量级线程协程调度不需要内核参与而是完全由用户态程序来决定因此协程对于系统而言是无感知的。协程由用户态控制就不存在抢占式调度那样强制的CPU控制权切换到其他进线程多个协程进行协作式调度协程自己主动把控制权转让出去之后其他协程才能被执行到这样就避免了系统切换开销提高了CPU的使用效率。抢占式调度和协作式调度的简单对比看到这里我们不免去想看着协作式调度优点更多那么为什么一直是抢占式调度占上风呢让我们继续一起学习可能就能解答这个问题了。1.3 实际工作中的我们我们写程序的时经常需要考虑的因素就是提高机器使用率这个非常好理解。当然机器使用率和开发效率维护成本往往存在权衡说句大白话就是要么费人力要么费机器选一个吧机器成本里面最贵的就是CPU了程序一般分为CPU密集型和IO密集型对于CPU密集型我们的优化空间可能没那么多但对于IO密集型却有非常大的优化空间试想我们的程序总是处于IO等待中让CPU呼呼睡大觉那该多糟糕。为了提高IO密集型程序的CPU使用率我们尝试多进程/多线程编程等让多个任务一起跑分时复用抢占式调度这样提高了CPU的利用率但由于多个进线程存在调度切换这也有一定的资源消耗因此进线程数量不可能无限增大。我们现在写的程序大部分都是同步IO的效率还不够高因此出现了一些异步IO框架但是异步框架的编程难度比同步框架要大但不可否认异步是一个很好的优化方向先不要晕来看下同步IO和异步IO就知道了同步是指应用程序发起I/O请求后需要等待或者轮询内核I/O操作完成后才能继续执行异步是指应用程序发起I/O请求后仍继续执行当内核I/O操作完成后会通知应用程序或者调用应用程序注册的回调函数。我们以C/C开发的服务端程序为例Linux的异步IO出现的比较晚因此像epoll之类的IO复用技术仍然有相当大的地盘但是同步IO的效率毕竟不如异步IO因此当前的优化方向包括异步IO框架(像boost.asio框架)和协程方案(腾讯libco)。0x02.Go和协程我们知道协程是CoroutineGo语言在语言层面对协程进行了原生支持并且称之为Goroutine这也是Go语言强大并发能力的重要支撑Go的CSP并发模型是通过Goroutine和channel来实现的后续会专门写一下CSP并发模型。2.1 协作式调度和调度器协作式调度中用户态协程会主动让出CPU控制权来让其他协程使用确实提高了CPU的使用率但是不由得去思考用户态协程不够智能怎么办不知道何时让出控制权也不知道何时恢复执行。读到这里忽然明白了抢占式调度的优势了在抢占式调度中都是由系统内核来完成的用户态不需要参与并且内核参与使得平台移植好说到底还是各有千秋啊为了解决这个问题我们需要一个中间层来调度这些协程这样才能让用户态的成千上万个协程稳定有序地跑起来我们姑且把这个中间层称为用户态协程调度器吧2.2 Goroutine和Go的调度器模型Go语言从2007年底开发直到今天已经发展了12年Go的调度器也不是一蹴而就的在最初的几个版本中Go的调度器也非常简陋无法支撑大并发。经过多个版本的迭代和优化目前已经有很优异的性能了不过我们还是来回顾一下Go调度器的发展历程(详见参考一)图片来自网络Go的调度器非常复杂篇幅所限本文只提一些基本的概念和原理后续会深入去展开Go的调度器。最近几个版本的Go调度器采用GPM模型其中有几个概念先看下图片来自网络GPM模型使用一种M:N的调度器来调度任意数量的协程运行于任意数量的系统线程中从而保证了上下文切换的速度并且利用多核但是增加了调度器的复杂度。来看两张图来进一步理解一下图片来自网络整个GPM调度的简单过程如下新创建的Goroutine会先存放在Global全局队列中等待Go调度器进行调度随后Goroutine被分配给其中的一个逻辑处理器P并放到这个逻辑处理器对应的Local本地运行队列中最终等待被逻辑处理器P执行即可。在M与P绑定后M会不断从P的Local队列中无锁地取出G并切换到G的堆栈执行当P的Local队列中没有G时再从Global队列中获取一个G当Global队列中也没有待运行的G时则尝试从其它的P窃取部分G来执行相当于P之间的负载均衡。Goroutine在整个生存期也存在不同的状态切换主要的有以下几种状态画个状态图看下0x03.巨人的肩膀0x04.往期精彩0x05.关于我有疑问加站长微信联系(非本文作者)
http://www.yutouwan.com/news/156096/

相关文章:

  • 顺德电子商务网站建设品牌logo设计制作
  • 网站建设实习任务完成情况建设展示类网站的意义
  • 一级a做爰片免费网站瑜伽做微信广告网站有哪些
  • 智能建站模板互联网公司图片
  • 外贸网站建设 全球搜公司网站设计要多少钱
  • 做网站对企业有什么好处郑州网站建设包括哪些
  • 做网站收费标准点击量wordpress下载页面
  • 上海元山建设有限公司网站网站模板 兼容
  • 本地南京网站建设网站建设维护费合同
  • 电子商务网站推广的主要方式企业网站建立之前必须首先确定
  • 互站网官网wordpress上传完主题
  • 百度 网站地图怎么做重庆市建设厅官方网站
  • 公司网站建设需要什么wordpress 商务 主题
  • 磐石网站seo东莞网站推广营销网站设计
  • 中国网站建设哪家公司好衡水企业网站制作报价
  • 多仓库版仓库管理网站建设源码wordpress 首页文章数量
  • 织梦示范网站步骤的近义词
  • 怎么做网站版面苏州吴中区做网站公司
  • 大连品尚茗居装修公司怎么样企业网站seo平台
  • 做挂网站吗东莞网络优化推广
  • 济南百度做网站怎么经营团购网站
  • 网站建设产品话术陕西省住房和城乡建设厅综合网站
  • 浏览器打不开wordpress百度seo和sem的区别
  • 怎么样模仿一个网站做简历网站建设应该注意什么
  • wordpress 仿站焦作网站设计
  • 工信部企业网站备案吗深圳网站建设方案优化
  • 西乡网站的建设自建本地网站服务器wordpress
  • 国外工装设计网站大全做全景网站
  • 一个好的网站应该具有什么条件wordpress 提交审批
  • 广西建设工程造价管理协会网站网站开发入那个科目