对协程的理解错误的是,为什么要有协程
谢城存在的理由是什么?协诚能解决哪些问题?纯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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。