课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
我们在上文中给大家简单介绍了高并发应用开发中网络协程的基本原理等内容,而今天我们就一起来了解一下,网络协程中的协程调度与引擎设计方法。
1、协程调度
libfiber采用了单线程调度方式,主要是为了避免设计上的复杂度及效率上的影响。
如果设计成多线程调度模式,则必须先需要考虑如下几点:
多核环境下CPU缓存的亲和性:CPU本身配有高效的多级缓存,虽然CPU多级缓存容量较内存小的多,但其访问效率却远高于内存,在单线程调度方式下,可以方便编译器有效地进行CPU缓存使用优化,使运行指令和共享数据尽可能放置在CPU缓存中,而如果采用多线程调度方式,多个线程间共享的数据就可能使CPU缓存失效,容易造成调度线程越多,协程的运行效率越低的问题;
多线程分配任务时的同步问题:当多个线程需要从公共协程任务资源中获取协程任务时,需要增加『锁』保护机制,一旦产生大量的『锁』冲突,则势必会造成运行性能的严重损耗;
事件引擎操作优化:在多线程调度则很难进行如此优化,下面会介绍在单线程调度模式下的事件引擎操作优化。
当然,设计成单线程调度也需解决如下问题:
(1)、如何有效地使用多核:
在单线程调度方式下,该线程内的多个协程在运行时仅能使用单核,解决方案为:
启动多个进程,每个进程运行一个线程,该线程运行一个协程调度器;
同一进程内启动多个线程,每个线程运行独立的协程调度器;
(2)、多个线程之间的资源共享:
因为协程调度是不跨线程的,在设计协程互斥锁时需要考虑:
协程锁需要支持『同一线程内的协程之间、不同线程的协程之间、协程线程与非协程线程之间』的互斥;
网络连接池的线程隔离机制,需要为每个线程建立各自独立的连接池,防止连接对象在不同线程的协程之间共享,否则便会造成同一网络连接在不同线程的协程之间使用,破坏单线程调度规则;
需要防止线程内的某个协程『疯狂』占用CPU资源,导致本线程内的其它协程得不到运行的机会,虽然此类问题在多线程调度时也会造成问题,但显然在单线程调度时造成的后果更为严重。
2、协程事件引擎设计
libfiber的事件引擎支持当今主流的操作系统,从而为libfiber的跨平台特性提供了有力的支撑,下面为libfiber事件引擎所支持的平台:
Linux:sekect/poll/epoll,epoll为Linux内核级事件引擎,采用事件触发机制,不象select/poll的轮循方式,所以epoll在处理大并发网络连接时运行效率更高;BSD/MacOS:select/poll/kqueue,其中kqueue为内核级事件引擎,在处理高并发连接时具有更高的性能;
Windows:select/poll/iocp/Windows窗口消息,其中iocp为Windows平台下的内核级高效事件引擎;
libfiber支持采用界面消息引擎做为底层的事件引擎,这样在编写Windows界面程序的网络模块时便可以使用协程方式了,之前人们在Windows平台编写界面程序的网络模块时,一般采用如下两种方式:
(1)、采用非阻塞方式,网络模块与界面模块在同一线程中;
(2)、将网络模块放到独立的线程中运行,运行结果通过界面消息『传递』到界面线程中;
现在libfiber支持Windows界面消息引擎,我们就可以在界面线程中直接创建网络协程,直接进行阻塞式网络编程。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。