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

功能最多的wordpress主题东莞整站优化火速公司

功能最多的wordpress主题,东莞整站优化火速公司,wordpress仿百度文件,郑州seo排名哪有文章目录 协程设计原理与汇编实现1. 协程概念2. 协程的实现2.1 setjmp2.2 ucontext2.3 汇编实现2.4 优缺点2.5 实现协程原语2.5.1 create()2.5.2 yield()2.5.3 resume()2.5.4 exit()2.5.5 switch()2.5.6 sleep() 2.6 协程调度器 3. 利用hook使用协程版本的库函数学习参考 协程设… 文章目录 协程设计原理与汇编实现1. 协程概念2. 协程的实现2.1 setjmp2.2 ucontext2.3 汇编实现2.4 优缺点2.5 实现协程原语2.5.1 create()2.5.2 yield()2.5.3 resume()2.5.4 exit()2.5.5 switch()2.5.6 sleep() 2.6 协程调度器 3. 利用hook使用协程版本的库函数学习参考 协程设计原理与汇编实现 本文介绍了协程的概念、特征、优势、以及其实现原理。 1. 协程概念 协程是一种轻量级的用户态线程。它允许在单个线程内执行多个任务使得程序可以在不同的函数之间灵活地切换以便更好地利用 CPU 资源。这种机制特别适合 IO 密集型任务如网络请求、文件读写和异步编程场景。协程可以被暂停和恢复避免了阻塞等待同时不需要系统级线程的切换成本。 协程的实现在底层是由执行流的跳转切换机制实现的。一般情况有一个协程调度器作为每个协程挂起时要切换回的代码。 应用场景 webserverkv存储图床网络层 同步和异步 同步和异步主要是指在执行任务时任务与调用方的相互关系。在同步操作中调用方会等待任务执行完毕然后继续执行。在异步操作中调用方会立即返回并继续执行后续的操作不会等待任务执行完任务执行完可以通过回调、事件等方式通知调用方。 异步的好处 多线程并发充分利用cpu性能好。 异步的坏处 代码复杂不好理解需要设置回调函数或者使用事件机制。 协程的好处 同步的编程方式实现异步的性能。 互联网中协程可能被用到的场景 浏览器网页加载发送异步HTTP请求时可能用到了协程。淘宝商店界面加载商品信息直播界面加载评论和视频流贴吧加载新的帖子回复bilibili异步加载新的回复网络游戏中加载各种位置信息微信聊天时需要异步加载和发送信息音视频通话异步加载流媒体chatgpt异步发送和接收问答消息github的git仓库托管服务器可能使用协程处理用户的push、pull等请求 2. 协程的实现 2.1 setjmp setjmp 和 longjmp 提供了一种低级的非局部跳转机制适用于需要在 C 程序中实现复杂控制流或异常处理的情况。但由于它们带来的复杂性和潜在风险使用时需要小心确保不会影响程序的可维护性和可读性。 代码示例 #include setjmp.h #include stdio.hjmp_buf env1, env2, env3;// coroutine1 void func1(void) {int cur 0;int ret setjmp(env1);if (ret 0)longjmp(env3, 1);printf(func1: %d [%d]\n, ret, cur);if (ret 20){longjmp(env2, ret); } }// coroutine1 void func2(void) {int cur 0;int ret setjmp(env2);printf(func2: %d [%d]\n, ret, cur);if (ret 20){longjmp(env1, ret); } }int main() {int ret setjmp(env3);if (ret 0)func1();elsefunc2();return 0; }从实现代码中可以看到setjmp机制需要我们自己保证协程所在的栈空间已被建立并且还没有退出。协程所在的函数需要先手动执行才能进行调度。协程的调度也比较麻烦。 2.2 ucontext ucontext 是一种用于实现协程和用户态线程的机制。它在一些类 Unix 系统例如 Linux中提供了在用户态创建、切换和恢复上下文的接口。ucontext 通过保存和恢复 CPU 寄存器、堆栈指针等状态允许程序在不同执行流之间切换适用于实现协程和轻量级任务调度等。 其中保存协程上下文信息的结构体ucontext_t为 #include ucontext.htypedef struct ucontext {ucontext_t *uc_link; // 执行结束后切换到的上下文sigset_t uc_sigmask; // 信号屏蔽字stack_t uc_stack; // 栈信息地址和大小mcontext_t uc_mcontext; // 寄存器状态 } ucontext_t;ucontext API 提供了几个主要函数来创建和切换上下文 getcontext(ucontext_t *ucp)获取当前上下文并保存到 ucp。setcontext(const ucontext_t *ucp)恢复指定上下文并跳转到该上下文。makecontext(ucontext_t *ucp, void (*func)(), int argc, ...)为 ucp 配置要执行的函数 func 及其参数。swapcontext(ucontext_t *oucp, const ucontext_t *ucp)保存当前上下文到 oucp然后切换到 ucp 上下文。 代码示例 #include ucontext.h #include stdio.hucontext_t ctx[2]; ucontext_t main_ctx;int count 0;// coroutine1 void func1(void) {int cur 0;while (count 20){printf(func1: %d [%d]\n, count, cur);// yieldswapcontext(ctx[0], ctx[1]);} }// coroutine1 void func2(void) {int cur 0;while (count 20){printf(func2: %d [%d]\n, count, cur);// yieldswapcontext(ctx[1], ctx[0]);} }int main() {char stack1[2048] {0};char stack2[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], func1, 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], func2, 0);printf(start\n);swapcontext(main_ctx, ctx[0]);return 0; }ucontext 机制虽然强大但需要谨慎使用。现代开发中通常使用其他更高层的协程库如 libco、libuv 或 Boost.Context 等。 2.3 汇编实现 使用汇编语言来实现协程的切换主要操作为恢复和保存寄存器的值。 int _switch(nty_cpu_ctx *new_ctx, nty_cpu_ctx *cur_ctx);__asm__(.text \n.p2align 4,,15 \n .globl _switch \n .globl __switch \n _switch: \n __switch: \nmovq %rsp, 0(%rsi) # save stack_pointer \nmovq %rbp, 8(%rsi) # save frame_pointer \nmovq (%rsp), %rax # save insn_pointer \nmovq %rax, 16(%rsi) \nmovq %rbx, 24(%rsi) # save rbx,r12-r15 \nmovq %r12, 32(%rsi) \nmovq %r13, 40(%rsi) \nmovq %r14, 48(%rsi) \nmovq %r15, 56(%rsi) \nmovq 56(%rdi), %r15 \nmovq 48(%rdi), %r14 \nmovq 40(%rdi), %r13 # restore rbx,r12-r15 \nmovq 32(%rdi), %r12 \nmovq 24(%rdi), %rbx \nmovq 8(%rdi), %rbp # restore frame_pointer \nmovq 0(%rdi), %rsp # restore stack_pointer \nmovq 16(%rdi), %rax # restore insn_pointer \nmovq %rax, (%rsp) \nret \n );上面的_switch函数实现了协程上下文的切换和线程切换所作的工作类似 2.4 优缺点 setjmp实现方式复杂但是跨平台性好ucontext实现方式简单但是跨平台性一般汇编实现方式复杂跨平台型差但是效率高 2.5 实现协程原语 2.5.1 create() 主要工作是创建一个保存协程上下文的数据结构。一个协程的上下文必须包括如下信息 协程运行的函数和参数信息 cpu寄存器上下文 运行时栈上下文 协程状态 协程id 协程所属的调度器 其他信息 一个示例如下 struct _coroutine_context {ucontext_t ctx; // 里面包括寄存器状态和栈上下文proc_coroutine func; // 协程运行的函数和参数信息void *arg;void *data;coroutine_status status; // 协程状态scheduler *sched; // 所属的调度器uint64_t id; };创建协程所作的主要工作包括 分配一个协程上下文并初始化获取并设置调度器将改协程加入调度器进行管理 2.5.2 yield() 主要工作是调用swapcontext()或者_switch()切换会协程调度器。 2.5.3 resume() 主要工作是恢复协程的执行。 2.5.4 exit() 主要工作是协程从调度器中删除然后释放协程上下文。 2.5.5 switch() 协程切换主要是切换协程的寄存器。 2.5.6 sleep() 让协程停止执行一段时间。 2.6 协程调度器 协程调度器管理协程包括一个就绪协程队列一个sleep协程的集合一个运行时协程队列一个等待协程集合。可以采用事件机制当某事件发生时例如某fd可读可以将相应的协程从等待集合中取出并恢复执行。 其核心代码如下 while (1) {// 检查sleep集合查看是否有协程超时coroutine_context *expired;while ((expired check_expired(sched))){resume(expired);}// 检查wait结合查看是否有协程有监听的事件发生coroutine_context *waked;int nready epoll_wait(epfd, events, EVENTS_SIZE, 1);for (int i 0; i nready; i){waked wait_search(events[i].data.fd);resume(waked);}// 恢复ready队列中的协程的运行coroutine_context *rdy;while (!is_ready_empty(sched)){rdt ready_pop(sched);resyme(rdt);} }3. 利用hook使用协程版本的库函数 利用运行时动态链接可以在运行时将一个函数替换为为使用协程的版本。 例如以下代码将read函数在运行时替换为了另一个函数 #include dlfcn.h #include unistd.htypedef ssize_t (*readf_t)(int fd, void *buf, size_t count);readf_t readf;void init_hook() {readf (readf_t)dlsym(RTLD_NEXT, read); }ssize_t read(int fd, void *buf, size_t count) {if (!readf) init_hook();// 如果对应的fd不可读那么就挂起协程yield_if_not_ok(fd, POLLIN | POLLERR | POLLHUP);return readf(fd, buf, count); }学习参考 学习更多相关知识请参考零声 github。
http://www.hkea.cn/news/14490144/

