多线程系列(一):认识线程

一、什么是线程

   线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程 序里执行多任务。通常由操作系统负责多个线程的调度和执行。

二、线程的开销

线程产生空间(内存消耗)和时间(运行时的执行性能)上的消耗。

(1)线程内核对象

   包含一组描述线程的属性、线程上下文。

(2)线程环境块(thread environment block)

 在用户模式下分配初始化的一个内存块。它包含线程异常处理链首。线程进入try块时,就会在这个链首插入节点,退出时删除节点。

(3)用户模式栈

 存储传给方法的局部变量和实参。还包含一个当前方法返回时,应该从什么地方开始线程的地址。用户模式栈默认分配1M.

(4)内核模式栈

  程序向操作系统内核模式的函数床底实参,会使用内核模式栈。从用户模式代码床给内核的任何实参,都会从线程的用户模式栈复制到线程的内核模式栈。

(5)dll线程连接和分离通知

  进程创建一个线程,都会加载进程的所有dll,同时传递一个连接通知。反之,也回调用所有的dll,并传递一个分离通知。

(6)上下文切换

  在任何时刻,系统只将一个线程分配给一个cpu,并可以运行一个时间片,时间片到期,就会发生上下文切换,切换到另一个线程。

    A、对于即将结束运行的的线程,它存在cpu寄存器中的值保存到此线程内核对象的上下文结构中。

    B、选择要切换加载的新线程,并将此线程的上下文加载到cpu寄存器。

    C、cpu执行所选的新线程,运行一个时间片,如上再次切换。。。

  注意:

    这样的话,如果一个程序无限循环,系统会定期抢占。

    如果要切换到同样的线程,就不会切换上下文。

    执行垃圾回收,CLR必须暂停所有的线程,遍历栈,查找根,对队中的对象进行标记。恢复所有线程。

原文地址:https://www.cnblogs.com/sunchong/p/3948507.html