原理篇-多线程

时间:2021-03-28 19:45:06
要点:
多线程是一项重要的技术。理解线程的调度机制,线程切换的代价,以及多线程的同步,才能设计出高效的多线程应用。
讨论:
线程就其本质是一个CPU的时间片。定时器产生一个中断,这个中断将CPU的控制权转移到OS的线程调度程序,OS根据调度规则将线程队列里的最合适线程调出,恢复该线程的上下文(context),也就是该线程上次被切换前的寄存器。中断结束,该线程就开始
运行,直到下次中断,OS开始另一次调度,该线程有可能被切换,也有可能继续运行。所以对线程的理解,首要理解线程的调度机制。下面我们研究win-ce的线程调度。
    Win-ce是一个可抢占的多任务操作系统。它采用基于优先级的时间片轮转方法来调度线程。
首先最重要的概念就是优先级。高优先级的线程可以抢占低优先级的线程。也就是说
当一个低优先级的线程在运行时,如果一个高优先级的线程由阻塞状态转入就绪状态,那么OS将强行挂起低优先级线程,转而运行高优先级线程。但例外的情况是,当一个低优先级的线程拥有的资源是高优先级线程必须的,则高优先级线程被阻塞,而OS临时调高低优先级线程的级别,保证其运行完并释放资源。在我们设计多线程程序时,对于线程的优先级别的选择是有一定原则的,通常对于运算量小的线程赋予较高的级别,而运算量大的线程要低一些。这个设计就是促使运算量小的线程尽快能运行完,而把更多时间给运算量大的线程。
如果按照一般人的误解,将高优先级赋予大运算量的线程,那么小运算量的线程将很难得到调度,这会影响整体的性能。以多媒体播放器为例,通常audio线程的优先级别高于video的优先级别。
    其次还有时间片的概念。Win-ce可以设置每个线程的时间片长度(Quantum)。对于优先级别一样的多线程应用,根据各个线程的运算量设置时间片长度还是有一定意义的。
    最后,我们来谈谈同步的问题。这是多线程最大的问题。在设计层面,可以把同步理解为如何分配任务到各个线程,各个线程间如何协作,有序使用资源,完成计算目标。设计层面的问题我会在另外一个Item里阐述。这里谈谈技术层面上,同步的一些问题。同步有许多的机制,临界区,互斥,信号量,事件等。在性能方面,临界区是最好的,因为它是个进程内的同步机制,对临界区的访问,不需要复杂的系统调用。而像互斥,事件等是OS的内核对象,对它们的访问是非常耗时的。内核对象的好处是它的全局性,可以支持进程间通信,
但对于大部分应用,根本就不需要进程间通信。所以临界区还是同步的首选。