| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 协程的设计原理与汇编实现 -> 正文阅读 |
|
[Java知识库]协程的设计原理与汇编实现 |
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习 协程的设计原理与汇编实现第一个问题,为什么会协程?以及协程到底解决了什么问题? 第一个同步的方式实现异步的效率 现象区别: 那现在这个工作队列他为什么在这个过程引入工作队列,他就能够提升性能呢?, 他是从哪些方面原因那这个要跟他分析这个要跟大家分析, 同一个流程没有切换的概念 异步性能高,同步有什么好处? 那有没有一种方式采用同步的编程方式还同时拥有异步的性能? 那我们如何把它改进成一个同步的编程方式 king式4元组异步连接池。 能不能把MySQL请求改成异步的,包括mongodb,redis,rpc都是可以改的。 核心:同步的编程方式,要有异步的性能 异步提交完了之后我们怎么改成同步的方式? 对应的callback地方就是检测结果的返回有没有数据。 确确实实不在一个流程里面,callback是申请一个子线程做的 看上去他们不在一个流程里面但是我们要改起来让他们在一个流程里面并且还没有副作用。 在fd加入到epoll里面我们在应用层引入一个yield(); 让出完了之后到达read这个地方,解析完了之后会有一个resume恢复; 给我们感觉它没有切换的,对应的引入了两个原语操作 那么我们该如何实现yield()以及resume()? 1.yield()让出时使用longjmp跳转到read fd;resume()恢复时在使用setjmp跳回来 yeild() 让出这里有俩个步骤,一个是longjmp() 标签一; setjmp() 标签二回来 把读io,io没有准备就绪的这个等待取消掉,性能会无线的接近异步方式 协程究竟解决什么问题? reactor和协程之间区别? 协程的切换到底怎么实现?
协程切换以X86为例,32位的,那这个寄存器的值也是32位的,它里面是有具体的值的,所以我们可以定义一个结构体去对应的保存值
将rsi保存到rdi里面 下面这一段就是加载的过程,最后ret返回 yield 和resume的过程
协程的启动协程的启动有如下三个问题: 现在有一个问题入口函数的这个函数把它加到哪里? 第一个把eip指针指向入口函数fun,也就是把fun的地址指向eip,然后再对应的把它的参数保存下来 把入口函数的地址换了 协程到底是怎么调度的在说明调度之前先理清一下协程是怎么定义的? 假如有十个协程我们使用什么数据结构来存储? 看一看协程源码:有红黑树还有就绪队列去存储集合
调度器又如何实现的假如这里有50个协程,那么这50个coroutine我们如何组织起来,并且使用何种顺序去调度呢?
fd如何知道是否就绪? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 10:57:10- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |