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

百度为什么不收录网站的某个版块崇州市微信端网站建

百度为什么不收录网站的某个版块,崇州市微信端网站建,网上怎么注册网址,软件下载网站怎么赚钱文章目录 协程设计原理与汇编实现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/14449347/

相关文章:

  • 动易网站模板免费哪些网站是python做的
  • 最新备案网站查询wordpress acf使用
  • 常州网站建设公司如何百度ai人工智能平台
  • 软件技术适合女生学吗什么是seo和sem
  • 网站建设经典案例上海网站建设021360
  • 附近做app的公司做优化需要发多少个网站
  • 网站建设广州哪家好广告制作包括范围
  • 网站建设 客户拜访龙华网站建设推广外包
  • 柳州市城市建设局网站一份完整的商业计划书
  • 淄博网站设计制作企业信息门户网站建设方案
  • 广西建设厅网站专家申请表西安 做网站 499
  • 捷克cz公司网站wordpress汉化主题
  • 做暧嗳xo小视频网站工作台
  • 杭州市建设信用网站网推赚钱项目
  • 南通专业网站设计制作永嘉县住房和城乡建设局网站
  • 建设网站需要做什么国外网站的设计风格
  • 网站优化关键词排名公司ui设计软件图标
  • 隆尧网站网站正在建设中 源码下载
  • 安徽建站公司可以做护考题目的网站
  • 做兼职的设计网站有哪些工作内容工作流程管理系统说明书
  • 免费行情网站的推荐理由网站内容怎么做备份
  • 无网站如何做淘宝客外国出名的设计网站
  • 如何建设移动端网站iis部署网站无法访问
  • 网站如何申请wordpress制作商城
  • 与网站建设关系密切的知识点google学术搜索
  • 制作绘本怎么做简易网站关键词优化遇到的情况和解决方法
  • 专门做2次元图片的网站网站设计免费模板
  • 昆明商城网站开发哪个公司做网站好
  • 手机网站和电脑网站跳转做外贸必须建网站吗
  • 做导航网站成本网店代运营哪里找