IO模型和mySQL缓冲
ServletWebServerFactoryAutoConfiguration
SpringApplicationRunListener
EventPublishingRunListener ->通过 SimpleApplicationEventMulticaster 发布spring事件 ,持有List
new SpringApplication
-> setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
run:
SpringApplicationRunListeners listeners = getRunListeners(args);
listeners.starting(); ->EventPublishingRunListener.starting()
IO模型
- 同步:进程触发IO操作并等待,或者轮训去查询IO操作是否完成,等待结果,然后才能执行后续的操作;
- 异步:触发IO操作后,直接返回,继续做后续的操作,IO交给内核来处理,完成后内核通知进程IO完成;
- 阻塞:进程给CPU传达一个任务后,一直等待CPU处理完成,才继续执行后续操作;
- 非阻塞:进程给CPU传达任务后,继续执行后续操作,隔段时间再来查询是否完成。
同步和异步是针对于应用程序和内核的交互而言的,更加关注通知的方式,关注的是程序与内核的协作关系;
阻塞和非阻塞更关注的是单个进程内部的执行状态,粒度更细,更微观,进程的阻塞是进程自身的一种主动行为。
阻塞IO:用户发起读,没数据准备好就阻塞在等待数据阶段
非阻塞IO:用户发起读操作,没准备好久立刻返回error,用户需要不断地主动询问数据准备好了没
**I/O多路复用:select,poll,epoll会不断轮询锁负责的所有socket,当某个socket有数据到达,就通知用户进程,特点是一个进程可以同时等待多个文件描述符
本质上都是同步IO,select,poll轮询,epoll:
- 监视的描述符数量不受限制
- 通过每个fd定义的回调函数来实现的
如果没有大量的idle-connection,epoll并不会比select/poll高很多
异步IO: 用户发起读操作后立刻就去干其他事情,内核等待数据完成,将数据拷贝到用户内存,完成后通知用户
信号驱动I/O:“半异步”,非阻塞模式是应用不断发起read调用查询数据到了内核没有,而信号驱动把这个过程异步了,应用发起read调用时注册了一个信号处理函数,其实是个回调函数,数据到了内核后,内核触发这个回调函数,应用在回调函数里再发起一次read调用去读内核的数据。 所以是半异步。
mySQL 插入缓冲,双写缓冲
- Insert Buffer:一般情况下由于聚集索引的有序性,不需要随机读取页中的数据,因为此类的顺序插入速度是非常快的。很多时候我们的表还会有很多非聚集索引,可非聚集索引插入的离散性导致了插入性能的下降 .Insert Buffer到底是个什么?就是用于提升非聚集索引页的插入性能的,其数据结构类似于数据页的一个B+树,物理存储在共享表空间ibdata1中 。
Insert Buffer的使用要求:1.索引是非聚集索引,2.索引不是唯一(unique)的 - Double write buffer:因为数据库使用的页(page,默认16KB)大小和操作系统对磁盘的操作页(page,默认4KB)不一样,当提交了一个页需要刷新到磁盘,会有
多次IO, 此时刷了前面的8k时异常发生宕机。在系统恢复正常后,如果没有double write机制,此时数据库磁盘内的数据页已损坏,无法使用redo log进行恢复。
如果有double write buffer,会检查double writer的数据的完整性,如果不完整直接丢弃double write buffer内容,重新执行那条redo log,如果double
write buffer的数据是完整的,用double writer buffer的数据更新该数据页,跳过该redo log。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