现在的位置: 首页 > 综合 > 正文

线程实现的两种方式——用户空间和内核中

2017年12月04日 ⁄ 综合 ⁄ 共 648字 ⁄ 字号 评论关闭

1、在用户空间中实现线程

(1)特点:内核对线程包一无所知。从内核角度考虑,就是按正常的方式管理,即单线程进程(存在运行时系统)

(2)优点

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

保存线程状态的过程和调用程序都只是本地过程,故启动它们比进程内核调用效率更高

不需要陷阱,不需要上下文切换,也不需要对内存高速缓存进行刷新,使得线程调用非常快捷

(3)缺点

线程发生I/O或页面故障引起的阻塞时,如果调用阻塞系统调用则内核由于不知道有多线程的存在,而会阻塞整个进程从而阻塞所有线程

一个单独的进程内部,没有时钟中断,所以不可能用轮转调度的方式调度线程

2、在内核中实现线程

(1)特点

当某个线程希望创建一个新线程或撤销一个已有线程时,它进行一个系统调用

(2)优点

所有能够阻塞线程的调用都以系统调用的形式实现,代价可观

当一个线程阻塞时,内核根据选择可以运行另一个进程的线程,而用户空间实现的线程中,运行时系统始终运行自己进程中的线程

说明:由于内核创建线程代价大,故有线程回收

3、信号是发给进程而不是线程的,当一个信号到达时,应该由哪一个线程处理它?线程可以“注册”它们感兴趣的信号。但如果两个或更多的线程注册了相同的信号,会发生什么呢?

下面是线程包实现图

4、混合实现

在这种模型中,每个内核级线程有一个可以轮流使用的用户级线程集合

补充:在用户级线程中,每个进程里的线程表由运行时系统管理。当一个线程转换到就绪状态或阻塞状态时,在该线程表中存放重新启动该线程所需的信息,与内核在进程表中存放的进程的信息完全一样

抱歉!评论已关闭.