Java与完成端口IOCP
文章来源:http://xiaohuabiao.blog.163.com/blog/static/13848218201010262717738/
大多数的网络游戏的服务器都会选择非阻塞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相关推荐
- [网络安全课设]基于JAVA的系统端口扫描软件设计实现(java代码+IDEA+UI图形界面+实验报告)
链接::l基于JAVA的系统端口扫描软件设计实现(java代码+IDEA+UI图形界面+实验报告) 系统端口扫描软件设计实现 设计目的和任务 参照superscan.nmap等端口扫描软件的运行情况, ...
- java 扫描tcp端口号_多线程TCP端口扫描 java实现
界面部分: import java.awt.Color; import java.awt.Container; import java.awt.FlowLayout; import java.awt. ...
- tomcat 端口_【Java】指定端口运行 war 包
最近在调研使用 Jenkins 持续集成软件,拿到了一个 war 文件,运行 war 文件有两种方式: 把 war 文件放到 tomcat 的 webapps 文件夹中,运行 tomcat ,由 to ...
- java获取进程端口_查看进程的端口号
一. netstat windows 下 1.查找指定目标进程(java的atf web工程) tasklist -v |find "java" 图像名 PID j ...
- java udp ip端口 设置_UDP端口扫描Java只找到1个开放的UDP端口
我对端口扫描有一个分歧.我在 Java中扫描一些IP地址的UDP端口.在我的程序中(假设一切正常)我只能找到一个开放的UDP端口.在另一方面端口扫描"nmap"我得到4个开放的UD ...
- Linux给Java程序设置端口_扫描服务端口的Java程序
在Linux下用C写了一个扫描指定IP地址对外开放端口号的程序.扫描自己的机器的端口号速度还是挺快的,用编写的程序扫描在美国的服务器时,等了10分钟,端口号才扫到1000左右.于是就想到了用多线程,可 ...
- java udp 同一个端口实现收发_Java网络编程之UDP协议
伙伴们注意了! 小编在这里给大家送上关注福利: 搜索微信公众号"速学Java"关注即可领取小编精心准备的资料一份! 今天我们来聊聊 网络编程这部分的内容 网络编程 1)计算机网络 ...
- java扫描一个端口状态_java扫描端口,如何判断端口是用来做什么的(提供什么服务的)?...
如题,自己用建立socket的方式扫描端口,代码大概如下: SocketAddress socketAddress; for (port = startPort + serial; port < ...
- java获取空闲端口_获取系统空闲端口
端口取值范围 以下搜自互联网 一般用到的是1到65535,其中0不使用,1-1023为系统端口,也叫BSD保留端口;1024-65535为用户端口,又分为: BSD临时端口(1024-5000)和BS ...
- java -jar 指定端口_「Linux命令」-Java程序员需要掌握的10个命令
作为服务端开发的同学,经常会与linux服务器打交道,一些用的命令必须要掌握. 1.top命令-观察服务端负载情况 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况 ...
最新文章
- 殊途同归!招聘软件与社交软件最终都要走向约P宿命?
- 检验两组数据是否显著差异_SPSS非参数两个相关样本检验
- 移动负载均衡技术(MBL)
- SQL2000: MMC 不能打开文件
- 如何将自己的代码发布到Maven中央仓库?
- 【java】Java泛型
- php修改语法错误,php语法检查的方法总结
- hadoop之 hadoop日志存放路径
- 5g鸿蒙概念,华为5G概念机,真全面屏+鸿蒙系统,颜值再登巅峰
- 一个简单企业信息网站架构
- Mysql按时间段分组查询来统计会员的个数
- ElasticSearch使用入门及拼音搜索介绍
- 山东大学软件学院计算机组成原理课程设计整机实验(1)
- vue项目打包成app
- python3爬虫系列20之反爬需要登录的网站三种处理方式
- echart结合高德地图的数据可视化大数据展示平台模板
- mfc改计算机名称,VC获取并修改计算机屏幕分辨率(MFC)
- 初级Java学习笔记总结
- DuerOS业绩亮眼,如何成为了百度财报新增长点?
- win7更新错误0x800b0109_Win7自动更新失败怎么办