1、在用户空间中实现线程
(1)特点:内核对线程包一无所知。从内核角度考虑,就是按正常的方式管理,即单线程进程(存在运行时系统)
(2)优点:
用户级线程包可以在不支持线程的操作系统上实现
保存线程状态的过程和调用程序都只是本地过程,故启动它们比进程内核调用效率更高
不需要陷阱,不需要上下文切换,也不需要对内存高速缓存进行刷新,使得线程调用非常快捷
(3)缺点:
线程发生I/O或页面故障引起的阻塞时,如果调用阻塞系统调用则内核由于不知道有多线程的存在,而会阻塞整个进程从而阻塞所有线程
一个单独的进程内部,没有时钟中断,所以不可能用轮转调度的方式调度线程
2、在内核中实现线程
(1)特点:
当某个线程希望创建一个新线程或撤销一个已有线程时,它进行一个系统调用
(2)优点:
所有能够阻塞线程的调用都以系统调用的形式实现,代价可观
当一个线程阻塞时,内核根据选择可以运行另一个进程的线程,而用户空间实现的线程中,运行时系统始终运行自己进程中的线程
说明:由于内核创建线程代价大,故有线程回收
3、信号是发给进程而不是线程的,当一个信号到达时,应该由哪一个线程处理它?线程可以“注册”它们感兴趣的信号。但如果两个或更多的线程注册了相同的信号,会发生什么呢?
下面是线程包实现图
4、混合实现
在这种模型中,每个内核级线程有一个可以轮流使用的用户级线程集合
补充:在用户级线程中,每个进程里的线程表由运行时系统管理。当一个线程转换到就绪状态或阻塞状态时,在该线程表中存放重新启动该线程所需的信息,与内核在进程表中存放的进程的信息完全一样