处理机调度实验总结_竞争感知的锁调度

论文阅读:Contention-Aware Lock Scheduling for Transactional Databases,原文章:

http://www.vldb.org/pvldb/vol11/p648-tian.pdf​www.vldb.org

该文提出了竞争感知的锁调度算法,先上脑图。

a80b03ec253d1cd7c50ef863132e120e.png
脑图-竞争感知的锁调度

问题定义

在数据库中锁协议主要有:

  • 锁的两个类型,即:共享锁和排他锁;
  • 两阶段封锁;

在数据库中一般会采用了锁依赖图(Dependency Graph)进行管理,如做死锁检查等,依赖图中点和边如下:

  • 锁依赖图中的节点有两类:事务和数据元素;
  • 边也有两个类:从事务到元素的边表示该事务占有了该元素的(共享/排他)锁;从元素到事务的边表示,该元素将要被该事务申请,但是还没有占有。

锁调度(Lock Scheduling是指在数据库中当一个锁资源被释放/或者一个事务申请锁时,从等待队列中选择一个事务执行的选择过程,即调度过程。最常用的First In First Out(FIFO)策略,或者基于FIFO的一些变形。

该文提出了一个新的锁调度策略,即竞争感知的锁调度。

竞争感知的锁调度

该调度算法已经在MySQL 8.0.3+开始作为缺省的调度算法了。

该文章主要列举了如下可参考使用的竞争感知可选项,即把这些作为调度的感知值,但在最后实验时主要是采用bLDFS进行实验的。具体如下:

Most Locks First(MLF,最多锁优先)

方法如下:从所有依赖于刚释放元素的事务中,选择使用到对象锁最多中的一个(Number of locks held)。在下图中,当o1对象锁被释放后,会选择t1作为下一个事务;

485283310a2407b39cbf256b36392b38.png
MLF

Most Blocking Locks First(MBLF,最多阻塞锁优先)

MLF会把没被其他线程使用的对象锁也算进来了,造成后续其他事务被阻塞。例如,上一个例子中,会延迟t2后的三个事务。为了解决这个问题,可以采用MBLF,即只计算元素锁中被其他事务依赖的个数(Number of locks that block other transaction),在上一个例子中,则会优先执行事务t2。类似地,在下面的例子中,会优先执行t2事务。

1ef50f0d28ebdaa65e77def3ef7dc61e.png
MBLF

Deepest Dependency First(DDF,最深依赖优先)

但是在上一个例子中,MBLF又会把事务t3之后的事务都阻塞,导致深度比较大的事务,要等待很久。为了解决这个问题,可以采用DDF,即基于深度依赖优先的调度策略。如果采用该策略,对于上个例子中,则会优先执行事务t1。

类似地,对于下一个例子,则会优先执行事务t1,但是如果先执行t2,其实是可以提前增加并法度的。

dac1f30e0e4c10b7a354458f47a6bdb4.png
DDF

Largest Dependency Set First(LDFS,最大依赖集优先)

为了解决以上问题,终于到了本文的核心方法,即LDFS,即基于依赖集的大小的方法,如下图所示。t1事务被五个事务(含自身)依赖,t2被四个事务依赖,因此会优先调度事务t1。

00323692da967e12cd8abaa4d38eccfe.png
LDFS

对于不同的锁(排他锁和共享锁),LDFS会把所有共享锁作为一个集合,然后做并集运算,得到依赖对象o的共享锁事务集合的个数。如果该数值比排他锁中最大依赖事务集合大小还要小,则优先执行共享锁的所有事务,即把对象o共享锁给这些事务;否则,执行排他锁中依赖集最大的一个事务。具体算法如下:

a4306fa80b93bf45eb3f3f43fd82cc6a.png
LDSF算法

b(atched) LDSF(批量LDFS)

LDFS算法存在一个问题,即当共享锁的事务集合太大时,那么就会造成其他排他锁事务等待,而且会依赖于最后一个共享锁的事务执行完成。

b3ba2f95bba92e7e9a595f161b10f672.png
引理4

另外,基于引理4,对于事务个数k,当k越大时,这些事务中最长事务的平均时长是呈递增趋势的。为了解决以上问题,作者又提出了一个分批处理的LDFS。即,对于共享锁的事务,拆分集合,并选择满足第5个操作的事务集合。

12fa9784f6a25753de814ece650bb7f7.png
bLDFS算法

其中,f(k)为延迟因子(delay factor)。

总结

本文提出了竞争感知的锁调度算法,该算法在测试结果中有明显的优势,而且也在MySQL 8.0.3+中实际应用,该算法比FIFO算法还是有较大的优势的。

另外,作者在实现时,也介绍了如何避免饿死(Starvation Avoidance)的情况,为了解决这个问题,在实现上,在每一个锁等待队列中加一个barrier,所有在这个barrier之后加入的不参与调度计算。这就可以有效地避免饿死的情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 处理机调度实验是计算机操作系统课程中的一个实验项目。在这个实验中,我们需要实现一个简单的处理机调度算法,来合理地分配和利用计算机的处理资源。 首先,我们需要明确处理机调度的目标,即提高处理机的利用率和系统的响应能力。为了实现这个目标,我们可以采用多种调度算法。 一种常见的调度算法是先来先服务(FCFS)算法。这种算法按照作业到达的先后顺序来调度处理机,即先到达的作业先执行。这种算法简单直观,但可能会导致后到达的作业等待时间过长,不利于系统的响应能力。 另一种调度算法是短作业优先(SJF)算法。这种算法根据作业的执行时间来进行调度,即执行时间较短的作业优先执行。这种算法能够减少作业的等待时间,提高系统的响应能力。 还有一种调度算法是时间片轮转(RR)算法。这种算法将处理机分为多个时间片,每个作业在一个时间片内得到执行。当时间片用完后,作业被挂起,等待下一个时间片再次执行。这种算法可以平衡不同作业之间的执行时间,提高系统的公平性。 在处理机调度实验中,我们可以选择以上任意一种或者多种调度算法来进行实现和测试。我们需要自己编写代码,模拟作业的到达和执行过程,并统计各个作业的等待时间和系统的响应时间。 通过处理机调度实验,我们可以更好地理解和掌握不同的调度算法,了解它们的优缺点,进一步提高计算机操作系统的设计和优化能力。 ### 回答2: 处理机调度实验,即CDSN(Central Dispatching System for Network)是一种模拟计算机系统的调度算法实验。在这个实验中,我们将模拟处理机的调度过程,根据给定的任务列表和资源限制,决定任务的执行顺序,以提高系统的吞吐量和性能。 CDSN实验中,我们需要设计一个调度算法,使得任务能够以最优的方式执行。首先,我们需要了解每个任务的属性和优先级,以便根据这些指标进行调度决策。之后,我们需要根据任务的优先级和处理机的资源限制来制定调度策略。例如,我们可以采用先来先服务(FCFS)的方式,根据任务的提交顺序进行调度。或者,我们可以根据任务的优先级进行调度,优先执行优先级高的任务。 除了任务的调度,CDSN实验还需要考虑系统的负载均衡。负载均衡是指将任务合理地分配到不同的处理机上,以使得每个处理机的负载相对均衡。为了实现负载均衡,我们可以采用动态调度算法,根据处理机的当前负载情况,将任务动态分配到负载相对较低的处理机上。这样可以提高系统的整体性能和效率。 CDSN实验还需要考虑各种情况下的任务调度策略。例如,当有新任务进入系统时,我们需要决定将它放在哪个处理机上执行。而当一个任务执行完成后,我们需要选择下一个要执行的任务。针对这些情况,我们可以采用优先级调度算法、循环调度算法等进行任务调度。 总之,处理机调度实验CDSN是一个模拟计算机系统调度算法的实验。通过合理的调度策略和负载均衡机制,可以提高系统的整体性能和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值