本帖最后由 廖成 于 2013-1-27 10:07 编辑
纤程 为了减少上下文切换,引入纤程的概念,可以在SQL Server中启用纤程,纤程是线程的子模块,纤程由运行在用户模式下的代码管理,所以切换纤程比切换进程的代价少的多,因为纤程模式不需要在将用户模式和内核模式中切换,而切换线程则需要这种转换。
两者的区别 SQL Server管理纤程的调度,而OS管理线程的调度;线程模式里 SQL Server为每个并发用户创建配一个线程,而纤程模式中 SQL Server为每个CPU分配一个线程,并为每个并发用户创建配一个纤程,一个线程中可以有多个纤程,纤程只在线程里切换,不用上下文切换实现线程的是操作系统内核。操作系统清楚地知道线程的情况,并且根据操作系统定义的算法对线程进行调度。纤程是以用户方式代码来实现的,内核并不知道纤程,并且它们是根据用户定义的算法来调度的。由于你定义了纤程的调度算法,因此,就内核而言,纤程采用非抢占式调度方式。
下一个问题是,单线程可以包含一个或多个纤程。就内核而言,线程是抢占调度的,是正在执行的代码。然而,线程每次执行一个纤程的代码—你决定究竟执行哪个纤程(随着我们讲解的深入,这些概念将会越来越清楚)。 当使用纤程时,你必须执行的第一步操作是将现有的线程转换成一个纤程。
当对纤程的执行环境进行分配和初始化后,就可以将执行环境的地址与线程关联起来。该线程被转换成一个纤程,而纤程则在该线程上运行。
SQL Server对线程和纤程的管理SQL Server既可以为用户连接维护一个线程池,也可以维护一个纤程池(如果设置了纤程模式,则系统只维护纤程池,不在是线程池) 在连接池中,线程和纤程都看作工作纤程。 当一个语句需要SQL Server执行时: - 如果线程池里用空闲的线程,SQL Server将为该语句分配一个线程
- 如果线程池中没有可供使用的空闲线程并且没有达到最大工作线程数量,SQL Server将为该命令创建新的工作线程
- 如果到了最大线程使用数量并且没有空闲的线程,则进程必须等待其他处理完成后释放一个线程
|