SQL Server 2005查询处理结构-用户模式计划(UMS)

本文深入解析了SQLServer2005的用户模式计划(UMS)及其工作原理,包括协同多处理器模式、UMS如何调度线程以及查询处理过程中的资源分配等问题。

SQL Server 2005查询处理结构-用户模式计划(UMS

 

   在对数据库进行性能调优时,必须全面的考虑各种可能造成系统性能瓶颈的各种因素,因此深入了解SQL Server 2005的查询处理机构是非常有必要的。下面,我就重点介绍一下用户模式计划(UMS)。

   SQL Server 使用协同多处理器模式取 代了对称多处理器模式。这两种处理模式之间最大的区别在于处理器处理计划方式不同。在协同模式下,同一时间在一个处理器上只能运行一个线程,并且当这个线 程没有任务要运行时,就会放弃对处理器的控制权。在这种方式下,可以允许多个线程相互协同使实际执行的任务数量最大化。

   控制这个协同行为是用户模式计划(User Mode Scheduler UMS)的任务。SQL Server启动时,会为每个逻辑的或物理的处理器创建一个UMS,并且这个UMS可以在系统中使用。这样,SQL Server就可以通过UMS执行自己的计划,而不是将线程发送到操作系统,由操作系统按计划在处理器上执行,认识到这一点是非常重要的。

  创建一个SQL Server的连接时,它对应的SPID就会分配到UMS。这个分配的进程就会采用一个基本的平衡算法,以实现尽可能的将进程平均的分散在多个UMS中。尽管一个连接请求通常会在同一个UMS中执行,但是这个请求通常会在同一UMS中执行,但是这个请求还是有可能在任何可用的UMS中处理。

  每个UMS都使用三个队列来处理查询:可执行的、正在执行的和等待中的。队列中的线程遵循先进先出的原则。当一个查询执行时,会为它分配一个线程并将这个线程放入到可执行的队列中,可执行队列中的线程会占用处理器。如果线程需要等待I/O、网络或内存等资源的配置时,它就会停止处理器的占用,并移入等待中的队列。

  等待分配资源的线程会一直保存在等待的队列中。这是,SQL Server会跟踪这个线程等待的时间量,并用等待时间表示,当分配的资源得到时,就用等待的类型表示。一旦得到分配的资源,这个线程就会从等待队列中转入可执行的队列的底部。一个进程从可执行的队列到转入处理器上之前所花费的时间叫一次等待。 

  处理器计划的内部执行步骤:

 1)查询首先必须被编译,需要内存和处理器资源;

 2)编译过的计划必须保存在查询缓存中, 需要内存和处理器资源;

 3)执行计划会转入到处理器中以执行这个查询,需要内存、处理器资源和潜在的磁盘I/O

 4)当查询读/写数据时,必须建立锁,可能需要更多的内存、处理器资源和磁盘I/O

 5)查询的结果必须打包并传送回客户端,需要内存、处理器资源和网络I/O

 

 由以上步骤可看,内存必须至少被分配5次。如果系统内存紧张,这个进程就不得不每次都要等待所需要的内存分配,这也就导致了需要5次转入到等待的队列中,然后又需要5次转回到可执行队列。如果发生这样的情况,每次资源的分配都会增加查询的持续时间,查询效率就会降低,形成内存瓶颈。同样道理,CPU、磁盘I/O、内存、锁都会出现这样的情况。

