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

一级a做爰小说免费网站大型网站改版

一级a做爰小说免费网站,大型网站改版,厦门搜索引擎优化,十档行情免费网站协程设计原理与汇编实现 同步与异步 对于任何一个事情#xff0c;都可以划分为不同的步骤。所谓同步#xff0c;就先做第一个事情#xff0c;按照这件事的步骤完成这件事之后#xff0c;再去做第二件事。再去做第三件事#xff0c;以此类推。 异步就是#xff0c;可以…协程设计原理与汇编实现 同步与异步 对于任何一个事情都可以划分为不同的步骤。所谓同步就先做第一个事情按照这件事的步骤完成这件事之后再去做第二件事。再去做第三件事以此类推。 异步就是可以先开始做第一件事从第一个步骤开始但是当做到某个步骤之后需要暂停等待于是跳转到了第二件事又开始从第二件事的第一个步骤开始做当做到某个步骤后又需要暂时等待于是跳转到了第三个事件从第一个步骤开始做可能做到某个步骤后发现第一个事情暂停的步骤被唤醒了于是转过头去继续把后续的事情做完再去看第二件事等待的资源是否完成。以此类推。 所以从宏观上即从某个时间段来看同步像是分开进行的异步像是同时执行的。这一点和操作系统中的某些概念是类似的。 什么是协程 协程的核心就是以同步的方式实现异步的性能。以上面的例子讲解就是用不同的函数实现不同的步骤这样在编程看起来是同步的就是所谓的以同步的方式然后不同函数在实现步骤的时候会设定一个类似于原语的操作如果这个步骤无法立刻完成就跳转到下一个事情中去直到满足条件之后再回来继续完成该事件这个原语即是实现了异步的性能。 如何实现协程 第一种方式setjmp/longjmp 首先需要定义一个 jmp_buf类型的变量env代表此时的环境编号类似于存档点。 setjmp函数调用此函数会保存当前系统的堆栈里的数据进行存档。返回值为0代表首次进行存档。返回值为x代表的下一次回退到存档点应该走的路线。 longjmp函数调用此函数会直接回退到存档点其中函数的第二个参数x就是上面setjmp下一次要返回的值。即下一次要走的路线 举例 #includestdio.h #includesetjmp.hjmp_buf env;int fun(int arg){printf(fun %d \n, arg);arg;longjmp(env, arg);return 0; }int main(){int ret setjmp(env);if(ret 0){fun(ret);}else if(ret 1){fun(ret);}else if(ret 2){fun(ret);}else if(ret 3){fun(ret);}} 弊端 如果是多线程会出现不同的堆栈这样在保存的时候会出现函数未定义等情况。不建议使用 第二种方式ucontext ucontext相比于上一个类似于让用户自己实现了上下文信息的保存而不是像setjmp一样通过调用函数让系统来保存。 定义了一个ucontext的结构体来保存上下文信息。 调用getcontextuc函数把上下文信息保存在uc结构体中并且初始化该结构体初始化的内容分配数组、确定返回、帮定函数 调用swapcontextctxctx2切换上下文。 #includeucontext.h #includestdio.hucontext_t ctx[3], main_ctx; int count 0;void fun1(){while (count 30){printf(1\n);swapcontext(ctx[0], ctx[1]);printf(4\n);} }void fun2(){while (count 30){printf(2\n);swapcontext(ctx[1], ctx[2]);printf(3\n);} }void fun3(){while (count 30){printf(3\n);swapcontext(ctx[2], ctx[0]);printf(6\n);} }int main(){int stack1[2048] {0};int stack2[2048] {0};int stack3[2048] {0};getcontext(ctx[0]);ctx[0].uc_stack.ss_sp stack1;ctx[0].uc_stack.ss_size sizeof(stack1);ctx[0].uc_link main_ctx;makecontext(ctx[0], fun1, 0);getcontext(ctx[1]);ctx[1].uc_stack.ss_sp stack2;ctx[1].uc_stack.ss_size sizeof(stack2);ctx[1].uc_link main_ctx;makecontext(ctx[1], fun2, 0);getcontext(ctx[2]);ctx[2].uc_stack.ss_sp stack3;ctx[2].uc_stack.ss_size sizeof(stack3);ctx[2].uc_link main_ctx;makecontext(ctx[2], fun3, 0);printf(swapcontext\n);swapcontext(main_ctx, ctx[0]);printf(\n);} 我的一些理解 在正常执行主函数调用子函数的时候系统内部是会帮我们实现一些操作的会保存当前堆栈的信息然后再另外分配一个新的空间堆栈用来执行子函数当子函数执行完毕再返回调用时堆栈的状态。 那么协程其实就是要求用户自己实现了这样一个过程而不是再交给系统来做了。首先需要初始化ctx结构体就相当于完成了调用子函数的功能getcontext实现保存当前堆栈信息ctx的uc_stack实现了子函数内存的分配ctx的uc_link实现了子函数的返回地点makecontext实现了给这个子函数命名。与调用子函数不同的点在于可以在子函数内部使用swapcontext用于不同子函数的切换其中内部的堆栈会记录该子函数目前执行到了哪一个步骤继续往下执行。 从这张图其实可以看出所谓的“同步的方式实现异步的性能”手动模拟了调用子函数的过程即为“同步的方式”但是在实现子函数内部中又允许不同子函数之间切换蓝色是协程实现的核心即实现了“异步的性能”。 协程实现了类似于操作系统中处理机的时间片轮转的操作。 弊端这样如果是协程之间互相切换不可控于是需要实现一个调度器schedual 调度器实现的就是不让子函数之间相互切换而是需要切换时切到主函数中去这样可控。以下代码中main里面的while循环就是一个简单的调度器子函数中swapcontext也是跳转到主函数中去。 #includeucontext.h #includestdio.hucontext_t ctx[3], main_ctx; int count 0;void fun1(){while (count 30){printf(1\n);//swapcontext(ctx[0], ctx[1]);swapcontext(ctx[0], main_ctx); //跳转到主函数中去而不是子涵数间互转printf(4\n);} }void fun2(){while (count 30){printf(2\n);//swapcontext(ctx[1], ctx[2]);swapcontext(ctx[1], main_ctx);printf(3\n);} }void fun3(){while (count 30){printf(3\n);//swapcontext(ctx[2], ctx[0]);swapcontext(ctx[2], main_ctx);printf(6\n);} }int main(){int stack1[2048] {0};int stack2[2048] {0};int stack3[2048] {0};getcontext(ctx[0]);ctx[0].uc_stack.ss_sp stack1;ctx[0].uc_stack.ss_size sizeof(stack1);ctx[0].uc_link main_ctx;makecontext(ctx[0], fun1, 0);getcontext(ctx[1]);ctx[1].uc_stack.ss_sp stack2;ctx[1].uc_stack.ss_size sizeof(stack2);ctx[1].uc_link main_ctx;makecontext(ctx[1], fun2, 0);getcontext(ctx[2]);ctx[2].uc_stack.ss_sp stack3;ctx[2].uc_stack.ss_size sizeof(stack3);ctx[2].uc_link main_ctx;makecontext(ctx[2], fun3, 0);printf(swapcontext\n);//简单的调度实现while(count 30){swapcontext(main_ctx, ctx[count%3]);}printf(\n);} 课程地址www.github.com/0voice
http://www.w-s-a.com/news/492305/

