在现代操作系统中,进程支持多线程。进程是资源管理的最小单元;而线程是程序执行的最小单元。一个进程的组成实体可以分为两大部分:线程集合资源集。进程中的线程是动态的对象;代表了进程指令的执行。资源,包括地址空间、打开的文件、用户信息等等,由进程内的线程共享。
线程有自己的私有数据:程序计数器,栈空间以及寄存器。
Why Thread?(传统单线程进程的缺点)
1. 现实中有很多需要并发处理的任务,如数据库的服务器端、网络服务器、大容量计算等。
2. 传统的UNIX进程是单线程的,单线程意味着程序必须是顺序执行,不能并发;既在一个时刻只能运行在一个处理器上,因此不能充分利用多处理器框架的计算机。
3. 如果采用多进程的方法,则有如下问题:
a. fork一个子进程的消耗是很大的,fork是一个昂贵的系统调用,即使使用现代的写时复制(copy-on-write)技术。
b. 各个进程拥有自己独立的地址空间,进程间的协作需要复杂的IPC技术,如消息传递和共享内存等。
多线程的优缺点
多线程的优点和缺点实际上是对立统一的。
支持多线程的程序(进程)可以取得真正的并行(parallelism),且由于共享进程的代码和全局数据,故线程间的通信是方便的。它的缺点也是由于线程共享进程的地址空间,因此可能会导致竞争,因此对某一块有多个线程要访问的数据需要一些同步技术。
三种线程——内核线程、轻量级进程、用户线程
内核线程
内核线程就是内核的分身,一个分身可以处理一件特定事情。这在处理异步事件如异步IO时特别有用。内核线程的使用是廉价的,唯一使用的资源就是内核栈和上下文切换时保存寄存器的空间。支持多线程的内核叫做多线程内核(Multi-Threads kernel )。
轻量级进程[*]
轻量级线程(LWP)是一种由内核支持的用户线程。它是基于内核线程的高级抽象,因此只有先支持内核线程,才能有LWP。每一个进程有一个或多个LWPs,每个LWP由一个内核线程支持。这种模型实际上就是恐龙书上所提到的一对一线程模型。在这种实现的操作系统中,LWP就是用户线程。
由于每个LWP都与一个特定的内核线程关联,因此每个LWP都是一个独立的线程调度单元。即使有一个LWP在系统调用中阻塞,也不会影响整个进程的执行。
轻量级进程具有局限性。首先,大多数LWP的操作,如建立、析构以及同步,都需要进行系统调用。系统调用的代价相对较高:需要在user mode和kernel mode中切换。其次,每个LWP都需要有一个内核线程支持,因此LWP要消耗内核资源(内核线程的栈空间)。因此一个系统不能支持大量的LWP。
注:
1. LWP的术语是借自于SVR4/MP和Solaris 2.x。
2. 有些系统将LWP称为虚拟处理器。
3. 将之称为轻量级进程的原因可能是:在内核线程的支持下,LWP是独立的调度单元,就像普通的进程一样。所以LWP的最大特点还是每个LWP都有一个内核线程支持。
用户线程
LWP虽然本质上属于用户线程,但LWP线程库是建立在内核之上的,LWP的许多操作都要进行系统调用,因此效率不高。而这里的用户线程指的是完全建立在用户空间的线程库,用户线程的建立,同步,销毁,调度完全在用户空间完成,不需要内核的帮助。因此这种线程的操作是极其快速的且低消耗的。
上图是最初的一个用户线程模型,从中可以看出,进程中包含线程,用户线程在用户空间中实现,内核并没有直接对用户线程进程调度,内核的调度对象和传统进程一样,还是进程本身,内核并不知道用户线程的存在。用户线程之间的调度由在用户空间实现的线程库实现。
这种模型对应着恐龙书中提到的多对一线程模型,其缺点是一个用户线程如果阻塞在系统调用中,则整个进程都将会阻塞。
加强版的用户线程——用户线程+LWP
这种模型对应着恐龙书中多对多模型。用户线程库还是完全建立在用户空间中,因此用户线程的操作还是很廉价,因此可以建立任意多需要的用户线程。操作系统提供了LWP作为用户线程和内核线程之间的桥梁。LWP还是和前面提到的一样,具有内核线程支持,是内核的调度单元,并且用户线程的系统调用要通过LWP,因此进程中某个用户线程的阻塞不会影响整个进程的执行。用户线程库将建立的用户线程关联到LWP上,LWP与用户线程的数量不一定一致。当内核调度到某个LWP上时,此时与该LWP关联的用户线程就被执行。
小结:
很多文献中都认为轻量级进程就是线程,实际上这种说法并不完全正确,从前面的分析中可以看到,只有在用户线程完全由轻量级进程构成时,才可以说轻量级进程就是线程。
分享到:
相关推荐
"COM线程模型 - C-C++2.htm"、"COM线程模型 - C-C++1.htm"和"COM线程模型 - C-C++3.htm"这三份文件可能包含了更深入的C++编程中关于COM线程模型的实例、最佳实践和常见陷阱,可以帮助开发者更好地理解和应用这些...
### 浅谈Android线程模型:深入理解与实践 #### 引言 随着智能手机的普及和技术的不断进步,Google的Android操作系统成为了移动设备领域的重要力量。Android不仅为用户提供了丰富的功能,也为开发者提供了广阔的...
而在追求高并发、低延迟的互联网服务中,线程服务器模型则更为常见,如Web服务器、数据库服务器等。 此外,还可以采用混合模型,如使用多进程加多线程的方式,结合两者的优势,实现更好的性能和稳定性。例如,主...
一个良好的内存模型能够帮助程序员避免常见的多线程问题,如竞态条件(race conditions)、死锁(deadlocks)等,并确保多线程程序的执行结果具有可预测性。 #### 三、C++09内存模型的动机 C++09内存模型的引入主要是...
【多线程模型】是指在一个进程中同时存在多个执行线程的编程模型,这种模型能够提高计算机系统的效率,尤其是在处理I/O密集型任务时。在操作系统中,进程是资源分配的基本单位,而线程是调度的基本单位。每个进程都...
在IT领域,多线程模型是一种常见的编程技术,特别是在处理大量并发操作时,如数据库读取。本篇文章将深入探讨“多线程读取DB数据”这一主题,旨在揭示其背后的原理、优缺点以及实现方法。 多线程是操作系统提供的一...
多线程服务器通常用于处理大量的并发连接请求,通过合理的线程模型设计和有效的线程间同步机制,可以显著提高服务器的性能和稳定性。OLPT模型和线程池模型各有优势,应根据具体的应用场景选择合适的模型。此外,进程...
【标题】"Kafka Demo 两种线程消费方式"展示了在Kafka中处理消息的两种常见线程模型,这是理解Kafka消费者工作原理的关键部分。Kafka是一个分布式流处理平台,用于构建实时数据管道和应用,它允许生产者发布消息到...
### Android多线程模型与Service深入解析 #### 线程与进程概念解析 在深入探讨Android中的多线程模型之前,我们先明确一下基本概念。在计算机科学中,**进程**(Process)与**线程**(Thread)是两个核心概念。进程是...
Java作为一种广泛使用的编程语言,其同步线程模型为开发多线程应用程序提供了坚实的基础。然而,该模型并非完美无缺,它在提升计算机资源使用效率和程序处理速度的同时,也带来了一些如死锁等问题。本文旨在分析Java...
多线程模型是指用户级线程和内核级线程之间的映射关系。常见的模型有: 1. 一对一模型:每个用户级线程都映射到一个内核级线程。这种模型能够提供良好的并发性能,但可能因为每个用户线程都需要一个内核线程而消耗...
在这个主题中,我们将深入探讨一个多线程示例程序以及在使用多线程时可能遇到的常见问题。 首先,我们来看标题中提到的"一个多线程示例程序"。在C++Builder中,创建多线程通常涉及使用`TThread`类,这是VCL(Visual...
Netty 消息接收和线程处理模型分析 ...最后,需要强调的是,线程模型的选择需要根据具体的业务场景和系统配置进行配置,以确保系统的高性能、低时延和可靠性。在高性能、低时延和可靠性等指标上实现最优组合。
1. **单线程模型**:虽然名为“多线程”,但有些简单的服务器可能会采用单线程模型,通过非阻塞I/O(如IO复用技术,如select、poll、epoll)处理并发请求。这种方式可以避免线程切换带来的开销,但当连接数量增加时...
这是一种常见的单例模式实现,但如果不正确地使用,可能会导致线程安全问题。JMM通过volatile关键字和synchronized的结合,可以保证在多线程环境下的正确初始化。 8. **死锁** 当两个或更多线程相互等待对方释放...
线程是操作系统中并发执行的基本单元,它是程序执行流的最小单位。在多核处理器或者单核处理器的多任务环境...在实际开发中,还需要根据具体应用场景选择合适的线程模型和同步策略,以实现高效、稳定、可靠的并发程序。
### Java内存模型(有助理解多线程) #### JMM简介 Java内存模型(JMM,Java Memory Model)是Java虚拟机规范中一个重要的概念,它规定了程序中各种变量(包括实例字段、静态字段和数组元素)的访问规则,以及在...
在计算机科学中,多线程编程模型是一种允许应用程序同时执行多个独立执行流的技术。这种模型在现代计算中广泛应用,特别是在需要高效利用多核处理器资源的系统中。本篇将深入探讨多线程编程模型,包括相关概念、操作...
- **性能优化**:根据任务特性选择合适的线程模型,避免过度使用线程导致系统资源浪费。 通过理解并熟练运用线程消费者模型,开发者可以编写出更加高效、响应快速的安卓应用程序。在实际项目中,可以根据需求选择...
例如,在Web服务器场景中,可以采用多进程模型来处理不同的客户端连接请求,而在每个进程中又可以使用多线程模型来进一步提高并发处理能力。这种方式既保证了不同客户端之间的隔离性和安全性,又能有效地利用系统...