您的位置:首页 > 其它

Process vs Thread

2013-07-01 23:34 309 查看
进程(Process):

A:An instance of a program.即一个程序的运行实例。

B: Executed in own address space.有独立的地址空间,包括程序内容和数据

C: Independent entity to which system assigns resources。进程是资源分配和拥有的单位.

D:Cannot access variables or other data structure in another process. Process communicate using inter-process mechanisms like files, pipes, sockets.

线程(Thread):

A:a single execution in a process . 进程的一个执行流程。

B: A process may have multiple threads within it. Also a thread is sometime referred as lightweight process. 一个进程可以有多个线程,线程又称轻量级进程。

C: Different threads can access same object. Threads always share the heap and contain their own stack to store local variables. 线程有自己的程序计数器、寄存器、堆栈和帧等。同一进程中的多个线程共用相同的地址空间,同时共享进程所拥有的内存和其他资源。

D: Can communicate thru shared variables and other memory structures

线程之所以称为轻量级进程,原因是二者有很多共同点。比如线程和进程的状态都有运行、就绪和阻塞。简单理解就是进程所需的资源没有到位的时候就是阻塞状态。当进行所需的资源到位而CPU没有到位的时候便是就绪状态。进程所需的资源和CPU都到位的时候便是运行状态。

为什么需要线程?

A:在很多程序中,需要多个任务协作完成工作,如果将这些工作分解到不同的线程中,则无疑简化了编程模型。(如Word 不但要响应鼠标和键盘,还要隔一段时间自动保存,如果放在一个线程中实现,则草稿保存时由于IO阻塞导致鼠标点击卡死)

B:线程相比进程,更加轻量级,创建和销毁代价更小。

C:线程提高了性能。对于单个CPU(单核),虽然宏观并行,但是微观串行,从CPU的角度看无法提高性能。但是当一部分线程由于等待资源(IO阻塞,等待输入)时,多线程允许进程内的其他线程继续执行而不是整个进程都阻塞,因此提高了利用率。

D:在多CPU或多核的情况下,多线程不仅宏观并行,微观也并行。



经典线程模型:

进程是组织资源的最小单位,而线程是安排CPU执行的最小单位。

A:进程是用于组织资源的单位,进程将相关的资源组织在一起,这些资源包括:内存地址空间,程序,数据等,将这些以进程的形式组织起来可以使得操作系统管理这些资源更为容易。(地址空间 、全局变量 、打开的文件 、子进程 、信号量 、账户信息)

B:而线程,是每一个进程中执行的一个条线。线程虽然共享进程中的大多数资源,但线程也需要自己的一些资源,比如栈 、寄存器 、状态 、程序计数器等

C:线程共享的是进程的内存空间,进程共享的是物理内存、打印机、键盘等。

线程的实现

1.使用内核线程实现:

内核线程(Kernel Thread,KLT)就是直接由操作系统内核支持的线程,这种线程由内核完成线程切换。内核通过操纵调度器(Scheduler)对线程调度,并负责将线程的任务映射到各个处理器上。每个内核线程都可以看做是内核的一个分身,这样的操作系统就有能力同时处理多个事情,支持多线程的内核就叫做多线程内核(Multi-Threads
Kernel)。

程序一般不会直接取使用内核线程,而是去使用内核线程的一种高级接口--轻量级进程(Light Weight Process,LWP),轻量级进程便是通常所讲的线程。由于每个轻量级进程都由一个内核线程支持,因此需要先支持内核线程,才能有轻量级进程。这种LWP和内核线程一对一的关系称为1:1线程模型。

2.使用用户线程实现:

这里的用户线程指的是完全建立在用户空间的线程库上,系统内核不能感知到线程的存在。用户线程的建立、同步、销毁和调度完全在用户态中完成,不需要内核的帮助。这种线程不需要切换到内核态,操作快速且低消耗,可以支持更大规模的线程数量。这种进程与用户线程1:N的关系成为一对多的线程模型。

由于没有内核的支援,所有线程的操作都需要用户程序自己处理。线程的创建、切换、调度都是需要考虑的问题,而且操作系统只把处理器资源分配到进程,线程的阻塞可能会导致整个进程的阻塞,即使该进程还有其他线程在工作。此外还有多处理器系统中如何将线程映射到其他处理器上,这些问题都很难解决。

3.混合实现

这种实现方式是将内核线程和用户线程一起使用。这种实现下,既存在用户线程,又存在轻量级进程。用户线程还是完全建立在用户空间中,因此用户线程的创建、切换、析构等操作依然廉价,并且可以支持大规模的用户线程并发。而操作系统提供支撑的轻量级进程则作为用户线程和内核线程之间的桥梁,这样可以使用内核提供的线程调度功能以及处理器映射,并且用户线程的系统调用通过轻量级进程来完成,大大降低进程被阻塞的风险。在这种模式中,用户线程和轻量级进程的比例不定,是M:N的关系。

在目前的JDK版本中,操作系统支持怎样的线程模型,很大程度上决定了Java虚拟机的线程是怎样映射的。

部分内容转自
http://www.cnblogs.com/CareySon/archive/2012/05/04/ProcessAndThread.html
<<深入理解Java虚拟机>>-周志明
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: