首页 > 代码库 > 操作系统--用户级线程和内核级线程
操作系统--用户级线程和内核级线程
在多线程操作系统中,各个系统的实现方式并不相同。在有的系统中实现了用户级线程,有的系统中实现了内核级线程
1.内核级线程:
(1)线程的创建、撤销和切换等,都需要内核直接实现,即内核了解每一个作为可调度实体的线程。
(2)这些线程可以在全系统内进行资源的竞争。
(3)内核空间内为每一个内核支持线程设置了一个线程控制块(TCB),内核根据该控制块,感知线程的存在,并进行控制。
在一定程度上类似于进程,只是创建、调度的开销要比进程小。有的统计是1:10
2.用户级线程:
(1)用户级线程仅存在于用户空间。——>对比内核(3)
(2)内核并不能看到用户线程。——>重要的区别
(3)内核资源的分配仍然是按照进程进行分配的;各个用户线程只能在进程内进行资源竞争。
用户线程运行在一个中间系统上面。目前中间系统实现的方式有两种,即运行时系统(RuntimeSystem)和内核控制线程。
“运行时系统”实质上时用于管理和控制线程的函数集合。包括创建、撤销、线程的同步和通信的函数以及调度的函数。这些函数都驻留在用户空间作为用户线程和内核之间的接口。用户线程不能使用系统调用,而是当线程需要系统资源时,将请求传送给运行时,由后者通过相应的系统调用来获取系统资源。
内核控制线程:
系统在分给进程几个轻型进程(LWP),LWP可以通过系统调用来获得内核提供的服务,而进程中的用户线程可通过复用来关联到LWP,从而得到内核的服务。
内核线程的优点:
(1)
(2)当有多个处理机时,一个进程的多个线程可以同时执行
缺点:
(1)由内核进行调度
用户进程的优点:
(1)线程的调度不需要内核直接参与,控制简单
缺点:
(1)资源调度按照进程进行,多个处理机下,同一个进程中的线程只能在同一个处理机下分时复用。
===========================================
线程的实现可以分为两类:用户级线程(User-Level Thread)和内核线线程(Kernel-Level Thread).后者又称为内核支持的线程或轻量级进程.
用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。
内核线程: 由操作系统内核创建和撤销。内核维护进程及线程的上下文信息以及线程切换。一个内核线程由于I/O操作而阻塞,不会影响其它线程的运行。Windows NT和2000/XP支持内核线程
用户线程:由应用进程利用线程库创建和管理,不以来于操作系统核心。不需要用户态/核心态切换,速度快。操作系统内核不知道多线程的存在,因此一个线程阻塞将使得整个进程(包括它的所有线程)阻塞。由于这里的处理器时间片分配是以进程为基本单位,所以每个线程执行的时间相对减少。
Windows NT和OS/2支持内核线程。Linux 支持内核级的多线程
=========================================================
了解了一下,用户级线程和内核级线程。
用户级线程:
从这张图上面可以看出来,用户级线程的管理是由应用程序的进程来完成的,而不关内核的事。在内核看来还是只有进程的概念,所以线程的调度也就可以通过应用程序自己设定,不用核心态的特权。
但是也就是因为这样,在内核中没有线程的概念,如果一个线程进入内核,然后再系统调用的时候阻塞了,那么,核心只会把它作为整个进程阻塞了,也就是说这个进程中的所有线程都被阻塞了。
线程状态和进程状态是独立的(从何说起?不理解)
优点:
线程切换不调用核心
调度是应用程序特定的:可以选择最好的算法
ULT可运行在任何操作系统上(只需要线程库)
缺点:
大多数系统调用是阻塞的,因此核心阻塞进程,故进程中所有线程将被阻塞
核心只将处理器分配给进程,同一进程中的两个线程不能同时运行于两个处理器上
内核级线程:
所有线程管理由核心完成
没有线程库,但对核心线程工具提供API
核心维护进程和线程的上下文
线程之间的切换需要核心支持
以线程为基础进行调度
例子:Windows
优点:
对多处理器,核心可以同时调度同一进程的多个线程
阻塞是在线程一级完成
核心例程是多线程的
缺点:
在同一进程内的线程切换调用内核,导致速度下降
操作系统--用户级线程和内核级线程