返回首页

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

更新日期:2024年09月11日

在给定的时间中,虚拟处理器只可运行一个线程。虚拟处理器通过在多个线程之间切换来
并发地为这些线程提供服务。虚拟处理器运行线程直到其中止。当一个线程中止时,虚拟
处理器将切换到下一个已准备好运行的线程。虚拟处理器将继续此过程,并且最后在原始
的线程准备好继续时返回到该线程。有些线程完成了它们的工作,虚拟处理器会启动新线

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

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

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

是,线程会在下列点中的一个点上让步:

代码中预先确定的点

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

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 89 -
当一个线程中止时,虚拟处理器在线程控制块中保存其上下文。 然后,虚拟处理器将从一
队就绪的线程中选择要运行的新线程、
从该新线程的线程控制块中装入该新线程的上下文,
然后在程序计数器中的新地址处开始执行。下图说明了虚拟处理器如何完成上下文切换。
图: 上下文切换:虚拟处理器如何从一个线程切换到另一个线程



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


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


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

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

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

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



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

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

使用 DROP SYNONYM 语句注销现有的同义词。
该语句是 SQL ANSI/ISO 标准的扩展。
语法

元素
描述
限制
语法
owner
synonym 的所有者 必须拥有 synonym
所有者名称
synonym 要删除的同义词
该同义词必须存在于当前数据
库中
标识符
用法
此语句从 systables 、syssynonyms 和 syssyntable 系统目录表中删除条目。您必
须是 synonym 的所有者或者拥有 DBA 特权才能执行 DROP SYNONYM 语句。
删除同义词对同义词指向的表、视图或系列对象都没有影响。
如果您包含可选的 IF EXISTS 关键字,则如果未在当前数据库中注册指定名称的
同义词则数据库服务器不执行任何操作(而不是向应用程序发送异常)。
下列语句删除用户 cathyg 拥有的同义词 nj_cust:
DROP SYNONYM cathyg.nj_cust;
DROP SYNONYM 并不是唯一一个可以注销同义词的 DDL 操作,如果删除表、
视图或序列,则同一数据库中的任何同义词以及指代该表、视图或序列的同义词
也会被删除。
但是,如果当前数据库中的同义词引用另一个数据库中的已删除表或视图,那么
该同义词将保留在系统目录中,直至使用 DROP SYNONYM 语句显式删除该同
义词。 您可以在同一数据库中创建另一个表或视图,并声明已删除的表或视图的
名称作为其标识符。(如果不是当前数据库中的任何表或对象的名称,您可以在
当前数据库中创建一个表、视图或序列对象,并将在其它数据库中的表中删除的
表或视图的标识符声明为其名称。)在另一种情况中,旧的同义词现在会引用新

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 587
的表对象。有关同义词链接的更完整的讨论,请参阅 CREATE SYNONYM 语句
描述中的链接同义词一节。

参数说明:控制是否开启与Teradata 数据库相应兼容的特征。该参数在用户连接上与
TD 兼容的数据库时,可以将参数设置成为on(即超长字符串自动截断功能启用),该功能
启用后,在后续的insert 语句中,对目标表中char 和varchar 类型的列插入超长字符串时,
会按照目标表中相应列定义的最大长度对超长字符串进行自动截断。
保证数据都能插入目标
表中,而不是报错。
说明:超长字符串自动截断功能不适用于insert 语句包含外表的场景。如果向字
符集为字节类型编码(SQL_ASCII、LATIN1 等)的数据库中插入多字节字符数据(如汉字
等),且字符数据跨越截断位置,这种情况下,按照字节长度自动截断,自动截断后会在尾
部产生非预期结果。
如果用户有对于截断结果正确性的要求,
建议用户采用UTF8 等能够按
照字符截断的输入字符集作为数据库的编码集。
该参数属于USERSET 类型参数,请参考表15-1 中对应设置方法进行设置。
取值范围:布尔型

on 表示启动超长字符串自动截断功能。

off 表示停止超长字符串自动截断功能。
默认值:off