多线程与多进程的相关概念

来源:互联网 发布: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机制共享信息。


切换

多进程切换需要系统调度,则资源消耗大,处理时间长;多线程则是较为方便快捷。

多进程切换需要系统调度,可以依靠内核调度功能有效处理进程间阻塞的问题;多线程则是需要自己提供方法,较为复杂。


0 0