秋雨 De Blog

一个技术小白的个人博客

线程实现的三种方法及优缺点——内核实现 用户实现 混合实现

在用户空间实现线程ULT

特点:

把整个线程包放在用户空间中,内核对线程包一无所知。从内核角度考虑,就是按正常的方式管理,即单线程进程。

在用户空间管理线程的时候,,每个进程需要有其专用的进程表(thread table),用来跟踪该进程中的线程。这些表和内核中的进程表类似,不过它仅仅记录着各个线程的属性,如每个线程的程序计数器、堆栈指针、寄存器和状态等。该线程表由运行时系统管理。当一个进程专户难道就绪状态或阻塞状态,在该线程表中存放重新启动该线程所需的信息与内核在进程表中存放的信息完全一样的。

优点:

1、用户级线程包可以在不支持线程的操作系统上实现。

2、线程切换至少要比陷入内核要快一个数量级。在线程完成运行时,它调用thread_yield可以把该线程的信息保存在线程表中;进而,它可以调用线程调度程序来选择另一个要运行的线程。保存该线程状态的过程和调度程序都只是本地过程,所以启动它们比进行内核调用效率更高。另一方面,不需要陷阱,不需要上下文切换,也不需要对内存高速缓存进行刷新,这使得线程调度非常快捷。

 
   在用户空间管理线程时,每个进程都需要有其专用的线程表,用来跟踪该进程中的线程。与进程表类似,线程表记录各个线程的属性,如每个线程的程序计数器,堆栈指针,寄存器和状态等,线程表由运行时系统管理,当一个线程转换到就绪状态或阻塞状态是,在该线程表中存放重新启动该线程所需的信息,与内核在进程表中存放进程的信息完全一样。

 
当某个线程做了一些会引起在本地阻塞的事情之后,例如等待进程中另一个线程完成某些工作,它调用一个运行时系统的过程,这个过程检查该线程是否必须进入阻塞状态。如果是,它在线程表中保持该线程的寄存器,并查看表中可运行的就绪线程,并把新线程的保存值重新装入机器的寄存器中。只要堆栈指针和程序计数器一被切换,新线程就又自动投入运行。

3、 允许每个进程有自己定制的调度算法。

4、 具有较好的可扩展性,这是因为在内核空间中内核线程需要一些固定表格空间和堆栈空间,当内核线程的数量非常大,就会出现问题。

缺点:

  线程发生I/O或页面故障引起的阻塞时,如果调用阻塞系统调用则内核由于不知道有多线程的存在,而会阻塞整个进程从而阻塞所有线程。注(阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。)

 
 在一个单独的进程内部,没有时钟中断,所以不能用轮转调度的方式调度线程。如果一个线程开始运行,那么在该进程中的其他线程就不能运行,除非第一个线程自动放弃CPU。

在内核空间实现线程 KST

特点:

 在内核中实现线程,此时不再需要运行时系统。另外,每个进程中也没有线程表,相反,在内核中用来记录系统中所有线程的线程表。当一个线程阻塞时,内核可以根据其选择,可以运行同一个进程中的另一个线程,或者运行另一个进程中的线程。而在用户级线程中,运行时系统始终运行自己进程中的线程,直到内核剥夺它的CPU为止。当某个线程希望创建一个新线程或撤销一个已有线程时,它进行一个系统调用。在内核中实现线程时,内核必须维护两个表,传统的进程表以便跟踪进程的状态和线程表。

优点:

  1. 在多处理器系统中,内核能够同时调度统一进程中的多个线程并行执行
  2. 如果进程中的一个线程被阻塞了,内核可以调度该进程中的其它线程占有处理器运行,也可以运行其他进程中的线程
  3. 内核支持线程具有很小的数据结构和堆栈,线程的切换比较快,切换开销小
  4. 内核本身也可以采用才线程技术,可以提高系统的执行速度和效率

缺点:

应用程序线程在用户态运行,而线程调度和管理在内核实现。在同一进程中,控制权从一个线程转移到另一个线程,需要用户态-内核态-用户态的模式切换,系统开销较大。(应用程序线程和线程调度管理,都在同一进程内)

混合实现 ULT/KST

多对一模型:

《线程实现的三种方法及优缺点——内核实现 用户实现 混合实现》

将用户级线程映射到一个内核控制线程。

优点:

线程管理开销小,效率高;

缺点:

如果一个进程在访问内核时发生阻塞,则整个进程都会被阻塞;此外,在任一时刻,只有一个线程可以访问内核,多个线程不能同时在多个处理机上运行。

一对一模型:

《线程实现的三种方法及优缺点——内核实现 用户实现 混合实现》

将每一个用户级线程映射到内核支持线程

优点:

当一个线程阻塞时,允许调用另一个线程运行,所以它提供了比多对一模型更好的并发功能。

在多处理机系统中,它允许多个线程并行地运行在多处理机系统上。

缺点:

每创建一个用户及线程,相应地就需要创建一个内核线程,开销较大,因此需要限制整个系统的线程数。

多对多模型:

《线程实现的三种方法及优缺点——内核实现 用户实现 混合实现》

将许多用户及线程映射到同样数量或更少数量的内核线程上。

将用户级线程的优点和内核级线程的优点结合起来的方法。使用内核级线程,然后将用户级线程与某些或者全部内核级线程多路复用起来。采用这种方法,编程人员可以决定有多少内核级线程和多少个用户级线程彼此多路复用。这一模型带来最大的灵活度。

采用这种方法,内核只识别内核级线程,并对其进行调度。其中一些内核级线程会被多个用户及线程能多路复用。如同在没有多线程能力操作系统中某个进程中的用户级线程一样,可以创建、撤销和调度这些用户级线程。在这种模型中,每个内核级线程有一个可以轮流使用的用户及县城集合。

该模型结合上述两种模型优点,它可以像一对一模型那样,使一个进程的多个线程并行地运行在多处理机系统上,也可以像多对一模型那样,减少模型的管理开销和提高效率。

点赞
  1. xirry说道:

    哈喽~

发表评论

电子邮件地址不会被公开。 必填项已用*标注