<think>我们正在处理一个关于重命名或移动DTS文件为DTSI文件的问题。用户希望将`ums96xx-base.dts`重命名为`ums92xx-base.dtsi`或执行类似操作。首先,我们需要理解DTS和DTSI文件是什么。DTS(Device TreeSource)是设备树源文件,而DTSI(DeviceTree SourceInclude)是设备树源包含文件,通常用于包含在多个DTS文件中以共享配置。重命名或移动操作可以通过命令行工具(如mv命令)来完成,但需要注意以下几点:1.文件扩展名:从.dts改为.dtsi,这不仅仅是重命名,还改变了文件的类型(从设备树源文件变为包含文件)。2.文件内容:可能需要调整文件内容,因为DTS文件通常包含一个根节点和完整的设备树,而DTSI文件通常是被包含的片段,可能没有完整的根节点。3.引用该文件的其他文件:需要更新所有引用原文件的地方,改为引用新文件。具体步骤:1.重命名文件:使用`mv`命令将文件重命名。```bashmvums96xx-base.dts ums92xx-base.dtsi```2.检查文件内容:打开`ums92xx-base.dtsi`,检查是否需要调整内容。例如,如果原文件是一个完整的设备树(有根节点),而你想将其作为包含文件,可能需要移除根节点(这取决于具体使用场景,有时DTSI也可以包含根节点,但通常DTSI是片段)。注意:如果原文件是完整的,那么作为包含文件可能会在编译时导致重复定义,所以需要根据实际情况调整。3.更新引用该文件的地方:在项目中搜索所有包含`ums96xx-base.dts`的地方(例如,其他DTS文件中可能通过`#include "ums96xx-base.dts"`引用),将它们改为`#include"ums92xx-base.dtsi"`。4.如果项目使用git等版本控制系统,建议通过gitmv来重命名,以便跟踪文件的历史记录:```bashgitmv ums96xx-base.dtsums92xx-base.dtsi```注意:如果文件不在同一个目录,移动操作可能需要指定路径。例如,将文件移动到另一个目录并重命名:```bashmv ums96xx-base.dtsnew_directory/ums92xx-base.dtsi```然后更新引用时也要注意路径的变化。另外,如果用户希望保留原文件并创建一个新的dtsi文件,则可以使用复制命令:```bashcpums96xx-base.dts ums92xx-base.dtsi```然后根据需求修改新文件的内容,并更新引用。总结:重命名操作本身很简单,但重要的是后续的内容调整和引用更新。生成相关问题:1.设备树文件(DTS和DTSI)有什么区别?2.如何更新设备树文件中的引用路径?3.在重命名设备树文件后,如何确保编译不会出错?4.设备树文件中的根节点应该如何处理?</think>### 重命名或移动 DTS 文件为 DTSI 文件 要将 `ums96xx-base.dts` 重命名为 `ums92xx-base.dtsi` 或执行类似操作,请按以下步骤操作: #### 1. **使用 `mv` 命令重命名** ```bash mv ums96xx-base.dts ums92xx-base.dtsi ``` - **作用**:直接重命名文件并更改扩展名 - **注意**:确保在包含该文件的目录中执行命令 #### 2. **检查文件内容** 打开重命名后的文件,检查是否需要调整内容: ```dts // ums92xx-base.dtsi /dts-v1/; / { // 检查是否需要移除根节点(如作为片段被包含) // 添加必要的头文件声明 }; ``` - **关键修改**: - 如果作为片段使用,移除根节点 `/ { ... }` - 确保语法符合 DTSI 标准(如添加 `/dts-v1/;`) #### 3. **更新引用文件** 在所有包含原文件的 DTS 中更新引用: ```dts // 原引用 #include "ums96xx-base.dts" // 修改为 #include "ums92xx-base.dtsi" ``` - **查找所有引用**: ```bash grep -r "ums96xx-base.dts" /path/to/dts/files/ ``` #### 4. **验证编译** 使用设备树编译器检查语法: ```bash dtc -I dts -O dtb -o /dev/null ums92xx-base.dtsi ``` - 无报错表示语法正确 #### 5. **版本控制操作(如使用 Git)** ```bash git mv ums96xx-base.dts ums92xx-base.dtsi # 保留历史记录 git commit -m "重命名 ums96xx-base.dts 为 ums92xx-base.dtsi" ``` ### 关键注意事项 1. **语义差异**: - `.dts` 是完整设备树,`.dtsi` 是包含片段 - 重命名后需确保文件内容符合片段规范[^1] 2. **依赖关系**: - 更新 Makefile/Kbuild 中的引用 - 检查设备树包含层级是否受影响 3. **备份**: ```bash cp ums96xx-base.dts ums96xx-base.dts.bak # 操作前备份 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值