相关文章:

  • 怎么在企业站建立网站网站域名密码找回
  • 网站建设备案优化满山红厦门网站建设
  • 做网站设计哪里有网站免费正能量推荐
  • 唐山自助建站模板the7 wordpress theme
  • 佛山市网站建设 乾图信息科技亚马逊用什么网站上传做新品好
  • 做网站要会没软件平面设计投稿平台
  • 商业网站开发入门沈阳市营商环境建设监督局网站
  • 莞城微网站建设网站不同时期的优化工作该怎么做
  • 商城网站设计织梦网站footer美化
  • 网站 备案 哪个省三类人员证书查询
  • 弄个做网站公司新能源汽车价格一览表
  • 江苏网站建设网络推广软件外包平台的服务商
  • 学校网站建设意义有哪些方面重庆自助模板建站
  • 重庆招聘网站都有哪些李沧网站建设谁家好
  • 个人网站设计过程简洁的企业博客html5手机网站模板源码下载
  • wordpress单位内网做网站wordpress好的插件推荐
  • 手机网站模板免费下载网站后台组成
  • 关于企业网站建设的提案做犯法任务的网站
  • 珠宝商城网站模板个人免费网站建站运营
  • 免费申请二级网站源码wordpress保存登陆
  • 三合一静态网站环保网站模板 html
  • 郑州网站建设找哪家好福田补贴每人9000元
  • 个人商城网站能备案吗江苏省建设厅网站
  • idea制作网站知名网站建设官网
  • 网站服务器模式wordpress 邮件服务
  • 重庆知名网站网站运营推广公司
  • 西安 内部网站建设南宁公司注册
  • 石家庄站到石家庄北站台州椒江区建设局网站
  • 网站建设制作经验足耒阳市古雍网站建设店
  • 帮人做淘宝网站骗钱宁德市人社局官网