Netty---高并发IO的底层原理


一.IO读写的基本原理

1.1 内核态和用户态

为了避免用户进程直接操作内核,保证内核安全,操作系统将内存分为了两部分:内核空间和用户空间内核模块运行在内核空间,对应内核态,用户程序运行在用户空间,对应用户态

1.2 系统调用

用户态进程不能直接访问内核空间的数据,也不能直接调用内核函数,因此需要将进程切换到内核才可以进行这个操作这个过程叫系统调用

1.3 内核缓冲区与进程缓冲区

用户程序进行IO的读写依赖于底层的IO读写,主要是read和wirte两大原语我们理解的应用程序IO过程:物理设备(磁盘等)和内存的读写,实际上这并不是真正的用户程序的IO

每一次物理设备和内存的资源交换都要经过一次中断这种操作是由操作系统系统内核(Kernel)完成的,与我们无关系统中断是一次非常消耗系统资源的过程,大致过程为:发生中断时,需要保存进程的一系列信息(比如PCB),结束中断要恢复一系列信息频繁的中断会极大的影响操作系统的性能,所以出现了内核缓冲区进程缓冲区的概念内存当中有一个内核缓冲区,每个进程对应一个进程缓冲区

用户程序的读,使用read函数,将内核缓冲区的数据复制到进程缓冲区用户程序的写,使用wirte函数,将进程缓冲区的数据复制到内存缓冲区

所以,真正的用户程序的IO并没有内存和物理设备之间资源的交换,而是进程缓冲区和内存缓冲区的复制

二.四大IO模型

2.1 阻塞与非阻塞

阻塞IO:执行read和wirte函数必须到内核态,只有内核IO完成后才能返回到用户态执行用户程序的操作指令非阻塞IO:用户空间的程序不需要等待内核IO操作彻底完成,可以立即返回用户空间去执行用户程序的后续指令,并且内核IO会返回一个当前IO的状态值在java中默认创建的socket都属于阻塞IO

2.2 同步与异步

同步IO:用户空间(进程或者线程)是主动发起IO请求的一方,系统内核被动接受异步IO:系统内核主动发起IO请求,用户空间被动接受

2.3 同步阻塞式IO (BIO)

默认情况下,在java应用程序进程中所有对 socket 连接进行的IO