0%

线程池原理与实现

B站讲解视频:线程池原理与实现

线程池

线程池是什么

线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。

线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。

Read more »

CPU调度策略

任务调度策略的三个基本准则

  • 任务周转时间:从新建到完成的时间
  • 任务响应时间:从提交请求到首次响应的时间(前台任务关心)
  • 系统吞吐量:一段时间内系统能完成的任务数

调度算法

  1. 先来先服务

  2. 最短作业优先调度:不可抢占,平均周转时间短(作业运行时间只能近似给出)

  3. 最短剩余时间有限:最短作业优先的可抢占版本

  4. 时间片轮转调度:保证响应时间

    时间片设得太短会导致过多的进程切换,降低了CPU效率设得太长会引起对短作业的交互请求的响应时间变长

  1. 多级反馈队列调度:动态调整任务类型(近期多IO可能为前台任务,无IO时间片结束未完成可能为后台大任务)

    运行流程

    1. 设置多级就绪队列,各级队列优先级从高到低,时间片从小到大
    2. 新进程到达时先进入第1级队列,按FCFS原则排队等待被分配时间片。 若用完时间片进程还未结束,则进程进入下一级队列队尾。如果此时已经是在最下级的队列,则重新放回最下级队列队尾
    3. 只有第k级队列为空时,才会为k+1级队头的进程分配时间片

调度算法比较

Read more »

视图(view)

概念

在MySQL中,视图是一种虚拟表,它是由一个或多个基本表的行或列组成的。视图并不实际存储数据,而是根据定义的 select 语句动态生成结果集。视图可以简化复杂的查询操作,提高查询效率,同时也可以保护数据的安全性,隐藏敏感数据。

执行过程

执行过程类似于 select 语句,流程如下

  1. 视图展开(预处理器):将视图名转化为 select 语句
  2. 查询优化(优化器):选择使用索引或者连接算法优化查询效率
  3. 执行查询(执行器,存储引擎):生成优化后的执行计划后,数据库的 存储引擎会根据这个计划执行查询。执行过程中,MySQL 会从底层表中读取数据,并按需执行连接、过滤、排序等操作,最终返回查询结果

连接(join)

简单嵌套循环连接

执行流程

对于左表的每一条记录,扫描右表的所有记录,找到匹配的记录

Read more »

为什么要有缓存机制

MySQL 的数据是存储在磁盘里的,但每次访问磁盘开销过大。为此,Innodb 存储引擎设计了一个缓冲池(Buffer Pool),当数据从磁盘中取出后,缓存到Buffer Pool中,下次查询同样的数据的时候,直接从内存中读取,来提高数据库的读写性能。

除了数据的读取保存在缓存中,对数据的修改也不是立即写入磁盘,而是先写到缓存后择机刷盘。所以 Buffer Pool 中包含脏数据(数据页中)和 undo 页

如何提高缓存命中率

基本实现

使用LRU(Least recently used)算法

该算法的思路是,链表头部的节点是最近使用的,而链表末尾的节点是最久没被使用的。那么,当空间不够了,就淘汰最久没被使用的节点,从而腾出空间。

简单的 LRU 算法的实现思路是这样的:

Read more »

数据库运行期间会发生哪些故障(问题)

事务故障

事务故障指事务未运行到既定的终点(没有commit或显式的rollback),例如对于支付系统若付款失败则需要回滚支付的操作,确保事务的一致性

系统故障

系统故障指需要即时重启系统而造成的数据库故障,现象是修改内存中的修改未写到磁盘,写入磁盘的数据未必是完成的事务

介质故障

介质故障指磁盘损坏造成的故障,需要全量迁移数据库数据

MySQL日志(解决方案)

undo log

概念

Read more »

执行select的过程

连接器

客户端通过TCP三次握手与数据库建立连接

查询缓存

如果 SQL 是查询语句(select 语句),MySQL 就会先去查询缓存( Query Cache )里查找缓存数据,看看之前有没有执行过这一条命令,这个查询缓存是以 key-value 形式保存在内存中的,key 为 SQL 查询语句,value 为 SQL 语句查询的结果。

解析SQL

解析器完成词法分析(根据输入的字符串识别出关键字)和语法分析(判断语句语法)

执行SQL

预处理器

Read more »

设计原则

依赖倒置原则(DIP)

高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖 于抽象(稳定)

抽象(稳定)不应该依赖于实现细节(变化),实现细节应该依赖于 抽象(稳定)

开放封闭原则(OCP)

对扩展开放,对更改封闭

类模块应该是可扩展的,但是不可修改

模版方法(Template Method)

模式动机

一些功能在底层开发模块时不知具体实现,而需要在高层模块实现

Read more »

什么问题适合用动态规划(最优子结构)

符合最优子结构的问题适合用动态规划

最优子结构 是指一个问题的最优解可以通过其子问题的最优解构造出来。换句话说,问题的最优解依赖于子问题的最优解。

例如要计算年级的最高分,可通过计算每个班级的最高分之后取最值得到

动态规划算法框架

确定状态和选择

明确当前值需要通过哪些子结构通过哪些选择得到,用以确定dp数组是一维还是二维的

例如对于斐波那契数列只要知道前2项即可,所以是一维的

对于零钱兑换问题,如果target=10,则粗略估计需要知道0-9的最小值(列),而且要对于不同零钱选择(行)计算最值(也可用一维的做,但二维从语意上更明确)

定义dp数组

Read more »

事务并发时遇到的问题

数据完整性方面(不同事务对同一行的读写/写写操作)

问题

不同事务对于同一范围内的数据进行增/删/改时需要锁确保在事务提交前只有一个事务能操作该数据

解决方法

对于要修改的数据加锁(lock)

查询结果方法(幻读现象)

问题

在当前读(区别于使用MVCC中ReadView的快照读)的场景下,在事务内不同时间对同一查询条件得到的查询结果不同

解决方法

Read more »

数据库需要解决的问题(背景)

在转账场景中,A向B转账100元。转账过程需要保证的是要么转账成功,要么转账失败恢复到原始值(原子性 Atomicity);转账前后A与B账号的存款总数不变(一致性 Consistency);转账过程中A与B的其他转账操作不影响当前转账(隔离性 Isolation);转账成功则不可撤回(持久性 Durability)。所以引入事务(Transaction)的概念

事务(解决方案)

特性(ACID)

  1. 原子性(Atomicity):一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节,而且事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样
  2. 一致性(Consistency):是指事务操作前和操作后,数据满足完整性约束,数据库保持一致性状态
  3. 隔离性(Isolation):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致
  4. 持久性(Durability):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失

InnoDB 引擎通过什么技术来保证事务的这四个特性的呢?

  • 持久性是通过 redo log (重做日志)来保证的;
  • 原子性是通过 undo log(回滚日志) 来保证的;
  • 隔离性是通过 MVCC(多版本并发控制) 或锁机制来保证的;
  • 一致性则是通过持久性+原子性+隔离性来保证;

并行事务的问题与解决方案(读的隔离性)

问题

  1. 脏读:如果一个事务「读到」了另一个「未提交事务修改过的数据」,就意味着发生了「脏读」现象
Read more »