spserver 架构分析(一)

本文分享了作者学习SPServer服务器框架的心得,包括其框架结构的理解与绘制,并阐述了如何通过SPServer作为跳板进一步深入研究ACE库的计划。

一直对多线程和网络编程比较感兴趣,自学了一些winsock和TCP/IP的知识,一年前因为项目需要,接触了一段时间的ACE,使用了其中的 Reactor框架,那时对网络编程还不甚熟悉,感觉ACE挺神秘。其间也就是根据项目需要使用了一下其中的某个框架,对于ACE内部的实现原理,也没怎 么多想。

        随着在网络以及多线程方面知识的积累,近日忽然想要学习一下ACE库的源代码,借鉴一下它的实现手法。到ACE的官网上下载了 ACE的源代码,准备开始看时,却如堕五里雾中了,不知从何下手。也难怪,ACE库如此庞大,这样贸然着手没有任何准备的去学习,应该不会收到很好的效 果,所以我决定分以下几个步骤来学习:

        1、找一个较轻量级的服务器框架,如spserver,先学习一下,为进军ACE做准备。

        2、重温一下《C++网络编程》的两本书,复习一下ACE库的使用方法和ACE框架的基础知识。

        3、从ACE库内部的几个框架着手,深入学习ACE库的源代码。

        我想通过这三个步骤,循序渐进并假以时日,应该可以达到学习ACE库的目的。

        学习spserver几日,我大概弄清楚了它的框架,根据我的理解,我画了一个spserver的框架图,如下:

 

         由上图可知,程序在启动后,主线程负责创建:

        1、连接接收套接字AcceptSocket,并设置必要的属性,如非阻塞等等

        2、一个完成端口对象,并将AcceptSocket套接字与它关联

        3、一个单独的子线程用于接收连接,该线程首先在AcceptSocket上调用Accept,然后调用WaitForSingleObject等待连接事件

        4、创建2个任务队列,用于存储服务端的待执行任务。

        5、创建2个线程池,在后面用于执行任务队列中的任务

        6、主线程此后不断调用GetQueuedCompletionStatus,检查该IOCP,从而找出待处理任务,然后根据任务的类别,有连接事件时,通知连接接收线程;将Recv任务放入任务队列1;将Send任务放入任务队列2。然后将这两个任务队列中的任务交由2个线程池处理。

 

        就这样,程序就有4个并行的部分:

        1、连接接收线程

        2、主线程,也就是任务产生和分配线程

        3、线程池1,处理Recv任务

        4、线程池2,处理Send任务

        其中主线程和2个线程池之间是生产者和消费者的关系,主线程不断产生新的任务放到任务队列中,线程池不断从任务队列中取出任务并执行。

        至 于所谓的半同步/半异步我想是这样的:套接字本身是异步套接字,也就是说函数调用如Accept,Recv,Send等都是异步执行的。但是由于连接接收 线程在指定位置处要等待主线程发出的连接进入事件,所以实质上这两个线程之间就构成了同步关系。按照我的理解,这就是所谓的半同步/半异步,当然我不确定 是否正确。

 

        以上是我学习spserver的一些心得,及对其框架的简单理解,纯粹出于对网络编程的热爱,放于此处,一为备忘,二为交流。欢迎广大有共同兴趣的朋友批评指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值