Go的机理- Green Thread模型、work stealing调度算法、非阻塞式IO

Goroutine使用Green Thread模型(N:M 多个green threads运行在多个kernel threads ),既可以快速的进行context switch,又可以很好的利用多核,使用work stealing算法进行调度

在这里插入图片描述

模型:MPG三个角色,分别代表kernel threads,processor和goroutine。

调度:P负责完成对G和M的调度
1、P维护一个deque来存放可执行的G,进行调度时切换当前执行的G,从deque顶部取出下一个G继续执行;
2、当G进行syscall阻塞时,不仅需要切换G,M也需要进行切换来保证P能够继续执行后面的G,当阻塞的G-M对就绪时会被重新调度执行。
3、同时当P维护的所有的G执行结束后,会从别的P的deque的steal一半的G放入自己的deque中执行

非阻塞式IO:
1、当goroutine尝试进行I/O操作而IO未就绪时,当前执行的G设置为阻塞,而M可以被调度继续执行其他的G;
2、Go实现netpoller来进行I/O的多路复用,当G阻塞到I/O时,将fd注册到epoll实例中进行epoll_wait,就绪的fd回调通知给阻塞的G,G重新设置为就绪状态等待调度继续执行,减少context switch开销,处理更大并发量级

Work-Stealing Queue是一种用于并发编程的数据结构,它允许多个线程在共享队列上执行工作项,其中每个线程维护自己的任务队列,并且当自己的队列为空时,可以从其他线程的队列中“偷”一些工作项来执行。该数据结构适用于任务量不确定、任务执行时间较长的情况。 下面是一个使用Work-Stealing Queue实现顺序执行的简单代码示例: ```c++ #include <iostream> #include <thread> #include <vector> #include "taskflow/taskflow.hpp" void func1() { std::cout << "Function 1" << std::endl; } void func2() { std::cout << "Function 2" << std::endl; } void func3() { std::cout << "Function 3" << std::endl; } int main() { tf::Executor executor; tf::Taskflow taskflow; // 将三个函数作为任务添加到taskflow中 auto task1 = taskflow.emplace([]() { func1(); }); auto task2 = taskflow.emplace([]() { func2(); }); auto task3 = taskflow.emplace([]() { func3(); }); // 任务之间的依赖关系,保证顺序执行 task1.precede(task2); task2.precede(task3); // 将taskflow提交给executor执行 executor.run(taskflow).wait(); return 0; } ``` 在上面的示例中,我们使用`Taskflow`库来创建一个`taskflow`对象,并将三个函数作为任务添加到其中。然后,我们使用`precede`方法来定义任务之间的依赖关系,以确保它们按照正确的顺序执行。最后,我们将`taskflow`提交给`executor`执行,并等待任务完成。 这样,我们就可以实现一个函数一个函数顺序执行的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值