返回首页

gbase数据、南大通用产品文档:GBase8s虚拟处理器如何为线程提供服务

更新日期:2024年09月11日

在给定的时间中,虚拟处理器只可运行一个线程。虚拟处理器通过在多个线程之间切换来
并发地为这些线程提供服务。虚拟处理器运行线程直到其中止。当一个线程中止时,虚拟

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 81 -
处理器将切换到下一个已准备好运行的线程。虚拟处理器将继续此过程,并且最后在原始
的线程准备好继续时返回到该线程。有些线程完成了它们的工作,虚拟处理器会启动新线
程来处理新的工作。由于虚拟处理器持续在线程之间切换,它可以使得 CPU 持续处理。
发生处理时的速度使虚拟处理器看上去就像同时在处理多个任务,而实际上也的确如此。
运行多个并发线程需要调度和同步以防一个线程干扰另一个线程的工作。虚拟处理器可以
使用下列结构和方法协调多个线程的并发处理:
• 控制结构
• 上下文切换
• 堆栈
• 队列
• 互斥
这些主题描述虚拟处理器如何使用这些结构和方法。

控制结构
当客户机连接到数据库服务器时,数据库服务器创建会话结构(称为会话控制块)以保存
有关连接和用户的信息。会话在客户机连接到数据库服务器时开始并在连接终止时结束。
接下来,数据库服务器将创建线程结构(该线程结构被称为会话的线程控制块 (TCB)),
并启动主线程(sqlexec)来处理客户机请求。当线程中止,即当它暂停并允许另一个线程
运行时,虚拟处理器将保存有关线程控制块中线程状态的信息。此信息包括系统注册的进
程内容、程序计数器(下一个要执行的指令的地址)以及堆栈指针。此信息组成线程的内
容。
在大多数情况下,数据库服务器将在每个会话中运行一个主线程。然而,在它执行并行处
理的情况下,它将为单台客户机创建多个会话线程以及多个相应的线程控制块。

上下文切换
通过上下文切换,虚拟处理器将从运行一个线程切换到运行另一个线程。当固定的时间量
(时间片)期满时,数据库服务器不会像操作系统对进程那样预占一个正在运行的线程。
而是,线程会在下列点中的一个点上让步:

代码中预先确定的点

当线程在满足某个条件前不再可以执行时
当完成任务所需的处理量会引起其他线程等待一段长度过长的时间时,线程在预先确定的
点中止。用于这些长时间运行的任务的代码包括处理中的策略点上对让步函数的调用。当
线程执行这些任务之一时,它会在遇到让步函数调用时让步。然后,就绪队列中的其他线
程将有机会运行。当下一次轮到原来的线程时,该线程将在对让步函数进行调用后立即重
新在点上执行代码。对中止函数的预先确定的调用将允许数据库服务器在对性能最有利的
点上中断线程。

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 82 -
当线程无法再继续它的任务时,它也会中止直到出现某种条件。例如,当线程等待磁盘
I/O 完成时、当等待来自客户机的数据时或当等待一个锁定或其他资源时,线程中止。
当一个线程中止时,虚拟处理器在线程控制块中保存其上下文。 然后,虚拟处理器将从
一队就绪的线程中选择要运行的新线程、从该新线程的线程控制块中装入该新线程的上下
文,然后在程序计数器中的新地址处开始执行。下图说明了虚拟处理器如何完成上下文切
换。
图: 上下文切换:虚拟处理器如何从一个线程切换到另一个线程



堆栈
数据库服务器将在共享内存的虚拟部分中分配一个区域以便为线程所执行的函数存储非共
享数据。此区域称为堆栈。有关如何设置堆栈大小的信息,请参阅堆栈。
堆栈使虚拟处理器能够保护线程中非共享数据免遭并发执行相同代码的其他线程的覆盖。
例如,如果几台客户机应用程序并发地执行 SELECT 语句,那么每台客户机的会话线程
将在代码中执行许多同样的函数。如果线程没有专用堆栈,那么一个线程可能会覆盖属于
函数中另一个线程的本地数据。
当虚拟处理器切换到新的线程时,它会为该线程从线程控制块中装入堆栈指针。堆栈指针
将存储堆栈的开始地址。 然后,虚拟处理器可以将偏移量指定到在堆栈中存取数据的开
始地址。该图说明了虚拟处理器如何使用堆栈来为会话线程分离非共享数据。
图: 虚拟处理器为每个用户分离非共享数据


GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 83 -


队列
数据库服务器使用三种类型的队列来调度多个并发运行的线程的处理。
相同类的虚拟处理器将共享队列。有些时候,这将使线程能够在需要时从类中的一个虚拟
处理器迁移到另一个虚拟处理器。

就绪队列
就绪队列将在当前的(正在运行的)线程中止时容纳已准备好运行的线程。 当一个线程
让步时,虚拟处理器将从就绪队列中选取下一个具有适当优先级的线程。在该队列中,虚
拟处理器处理在先进先出 (FIFO) 基础上具有相同优先级的线程。
在多处理器计算机上,如果您注意到线程正在一类的虚拟处理器的就绪队列中堆积(表示
工作堆积的速度比虚拟处理器可以处理它的速度块),那么您可以启动该类的附加虚拟处
理器以分发处理负载。有关如何监视就绪队列的信息,请参阅监视虚拟处理器。有关如何
在数据库服务器处于联机方式时添加虚拟处理器的信息,请参阅在联机方式下添加虚拟处
理器。

睡眠队列
睡眠队列将容纳特定的时间中没有工作要做的线程的上下文。使线程在指定的时间段或永
久睡眠。
虚拟处理器的管理类 (ADM) 运行系统计时器和特殊的实用程序线程。此类中的虚拟处理
器将自动创建并运行。没有配置参数会影响此类虚拟处理器。
ADM 虚拟处理器唤醒已休眠了指定时间段的线程。运行在 ADM 虚拟处理器中的线程以
一秒为时间间隔来检查正在休眠的线程。 如果休眠的线程已休眠了指定时间段,那么
ADM 虚拟处理器将其移动到适当的就绪队列。正在睡眠指定时间段的线程也可以显式地
由另一个线程唤醒。
永久睡眠的线程会在其有更多的工作要做时被唤醒。例如,当 CPU 虚拟处理器上运行的
线程必须访问磁盘时,该线程会发出 I/O 请求,将其自身置于 CPU 虚拟处理器的休眠队

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 84 -
列中,然后停止。当 I/O 线程通知 CPU 虚拟处理器 I/O 已经完成时,CPU 虚拟处理器
调度原来的线程通过将该线程从休眠队列移动到就绪队列来继续处理。下图说明了数据库
服务器线程如何排队执行数据库 I/O。
图: 数据库服务器线程如何排队执行数据库 I/O



等待队列
等待队列保存了必须等待特定事件才能继续运行的线程。例如,等待队列将协调线程对共
享数据的访问。当用户线程尝试获取逻辑日志锁存器但发现锁存器由另一个用户所持有
时,遭拒绝的线程会将其自身放在逻辑日志等待队列中。当拥有锁的线程准备好释放锁存
器时,它会检查等待的线程,如果线程正在等待,它将唤醒等待队列中的下一个线程。

互斥
互斥(互相排斥),又称为锁存器,是数据库服务器用于同步多个线程对共享资源的访问
的一种锁存机制。互斥与信号相似,一些操作系统使用后者来控制多个进程对共享数据的
访问。然而,互斥比信号允许更高的并行度。
互斥是与共享资源(如缓冲区)关联的变量。线程必须在可以访问资源前获取资源的互
斥。其他线程将不能访问该资源直到所有者将其释放。在互斥可用后,线程通过将其状态
设置为使用状态而获得互斥。互斥的同步确保一次只有一个线程写入共享内存的区域。
有关监视互斥的信息,请参阅监视共享内存概要文件和锁存器。


GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
VI

gbase_row_seek .............................. 41



GBase 8a 程序员手册C API 篇
南大通用数据技术股份有限公司

III