多线程系列(一):认识线程
一、什么是线程
线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程 序里执行多任务。通常由操作系统负责多个线程的调度和执行。
二、线程的开销
线程产生空间(内存消耗)和时间(运行时的执行性能)上的消耗。
(1)线程内核对象
包含一组描述线程的属性、线程上下文。
(2)线程环境块(thread environment block)
在用户模式下分配初始化的一个内存块。它包含线程异常处理链首。线程进入try块时,就会在这个链首插入节点,退出时删除节点。
(3)用户模式栈
存储传给方法的局部变量和实参。还包含一个当前方法返回时,应该从什么地方开始线程的地址。用户模式栈默认分配1M.
(4)内核模式栈
程序向操作系统内核模式的函数床底实参,会使用内核模式栈。从用户模式代码床给内核的任何实参,都会从线程的用户模式栈复制到线程的内核模式栈。
(5)dll线程连接和分离通知
进程创建一个线程,都会加载进程的所有dll,同时传递一个连接通知。反之,也回调用所有的dll,并传递一个分离通知。
(6)上下文切换
在任何时刻,系统只将一个线程分配给一个cpu,并可以运行一个时间片,时间片到期,就会发生上下文切换,切换到另一个线程。
A、对于即将结束运行的的线程,它存在cpu寄存器中的值保存到此线程内核对象的上下文结构中。
B、选择要切换加载的新线程,并将此线程的上下文加载到cpu寄存器。
C、cpu执行所选的新线程,运行一个时间片,如上再次切换。。。
注意:
这样的话,如果一个程序无限循环,系统会定期抢占。
如果要切换到同样的线程,就不会切换上下文。
执行垃圾回收,CLR必须暂停所有的线程,遍历栈,查找根,对队中的对象进行标记。恢复所有线程。