DBMS 中的饥饿

2025年7月1日 | 阅读 8 分钟

引言

数据库系统中,确保每个事务都能公平地访问资源对于平稳均衡的性能至关重要。然而,在高度并发的环境中,一些事务可能会比其他事务等待更长时间,这是由于持续的资源竞争。当某些事务被反复忽视而偏向其他事务时,尤其是那些优先级较高或数量庞大的事务,就会出现这个问题。随着时间的推移,所有这些被忽视的事务可能会面临过度的延迟,无法有效地取得进展。

这种延迟不是由错误或死锁引起的,而是由调度策略或糟糕的资源管理引起的。例如,一个请求锁的事务可能会因为其他事务不断地先获取该锁而一直被推迟。如果没有适当的控制,这会严重影响系统性能和公平性。在数据库管理系统(DBMS)中,必须小心处理这种情况,以避免不公平和系统效率低下。为了做到这一点,它们实现了各种技术,例如老化、超时策略和公平调度,这些技术将在本文后面讨论。

这些策略确保每个事务最终都能获得所需的关注和资源,有助于维护系统的整体稳定性和响应能力。

数据库管理系统(DBMS)中的“饥饿”是什么意思?

在相应的数据库管理系统(DBMS)中,饥饿主要指的是一个事务被持续拒绝访问资源(例如锁),而无法继续执行的情况。当系统的资源分配策略偏向其他事务时,就会遇到这种情况,从而导致等待的事务被无限期地推迟。

Starvation in DBMS

饥饿通常发生在存在各种并发事务的环境中,其中多个事务争夺有限的资源。如果调度机制不公平,或者高优先级事务总是被优先处理,那么低优先级事务可能永远无法获得执行的机会。

饥饿的原因

  • 如果锁定资源的等待系统不公平,人们可能会挨饿。(优先级队列)
  • 选择受害者(同一事务反复被选为受害者)
  • 资源泄露。
  • 通过拒绝服务攻击。

通过示例来说明饥饿的最佳方法

假设有三个事务 T1、T2 和 T3 在数据库中争夺数据项“I”的锁。现在想象 T1 从调度器那里获得了锁(可能是由于优先级),而另外两个事务仍在等待锁。一旦 T1 完成运行,事务 T4 就会加入并请求对数据项 I 的锁。现在 T4 已获得锁,T2、T3 和调度器必须再次等待。如果其他事务不断地请求锁并迫使 T2 和 T3 等待很长时间,T2 和 T3 可能会遭受饥饿。

防止饥饿

  • 饥饿问题的解决方案:当一个事务必须无限期地等待时,它就会陷入饥饿。在这种情况下,我们可以提高相关事务或事务的优先级。这种方法的缺点是,在最高优先级事务到达并完成之前,其他事务可能需要等待更长时间。
  • 修改受害者选择算法:如果一个事务多次被选中,可以通过降低其相对于其他事务的优先级来修改算法。
  • 先到先服务方法:事务可以使用公平调度技术(FCFS)按照请求锁的顺序获得对某个项目的锁。
  • 受伤等待和等待死亡策略:这些是基于时间戳使用事务排序系统的技术。

数据库管理系统(DBMS)中的饥饿是指事务或进程由于无法访问其前进所需的资源而反复延迟或停滞。当其他事务或进程优先于正在饥饿的事务或进程时,可能会发生这种情况。

在 DBMS 中,多个事务或进程通常共享锁、内存和 CPU 时间等资源。如果某些事务或进程优先于其他事务或进程,则可能会出现一个或多个事务或进程的饥饿情况。

例如,如果一个事务正在等待另一个事务持有的锁,如果第二个事务永远不释放锁,第一个事务可能会无限期地停滞。如果初始事务持续停滞并且无法继续,这可能会导致饥饿。

DBMS 通常采用各种策略来防止或减轻饥饿,包括

  • DBMS 可以使用资源分配策略来公平地分配资源,确保任何事务或进程都不会被常规性地优先于其他事务或进程。
  • DBMS 可以使用考虑事务或进程优先级的调度算法,确保高优先级事务或进程在低优先级事务或进程之前完成。这称为基于优先级的调度。
  • 超时机制:如果事务等待资源的时间过长,在这种情况下,系统可能会触发超时。然后,该事务将被回滚或重试,或者其请求将被优先处理,这有助于打破长时间等待并防止无限期延迟。
  • 资源管理:为了防止任何一个事务或进程垄断资源并防止饥饿,DBMS 还可以采用资源配额和限制等策略。

数据库管理系统是用于快速、可靠和轻松处理数据的系统软件。它适用于

  • 构建数据库。
  • 从数据库中检索信息。
  • 更新数据库。
  • 维护数据库。

它为我们提供了各种特性,并且与传统文件系统相比具有一些优点,如下所示

