从底层了解IO多路复用模型
前言
当我们去面试的时候,问到了 redis,nginx,netty他们的底层模型分别是什么?
- redis -> epoll
- nginx-> epoll
- netty-> epoll?
需要从操作系统的层面上来谈
BIO
当我们开机的时候,首先被加载进内存的是我们的Kernel(内核),内核是用于管理我们的硬件的,同时内核还会创建一个GDT表,然后划分两个空间(用户空间和内核空间),同时空间中的内容是开启了保护模式,无法被修改的。
同时还有一个CPU的概念,CPU有自己的指令集,并且指令集是分了几个级别的,分别是从0~3的,Kernel属于0级别。APP只能用级别为3的指令集。
从上面我们可以知道,我们的应用程序是无法直接访问我们的Kernel的,也就是程序不能直接访问我们的磁盘,声卡,网卡等设备,只有内核才可以访问,那我们怎么办?
只有APP通过调用Kernel提供的 syscall(系统软中断和硬中断)来获取硬件中的内容。
- 软中断
- 硬中断:硬中断指的是我们的键盘,按下一个按键的时候,就会触发我们的硬中断,也就是内核会有一个中断号,然后得到一个callback的回调函数
说到这里,其实就是为了引出一个 概念,就是 IO 和 内核之间的成本问题
/**
* 服务器读取文件
* @author: 陌溪
* @create: 2020-07-01-20:40
*/
public class TestSocket {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8090);
System.out.println("step1: new ServerSocket(8090)");