线程的实现模型

一 用户级线程(User-Level Thread,ULT):

(1)定义:应用程序可以通过使用线程库来设计多线程程序。线程库是用户级线程管理的一个包,它包含用于创建和销毁线程、在线程间传递信息和数据、调度线程执行的代码以及保存和恢复线程上下文的代码。

(2)优点:

1.最快的切换时间:所有线程的管理数据结构都在一个进程的地址空间内,线程切换不需要内核支持。

2.调度可以是和应用程序相关的。

3.用户级线程可以在任何操作系统上运行,不需要对底层内核进行修改以支持用户级线程。

(3)缺点:

1.内核看不到多线程的存在,继续以进程为单位进行调度,当执行系统调用时,不仅这个线程会被阻塞,进程中的所有线程都被阻塞。

2.在纯粹的用户级线程策略中,一个多线程应用程序不能利用多处理技术,内核一次只为一个进程分配给一个处理器。



二 内核级线程(Kernel-Level Thread,KLT):

(1)定义:在一个纯粹的内核级线程中,有关线程管理的所有工作都由内核完成(Windows)。调度是内核基于线程完成的。

(2)优点:

1.内核可以同时把一个进程中的多个线程调度到多个处理器上。

2.一个线程被阻塞,内核可以调度同一个进程中的另外一个线程执行。

(3)缺点:

1.线程环境切换速度相对较慢:把控制从一个线程转移到同一进程的另一个线程时需要到内核的状态切换。


三 轻量级进程(LWP):本质是进程,通过clone系统调用创建。

(1)Linux使用轻量级线程对多线程提供支持。Linux中,一个线程组基本上就是实现了多线程应用的一组轻量级线程。

(2)轻量级进程允许父子进程共享很多进程在内核的很多数据结构如:地址空间、打开的文件、以及信号处理等。

(3)实现多线程的简单方法就是把轻量级进程和线程关联起来:

*这样线程之间就可以通过简单的共享同一内存地址空间、同一打开文件集等来访问相同的应用程序数据结构集;

*同时,每个线程都可以由内核独立调度。

(4)fork系统调用在linux中是通过clone实现的。vfork系统调用创建的进程共享其父进程的内存地址空间,也是通过clone实现的。


四 线程实现模型:

(一)M:1模型:即用户级。

(1)优点:

1.最快的切换时间:所有线程的管理数据结构都在一个进程的地址空间内,线程切换不需要内核支持。

2.调度可以是和应用程序相关的。

3.用户级线程可以在任何操作系统上运行,不需要对底层内核进行修改以支持用户级线程。

(2)缺点:

1.内核看不到多线程的存在,继续以进程为单位进行调度,当执行系统调用时,不仅这个线程会被阻塞,进程中的所有线程都被阻塞。

2.在纯粹的用户级线程策略中,一个多线程应用程序不能利用多处理技术,内核一次只为一个进程分配给一个处理器。

(3)适用情况:当要求并发但不需要并行时,多对一实现可以提供最好的线程创建性能和因互斥量和条件变量带来的环境切换效率。


(二)1:1模型:即内核级。

(1)优点:

1.内核可以同时把一个进程中的多个线程调度到多个处理器上。

2.一个线程被阻塞,内核可以调度同一个进程中的另外一个线程执行。

(2)缺点:

1.线程环境切换速度相对较慢:把控制从一个线程转移到同一进程的另一个线程时需要到内核的状态切换。

(3)适用情况:一对一实现对于CPU密集型(不会经常阻塞)应用而言是个不错的选择。


(三)M:N模型:试图兼有M:1和1:1对优点,避免其缺点。

(1)优点:

1.大多数环境在用户模式下切换(速度快),可以直接在用户模式下进行线程的切换。

2.能在一个进程内利用多处理机的优势。

3.在系统服务的阻塞期间延迟很小:当内核要阻塞一个线程来等待I/O或另外的资源时,内核可以通知pthreads库,以便库能很快调度一个新的线程来保持进程的并发性。

(2)缺点:

1.比其它模型复杂。

2.程序员可能在内核级线程上失去直接的控制,因为线程的优先级可能仅仅在用户模式中有意义。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值