1) 查询处理和对象管理:在传统文件系统中,我们无法以对象的形式存储数据。现实世界中使用的应用程序将数据保存为对象而不是文件。为了以便以后使用,文件系统中的一些应用程序软件会将文件中保存的数据转换为对象。

使用数据库管理系统,我们可以直接将数据存储为对象。文件系统需要应用程序级别的代码来管理、存储和浏览数据,而数据库管理系统(DBMS)允许我们查询数据库。

2) 管理冗余和一致性:冗余是重复使用相同数据的实践。虽然在文件系统中可能多次保存相同的数据,但数据库系统提供了冗余管理。例如,如果一名学生在同一所学校学习两个不同的教育项目,例如工程学和历史学,那么他的信息(如电话号码和地址)可能会被记录多次,一次在工程部门,一次在历史部门。因此,这会延长访问和存储数据所需的时间。此外,这可能导致两个位置的数据状态不一致。为了防止重复和冗余,DBMS 使用数据规范化

3) 高效的内存管理和索引:DBMS 使复杂的内存管理更容易处理。在文件系统中,文件是按顺序索引的,而不是按对象索引,因此查询操作需要对整个文件进行扫描,而在 DBMS 中,对象索引是使用基于数据的任何属性或数据属性的数据库设计快速进行的。这有助于根据索引属性快速检索数据。

4) 事务管理和并发控制:许多应用程序提供同时数据访问。因此,在使用文件时可能会出现数据不一致的情况。考虑两个取款事务 X 和 Y,从起始余额为 1000 的账户 A 中分别提取 100 和 200。当多个事务同时发生时,账户可能会被不同事务以各种方式更新。X 读取 1000,借记 100,将账户 A 更新为 900,而 Y 也读取 1000,借记 200,将 A 更新为 800。在这两种情况下,账户 A 都包含不正确的信息。因此,数据不一致。DBMS 提供了处理此类数据不一致的方法,同时允许用户同时访问数据。

5) 访问控制和数据获取的简便性:DBMS 可以提供对多个用户的访问,并选择他们可以访问数据库的哪些部分以及多少数据,从而消除冗余。否则,文件系统要求为每个用户创建单独的文件,其中详细说明了每个用户可以访问的数据量。此外,如果用户想要提取某些数据,则在文件系统的情况下,他需要一个代码/应用程序来完成该任务,例如,假设经理想要一份工资超过 X 的所有员工列表。如果数据保存在文件中,那么我们就需要为此构建业务逻辑。

DBMS 用于防止或减轻饥饿的技术

  1. 老化(优先级提升):老化是一种常见的技术,等待事务的优先级会随着等待时间的增加而逐渐提高。并希望这能确保即使是低优先级任务也能最终获得执行机会,从而防止它们被高优先级任务饿死。
  2. 公平调度:DBMS 通常使用公平调度算法,如先到先服务(FCFS)轮转法,这些算法按事务到达的顺序处理它们,或者通过简单地轮流执行。这些方法确保每个事务都能获得公平的 CPU 或资源时间,从而有效地降低饥饿的风险。
  3. 超时机制:如果一个事务等待资源的时间过长,在这种情况下,系统可能会触发超时。然后,该事务将被回滚或重试,或者其请求将被优先处理,这有助于打破长时间等待并防止无限期延迟。
  4. 资源预留:一些 DBMS 通常允许提前预留某些资源,特别是对于关键事务。这可以防止高优先级或频繁被阻塞的事务被永久延迟。
  5. 死锁检测及其预防:虽然死锁与饥饿完全不同,但避免死锁的策略(如等待-死亡或受伤-等待方案)也有助于通过有效地管理事务如何等待资源来降低饥饿风险。

常见问题解答

关于数据库管理系统中饥饿使用的各种常见问题如下

问题 1:资源分配策略在防止饥饿方面起什么作用?

答案:资源分配策略主要通过使用分时或限制单个事务可以持有的资源数量等策略,帮助确保资源在所有事务之间公平分配,所有这些策略都可以防止任何一个事务垄断资源,并确保所有事务最终都能得到相应处理。

问题 2:调度算法如何影响数据库管理系统中的饥饿?

答案:调度算法通常有效决定事务访问资源的顺序。如果所选算法集倾向于高优先级任务,则低优先级任务可能会经历饥饿。FCFS 或轮转法等公平算法可确保公平访问,从而有效地降低饥饿的风险。

结论

DBMS 中的饥饿主要发生在某些事务被无休止地延迟而其他事务被反复执行时。这是由于不公平的调度或优先级规则造成的。它还会降低系统性能和公平性。老化、轮转调度或动态优先级等技术有助于确保每个事务最终都能得到处理,从而保持系统的平衡和效率。