一、计算机网络
1.1 三次握手&四次挥手
客户端——发送带有SYN标志的数据包——服务端 一次握手 Client进入syn_sent状态
服务端——发送带有SYN/ACK标志的数据包——客户端 二次握手 服务端进入syn_rcvd
客户端——发送带有ACK标志的数据包——服务端 三次握手 连接就进入Established状态
为什么一定要三次
假设A发送消息给B AB两端都需要确保自己的发送能力&接受能力没问题
第一次 A-》B
A视角
A接收能力 | A发送能力 | B接收能力 | B发送能力 |
---|---|---|---|
未知 | 未知 | 未知 | 未知 |
B视角
A接收能力 | A发送能力 | B接收能力 | B发送能力 |
---|---|---|---|
未知 | 没问题 | 没问题 | 未知 |
第二次 B-》A
A视角
A接收能力 | A发送能力 | B接收能力 | B发送能力 |
---|---|---|---|
没问题 | 没问题 | 没问题 | 没问题 |
B视角
A接收能力 | A发送能力 | B接收能力 | B发送能力 |
---|---|---|---|
未知 | 没问题 | 没问题 | 未知 |
第三次 A-》B
A视角
A接收能力 | A发送能力 | B接收能力 | B发送能力 |
---|---|---|---|
没问题 | 没问题 | 没问题 | 没问题 |
B视角
A接收能力 | A发送能力 | B接收能力 | B发送能力 |
---|---|---|---|
没问题 | 没问题 | 没问题 | 没问题 |
1.1.1 四次挥手
由于TCP半关闭特性(half-close),TCP可以在连接的一端结束他的消息发送后还能接受另一端的消息。所以AB两端都需要告诉对方我这里消息发送结束了,另一方都需要确认。
其中timeWait是为了避免消息发送结束请求超时,在重新建立新的连接后到达导致的数据问题。也可以理解为保存上下文,如果消息发送结束请求发送完成后并没有受到确认消息,而上下文信息已经被删掉的话就无法重试了。
TIME_WAIT时间会被设定为2MSL,MSL是报文最大生存时间。
可以参考:TCP四次挥手详解(含常见面试题)
1.2 网络架构
OSI七层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
TCP/IP五层:物理层、数据链路层、网络层、传输层、应用层
应用层:HTTP、SMTP、DNS、FTP
传输层:TCP 、UDP
网络层:ICMP 、IP、路由器、防火墙
数据链路层:网卡、网桥、交换机
物理层:中继器、集线器
基于TCP的协议:HTTP、FTP、SMTP
基于UDP的协议:RIP、DNS、SNMP
1.2.1 TCP滑动窗口 & 拥塞控制 & 粘包原因和解决方法
https://zhuanlan.zhihu.com/p/650019037
1.2.2http&https
https结局了http的不安全的缺陷 在tcp和http之间加入了ssl/tls协议 在三次握手的基础上加入了ssl/tls协议握手过程后方可进行加密的数据传输
https用了对称加密 & 非对称加密 后者用于交换密钥 后者用于加密铭文数据
https用了摘要算法 保障数据不被更改,根据内容生成摘要
https利用了数字证书 借用第三方结构CA 证书可信公钥就是可信的
http/2 相较之前做了头部压缩 消除了重复的部分 明文报文改成二进制 增加了传输效率 传输模式不在按照顺序发送,按照数据流模式,每个数据流有一个独一无二的编号。多路复用 并发发多个请求不需要按照顺序来 防止头部阻塞问题
1.2.3 udp
http/3 底层不再使用tcp 而是使用udp
udp的QUIC协议可以实现可靠性传输
QUIC协议
这个需要去看下
二、MYSQL
2.1
三、操作系统
为什么要有用户态和内核态
由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络
用户态切换到内核态的3种方式
a. 系统调用
主动调用,系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中
b. 异常
当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,比如缺页异常,这时会触发切换内核态处
理异常。
c. 外围设备的中断
当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会由用户态到内核态的切换。
操作系统的进程空间
页式管理、段式管理、段页式管理
页式管理
在页式存储管理中,将程序的逻辑地址划分为固定大小的页(page),而物理内存划分为同样大小的页框,程序加 载时,可以将任意一页放入内存中任意一个页框,这些页框不必连续,从而实现了离散分离。页式存储管理的优点 是:没有外碎片(因为页的大小固定),但会产生内碎片(一个页可能填充不满)
优点:没有外碎片,每个内碎片不超过页的大小。
缺点:程序全部装入内存,要求有相应的硬件支持,如地址变换机构缺页中断的产生和选择淘汰页面等都要求有相应的硬件支持。增加了机器成本和系统开销
段式管理
将程序的地址空间划分为若干段(segment),如代码段,数据段,堆栈段;这样每个进程有一个二维地址空间, 相互独立,互不干扰。段式管理的优点是:没有内碎片(因为段大小可变,改变段大小来消除内碎片)。但段换入 换出时,会产生外碎片(比如4k的段换5k的段,会产生1k的外碎片)(分配的空间用完了 但是每个页之间的空隙)
优点:可以分别编写和编译,可以针对不同类型的段采取不同的保护,可以按段为单位来进行共享,包括通过动态链接进行代码共享。
缺点:会产生碎片。
段页式管理
段?式管理机制结合了段式管理和?式管理的优点。简单来说段?式管理机制就是把主存先分成若干段,每个段又 分成若干?,也就是说 段?式管理机制 中段与段之间以及段的内部的都是离散的
优缺点
https://zhuanlan.zhihu.com/p/512331932
页面置换算法
先进先出FIFO
缺点:没有考虑到实际的页面使用频率,性能差、与通常页面使用的规则不符合,实际应用较少
最近最久未使用LRU
原理:选择最近且最久未使用的页面进行淘汰
优点:考虑到了程序访问的时间局部性,有较好的性能,实际应用也比较多
缺点:没有合适的算法,只有适合的算法,lFU、random都可以
最佳置换算法OPT
原理:每次选择当前物理块中的页面在未来长时间不被访问的或未来不再使用的页面进行淘汰
优点:具有较好的性能,可以保证获得最低的缺页率
缺点:过于理想化,但是实际上无法实现(没办法预知未来的页面)
死锁
死锁的条件
互斥条件:进程对所分配到的资源不允许其他进程访问,若其他进程访问该资源,只能等待至占有该资源的进程释
放该资源;
请求与保持条件:进程获得一定的资源后,又对其他资源发出请求,阻塞过程中不会释放自己已经占有的资源
非剥夺条件:进程已获得的资源,在未完成使用之前,不可被剥夺,只能在使用后自己释放
循环等待条件:系统中若干进程组成环路,环路中每个进程都在等待相邻进程占用的资源
四、Redis
写时复制 CopyOnWrite
https://www.cnblogs.com/jelly12345/p/15223184.html
当父进程或者子进程对共享的内存进行修改时,共享的内存才会以页为单位进行拷贝,父进程会保留原有的物理空间,而子进程会使用拷贝后的新物理空间;
面向对象三大特性
特性:封装、继承、多态
封装:对抽象的事物抽象化成一个对象,并对其对象的属性私有化,同时提供一些能被外界访问属性的方法;
继承:子类扩展新的数据域或功能,并复用父类的属性与功能,单继承,多实现;
多态:通过继承(多个子类对同一方法的重写)、也可以通过接口(实现接口并覆盖接口)
CopyOnWriteArrayList
https://www.zhihu.com/question/438808963/answer/1673676355
synchronize & ReentrantLock
synchronize 效率低是因为依赖于底层的操作系统的MutexLoCK 会从用户态转核心态 同时锁的粒度 还有并发性受限
ReentrantLock
IOC容器初始化加载Bean流程:
四个阶段
? 实例化 Instantiation
? 属性赋值 Populate
? 初始化 Initialization
? 销毁 Destruction
完整流程
- 实例化一个Bean--也就是我们常说的new;
- 按照Spring上下文对实例化的Bean进行配置--也就是IOC注入;
- 如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String)方法,也就是根据就是Spring配置文件中Bean的id和name进行传递
- 如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现setBeanFactory(BeanFactory)也就是Spring配置文件配置的Spring工厂自身进行传递;
- 如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(Application-Context)方法,和4传递的信息一样但是因为ApplicationContext是BeanFactory的子接口,所以更加灵活
- 如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization()方法,Bean PostProcessor经常被用作是Bean内容的更改,由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术
- 如果Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法。
- 如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessAfterInitialization(),打印日志或者三级缓存技术里面的bean升级
- 以上工作完成以后就可以应用这个Bean了,那这个Bean是一个Singleton的,所以一般情况下我们调用同一个id的Bean会是在内容地址相同的实例,当然在Spring配置文件中也可以配置非Singleton,这里我们不做赘述。
- 当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,或者根据spring配置的destroy-method属性,调用实现的destroy()方法
循环依赖
#######三级缓存解决循环依赖问题
#######懒加载@Lazy解决循环依赖问题
Spring启动的时候会把所有bean信息(包括XML和注解)解析转化成Spring能够识别的BeanDefinition并存到 Hashmap里供下面的初始化时用,然后对每个 BeanDefinition 进行处理。普通 Bean 的初始化是在容器启动初始 化阶段执行的,而被lazy-init=true修饰的 bean 则是在从容器里第一次进行context.getBean() 时进行触发。
红黑树
其他
CI框架
Nginx内存模型
io磁盘寻道
索引原理 &聚集、非聚集
Mysql性能优化
不利用外键搜索 & 索引失效的情况
MYSQL safePoint
一致性hash算法
concurrentHashMap
HashMap为什么线程不安全
Mybatis和Hibernate区别
Java内存模型 主存&本地内存
Java时间监听机制& 源码解析
reentrantLock
Spring源码
核心类
- defaultListableBeanFactory
- abstractautowireCapableBeanFactory
- GenericBeanDefinition