线程实现模型

N:1用户线程模型

“线程实现”建立在“进程控制”机制之上,由用户空间的程序库来管理。OS内核完全不知道线程信息。这些线程称为用户空间线程。这些线程都工作在“进程竞争范围”

N:1用户线程模型

在N:1线程模型中,内核不干涉线程的任何生命活动,也不干涉同一进程中的线程环境切换。

在N:1线程模型中,一个进程中的多个线程只能调度到一个CPU,这种约束限制了可用的并行总量。

第二个缺点是如果某个线程执行了一个“阻塞式”操作(如read),那么,进程中的所有线程都会阻塞,直至那个操作结束。为此,一些线程的实现是为这些阻塞式函数提供包装器,用非阻塞版本替换这些系统调用,以消除这种限制。

1:1核心线程模型

在1:1核心线程模型中,应用程序创建的每一个线程都由一个核心线程直接管理。

OS内核将每一个核心线程都调到系统CPU上,因此,所有线程都工作在“系统竞争范围”。

这种线程的创建与调度由内核完成,因为这种线程的系统开销比较大(但一般来说,比进程开销小)。

内核线程,每个用户线程被映射或绑定到一个内核线程。用户线程在其生命期内都会绑定到该内核线程。一旦用户线程终止,两个线程都将离开系统。称作”一对一”线程映射

N:M混合线程模型

N:M混合线程模型提供了两级控制,将用户线程映射为系统的可调度体以实现并行,这个可调度体称为轻量级进程(LWP:lightweight process),LWP再一一映射到核心线程

用户级线程主要解决的是上下文切换的问题,它的调度算法和调度过程全部由用户自行选择决定,在运行时不需要特定的内核支持。在这里,操作系统往往会提供一个用户空间的线程库,该线程库提供了线程的创建、调度和撤销等功能,而内核仍然仅对进程进行管理。如果一个进程中的某一个线程调用了一个阻塞的系统调用函数,那么该进程包括该进程中的其他所有线程也同时被阻塞。这种用户级线程的主要缺点是在一个进程中的多个线程的调度中无法发挥多处理器的优势。

轻量级进程是内核支持的用户线程,是内核线程的一种抽象对象。每个线程拥有一个或多个轻量级线程,而每个轻量级线程分别被绑定在一个内核线程上。

内核线程建立和销毁都是由操作系统负责、通过系统调用完成的。线程管理的所有工作由内核完成。

posix线程调度是一个混合模型,在标准的特定实现中支持用户级和内核级的线程。模型中包括两级调度–线程及和内核实体级。线程级与用户级线程类似,内核实体由内核调度。由线程库来决定它需要多少内核实体,以及他们是如何映射的。LinuxThreads仅实现了PTHREAD_SCOPE_SYSTEM一值。

原文地址:https://www.cnblogs.com/randyniu/p/9189193.html

时间: 2024-10-10 00:05:25

线程实现模型的相关文章

Java线程:线程栈模型与线程的变量

Java线程:线程栈模型与线程的变量 要理解线程调度的原理,以及线程执行过程,必须理解线程栈模型. 线程栈是指某时刻时内存中线程调度的栈信息,当前调用的方法总是位于栈顶.线程栈的内容是随着程序的运行动态变化的,因此研究线程栈必须选择一个运行的时刻(实际上指代码运行到什么地方). 下面通过一个示例性的代码说明线程(调用)栈的变化过程. 这幅图描述在代码执行到两个不同时刻1.2时候,虚拟机线程调用栈示意图. 当程序执行到t.start();时候,程序多出一个分支(增加了一个调用栈B),这样,栈A.栈

Java线程:线程栈模型

