线程实现

237 阅读2分钟

线程

线程的使用

线程的必要性: 线程可以使并行实体拥有共享一个地址空间和所有可用数据的能力。 由于线程比进程更轻量级,所以它们比进程更容易(即更快)创建,也更容易撤销。 若多个线程都是CPU密集型的,那么并不能获得性能上的增强,但如果存在着大量的计算和大量的I/O处理,拥有多线程允许活动重叠进行,回加快程序的速度。 再多CPU系统中,多线程是有益的,在这样的系统中,真正的并行有了实现的可能。 有限状态机模拟多线程及其堆栈,但“顺序进程”模型消失了。

经典的线程模型

线程模型基于两个独立概念:资源分组处理与执行。 进程把相关资源集中管理。 线程是CPU上被调度执行的实体。 线程的四种状态:运行、阻塞、就绪和终止。

在用户空间中实现线程

优点: 线程切换快捷。 允许每个进程自己定制的调度算法。 具有较好的可扩展性。 缺点: 阻塞系统调用和缺页中断问题实现复杂。 如果一个线程开始运行,那么在该进程中其他线程就不能运行,除非第一个线程自动放弃CPU。

在内核中实现线程

优点: 解决了部分在用户空间实现线程的问题。 缺点: 创建和撤销线程代价大,引入线程池。 线程创建进程问题。 信号处理问题。 内核线程出错的损害更大。

混合实现

用户级线程与某些或者内核线程多路复用。

调度程序激活机制

调度程序激活机制的基本思路是,当内核了解到一个线程被阻塞之后,内核通知该进程运行时系统,并且在堆栈中以参数形式传递有问题的线程编号和所发生事件的一个描述。 调度程序激活机制的一个目标是作为上行调用的信赖基础,这是违反分层次系统内在结构的概念。通常,n层提供n+1层可调用的特定服务,但是n层不能调用n+1层中的过程。上行调用并不遵守这个基本原则。

弹出式线程

一个消息到达导致系统创建一个处理该消息的线程,这种线程称为弹出式线程。

使单线程代码多线程化

将单线程系统修改为多线程系统面临的问题: 全局变量共享。 许多库过程不可重入。 信号处理。 堆栈管理。