传统的BIO
Socket 和 ServerSocket
1 | public static void main(String[] args) throws IOException { |
new ServerSocket(9090);
这个java程序创建new ServerSocket(9090);会调用操作系统内核,也就是系统调用,
比如linux操作系统,应用进程也就是我们的java进程,会调用linux的内核方法,创建一个socket,在linux系统中就是一个文件描述符fd,最终对得到:
1 | socket() = XXfd |
- socket 的read方法 ,读取客户端发送的数据,如果没有,则一直阻塞
- serverSocket的accept方法,等待客户端的链接,如果没有链接,则一直阻塞等待
- serverSocket 一次只能处理一个客户端请求
BIO程序有哪些弊端?
- 服务端一次处理一个请求,并发非常低
- 没有客户端请求,服务端一直阻塞,占用资源
如果在bio的基础上,利用多线程处理客户端请求?
d C10K问题
来一个链接,服务端创建一个线程 ,去处理请求,服务端继续监听客户端,是不是可以增加并发?
有什么问题?
- 线程消耗内存资源
如果一下子过来10万个请求呢?
服务器要创建10万个线程,内存就崩了。
如果搞一个线程池呢? 并发度最大为最大线程数? 并发度已经定死了?