要理解线程调度的原理,以及线程执行过程,必须理解线程栈模型. 线程栈是指某时刻时内存中线程调度的栈信息,当前调用的方法总是位于栈顶.线程栈的内容是随着程序的运行动态变化的,因此研究线程栈必须选择一个运行的时刻(实际上指代码运行到什么地方). 下面,我们来根据这段代码和图片来来说明线程栈的过程 package cn.happy.bdqn; public class TestRunnable { /** * @param args */ public static void main(String[

java线程内存模型,线程、工作内存、主内存

转自:http://rainyear.iteye.com/blog/1734311 java线程内存模型 线程.工作内存.主内存三者之间的交互关系图: key edeas 所有线程共享主内存 每个线程有自己的工作内存 refreshing local memory to/from main memory must  comply to JMM rules 产生线程安全的原因 线程的working memory是cpu的寄存器和高速缓存的抽象描述:现在的计算机,cpu在计算的时候,并不总是从内存读

线程池模型

服务器线程模型分类: (1)按需生成(来一个连接生成一个线程) (2)线程池(预先生成很多线程) (3)Leader follower(LF) 线程池的作用:提高消息(任务)响应的实时性.提高任务执行的速度. 线程池的注意事项 (1)线程池大小.多线程应用并非线程越多越好,需要根据系统运行的软硬件环境以及应用本身的特点决定线程池的大小.一般来说,如果代码结构合理的话,线程数目与CPU 数 量相适合即可.如果线程运行时可能出现阻塞现象,可相应增加池的大小:如有必要可采用自适应算法来动态调整线程池的

浅谈服务器单I/O线程+工作者线程池模型架构及实现要点

转自 http://www.cnblogs.com/ccdev/p/3542669.html 单I/O线程+多工作者线程的模型,这也是最常用的一种服务器并发模型.我所在的项目中的server代码中,这种模型随处可见.它还有个名字,叫“半同步/半异步“模型,同时,这种模型也是生产者/消费者(尤其是多消费者)模型的一种表现. 这种架构主要是基于I/O多路复用的思想(主要是epoll,select/poll已过时),通过单线程I/O多路复用,可以达到高效并发,同时避免了多线程I/O来回切换的各种开销,

线程处理模型 由于 SynchronizationContext 引起的死锁问题解决

由于GUI 应用程序 不能使用线程池的线程更新UI,只能使用 GUI 线程更新,所以在 await 前后需要保证是同一个 GUI 线程 ASP.NET 程序 的线程处理客户端请求的时候,需要假定客户端的语言文化和身份标识等,所以为了保证信息的统一性,await 前后 会用同一个线程来处理... 那么,在 FCL 的 SynchronizationContext 就使用这样的线程模型来解决以上问题.因此偶尔也会带来一些问题:如下, protected void Page_Load(object s

深入Redis(十)线程IO模型

线程IO模型 首先必须记住的是,Redis是个单线程程序. 为什么单线程还这么快? Redis所有数据都在内存里,所有运算都是内存级别的运算,所以速度比在硬盘内操作更快.但是也正是由于是单线程,所以要小心使用那些时间复杂度O(n)的指令. 单线程如何处理那么多的并发客户端连接? 多路复用. 非阻塞IO socket方法的读写默认都是阻塞的,在python中可以通过socket.socket().setblocking(False)来设置非阻塞IO. 时间轮询(多路复用) 非阻塞IO有个问题就是,

Java线程同步模型-生产者与消费者

Java生产者与消费者模型是经典Java线程同步模型,涉及使用同步锁控制生产者线程和消费者线程同步运行问题.同步对象是仓库资源,生产者线程生产向仓库中生产商品,消费者线程从仓库中消费商品,当生产者线程生产的商品达到仓库的90%时,生产者线程停止生产并通知消费者线程开始消费,当消费者线程消耗到仓库的10%时,消费者线程停止消费并通知生产者线程恢复生产,如此循环往复过程. 如下图解: T1时刻分析 T2时刻 T3时刻 T4时刻 上图的分析,T3同T1时刻相同场景,T2同T2时刻相同场景,程序如此循环

CUDA学习(一)、CUDA线程执行模型

CUDA在执行的时候,每一个host里面的一个个kernel按照线程网格的概念在显卡硬件上执行,每一个线程网格又可以包含多个线程块,每个线程块又可以包含多个线程. 当程序执行时,每一个线程就相当于一个士兵,一个军队的将军就相当于host.当我们要执行某一个军事任务时,我们就要分配各个不同的任务,每个任务有一部分人完成,假设有M个任务,这就是M个kernel.而每一个任务(kernel)就交给一个grid看管,这里grid就相当于副将或者千户(grid管理线程的多少和GPU的性能有关)当执行具体任