要理解 SQL Anywhere 线程模型,必须了解线程和请求处理的基本术语和概念:
请求 请求是一种通过连接发送到数据库服务器的工作单元,如查询或 SQL 语句。请求的生存期始于数据库服务器首次接收请求时,终于返回最后一条结果、关闭游标或取消请求时。
任务 任务是一种在数据库服务器内执行的活动单元,是数据库服务器调度的最小工作单元。在数据库服务器内,每个用户请求至少会成为一项任务,如果涉及查询内并行机制,则可能会成为更多项任务。除用户请求外,数据库服务器还可以调度其自己的任务来执行内部任务,如运行清理程序或处理计时器。可并发执行的最大活动任务数取决于内核中的工作线程池的大小。用户请求任务到达数据库服务器时,如果为其分配了工作线程,则 ActiveReq 服务器属性将增加 1。该请求完成后,ActiveReq 服务器属性将减少 1。但如果没有可用的工作线程来执行用户请求任务,则将该任务加入队列以等待执行,同时 UnschReq 服务器属性增加 1。当该任务由于工作线程可用而取消排队并开始执行后,UnschReq 服务器属性将减少 1,而 ActiveReq 属性将增加 1。
工作线程 工作线程是对数据库服务器内核中执行一连串控制这样一个过程的抽象表述。在 Windows 和 Linux 上,使用一种称为纤程的轻量化线程来实现工作线程,在其它平台上则使用操作系统线程来实现。工作线程用于执行数据库服务器内核分配给它们的任务。数据库服务器使用大小可变的工作线程池来处理服务器的负载。该池的大小与数据库服务器的进程并发水平相对应。
个人服务器和 Windows Mobile 上的网络服务器都具有固定大小的工作线程池。对于其它服务器,服务器启动时创建的工作线程数由 -gn 选项控制。对于所有其它网络服务器,数据库服务器所创建的工作线程数由 -gnh 选项指定。但对于服务任务,只能使用服务器进程并发水平所指定的工作线程数。缺省情况下,内核会根据数据库服务器负载的变化动态调整工作线程池的大小,因此池大小会在分别由 -gnl 和 -gnh 选项指定的上限和下限之间变动。
将任务分配到工作线程时,会采取先进先出 (FIFO) 原则。各个任务的优先级都将根据产生该任务的连接来设置。任务被分配到工作线程以执行时,内核的调度器会根据该任务的优先级来为工作线程分配 CPU 时间。执行任务过程中,如果某一任务在处理过程中因为某种原因而需要暂停运行,例如等待锁或等待 I/O 完成,则工作线程仍然会与该任务耦合。仅当任务完成后,该工作线程才可用于执行其它任务。
线程 线程(或执行线程)是一种操作系统结构,它允许在单个进程内的并发执行。每个操作系统进程(包括数据库服务器)都至少由一个线程来执行,可能的情况下会由许多线程来执行。操作系统在应用程序外调度线程,应用程序的所有执行操作最终都由其线程来执行。在 Windows 和 Linux 上,数据库服务器创建固定数量的线程:每个 CPU 核心一个操作系统线程,由 -gtc 选项控制。在其它平台上,创建的操作系统线程数等于工作线程池的大小,并且使用与用于控制工作线程池大小相同的机制来控制。
线程数与到数据库的连接数无关,且数据库服务器不会将某线程专用于某个特定连接。相反,随着任务进入数据库服务器开始执行,会从大小固定的服务器线程池中动态地分配线程给这些任务。任务被分配了线程后,该线程会始终处理该任务直到任务完成或取消。
Unix 上的工作线程
Windows 和 Linux 上的工作线程
线程行为
进程并发水平的数据库服务器配置
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2013, SAP 股份公司或其关联公司. - SAP Sybase SQL Anywhere 16.0 |