文章来源:http://xiaohuabiao.blog.163.com/blog/static/13848218201010262717738/

传统的Server/Client实现是基于Thread per request,即服务器为每个客户端请求建立一个线程处理,单独负责处理一个客户的请求。

大多数的网络游戏的服务器都会选择非阻塞select这种结构,为什么呢?因为网络游戏的服务器需要处理的连接非常之多,并且大部分会选择在Linux/Unix下运行,那么为每个用户开一个线程实际上是很不划算的,一方面因为在Linux/Unix下的线程是用进程这么一个概念模拟出来的,比较消耗系统资源,另外除了I/O之外,每个线程基本上没有什么多余的需要并行的任务,而且网络游戏是互交性非常强的,所以线程间的同步会成为很麻烦的问题。由此一来,对于这种含有大量网络连接的单线程服务器,用阻塞显然是不现实的。
iocp,在linux下使用epoll

关于线程是这样的,肯定不可能一个用户一个线程的,没见过那么做的,通常我们是这样的,我们创建几个线程分别用于发送和接收网络消息,当然数量也不是太多,通常是CPU个数的2倍,然后另外建立一个逻辑线程,所有的网络线程接收到的数据都会打入这个逻辑线程,以保证逻辑处理中的顺序处理.  不知道你是否理解.   另外一个小提示,QQGAME可不是一个进程就500个连接,通常他一个进程都会达到20000左右的连接数.

NIO服务器最核心的一点就是反应器模式:当有感兴趣的事件发生的,就通知对应的事件处理器去处理这个事件,如果没有,则不处理。所以使用一个线程做轮询就可以了。当然这里这是个例子,如果要获得更高性能,可以使用少量的线程,一个负责接收请求,其他的负责处理请求,特别是对于多CPU时效率会更高。

JDK 7,WEB服务器 Tomcat、Jetty等,在Windows下,Java将可以使用IOCP,而不是现在nio所用的select,网络并发性能将会得到大幅度提升。在Linux下则应该改变不多,毕竟linux现在并发最好性能的网络I/O EPOLL,JDK 6.0 nio包含5.0的后续版本的缺省实现就是epoll。
-------------------
关于C++中完成端口的介绍:

完成端口在我理解看来也就是用来管理异步过程调用的,呵呵!在Wait等待事件函数中存在数量限制,而完成端口不存在这一限制。   
  只给完成端口启动2倍CPU的线程,这是因为线程也耗系统资源,在一个时间片内一个CPU上只会处理一个线程,大量的线程上下文切换也很耗时间,设定2倍的线程,是因为线程处理例程可能会处理比较耗时的操作,这时如果完成端口又来了请求,系统就会唤醒线程池中的空闲线程及时响应,所以设定为2倍。说得够明白了吧!^-^

两个线程是处理绝对的并发请求,假如真的会有1000个并发请求,两个线程同时处理也是非常快的,估计1-2秒就差不多了.   
  完成端口并不是为每个请求开一个线程,否则会把cpu累坏的.楼主没真正理解.

当你的线程在诸如做数据库调用的时候或者读写文件,如果处于等待状态,IOCP会激活另外一个线程。所以不用太担心。
完成端口的出发点之一就是减少性能在线程切换时的损失吧,好像有的例子里面工作线程的个数是CPU*2+2,据说是实际测试出来的结果这样的设置效率最高

完成端口
  
 一个完成端口其实就是一个通知队列,由操作系统把已经完成的重叠I/O请求的通知放入其中。当某项I/O操作一旦完成,某个可以对该操作结果进行处理的工作者线程就会收到一则通知。而套接字在被创建后,可以在任何时候与某个完成端口进行关联。

步骤:
 1、创建一个空的完成端口;
 2、得到本地机器的CPU个数;
 3、开启CPU*2个工作线程(又名线程池),全部都在等待完成端口的完成包;
 4、创建TCP的监听socket,使用事件邦定,创建监听线程;
 5、当有人连接进入的时候,将Client socket保存到一个我们自己定义的关键键,
    并把它与我们创建的完成端口关联;
 6、使用WSARecv和WSASend函数投递一些请求,这是使用重叠I/O的方式;
 7、重复5~6;

注:1、重叠I/O的方式中,接收与发送数据包的时候,一定要进行投递请求这是它们这个体系结构的特点 当然,在完成端口方式中,不是直接使用的WSARecv和WSASend函数进行请求的投递的。而是使用的ReadFile,Write的方式
  2、完成端口使用了系统内部的一些模型,所以我们只要按照一定的顺序调用就可以完成了。
  3、完成端口是使用在这样的情况下,有成千上万的用户连接的时候,它能够保证性能不会降低。

引文来源   Java与完成端口IOCP--流子

