1、windows永远不会调度一个进程,只调度线程。
2、线程和操作系统的关系:CLR(X)--AppDomain--线程池(包含工作者线程和I/O线程)
3、线程的关键组成部分
A、线程执行上下文
占用的空间:
o x86->700字节内存
x64->1240字节内存
o IA64->2500字节内存
B、线程环境块(用户模式下应用程序能快速访问的地址空间),占用空间为1个内存页,在x86和x64系统中卫4KB,在IA64系统下为8KB。
C、用户模式栈,占用1MB内存空间。
D、内核模式栈,32位系统为12KB,64位系统为24KB内存。
4、windows桌面型系统的上下文切换时间为30毫秒左右(以windows7为例的理论时间)。
5、尽量减少线程数量的理由:
- 上线文切换的30毫秒时间开销
- 执行垃圾回收时,CLR会暂停、遍历所有线程。
- 线程越多,调试、跟踪程序的工作就会变的越困难。
- CPU对多线程的数量支持是有限的。
6、线程的优先级=进程优先级+线程优先级
优先级从低到高的顺序为:Idle,BelowNormal,Normal,Abore Normal,High,Realtime
7、特别提示:windows桌面和server操作系统不是实时的操作系统,不能保证线程的实时性。
8、针对线程执行上下文的编程:
- 阻止上下文流可以提高城乡的性能,尤其针对运行于服务器上应用程序。
o CallContext.LogicalSetData("Name","xx");
o ExecutionContext.SuppressFlow();//阻止上下文流动
o ExecutionContext.RestoreFlow();//恢复上下文流动
9、和线程相关的委托和回掉函数:
WaitCallback委托--------------------ThreadPool.QueueUserWorkItem()
TimerCallback委托-------------------System.Threading.Timer
ParameterizedThreadStart委托------System.Threading.Thread
回调分类:
A、普通不可取消回调
B、可取消的回调:
CancellationTokenSource CTS= new...
ThreadPool.QueueUserWorkItem(0=>Count(CTS.Token,1000));
Void Count(CancellationToken token,Int32 CountTo)
{
for....
If(token.IsCancellationRquested)
{
...
}
}
关联取消标记:
CancellationTokenSource.CreateLinedTokenSource(CTS1.Token,CTS2.Token);
10、使用专用线程的理由(System.Threading.Thread):一个需要长时间运行的任务。
11、ThreadPool的缺点:
- 无法跟踪操作的状态(回调函数内容);
- 无法获取操作的返回值(回调函数结果);
采用任务Task可以解决这两个问题
12、Parallel循环,并行循环静态方法,Parallel.For/ForEach
- 任何一次都会使整个循环集合终止,但是由于循环集合时分块并行执行,所以不会立刻得到终止。
- 不要为执行很快的操作使用Parallel循环。
13、Parallel.Invoke(()=>StaticFounction1(),()=>StaticFounction2);