多线程与多进程的相关概念
来源:互联网 发布:unity3d工资待遇 编辑:程序博客网 时间:2024/06/05 05:46
关于并发的很多书中都会提到进程、轻量级线程、线程,进而还有多线程、多进程这些概念,有时候会对概念性的东西有些模糊,现在总结一下。
进程与线程
《深入理解计算机系统》
进程是操作系统对一个正在运行的程序的一种抽象。一个进程可以是由多个称为线程的执行单元组成的,每个线程都运行在进程的上下文中,并共享着同样的代码和全局数据。
可见,线程其实就是运行在进程上下文中的逻辑流。所有运行在同一个进程里的线程共享该进程的整个虚拟地址空间。一个进程中的线程是对等的,一个线程可以杀死任何对等线程,或者等待它的任何对等线程终止。
进程上下文:进程运行所需的所有状态信息,如PC和寄存器文件的当前值,以及主存的内容。。
进程上下文切换:保存当前进程的上下文、恢复新进程的上下文,然后将控制权传递给新进程。新进程就会从上次停止的地方开始。
线程上下文:线程运行所需的状态信息,如一个唯一的整数线程ID、栈、栈指针、程序计数器、通用目的寄存器和条件码。线程上下文要比进程上下文小得多,故线程上下文的切换要比进程上下文的切换快得多。
《C++网络编程 卷一》
进程是一种OS实体,用以提供“执行程序指令”的环境。每一个进程都管理某些资源,如虚拟内存、I/O句柄、信号处理器等,并借助内存单元硬件,防止自身遭受其他OS进程破坏。进程是资源管理和保护的基本单位。
一个线程是一组单独的指令序列,执行在进程的保护范围之内,即进程中的执行单元。线程管理着指令指针、保存“函数活动记录”的运行时栈、一组寄存器、信号屏蔽设备、优先级以及和线程有关的数据等。
《深入理解Linux内核》
进程,通常定义是程序执行时的一个实例。即用简单的 “hello world” 例子来说,执行该程序的时候,就产生了一个进程。用以描述程序已经执行到何种程度的数据结构的汇集。从内核观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的实体。
而每个线程则是都代表着进程的一个执行流。
线程模型
《深入理解Java虚拟机》
一对一的线程模型:轻量级进程与内核线程之间1:1的关系
轻量级进程是内核线程的一种高级接口,就是我们通常意义上所讲的线程,由于每个轻量级进程都由一个内核线程支持,故每个轻量级进程都是一个独立的调度单元,即使有一个轻量级进程在系统中阻塞了,也不会影响整个进程继续工作。也是由于是基于内核线程实现的,所以线程操作会用到系统调度,需要在用户态和内核态中切换,同时也会消耗一定的内核资源(所以一个系统支持轻量级进程的数量是有限的)。
1对多的线程模型:进程与用户线程之间1:N的关系
狭义的的用户线程指的是完全建立在用户空间的线程库上,线程的操作不需要内核的参与,故不会切换到内核态,从而线程操作是快速和低消耗的,可以支持更多的线程数量。
而缺点是,没有了系统内核的参与将导致线程操作都需要用户程序自己处理,会出现一些复杂的问题如:如何处理线程切换和调度,如何解决阻塞
多对多的线程模型:用户线程与轻量级进程之间是N:M的关系
该混合模式是将内核线程和用户线程一起使用:用户线程建立在用户空间中,线程操作快速和低消耗;而轻量级进程则作为用户线程和内核线程之间的桥梁,从而可以使用内核提供的内核调度和处理器映射功能。
《深入理解Linux内核》
用户态线程
从内核看来,多线程应用程序仅是一个普通的进程。(这就是Java虚拟机中的 1:N 的模型)
多线程应用程序多个执行流的创建、处理、调度都是在用户态进行的。通常使用POSIX兼容的pthread库。
轻量级进程
对多线程应用程序提供更好的支持。两个轻量级进程可以共享一些资源,像地址空间、打开的文件之类的。
将轻量级进程和每个线程关联起来实现的多线程应用程序,有以下优点:通过共享同一内存地址空间、同一打开的文件集来访问相同的应用程序数据结构集;每个线程都可以由内核独立调度,从而其中一个线程睡眠的时候另一个线程还是可以运行。(这就是Java虚拟机中的 1:1 的模型)
多进程与多线程
《C++网络编程 卷一》
多进程与多线程的比较(此处多线程指的是 1:N 模型)
优点:
- 线程创建和环境切换。线程维护的状态信息较进程要少,故在线程创建和环境切换的时候,线程的开销要少。
- 同步。线程的同步不需要OS内核的干预,而进程间的同步则一般需要OS内核的干预(用户态和内核态的切换)。
- 数据复制。线程之间通过“进程局部内存”共享信息,通信将更有效率,因为不需要通过内核来复制(共享内存和本地IPC需要内核复制)。
局限性:
- 性能损失。单处理器无法受益;高精度的锁策略带来高同步开销。
- 健壮性降低。为减少环境切换和同步的开销,线程间接收的“MMU保护”很少或没有。同一进程地址中,若有一个线程破坏了全局变量,则可能会导致整个进程崩溃;或者某一线程调用某些OS函数,会造成不利的影响,如exit()会导致终止整个进程中的所有线程。
- 缺乏高精度的访问控制。同一进程中,所有线程共享相同的用户ID和“对文件和其它被保护资源”的访问权。
总结
线程与进程的概念
线程:一组单独的指令序列,运行在进程的上下文中,并共享着同样的代码和全局数据。
进程:程序执行时的一个实例,用以提供“执行程序指令”的环境,一个进程可以是由多个称为线程的执行单元组成的。
多线程与多进程与的区别
通信
线程之间通过“进程局部内存”共享信息,不需要通过内核来复制,通信将更有效率。
进程之间由于独立的空间地址,只能通过显式的IPC机制共享信息。
切换
多进程切换需要系统调度,则资源消耗大,处理时间长;多线程则是较为方便快捷。
多进程切换需要系统调度,可以依靠内核调度功能有效处理进程间阻塞的问题;多线程则是需要自己提供方法,较为复杂。
- 多线程与多进程的相关概念
- JAVA 多进程与多线程的概念
- 多线程与多进程服务器以及池的概念
- 多线程的概念与相关方法
- 进程相关的概念
- 进程的相关概念
- 【windows编程--进程与线程】多线程的概念
- 理解进程与多线程的概念及关系
- 可执行程序装载与进程相关的概念
- 多核 多线程 进程的概念
- 多线程和进程的概念
- 进程、线程相关的概念
- windows进程的相关概念
- 什么是进程?进程的相关概念?
- C#多线程(一) 多线程的相关概念
- J2SE多线程 part1 多线程的相关概念
- 进程、线程与多线程概念详解
- 多线程(一)进程与线程概念
- 编程珠玑第九|十章学习总结
- Android获取当前位置(GPS和网络定位)
- 18.View the Exhibit and identify the component marked with a question mark.
- 精通HQL
- 堆(heap)排序算法
- 多线程与多进程的相关概念
- Socket
- PHP Calendar API方法归纳总结
- HDU1390 ZOJ1383 Binary Numbers
- Hangman Judge
- GMS认证之CtsVerifier测试
- 训练第六天
- SQL
- 美图功能ios源代码