.NET 线程基础的使用介绍(2)

  进程是一个虚拟的地址空间,操作系统不会对其进行调度而是调度执行其中包含的线程。CLR在AppDomain内部也有自己的运行线程,AppDomain中的线程由CLR维护,但最终CLR仍需将AppDomain中的线程映射为应用程序进程中的线程,交给操作系统进行调度。并且AppDomain中的线程不一定与操作系统线程完全一一对应。

  下图是大体描述进程、AppDomain和线程的关系,以及操作系统对线程的调度。详细内容本文不做进一步说明。

.NET 线程基础的使用介绍

线程优先级

  线程调度根据线程优先级进行,Windows将系统内的线程分为0至31,共32个等级,优先级为31的线程是最高优先级线程,最先得到执行权限。例如,一个优先级为8的线程正在执行,而此刻操作系统确认一个优先级为31的线程已经做好了执行准备,那么操作系统会立刻挂起正在执行的线程,把CPU的执行权限交给优先级为31的线程,即使优先级为8的线程还没有执行完一个完整的时间片,优先级为31的线程将获得一个完整的时间片,如果该线程执行完后操作系统发现还有优先级为31的线程准备执行,那么CPU执行权限将分给这个线程,前面优先级为8的线程始终得不到执行,这种情况称为饥饿。

  ​​如果开发人员没有合理的设置自己程序内的线程优先级,就可能会造成其他应用程序很难得到执行,甚至影响计算机响应速度。所以Windows又设计了一个进程优先级类来控制各个进程中的线程优先级的关系,进程优先级是一个虚拟的概念,因为操作系统不会对进程进行调度,这个概念只是为了控制进程中线程优先级的范围。进程优先级有6个级别(详见下表),根据进程优先级类,应用程序对内部线程设置相对优先级,会得到一个操作系统调度的线程优先级值。这样,使线程优先级能得到有效控制。

线程相对

优先级

进程优先级类


Idle

Below Normal

Normal

Above Normal

High

Real-Time


Time-critical

 

15

 

15

 

15

 

15

 

15

 

31

 

Highest

 

6

 

8

 

10

 

12

 

15

 

26

 

Above normal

 

5

 

7

 

9

 

11

 

14

 

25

 

Normal

 

4

 

6

 

8

 

10

 

13

 

24

 

Below normal

 

3

 

5

 

7

 

9

 

12

 

23

 

Lowest

 

2

 

4

 

6

 

8

 

11

 

22

 

Idle

 

1

 

1

 

1

 

1

 

1

 

16

 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjgsyg.html