对协程的理解错误的是,为什么要有协程

  对协程的理解错误的是,为什么要有协程

  谢城存在的理由是什么?协诚能解决哪些问题?纯C语言协同学框架实现,底层原理及性能分析,访谈blade _ blog _协同学缺点

  谢城存在的理由是什么?协诚能解决哪些问题?纯C语言协同框架的实现,底层原理及性能分析,面试blade

  协同学的概念由来已久,许多程序员都实现了这个组件。关于协同学的网上文章、博客、论坛都是人山人海。在知乎上,也有很多在github上写协同学的大牛。我也是心血来潮,来实现了这样一个组件,测试了它的性能。我借鉴了很多大牛的思想,看了很多大牛的代码。所以把整个思考过程写下来。实现代码https://github.com/wangbojing/NtyCo代码易于阅读。如果NtyCo能在你的项目中为你解决一些工程问题,那将是我的荣幸。

  谢城存在的理由是什么?协诚能解决哪些问题?在我们目前的CS和BS开发模式中,服务器的吞吐量是一个非常重要的参数。实际上,吞吐量是IO处理时间加上业务处理时间。为简单起见,例如,客户端和服务器之间有一个长连接,客户端定期向服务器发送心跳包数据。客户端向服务器发送一次心跳包,服务器更新新客户端的状态。在发送心跳包的过程中,业务处理时间等于IO读取(RECV系统调用)加上业务处理(更新客户状态)。业务处理时间等于1s吞吐量。

  业务处理(更新客户端状态)时间。如果业务不一样,处理时间不一样,就不讨论了。

  如何提高recv的性能?如果只有一个客户端,就没有必要提高recv的性能,也无法提高。如果有几百万长连接的客户端,如何改进?以Linux为例,这里需要介绍的一个“网络名人”是epoll。使用服务器epoll管理数百万个长客户端连接。代码框架如下:

  while (1) {

  int nready=epoll_wait(epfd,events,EVENT_SIZE,-1);

  for(I=0;我准备好了;i ) {

  int sockfd=events[I]. data . FD;

  if (sockfd==listenfd) {

  int connfd=accept(listenfd,xxx,xxxx);

  setnonblock(conn FD);

  ev.events=EPOLLIN EPOLLET

  ev . data . FD=conn FD;

  epoll_ctl(epfd,EPOLL_CTL_ADD,connfd,ev);

  }否则{

  手柄(sockfd);

  }

  }

  }对于响应式服务器来说,客户端的所有操作驱动都来自于这个大循环。epoll_wait的反馈结果。

  该服务器处理数百万次IO。Handle(sockfd)可以通过两种方式实现。

  首先,handle(sockfd)函数读写sockfd。代码如下所示

  int handle(int sockfd) {

  recv(sockfd,rbuffer,length,0);

  parser_proto(rbuffer,length);

  send(sockfd,sbuffer,length,0);

  }句柄的io操作(send,recv)与epoll_wait在同一个处理流程中。这是IO同步操作。

  优势:

  1.sockfd易于管理。

  2.清晰的操作逻辑。

  缺点:

  1.服务器程序依赖epoll_wait获得缓慢响应。

  2.程序性能差。

  第二,handle(sockfd)函数将sockfd的操作推入线程池,代码如下:

  int thread_cb(int sockfd) {

  //这个函数在线程池创建的线程中运行。

  //不在与句柄相同的线程上下文中运行

  recv(sockfd,rbuffer,length,0);

  parser_proto(rbuffer,length);

  send(sockfd,sbuffer,length,0);

  }

  int handle(int sockfd) {

  //这个函数运行在主线程main_thread中

  //在此之前,确保线程池已经启动。

  push_thread(sockfd,thread _ CB);//将sockfd放在另一个线程中运行。

  }Handle函数是将sockfd处理方法放到另一个已经运行的线程中。这样io操作(recv,send)和epoll_wait不在同一个处理流程中,io操作(recv,send)和epoll_wait解耦。这被称为IO异步操作。

  优势:

  1.子模块规划得很好。

  2.高程序性能。

  缺点:

  因为正子模块规划的很好,所以模块之间sockfd的管理极其麻烦。每个子线程都需要管理好sockfd,避免IO操作时sockfd关闭或其他异常。

  如上所述,IO同步运行,程序响应慢,IO异步运行,程序响应快。

  让我们比较一下IO同步操作和IO异步操作。

  代码如下:

  https://github . com/wangbojing/c 1000k _ test/blob/master/server _ mulport _ epoll . c

  当这段代码的第486行#if 1打开时,它为IO异步操作。关闭时,同步IO操作。

  接下来,粘贴我的access测试结果。

  IO异步操作,每1000个连接的服务器响应时间(约900ms)。

  IO同步运行,每1000个连接的服务器响应时间(约6500ms)。

  io异步操作和IO同步操作

  没有一种方法,异步性能和同步代码逻辑。方便程序员操作IO组件?是的,它是由一个轻量级的协同流程实现的。开关,然后调度器处理epoll_wait的进程。

  正是基于这种思想编写了NtyCo,实现了一个IO异步操作和协同操作相结合的组件。https://github.com/wangbojing/NtyCo,

  过程的更详细的解释

  纯C语言协同学框架的实现,底层原理及性能分析,面试blade 1。协同学的起源——它存在的理由?协诚能解决哪些问题?

  协同学的起源-它为什么存在?怎么用?和线程使用有什么不同?内部是如何工作的?有哪些原语?分别怎么实现?2.协作实现的切换——上下文是如何切换的?如何实现代码?

  跑体是怎么定义的?调度器是如何定义的?流程是如何安排的?协同多核模式-多核实现协同性能测试-实际性能测试

  勿忘你的倡议心灵雅原创作品,博主,

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • office2010激活密钥大全 怎么永久激活office2010
  • project2010产品密钥免费_project2010激活密钥永久激活码
  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • chatgpt是什么?为什么这么火?
  • ChatGPT为什么注册不了?OpenAI ChatGPT的账号哪里可以注册?
  • OpenAI ChatGPT怎么注册账号?ChatGPT账号注册教程
  • chatgpt什么意思,什么是ChatGPT ?
  • CAD中怎么复制图形标注尺寸不变,CAD中怎么复制图形线性不变
  • cad中怎么创建并使用脚本文件,cad怎么运行脚本
  • cad中快速计算器的功能,cad怎么快速计算
  • cad中快速修改单位的方法有哪些,cad中快速修改单位的方法是
  • cad中心点画椭圆怎么做,cad轴测图怎么画椭圆
  • CAD中常用的快捷键,cad各种快捷键的用法
  • 留言与评论(共有 条评论)
       
    验证码: