首页 > 代码库 > 多线程开发必须知道的概念

多线程开发必须知道的概念

操作系统

是管理和控制计算机硬件与软件资源的计算机程序,它是一个软件。

多任务

多任务是操作系统一次运行多个应用程序的能力。多任务有两种形式:协作式多任务和抢占式多任务

协作式多任务:处理器同一时间内只能处理一个程序,直到该程序将占用处理器资源释放时(执行完退出),其他运行的程序才可以得到处理器资源。这种多任务的缺点是,如果一个程序不释放处理器资源,其他应用程序就会被挂起。windows早期版本正是用的这种方式。

抢占式多任务:操作系统允许一个应用程序执行一小段时间,然后强制中断它,让另一应用程序执行。可简单理解为中断一个程序来允许另一个程序执行。它全程由操作系统来控制。这样做的好处是避免了协作式多任务带来的挂起问题但会造成数据同步的问题。比如两个应用程序同时访问并修改一个变量。

进程

当启动一个程序时,系统就会为该程序分配所需的内存及其他资源。内存和资源的物理隔离叫做进程。当然,一个程序可能不止一个进程,所以程序和进程并不是一个意思。分配给进程的内存与其他进程隔离,只有自身可以访问。

线程

线程是操作系统能够进行运算调度的最小单元。它被包含在进程中,是进程的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

时间片

进程可以执行的时间称作“时间片”或者“时间量”。时间片的间隔是变化莫测的而且每个操作系统和每个处理器设定的都可能不一样。

本地存储(TLS)

当一个线程运行的时间超出了它分配的时间片是,它并不是停下来而是再次排队等待。每个处理器在同一时间只能处理一个线程,所以当前线程不得不移出当前处理器。然而,在线程跳出执行前,它得将离开前的状态信息保存下来以便再次执行。这个功能就称作线程本地存储(Thread Local Storage,TLS)。TCL包含寄存器、堆栈指针、调度信息、内存中的地址空间以及其他正在使用的资源信息。存储在TLS中的一个寄存器是程序计数器,该计数器用来告诉线程接下来该执行哪条指令。

中断

中断是一种机制,它能够使CPU指令由正常执行顺序转向计算机内存中的其他地方,而不需要知道目前正在执行什么程序。Windows通过中断知道它什么时候需要作出线程调度的决定。Windows决定一个线程执行多长时间并在当前线程的执行顺序中放入一条指令。这个时间在不同系统间甚至同一系统的不同线程间都可能是不同的。由于中断被显式地放入到指令集,所以通常被称为软件中断。一旦中断被设置,Windows就允许线程执行。当线程执行到中断时,Windows使用一个被称为中断处理的特定函数来将这个线程的状态存在在TLS中。当前线程的程序计数器也存储在TLS中。这个程序计数器仅仅是当前执行指令的地址。一旦线程执行超时,它会按照自身的优先级被移动到线程队列的末尾来等待再次被调度。

线程睡眠与时钟中断

线程自愿地退出执行队列一段时间,就称为睡眠。当一个线程进入睡眠状态,它被再次被打包到TLS中,但是这次不会放到TLS执行队列尾部。而是放到一个单独的睡眠队列中。为了使睡眠队列上的线程再次运行,需要用另一种中断来标记它们,称为时钟中断。当一个线程进入睡眠队列时,就会给它设置一个时钟中断,安排何时唤醒这个线程。当发生时钟中断时,如果这个时间与睡眠队列上的一个线程恢复运行的时间匹配,这个线程就会回到可执行的队列中,并安排恢复执行的时间。

线程的终止

线程的终止分为两种情况。一种是在一个线程执行过程中显式请求停止另一个线程;另一种是一个线程执行完成自动结束。

线程的优先级

线程执行的优先顺序称为线程的优先级。windows将线程的优先级分为0~31级别,数字越大表示优先级越高。只有系统才能设置0优先级,说明线程是空闲的。用户可以设置1~15的优先级,只有系统管理员才能设置高于15的优先级。16~31之间运行的线程是实时线程。“实时”,指的是优先级非常高,可以抢占优先级低的线程的执行时间。

多线程开发必须知道的概念