Java与完成端口IOCP相关推荐

  1. [网络安全课设]基于JAVA的系统端口扫描软件设计实现(java代码+IDEA+UI图形界面+实验报告)

    链接::l基于JAVA的系统端口扫描软件设计实现(java代码+IDEA+UI图形界面+实验报告) 系统端口扫描软件设计实现 设计目的和任务 参照superscan.nmap等端口扫描软件的运行情况, ...

  2. java 扫描tcp端口号_多线程TCP端口扫描 java实现

    界面部分: import java.awt.Color; import java.awt.Container; import java.awt.FlowLayout; import java.awt. ...

  3. tomcat 端口_【Java】指定端口运行 war 包

    最近在调研使用 Jenkins 持续集成软件,拿到了一个 war 文件,运行 war 文件有两种方式: 把 war 文件放到 tomcat 的 webapps 文件夹中,运行 tomcat ,由 to ...

  4. java获取进程端口_查看进程的端口号

    一. netstat windows 下 1.查找指定目标进程(java的atf web工程) tasklist  -v |find "java" 图像名        PID j ...

  5. java udp ip端口 设置_UDP端口扫描Java只找到1个开放的UDP端口

    我对端口扫描有一个分歧.我在 Java中扫描一些IP地址的UDP端口.在我的程序中(假设一切正常)我只能找到一个开放的UDP端口.在另一方面端口扫描"nmap"我得到4个开放的UD ...

  6. Linux给Java程序设置端口_扫描服务端口的Java程序

    在Linux下用C写了一个扫描指定IP地址对外开放端口号的程序.扫描自己的机器的端口号速度还是挺快的,用编写的程序扫描在美国的服务器时,等了10分钟,端口号才扫到1000左右.于是就想到了用多线程,可 ...

  7. java udp 同一个端口实现收发_Java网络编程之UDP协议

    伙伴们注意了! 小编在这里给大家送上关注福利: 搜索微信公众号"速学Java"关注即可领取小编精心准备的资料一份! 今天我们来聊聊 网络编程这部分的内容 网络编程 1)计算机网络 ...

  8. java扫描一个端口状态_java扫描端口,如何判断端口是用来做什么的(提供什么服务的)?...

    如题,自己用建立socket的方式扫描端口,代码大概如下: SocketAddress socketAddress; for (port = startPort + serial; port < ...

  9. java获取空闲端口_获取系统空闲端口

    端口取值范围 以下搜自互联网 一般用到的是1到65535,其中0不使用,1-1023为系统端口,也叫BSD保留端口;1024-65535为用户端口,又分为: BSD临时端口(1024-5000)和BS ...

  10. java -jar 指定端口_「Linux命令」-Java程序员需要掌握的10个命令

    作为服务端开发的同学,经常会与linux服务器打交道,一些用的命令必须要掌握. 1.top命令-观察服务端负载情况 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况 ...

最新文章

  1. 殊途同归!招聘软件与社交软件最终都要走向约P宿命?
  2. 检验两组数据是否显著差异_SPSS非参数两个相关样本检验
  3. 移动负载均衡技术(MBL)
  4. SQL2000: MMC 不能打开文件
  5. 如何将自己的代码发布到Maven中央仓库?
  6. 【java】Java泛型
  7. php修改语法错误,php语法检查的方法总结
  8. hadoop之 hadoop日志存放路径
  9. 5g鸿蒙概念,华为5G概念机,真全面屏+鸿蒙系统,颜值再登巅峰
  10. 一个简单企业信息网站架构
  11. Mysql按时间段分组查询来统计会员的个数
  12. ElasticSearch使用入门及拼音搜索介绍
  13. 山东大学软件学院计算机组成原理课程设计整机实验(1)
  14. vue项目打包成app
  15. python3爬虫系列20之反爬需要登录的网站三种处理方式
  16. echart结合高德地图的数据可视化大数据展示平台模板
  17. mfc改计算机名称,VC获取并修改计算机屏幕分辨率(MFC)
  18. 初级Java学习笔记总结
  19. DuerOS业绩亮眼,如何成为了百度财报新增长点?
  20. win7更新错误0x800b0109_Win7自动更新失败怎么办

热门文章

  1. 单片机c语言入门 龙脉工作室著,单片机c语言入门
  2. 芯片之路: 海思半导体前世今生
  3. B站还有多久成为天涯
  4. 科创板第二批受理名单公布,为何AI独角兽 “全军覆没”?...
  5. KindEditor上传文件时报500错误
  6. 电信光猫F652破解经验谈
  7. win7桌面怎么弄计算机,电脑动态桌面,详细教您win7怎么设置电脑动态桌面
  8. android的opengl教程,android opengl 教程
  9. python代码实现自动登录
  10. 如何让U盘对病毒免疫