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

wordpress能开发商城网站吗蛋糕行业网站建设方案

wordpress能开发商城网站吗,蛋糕行业网站建设方案,wordpress wp rest api,wordpress淘宝客教程目录前言一、进程、线程、Goroutine1、进程与线程2、Goroutine二、Go调度器设计思想1、线程模型1.1 内核级线程模型1.2 用户级线程模型1.3 混合型线程模型2、 被废弃的 G-M 调度器2.1 了解 G-M 调度如何工作3、如今高效的 GMP 模型3.1 GMP模型调度流程3.2 GMP调度设计策略3.3 G… 目录前言一、进程、线程、Goroutine1、进程与线程2、Goroutine二、Go调度器设计思想1、线程模型1.1 内核级线程模型1.2 用户级线程模型1.3 混合型线程模型2、 被废弃的 G-M 调度器2.1 了解 G-M 调度如何工作3、如今高效的 GMP 模型3.1 GMP模型调度流程3.2 GMP调度设计策略3.3 GMP调度场景3.3.1 G1 运行中创建 G23.3.2 G 运行结束后3.3.3 M 上创建的 G 个数大于本地队列长度时3.3.5 M 的自旋状态3.3.5 任务窃取机制3.3.6 G 发生系统调用进入阻塞时3.3.6.1 用户态阻塞3.3.6.2 系统调用阻塞3.3.7 G 退出系统调用时前言 春招开始了作为23届的科班咸鱼学习记录一下八股文和go底层原理GC、GMP调度、goroutine等本文介绍 Go 语言运行时调度器的实现原理其中包含调度器的设计与实现原理、演变过程以及与运行时调度相关的数据结构。 参考几篇不错的文章 mingguangtu《深入分析Go1.18 GMP调度器底层原理》 刘丹冰Aceld《Golang 调度器 GMP 原理与调度全分析》 一、进程、线程、Goroutine 1、进程与线程 在了解Go的调度器的时候都离不开操作系统、进程与线程这些概念。 进程线程操作系统资源调度和分配的基本单位CPU调度和分派的基本单位一个进程可以有多个线程一个线程只能属于一个进程有独立的地址空间同一类线程共享代码和数据空间每个线程有独立的运行栈和程序计数器创建销毁开销大进程切换时耗费资源较大创建销毁开销小线程切换时耗费资源小实现操作系统的并发实现进程内部的并发 进程在执行过程中拥有独立的内存单元而多个线程共享进程的内存。资源分配给进程同一进程的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段代码和常量数据段全局变量和静态变量扩展段堆存储。但是每个线程拥有自己的栈段栈段又叫运行时段用来存放所有局部变量和临时变量。 在同一进程中线程的切换不会引起进程切换。在不同进程中进行线程切换,如从一个进程内的线程切换到另一个进程中的线程时会引起进程切换。 摘抄某知乎大佬的比喻进程火车线程车厢 线程在进程下行进单纯的车厢无法运行一个进程可以包含多个线程一辆火车可以有多个车厢不同进程间数据很难共享一辆火车上的乘客很难换到另外一辆火车比如站点换乘同一进程下不同线程间数据很易共享A车厢换到B车厢很容易进程要比线程消耗更多的计算机资源采用多列火车相比多个车厢更耗资源进程间不会相互影响一个线程挂掉将导致整个进程挂掉一列火车不会影响到另外一列火车但是如果一列火车上中间的一节车厢着火了将影响到所有车厢进程可以拓展到多机进程最多适合多核不同火车可以开在多个轨道上同一火车的车厢不能在行进的不同的轨道上进程使用的内存地址可以上锁即一个线程使用某些共享内存时其他线程必须等它结束才能使用这一块内存。比如火车上的洗手间“互斥锁”进程使用的内存地址可以限定使用量比如火车上的餐厅最多只允许多少人进入如果满了需要在门口等等有人出来了才能进去“信号量” 2、Goroutine Goroutine Golang Coroutine。Goroutine是golang实现的用户态、轻量级的协程。Goroutine具有以下特点 相比线程其启动的代价很小以很小栈空间启动2Kb左右能够动态地伸缩栈的大小最大可以支持到Gb级别工作在用户态切换成本很小与线程关系是 N:M即可以在 N 个系统线程上多工调度 M 个Goroutine Goroutine是Golang支持高并发的重要保障。Golang可以创建成千上万个Goroutine来处理任务将这些Goroutine分配、负载、调度到处理器上采用的是G-M-P模型。 二、Go调度器设计思想 在我们学习Go调度器前先了解线程模型的概念大部分的调度器都是基于线程模型思想开发的。 1、线程模型 线程创建、管理、调度等采用的方式称为线程模型。线程模型一般分为以下三种 内核级线程(Kernel Level Thread)模型用户级线程(User Level Thread)模型两级线程模型也称混合型线程模型 三大线程模型最大差异就在于用户级线程与内核调度实体KSEKSEKernel Scheduling Entity之间的对应关系。KSE是Kernel Scheduling Entity的缩写其是可被操作系统内核调度器调度的对象实体是操作系统内核的最小调度单元可以简单理解为内核级线程。 用户级线程即协程由应用程序创建与管理协程必须与内核级线程绑定之后才能执行。线程由 CPU 调度是抢占式的协程由用户态调度是协作式的一个协程让出 CPU 后才执行下一个协程。 特性用户级线程内核级线程创建者应用程序内核操作系统是否感知存在否是开销成本创建成本低上下文切换成本低上下文切换不需要硬件支持创建成本高上下文切换成本高上下文切换需要硬件支持如果线程阻塞整个进程将被阻塞。即不能利用多处理来发挥并发优势其他线程可以继续执行,进程不会阻塞案例JAVA threadsWindow Solaris 1.1 内核级线程模型 内核级线程模型中用户线程与内核线程是一对一关系1 : 1。线程的创建、销毁、切换工作都是有内核完成的。应用程序不参与线程的管理工作只能调用内核级线程编程接口(应用程序创建一个新线程或撤销一个已有线程时都会进行一个系统调用。 操作系统调度器管理、调度并分派这些线程。运行时调度器为每个用户级线程静态关联一个内核级线程用户线程在其生命期内都会绑定到该内核线程。一旦用户线程终止两个线程都将离开系统。 大部分编程语言的线程库(如linux的pthreadJava的java.lang.ThreadC11的std::thread等等)都是对操作系统的线程内核级线程的一层封装创建出来的每个线程与一个不同的内核级线程静态关联因此其调度完全由OS调度器来做。 内核级线程模型有如下优点 在多处理器系统中内核能够并行执行同一进程内的多个线程如果进程中的一个线程被阻塞不会阻塞其他线程是能够切换同一进程内的其他线程继续执行当一个线程阻塞时内核根据选择可以运行另一个进程的线程而用户空间实现的线程中运行时系统始终运行自己进程中的线程 缺点 线程的创建与删除都需要CPU参与成本大需要使用大量线程的场景下对OS的性能影响会很大 1.2 用户级线程模型 用户线程模型中的用户线程与内核线程是多对一关系N : 1。线程的创建、销毁以及线程之间的协调、同步等工作都是在用户态完成具体来说就是由应用程序的线程库来完成。线程的并发处理从宏观来看任意时刻每个进程只能够有一个线程在运行且只有一个处理器内核会被分配给该进程。 从图中可以看出来一个进程中所有创建的线程都与同一个内核线程在运行时动态关联。内核线程将被操作系统调度器指派到处理器内核。用户级线程是一种”多对一”的线程映射 用户级线程有如下优点 创建和销毁线程、线程切换代价等线程管理的代价比内核线程少得多, 因为保存线程状态的过程和调用程序都只是本地过程线程能够利用的表空间和堆栈空间比内核级线程多 缺点 线程发生I/O或页面故障引起的阻塞时如果调用阻塞系统调用则内核由于不知道有多线程的存在而会阻塞整个进程从而阻塞所有线程, 因此同一进程中只能同时有一个线程在运行资源调度按照进程进行多个处理机下同一个进程中的线程只能在同一个处理机下分时复用 1.3 混合型线程模型 混合型线程模型中用户线程与内核线程是多对多关系N : M。混合型线程模型充分吸收上面两种模型的优点为一个进程中创建多个内核线程并且线程可以与不同的内核线程在运行时进行动态关联当某个内核线程由于其上工作的线程的阻塞操作被内核调度出CPU时当前与其关联的其余用户线程可以重新与其他内核线程建立关联关系。 其线程创建在用户空间中完成线程的调度和同步也在应用程序中进行。一个应用程序中的多个用户级线程被绑定到一些小于或等于用户级线程的数目内核级线程上。 此模型有时也被称为 两级线程模型即用户调度器实现用户线程到内核线程的“调度”内核调度器实现内核线程到CPU上的调度。 缺点: 这种动态关联机制的实现很复杂也需要用户自己去实现。Go语言中的并发就是使用的这种实现方式Go为了实现该模型自己实现了一个运行时调度器来负责Go中的线程与内核的动态关联。 这里我们只需要知道 Go 的线程模型下面我们讲一下GMP调度的升级之路 2、 被废弃的 G-M 调度器 Golang在底层实现了混合型线程模型。Go 语言将线程分为了两种类型内核级线程 M Machine轻量级的用户态的协程 Goroutine。 这里我们提到了 Go 语言调度器的三个核心概念中的两个 M Machine的缩写代表了内核线程 OS ThreadCPU调度的基本单元 G Goroutine的缩写用户态、轻量级的协程一个 G 代表了对一段需要被执行的 Go 语言程序的封装每个 Goroutine 都有自己独立的栈存放自己程序的运行状态分配的栈大小 2KB可以按需扩缩容 2.1 了解 G-M 调度如何工作 老调度器存在一个全局 G 队列M在执行和放回队首的 G 都需要访问全局 G 队列因为存在多个 M 同时竞争在访问临界资源全局 G 队列时需要加锁进行保证互斥 / 同步所以全局 G 队列是有互斥锁进行保护的。 我们知道在多线程下老调度器存在几个缺点 创建、销毁、调度 G 都需要每个 M 获取锁在多线程下这就形成了激烈的锁竞争。M 转移 G 会造成延迟和额外的系统负载。比如当 G 中包含创建新协程的时候M 创建了 G’为了继续执行 G需要把 G’交给 M’执行也造成了很差的局部性因为 G’和 G 是相关的最好放在 M 上执行而不是其他 M’。系统调用 (CPU 在 M 之间的切换) 导致频繁的线程阻塞和取消阻塞操作增加了系统开销。 3、如今高效的 GMP 模型 Go为了解决 G-M 调度的缺点在原先的 G-M 调度器基础上引进了 P也就是如今Go优秀的GMP 调度模型。 PProcessor的缩写代表一个虚拟的处理器是线程 M 和 G 的中间层它能提供线程需要的上下文环境也会负责调度线程上的等待队列它维护一个本地的可运行的 G 队列通过处理器 P 的调度每一个内核线程都能够执行多个 Goroutine它能在 Goroutine 进行一些 I/O 操作时及时让出计算资源提高线程的利用率。 3.1 GMP模型调度流程 了解一下图中出现的几个概念 全局队列Global Queue存放等待运行的 G。P 的本地队列同全局队列类似存放的也是等待运行的 G本地队列中 G 的数量有限不超过 256 个。新建 G’时G’优先加入到 P 的本地队列如果队列满了则会把本地队列中一半的 G 移动到全局队列本地队列的前一半 G’通常为 G’。 GMP调度流程大致如下 线程M想运行任务就需得获取 P即与P关联P 的本地队列(LRQ)获取 G若LRQ中没有可运行的GM 会尝试从全局队列(GRQ)拿一批G放到P的本地队列拿取数量 全局队列中 G 的数量 / 运行的 M-P 数量 1至少拿一个保证合理分配若全局队列也未找到可运行的G时候M会随机从其他 P 的本地队列偷一半放到自己 P 的本地队列拿到可运行的G之后M 运行 GG 执行结束后M 会从 P 获取下一个 G不断重复下去当 M 执行某一个 G 时候如果发生了 syscall 或则其余阻塞操作M 会阻塞如果当前有一些 G 在执行runtime 会把这个线程 M 从 P 中摘除 (detach)然后再创建一个新的操作系统的线程 (如果有空闲的线程可用就复用空闲线程) 来服务于这个 P当 M 系统调用结束时候这个 G 会尝试获取一个空闲的 P 执行并放入到这个 P 的本地队列。如果获取不到 P那么这个线程 M 变成休眠状态 加入到空闲线程中然后这个 G 会被放入全局队列中 3.2 GMP调度设计策略 复用线程避免频繁的创建、销毁线程而是对线程的复用。可以使用下面两种机制实现对线程对复用。 Work Stealing 任务窃取机制M 优先执行其所绑定的 P 的本地队列的 G如果本地队列为空当 P 本地队列为空时M 也会尝试从全局队列拿一批 G 放到 P 的本地队列如果全局队列也为空时会从其他 P 的本地队列偷一半放到自己 P 的本地队列这种 GMP 调度模型也叫任务窃取调度模型 Hand Off 交接机制当前线程 M 因为 G 进行系统调用阻塞时线程 M 释放绑定的 PP 会寻找其他空闲的线程 M 绑定执行 如果没找到空闲的 M 的 P 进入全局 P 队列。 利用多核并行能力Go默认设置线程 M 最大数量为10000实际等于 CPU 的核心数。GOMAXPROCS 设置 P 处理器的数量实际上 P 数量应该小于等于 CPU 核数。GOMAXPROCS 也限制了并行比如 GOMAXPROCS 核数/2则最多利用了一半的 CPU 核进行并行。 基于协作的抢占机制 G 主动让出 CPU 才能调度执行下一个 G某些 Goroutine 可以长时间占用线程造成其它 Goroutine 的饥饿垃圾回收需要暂停整个程序Stop-the-worldSTW最长可能需要几分钟的时间导致整个程序无法工作Go为了公平让每个孩子都有奶吃一个 G 最多占用 CPU 10ms防止其他 G 等待时间过长被饿死。 基于信号的真抢占机制尽管基于协作的抢占机制能够缓解长时间 GC 导致整个程序无法工作和大多数 Goroutine 饥饿问题但是还是有部分情况下Go调度器有无法被抢占的情况例如for 循环或者垃圾回收长时间占用线程为了解决这些问题 Go1.14 引入了基于信号的抢占式调度机制能够解决 GC 垃圾回收和栈扫描时存在的问题。 3.3 GMP调度场景 可能到这里对于调度流程和设计策略还是一知半解先用几张图形象的描述下 GMP 调度机制的一些场景帮助理解 GMP 调度器为了保证公平性、可扩展性、及提高并发效率所设计的一些机制和策略。 3.3.1 G1 运行中创建 G2 正在 M1 上运行的 G1通过go func() 创建 G2 后由于局部性G2优先放入 P 的本地队列。 3.3.2 G 运行结束后 M1 上的 G1 运行完成后调用goexit()函数M1 上运行的 Goroutine 会切换为 G0G0 负责调度协程的切换运行schedule() 函数从 M1 上 P 的本地运行队列获取 G2 去执行函数execute()。 注意这里 G0 是程序启动时的线程 M也叫M0的系统栈表示的 G 结构体负责 M 上 G 的调度 3.3.3 M 上创建的 G 个数大于本地队列长度时 如果 P 本地队列最多能存 4 个 G实际上是256个正在 M1 上运行的 G2 要通过 go func()创建 6 个 G那么前 4 个 G 放在 P 本地队列中G2 创建了第 5 个 GG7时P 本地队列中前一半和 G7 一起打乱顺序放入全局队列P 本地队列剩下的 G 往前移动G2 创建的第 6 个 GG8时放入 P 本地队列中因为还有空间 3.3.5 M 的自旋状态 创建新的 G 时运行的 G 会尝试唤醒其他空闲的 M 绑定 P 去执行如果 G2 唤醒了M2M2 绑定了一个 P2会先运行 M2 的 G0这时 M2 没有从 P2 的本地队列中找到 G会进入自旋状态spinning自旋状态的 M2 会尝试从全局空闲线程队列里面获取 G放到 P2 本地队列去执行获取的数量满足公式n min(len(globrunqsize)/GOMAXPROCS 1, len(localrunsize/2))含义是每个P应该从全局队列承担的 G 数量为了公平性和提高效率不能太多要给其他 P 留点 3.3.5 任务窃取机制 自旋状态的 M 会寻找可运行的 G如果全局队列为空则会从其他 P 偷取 G 来执行个数是其他 P 运行队列的一半 3.3.6 G 发生系统调用进入阻塞时 如果 G 发生系统调度进入阻塞其所在的 M 也会阻塞因为会进入内核状态等待系统资源和 M 绑定的 P 会解除绑定寻找空闲的 M 执行这是为了提高效率不能让 P 本地队列的 G 因所在 M 进入阻塞状态而无法执行。 GMP模型的阻塞可能发生在下面几种情况 I/Oselectblock on syscallchannel等待锁runtime.Gosched() 3.3.6.1 用户态阻塞 当 G 因为channel操作或者network I/O而阻塞时实际上golang已经用netpoller实现了 G 网络I/O阻塞不会导致M被阻塞仅阻塞G对应的G会被放置到某个wait队列(如channel的waitq)该G的状态由_Gruning变为_Gwaitting而M会跳过该G尝试获取并执行下一个G如果此时没有runnable的G供M运行那么M将解绑P并进入sleep状态当阻塞的G被另一端的G2唤醒时比如channel的可读/写通知G被标记为runnable尝试加入G2所在P的runnext然后再是P的Local队列和Global队列。 3.3.6.2 系统调用阻塞 当G被阻塞在某个系统调用上时此时G会阻塞在_Gsyscall状态M也处于 block on syscall 状态此时的M执行可被抢占调度执行该G的M会与P解绑而P则尝试与其它idle的M绑定继续执行其它G。如果没有其它idle的M但P的Local队列中仍然有G需要执行则创建一个新的M当系统调用完成后G会重新尝试获取一个idle的P进入它的Local队列恢复执行如果没有idle的PG会被标记为runnable加入到Global队列。 3.3.7 G 退出系统调用时 如果刚才进入系统调用的 G2 解除了阻塞其所在的 M1 会寻找 P 去执行优先找原来的 P发现没有找到或者 P 已经与其他 M 绑定则其上的 G2 会进入全局队列等其他 M 获取执行M1 进入休眠线程队列等待 P 将他重新唤醒。
http://www.w-s-a.com/news/418622/

相关文章:

  • vs 团队网站开发中铁建设门户网登录咋进不去了
  • 快速网站建设公司哪家好优秀的网站建设
  • 网站开发的自适应wordpress搜索词结果按文章标题
  • 微网站是用什么开发的wordpress中英文主题
  • 纯静态网站怎么做淄博seo开发
  • 江西新农村建设权威网站盐步网站制作
  • 网站ui设计例子怎么做打鱼网站
  • 在1688做公司网站wordpress category
  • 单页面 网站 模板网站代理公司
  • 手机网站底部电话代码网站后台点击添加图片没有反应
  • 龙岩建设局网站声明自学制作网站难不难
  • 济南网站优化小黑godaddy中文网站开发
  • 做微课常用的网站广州seo优化推广
  • 主机屋如何做网站电脑网页游戏大全
  • 工作网站建设中布线费用账务处理特色的重庆网站推广
  • dede 网站地图模板htm写作网站水平哪个最好
  • 服务器上的网站erp教学零基础入门
  • 网站建设58设计资料网站
  • 如何把动态图发网站做头像网页设计实训报告小结
  • 做简历用的网站wordpress版权说明
  • 网站关键词有哪些网站新闻前置审批
  • 怎么自己注册网站义乌做公司网站
  • 做哪种网站赚钱苏州住房城乡建设部网站
  • 镇江做网站学编程学哪一种比较好
  • 华美天一建筑公司网站赚钱做任务的网站有哪些
  • asp网站打开速度慢家乡网页设计教程
  • 网站 设计 深圳书店网站的建设
  • 北京网络营销推广培训哪家好南宁软件优化网站建设
  • flash网站引导页仓库管理系统源码
  • 济南网站制作公司排名营销型网站管理系统