用户级线程和内核级线程

来源:互联网 发布:2016年网络第一红歌 编辑:程序博客网 时间:2024/04/30 00:01

 用户级线程和内核级线程


      根据在用户空间还是在核心实现多线程机制,线程又被分为用户级线程(User Level Thread)和内核级线程(Kernel Level Thread)。

      有关线程的所有管理工作都有在用户级实现的线程库来支持。用户级线程库是用于用户级线程管理的例程包,支持线程的创建、终止,以及调度线程的执行并保存和恢复线程的上下文,这些操作都在用户空间运行,无需内核的支持,所以用户级线程的创建和管理等操作更快。对于那些内核本身不支持多线程的操作系统,通过用户级线程库可以使用户获得多线程编程的好处。

      由于内核不能感知到用户及线程的存在,内核仍然以进程为单位进行调度,当内核调度一个进程运行时,用户级线程库调度该进程的一个线程执行,如果时间片允许,进程的其他线程也可能被执行,该进程的多个线程共享该进程的运行时间片。如果一个线程需要进行i/o读写,该线程调用系统调用进入内核,在启动I/O设备后内核会把该进程值为阻塞态,并把CPU分配给其他进程。即使该进程的其他线程可以运行,内核也不会发现这一情况,在该进程的状态变为就绪之前内核不会调度该进程运行,因而属于该进程的线程都不可能运行,因而用户级线程的并行性会受到一定的限制。

     内核级线程的所有管理操作都是由操作系统内核完成的。内核保存线程的状态和上下文信息,当一个线程执行了引起阻塞的系统调用时,内核可以调度该进程的其他线程执行。在多处理器系统上,内核可以分派属于同一进程的多个线程在多个处理器上运行,提高进程执行的并行度。

     由于需要内核完成线程的创建、调度和管理,所以和用户级线程相比这些操作要慢得多,但是仍然比进程的创建和管理操作要快。大多数市场上的操作系统,Windows 2000,Solaris 2,Linux等都支持内核级线程。

      有的操作系统提供了组合的线程模式,在Solaris 中,用户创建的多个用户级线程被映射到一些内核线程上,内核线程的数目可能少于用户级线程的数目,内核级线程的数目决定了该进程的并发度。

多线程的映射模型

对于实现了用户级线程和内核级线程的操作系统,用户级线程和内核级线程之间可以有不同的映射方式。

(1)多对一模型。

(2)一对一模型。

(3)多对多模型。

对比:

虽然多对一模型对创建用户级线程的数目并没有限制,但这些线程在同一时刻只能有一个被执行。

一对一模型可以获得高并发性,但因耗费资源而使线程数会受到限制。多对多模型具有多对一和一对一两种模型的优势,用户可以创建所需要的用户级线程,通过分配适当数目的内核级线程获得并发执行的优势并节省系统资源。

 

线程之间通信的两个基本问题是互斥和同步。

线程互斥是指对于共享资源,在各线程访问时的排它性。即当有多个线程都要使用某一共享资源时,同一时刻却只允许一个线程去使用,而其他要使用该共享资源的线程必须等待,直到占用资源者释放该共享资源。

线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应该等待,知道消息到达时才被唤醒。

实际上线程互斥是一种特殊的线程同步。


摘自:《清华大学:多核程序设计》

原创粉丝点击