IO模型和epoll原理

传统BIO为阻塞IO,来张图:

在这里插入图片描述
BIO 一个线程处理一个连接,如果建立连接不发送数据,就会一直阻塞,即使是多个线程处理多个服务也是阻塞的,两个阻塞点:等待链接。等待输入。
线程Thread是操作系统的轻量级进程,BIO每个连接进来都创建线程与之对应,是如何操作的呢?
每连接一个操作系统会调用内核的clone方法将连接好的线程copy一份,该线程会有对应的线程ID号,建立监听。有对应的日志,新开辟的线程可以recv(读取客户端信息),然后主线程继续等待连接,以此类推。主线程循环继续阻塞等待连接,随着客户端连接增加,clone的线程也会越多,NIO的改造是减少线程的开辟,但是必须改造内核。
在这里插入图片描述

NIO:

Java中的newIO,OS中的nonblockIO。
在这里插入图片描述

多路复用器的select和poll存在的问题:
1.每次系统调用内核都必须传输大量数据【客户端编号】(内核是无状态的,不会记录每次调用的上下文信息)

2.程序每次调用内核都会触发新一轮遍历,然后客户端状态返回给内核,此处也是同步。
如何解决呢?
内核开辟空间,保存每个客户端信息,异步标记客户端数据状态。
EPOLL解决以上问题,来张图
在这里插入图片描述
BIO NIO 多路复用器均为同步IO模型
同步:程序自己读取数据(同步和异步,同步需要自己去读取数据,异步数据自己推过来)
————————————
系统调用:

系统调用和中断机制(程序的交替执行),中断有以下几种情况:
	情况1:系统自己调度实现中断
		网卡晶振(一直断点,每个断点为切换执行的过程),大概流程:
			>晶振后CPU将终止当前执行的程序,将CPU程序计数器(执行位置)存到程序的程序计数器中,以便于下次顺序执行
			>触发CPU进程调度,利用算法找出即将执行的程序
			>找中断向量表(键值,键代表某个程序,值为回调函数【将程序中要执行的区域搬到内存】)
			>将待执行程序的程序计数器加载到CPU自己的寄存器中,每执行一步从CPU程序计数器获取下一条指令继续执行
			>等待晶振打断
	情况2:外部设备实现中断
		如晃动鼠标,敲击键盘等

CPU的中断概念非常重要,此为多程序运行的基础,如果没有中断,相当于计算机中只有一个程序。
举个例子
不中断:一个教室,老师和学生是一对一的,就是不间断程序,意味着这个老师不间断的管理这一个孩子
中断:一个教室,老师和学生是一对多的,老师在多个学生之间切换管理,不论如何切换,每次执行都是一对一的,但是所有的学生又都归该老师管理
回调函数:当触发一定的条件时执行,学生犯错了,老师来一巴掌,一巴掌就是回调函数,学生的错就是触发条件

IO牵扯到硬件,是用户态到内核态。
系统调用和函数调用(内核态的切换是中断的过程)
系统调用:经过内核态,cpu切换
函数调用:cpu不切换执行,从A函数跳到B函数执行

猜你喜欢

转载自blog.csdn.net/GiantCrocodile/article/details/117364619