计算机基础知识
内核空间:专门给操作系统用的【物理】内存空间(操作系统的专属空间)
用户空间:给用户程序使用的【虚拟】内存空间
操作系统就是一个【资源管家】,管理一切用户程序需要使用到的资源,cpu资源(线程调度)、内存资源以及所有的外设资源(外部设备)
用户程序和所有外设的交互都需要经过操作系统
虚拟内存的作用:进程隔离、提供比物理内存更大的内存空间
计算机包括一下五大部件:运算器、控制器、存储器、输入和输出设备
IO:I数据从外设到内存,O数据从内存到外设
所以不管什么IO都逃不开操作系统
Java IO
java IO从使用上可以分为两类:一,针对文件的磁盘IO;二,针对socket的网络IO。
BIO是面向流的阻塞IO,分为字节流和字符流两类,NIO是面向块的非阻塞IO。
NIO包含三大核心:Selector、Channel、Buffer
对文件IO时,只会用到Channel和Buffer(DirectByteBuffer可以使用直接内存作为Buffer,减少数据拷贝次数)
只有网络IO时,才会用到基于IO多路复用的Selector
BIO下的网络模型,使用一个线程接收连接,每来一个连接,再使用一个线程处理连接中的数据读写。接收连接和从连接上接收数据都是阻塞操作。
BIO网络模型的缺点,在于一个线程处理一个socket连接。
引申出一个主要缺点:
服务器能同时处理的连接数受限于线程个数。
引申出一个次要缺点:
一个线程处理一个socket连接,如果客户端建立一个请求后,不怎么发数据,又迟迟不断开连接,那处理这个连接的线程大部分时间都处于阻塞状态,那这个线程资源就浪费了。
NIO网络模型,使用一个线程去轮询Selector,每发生一个事件(比如请求连接事件、读事件),就使用一个线程去处理对应socket上的事件。整个过程不会发生线程阻塞。
Selector基于操作系统提供的select、poll或epoll实现的。
select和poll知道有事件发生,但不知道是哪个socket上有事件发生,所以需要轮询所有的socket,时间复杂度为O(n)
epoll是基于事件回调的,不仅知道有事件发生还知道是哪个socket有事件发生,时间复杂度为O(1)
NIO网络模型相较于BIO网络模型的优点:
- 线程资源被充分利用,不会阻塞在网络IO上。
- 能同时处理的连接数远大于BIO网络模型(不受限于线程个数)
tomcat8默认使用NIO网络模型,默认的最大连接数是1万,默认的最大线程数是200。
IO密集型应用,线程数适合搞多点,因为有很多线程阻塞在IO上,所以多搞点线程可以充分压榨cpu。
cpu密集型应用,线程数最好不要超过机器允许的最大并发数,否则花费在线程切换上的代价会很大。
web应用一般都是IO密集型,为了支持高并发,堆线程数是没用的,像tomcat 200个线程完全够用了,关键是降低数据IO的阻塞时间,对于不着急的IO用mq异步处理,对于着急的IO使用缓存、读写分离、垂直拆分、水平拆分等手段尽量提升IO速度。
网友评论