什锦地址:https://mp.weixin.qq.com/s/pPao7zkl2yA9Y-iI0L5Jlw

什么是零拷贝?

零拷贝是一种IO操作优化技术,主要是为了计算机执行IO操作时减少CPU读写的上下文切换次数和拷贝时间

一共有几种IO模型?NIO和多路复用的区别?

一共有五种IO模型:

  • 阻塞IO模型
  • 非阻塞IO模型
  • IO多路复用模型
  • IO模型之信号驱动模型
  • IO模型之异步IO(AIO)

    NIO(非阻塞IO)

    NIO存在性能问题,即在应用进程发起请求时如果操作系统内核数据没有准备好,就会轮训发起请求,这导致频繁的系统调用,会消耗大量的CPU资源(可以考虑IO复用模型解决这个问题)

IO多路复用模型

IO多路复用就是摒弃了NIO的轮训策略,只有当内核数据准备就绪时会通知应用进程,这时应用进程才会发起请求。

IO多路复用之select

IO多路复用之epoll

Future实现阻塞等待获取结果的原理?

Future实现了阻塞等待获取结果的方法是 Future.get() 。Future表示一个任务的生命周期。
get方法的源码

  1. public V get() throws InterruptedException, ExecutionException {
  2. int s = state;
  3. //如果状态小于等于 COMPLETING,表示 FutureTask 任务还没有完成, 则调用awaitDone让当前线程等待。
  4. if (s <= COMPLETING)
  5. s = awaitDone(false, 0L);
  6. return report(s);
  7. }
  1. private int awaitDone(boolean timed, long nanos)
  2. throws InterruptedException {
  3. final long deadline = timed ? System.nanoTime() + nanos : 0L;
  4. WaitNode q = null;
  5. boolean queued = false;
  6. for (;;) {
  7. // 如果当前线程是中断标记,则
  8. if (Thread.interrupted()) {
  9. //那么从列表中移除节点 q,并抛出 InterruptedException 异常
  10. removeWaiter(q);
  11. throw new InterruptedException();
  12. }
  13. int s = state;
  14. //如果状态已经完成,表示FutureTask任务已结束
  15. if (s > COMPLETING) {
  16. if (q != null)
  17. q.thread = null;
  18. //返回
  19. return s;
  20. }
  21. // 表示还有一些后序操作没有完成,那么当前线程让出执行权
  22. else if (s == COMPLETING) // cannot time out yet
  23. Thread.yield();
  24. //将当前线程阻塞等待
  25. else if (q == null)
  26. q = new WaitNode();
  27. else if (!queued)
  28. queued = UNSAFE.compareAndSwapObject(this, waitersOffset,
  29. q.next = waiters, q);
  30. //timed 为 true 表示需要设置超时
  31. else if (timed) {
  32. nanos = deadline - System.nanoTime();
  33. if (nanos <= 0L) {
  34. removeWaiter(q);
  35. return state;
  36. }
  37. //让当前线程等待 nanos 时间
  38. LockSupport.parkNanos(this, nanos);
  39. }
  40. else
  41. LockSupport.park(this);
  42. }
  43. }

ReentrantLock和Synchronized的区别?Synchronized的原理?

  • Synchronized依赖于JVM实现;ReentrantLock是基于API实现的
  • Synchronized从引入了偏向锁、轻量级锁(自旋锁)后与ReentrantLock性能偏差变小了
  • Synchronized的加锁和释放是由编译器保证的;ReentrantLock需要手工声明加锁和释放锁
  • Synchronized只能是非公平锁;ReentrantLock可以指定是公平锁和非公平锁
  • Synchronized不可响应中断,一个线程获取不到锁就会一直等着;ReentrantLock可响应中断、可轮回

Synchronized原理: https://www.yuque.com/aishy/lzkgug/bkskpo

[

](https://www.yuque.com/aishy/lzkgug/bkskpo)

什么是AQS?ReentrantLock的实现原理?

AQS是指抽象同步队列。里面包好的要点有:

ReentrantLock的回答要点有:

  • 可重入性
  • 公平锁
  • 非公平锁
  • 结合AQS

乐观锁与悲观锁,你会怎样实现?

乐观锁

即在读操作时不会上锁,只是在更新、插入、删除时才会判断其他线程在这期间有没有对数据进行修改。实现方式:版本号机制、CAS算法

CAS乐观锁实现:

https://www.yuque.com/aishy/lzkgug/egxnzp

悲观锁

悲观锁会在做任何操作的时候都进行上锁,只有持有锁的线程才能进行操作。
具体实现有:

  • MySQL的for update
  • JVM的Synchronized关键字

Paxos协议了解吗?工作流程是怎样的?

可以说说B+树吗?B+树是不是有序的?B+树和B树的主要区别?

首先B+树是有序的

B+树和B树的区别?

  • B树的内部节点以及叶子结点都是保存数据的;而B+树的内部节点只是作为指向数据的索引,并不保存数据,其数据只保存在叶子节点中。(由于内部节点不存储具体数据导致占用的空间变少,所以一次性查找的关键字也变多,相对的IO操作也变少了,所以B+树的查找速度会更快)
  • B+树相邻链表之间是通过指针连起来的,而B树不是(中序遍历)
  • B+树在查找过程中需要通过索引找到叶子节点中的数据才结束;B树在找到具体的值后才结束
  • B+树叶子节点中的关键字为左闭右开,即数据会有重复;而B树的关键字并不会重复(开区间)

TCP的拥塞机制?

拥塞控制是作用于网络的,主要作用是防止过多的数据报注入到网络中,避免出现网络负载过大的情况。解决的问题是:最大化利用网络上瓶颈链路的带宽。
拥塞控制的几种常用算法:

  • 慢启动
  • 拥塞避免
  • 拥塞发生
  • 快速恢复

数据库分库分表的缺点是什么?

  1. 会出现事务问题,由于不是本地事物,所以会出现一致性问题。
  2. 跨节点JOIN的问题:可以分两次查询实现
  3. ID问题:数据库被切分后,不能再依赖数据库自身的主键生成机制
  4. 跨分片的排序分页问题?

分布式事务如何解决?TCC是什么?

分布式事务

是指事物的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上(分布式事务指的就是在分布式系统上的事务,分布式事务主要会导致不同节点数据的一致性问题)。
基本理论:

  • CAP理论
  • BASE理论

CAP理论
  • 一致性:
  • 高可用:
  • 分区容忍:

RabbitMQ如何保证消息的准确性和安全性?