论文部分内容阅读
摘 要:在计算机网络通讯方式中使用TCP 协议的C/S程序是其中非常重要的一种,在这种程序模型中服务器端程序开发又是其中的重点,本文简单地谈论在Windows系统下性能最高的一种网络通讯模型——完成端口通讯模型。
关键词:完成端口网络通讯模型;TCP 协议;网络通讯方式
在网络世界中,有两种网络通讯方式。第一种是我们最常见的Web形式,平时使用360、火狐、UC等浏览器都是使用这种模式来访问网络数据。第二种是C/S服务器客户端模式即在远程服务器上运行服务器程序,在终端机上包括传统的PC机和现在的移动终端Android和iOS设备上的APP运行客户端程序,服务器程序和客户机程序通过在IP地址和端口上使用TCP协议连接。在第二种方式中服务器程序往往是编程中比较复杂的部分。本文讨论在Windows下性能最高的通讯模型——完成端口模型。
完成端口是Windows下使用异步非阻塞方式的系统内核对象,它的主要功能是提供一个服务器程序的内核部分,以便让几万个客户端程序接入,负责同时与这几万个客户端程序接收和发送数据(即网络I/O操作)。其程序设计包括下面三个实体部分,第一个是程序主线程,第二个是负责与客户端收发和接收数据的线程,这里我们称其为工作线程,第三个是操作系统本身。
首先主线程开始三个工作,第一工作是负责初始化套接字库,由于要接入上万个客户端,要为每一个客户端提供套接字,而新建一个套接字需要花费比较多的时间,所以在初始化时,要先多建一些套接字,等有新客户端连接上来的时候直接用上而不是新建以便加快系统速度。工作线程具体的数量由网络状态来确定,比如并发数量很高的话就准备比较多的新建套接字,并发量如果不高的话就不准备太多。在新建完一定数量套接字后把它们组成队列。第二个工作是新建一个完成端口,把新建的套接字和完成端口绑定好以便监听。第三个工作是生成一定数量的工作线程负责网络I/O操作也就是负责发送数据到客户端和接收客户端发送来的数据,由于要避免线程之间的太多切换,我们生成CPU核心数两倍加二个工作线程。
然后,工作线程开始工作,工作线程是以阻塞模式工作。一方面按需要给操作系统传递收发数据指令,操作系统在执行完收发数据后把运行结果发送到完成端口上。工作线程另一方面不停地扫描完成端口上由操作系统发来的执行结果,读出结果以便一下步的操作。在这里一般来说,工作线程有三种操作,第一是接收操作,即有新的客户端接入。第二是发送操作就是把数据发送到客户端,第三是接收由客户端发来的信息。所以在程序设计之初就要设计网络操作的类型。而具体是哪一种操作,则是由工作线程通过完成端口的读写状态函数来读取,以此循环。
举一个例子来说明,我们把服务器程序想象成一家物流公司。这家公司有三种员工,首先是经理,然后是秘书,最后是快递员。经理就是我们上面提到的主线程,而秘书是工作线程,最后快递员是操作系统。代表主线程的经理只有一个,代表工作线程的秘书可以多个,同样一个秘书不可能做太多的事情,所以一个经理下面只管理几个秘书。而一个秘书可以同时给多个快递员下达收发货物的命令。在这时秘书不需要等待第一个快递员完成工作后再给第二个快递员下指令所以这里是异步非阻塞模式。快递员只是在完成工作后才把收发工作的执行结果返回到公司,而不是边做边汇报。
工作流程如下,经理先开始工作,第一项工作是准备基础设备(即初始化socket 库,监听套接字),第二项工作是根据今天的业务量来生成空白工單(即多新建一些套接字以备客户端接入使用),确定秘书数量(生成工作线程数量),招集秘书开会确定工单的类型(即有什么网络操作如接收数据,发送数据和新客户端的接入等)。第三项工作是建立一个工作总台用于所有收发货品工作结果的存放(即建立一个完成端口)。
然后是秘书开始工作,秘书的工作就是不停地从总台上读出快递员收发货品工作的执行结果,根据不同的结果做出不同的反应,总台上一般是新客户的来访,收货品,发货品的执行结果(对应的操作就是接收新客户端的接入,接收客户端的发送数据,发送数据到客户端)。
最后是快递员去完成具体的接收和发送货品工作,然后把执行结果放到总台上去以便让秘书知道每一笔业务的执行情况(即操作系统异步非阻塞地完成接收和发送数据的工作后把执行结果放到完成端口上)。
在这个循环完成后,如果服务器程序要结束运行,那应该由谁来完成结束完成端口呢?大家很自然地从经理,秘书和快递员中找出答案,是经理。也就是主线程来结束完成端口模型,由于完成端口模型上的工作线程是采用阻塞方式运行,所以主线程通过发送信息的方式来通知多个工作线程来结束当前的工作。在这里我们发送一个特定的网络事件给每一个工作线程,工作线程读出这个特定网络事件后就退出。这里注意一定要检查是否每个工作线程都退出。
参考文献:
[1]王艳平,张越著.Windows 网络与通信程序设计[M].人民邮电出版社.
[2]徐磊,腾婧,张莹.Windows Sockets网络编程[M].机械工业出版社出版.
[3]Jeffrey Richter(法) /Christophe Nasarre.Windows 核心编程 Windows via C/C++[M].清华大学出版社.
[4]朱桂英,张元亮.visual c++网络编程案例实战[M].清华大学出版社.
关键词:完成端口网络通讯模型;TCP 协议;网络通讯方式
在网络世界中,有两种网络通讯方式。第一种是我们最常见的Web形式,平时使用360、火狐、UC等浏览器都是使用这种模式来访问网络数据。第二种是C/S服务器客户端模式即在远程服务器上运行服务器程序,在终端机上包括传统的PC机和现在的移动终端Android和iOS设备上的APP运行客户端程序,服务器程序和客户机程序通过在IP地址和端口上使用TCP协议连接。在第二种方式中服务器程序往往是编程中比较复杂的部分。本文讨论在Windows下性能最高的通讯模型——完成端口模型。
完成端口是Windows下使用异步非阻塞方式的系统内核对象,它的主要功能是提供一个服务器程序的内核部分,以便让几万个客户端程序接入,负责同时与这几万个客户端程序接收和发送数据(即网络I/O操作)。其程序设计包括下面三个实体部分,第一个是程序主线程,第二个是负责与客户端收发和接收数据的线程,这里我们称其为工作线程,第三个是操作系统本身。
首先主线程开始三个工作,第一工作是负责初始化套接字库,由于要接入上万个客户端,要为每一个客户端提供套接字,而新建一个套接字需要花费比较多的时间,所以在初始化时,要先多建一些套接字,等有新客户端连接上来的时候直接用上而不是新建以便加快系统速度。工作线程具体的数量由网络状态来确定,比如并发数量很高的话就准备比较多的新建套接字,并发量如果不高的话就不准备太多。在新建完一定数量套接字后把它们组成队列。第二个工作是新建一个完成端口,把新建的套接字和完成端口绑定好以便监听。第三个工作是生成一定数量的工作线程负责网络I/O操作也就是负责发送数据到客户端和接收客户端发送来的数据,由于要避免线程之间的太多切换,我们生成CPU核心数两倍加二个工作线程。
然后,工作线程开始工作,工作线程是以阻塞模式工作。一方面按需要给操作系统传递收发数据指令,操作系统在执行完收发数据后把运行结果发送到完成端口上。工作线程另一方面不停地扫描完成端口上由操作系统发来的执行结果,读出结果以便一下步的操作。在这里一般来说,工作线程有三种操作,第一是接收操作,即有新的客户端接入。第二是发送操作就是把数据发送到客户端,第三是接收由客户端发来的信息。所以在程序设计之初就要设计网络操作的类型。而具体是哪一种操作,则是由工作线程通过完成端口的读写状态函数来读取,以此循环。
举一个例子来说明,我们把服务器程序想象成一家物流公司。这家公司有三种员工,首先是经理,然后是秘书,最后是快递员。经理就是我们上面提到的主线程,而秘书是工作线程,最后快递员是操作系统。代表主线程的经理只有一个,代表工作线程的秘书可以多个,同样一个秘书不可能做太多的事情,所以一个经理下面只管理几个秘书。而一个秘书可以同时给多个快递员下达收发货物的命令。在这时秘书不需要等待第一个快递员完成工作后再给第二个快递员下指令所以这里是异步非阻塞模式。快递员只是在完成工作后才把收发工作的执行结果返回到公司,而不是边做边汇报。
工作流程如下,经理先开始工作,第一项工作是准备基础设备(即初始化socket 库,监听套接字),第二项工作是根据今天的业务量来生成空白工單(即多新建一些套接字以备客户端接入使用),确定秘书数量(生成工作线程数量),招集秘书开会确定工单的类型(即有什么网络操作如接收数据,发送数据和新客户端的接入等)。第三项工作是建立一个工作总台用于所有收发货品工作结果的存放(即建立一个完成端口)。
然后是秘书开始工作,秘书的工作就是不停地从总台上读出快递员收发货品工作的执行结果,根据不同的结果做出不同的反应,总台上一般是新客户的来访,收货品,发货品的执行结果(对应的操作就是接收新客户端的接入,接收客户端的发送数据,发送数据到客户端)。
最后是快递员去完成具体的接收和发送货品工作,然后把执行结果放到总台上去以便让秘书知道每一笔业务的执行情况(即操作系统异步非阻塞地完成接收和发送数据的工作后把执行结果放到完成端口上)。
在这个循环完成后,如果服务器程序要结束运行,那应该由谁来完成结束完成端口呢?大家很自然地从经理,秘书和快递员中找出答案,是经理。也就是主线程来结束完成端口模型,由于完成端口模型上的工作线程是采用阻塞方式运行,所以主线程通过发送信息的方式来通知多个工作线程来结束当前的工作。在这里我们发送一个特定的网络事件给每一个工作线程,工作线程读出这个特定网络事件后就退出。这里注意一定要检查是否每个工作线程都退出。
参考文献:
[1]王艳平,张越著.Windows 网络与通信程序设计[M].人民邮电出版社.
[2]徐磊,腾婧,张莹.Windows Sockets网络编程[M].机械工业出版社出版.
[3]Jeffrey Richter(法) /Christophe Nasarre.Windows 核心编程 Windows via C/C++[M].清华大学出版社.
[4]朱桂英,张元亮.visual c++网络编程案例实战[M].清华大学出版社.