浅谈线程池(中):独立线程池的作用及IO线程池
2010-09-30 20:49:16 来源:WEB开发网我们也可以使用代码来操作IO线程池,例如下面这个接口便是向IO线程池递交一个任务:
public static class ThreadPool
{
public static bool UnsafeQueueNativeOverlapped(NativeOverlapped* overlapped);
}
NativeOverlapped包含了一个IOCompletionCallback回调函数及一个缓冲对象,可以通过Overlapped对象创建
Overlapped会包含一个被固定的空间,这里“固定”的含义表示不会因为GC而导致地址改变,甚至不会被置换到硬盘上的Swap空间去。这么做的目的是迎合IOCP的要求,但是很明显它也会降低程序性能。因此,我们在实际编程中几乎不会使用这个方法3。
注1:如果没有加以说明,我们这里谈论的对象默认为XP及以上版本的Window操作系统。
注2:timeslice又被称为quantum,不同操作系统中定义的这个值并不相同。在Windows客户端操作系统(XP,Vista)中时间片默认为2个clock interval,在服务器操作系统(2003,2008)中默认为12个clock interval(在主流系统上,1个clock interval大约10到15毫秒)。服务器操作系统使用较长的时间片,是因为一般服务器上运行的程序比客户端要少很多,且更注重性能和吞吐量,而客户端系统更注重响应能力——而且,如果您真需要的话,时间片的长度也是可以调整的。
注3:不过,如果程序中多次复用单个NativeOverlapped对象的话,这个方法的性能会略微好于QueueUserWorkItem,据说WCF中便使用了这种方式——微软内部总有那么些技巧是我们不知如何使用的,例如老赵记得之前查看ASP.NET AJAX源代码的时候,在MSDN中不小心发现一个接口描述大意是“预留方法,请不要在外部使用”。对此,我们又能有什么办法呢?
更多精彩
赞助商链接