线程在现在操作系统中使用非常广泛,但是在各个系统中实现的方式各有不同,如infomix实现的是用户级线程,而macintosh实现的是内核支持线程,比如Solaris OS两者都实现了。
1.内核支持线程(Kernel Supported Threads)
在OS中的所有进程,无论是系统进程还是用户进程,都是在操作系统内核的支持下运行的,是与内核紧密相关的。而内核支持线程KST同样也是在内核的支持下运行的,它们的创建、阻塞、撤消和切换等,也都是在内核空间实现的。为了对内核线程进行控制和管理,在内核空间也为每个内核线程设置了一个线程控制块,内核根据该控制块而感知某线程的存在,并对其加以控制。当前大多数OS都支持内核支持线程。
这种线程实现方式主要有四个主要优点:
在多处理器系统中,内核能够同时调度同一进程中的多个线程并行执行
如果进程中的一个线程被阻塞了,内核可以调度该进程中的其它线程占有处理器运行,也可以运行其它进程中的线程
内核支持线程具有很小的数据结构和堆栈,线程的切换比较快,切换开销小
内核本身也可以采用多线程技术,可以提高系统的执行速度和效率。
内核支持线程的主要缺点是:对于用户的线程而言,其模式切换的开销较大,在同一个进程中,从一个线程切换到另一个线程时,需要从用户态转为用户进程的线程在用户态运行,而线程调度和管理是在内核实现的,系统开销较大。
2.用户级线程(User Level Threads)
用户级线程是在用户空间中实现的。对线程的创建、撤消、同步与通信等功能,都无需内核的支持,即用户级线程是与内核无关的。在一个系统中的用户级线程的数目可以达到数百个至数千个。由于这些线程的任务控制块都是设置在用户空间,而线程所执行的操作也无需内核的帮助,因而内核完全不知道用户级线程的存在。
值得说明的是,对于设置了用户级线程的系统,其调度仍是以进程为单位进行的。在采用轮转调度算法时, 各个进程轮流执行一个时间片,这对诸进程而言貌似是公平的。但假如在进程A中包含了一个用户级线程,而在另一个进程B中含有100个用户级线程,这样,进程A中线程的运行时间将是进程B中各线程运行时间的100倍:相应地,其速度要快上100倍, 因此说实质上并不公平。
假如系统中设置的是内核支持线程。如调度便是以线程为单做进行的,在采用轮转法调度时,是各个线程轮流执行一个时间片。同样假定进程A中只有一一个丙核支持线程,而在进程B中有100个内核支持线程。此时进程B可以获得的CPU时间是进程A的100倍,且进程B可使100个系统调用并发工作
课外题:
某系统支持内核级线程,且处理器采用时间片轮转调度算法。该系统现有进程A和进程B,且进程A拥有2个线程、进程B拥有100个线程,那么进程A执行时间一般应为进程B执行时间的1/50。
某系统不支持内核级线程但支持用户级线程,且处理器采用时间片轮转调度算法。该系统现有进程A和进程B,且进程A拥有1个线程、进程B拥有100个线程,那么进程A执行时间一般应为进程B执行时间的1。