相关文章:

  • 网络安全形势下怎么建设学校网站wordpress最新主题下载
  • 自己建设网站需要什么条件.gs域名做网站怎么样
  • 网上做公益的网站推广手机卡返佣平台
  • 网站是公司域名是个人可以南京建设银行官方网站
  • 做互联网网站的会抓百度网盟推广 网站
  • 商务网站开发设计结论微信报名小程序怎么制作
  • 网站建设销售简历wordpress七比2
  • 制作网站报价工程项目查询哪个网站
  • 深圳移动网站建设制作公司网站建设的认识
  • 网站建设脚本语言有哪些想开网店哪个平台好
  • 视频网站用什么做的好深圳的小程序开发公司
  • 南京网站定制开发商城网站免费模板
  • 青海学会网站建设公司照片组合拼图
  • 中国建设银行福清分行网站爱站网权重查询
  • 外贸通网站建设网站建设7个主要流程图
  • 元气森林网络营销方式医疗网站优化怎么做
  • 手机网站制作报价表做网站公司做网站公司
  • 湖州网站设计吉林网站建设哪家好
  • 做存储各种环境信息的网站使用tag的网站
  • 阿里云用ip做网站网站开发员属于
  • 外链网盘下载南宁seo推广优化
  • 网站的推广方案有哪些此网站可能有
  • wordpress更改链接后网站打不开一键生成个人网站
  • 网站建设后台有哪些东西前端开发培训一般多少钱
  • 高端建设网站公司网站开发 源码
  • 企业网站的劣势园林景观设计公司简介范文
  • 网站建设程序招聘东营建设信息网登录
  • o2o是什么意思通俗讲seo与网站优化 pdf
  • 外贸网站外包一般建设一个网站多少钱
  • 抄袭别人网站的前端代码合法吗网络促销策略