如下图:
┏━━━━━━━┓
┃ A B C ┃
┃ │ ┃ │ ┃
┃ │ ┃ │ ┃
┃ │ ┃ │ ┃
┃ │ ┃ │ ┃
┃ │ ▉ │ ┃
┃ │ ┃ │ ┃
┃ │ ┃ │ ┃
┃ ▉ ┃ │ ┃
┃ │ ┃ │ ┃
┃ │ ┃ │ ┃
┃ │ ┃ │ ┃ 细竖线表示线程;
┃ │ ┃ ▉ ┃ 粗竖线表示主进程;
┃ │ ┃ │ ┃ 方块表示当前位置;
┃ │ ┃ │ ┃ 方框表示进程封装;
┃ 1 2 3 ┃ 字母表示进程名称;
┃ └─╂─┘ ┃ 数字表示进程CPU地址。
┗━━━━━━━┛
我就是进程
1.进程如树根,线程如树干,所有线程都直接或间接由进程得来。
2.B线程是程序运行时创建的,由他创建A和C,它就是树子的主树
干,其它小树干(树枝)由它长出
3.每个树枝(线程)几乎可以做到互不影响,砍断一个另两个仍然生长
4.CPU如生长素,按顺序分别在ABC三个地方施加向上的一个推动线程
的力,虽然CPU在某个时刻只在一个地点出现,但由于快速的切换导
致我们无法发现,犹如快速切换具有相似性的一组静态图片可以使
我们看到运动图像一样。
5.当所有的树干都被砍断,树根的存在就不再有意义了,所以它会自
动地“烂掉”。
微软官方对进程和线程的定义:
进程:用最简洁的话来说,进程就是一个正在执行的程序,一个或多个线程在进程中运行,线程是操作系统分配CPU运算时间的最小单位。每一个进程都提供了运行一个程序所必需的资源,一个进程具有4GB的虚拟地址空间(Windows NT Server Enterprise Edition及Windows 2000 Advanced Server中低3GB虚拟地址空间供进程使用,高1GB供操作系统的内核代码使用。Windows NT/2000中低2GB供进程使用,高2GB供操作系统内核代码使用。Windows9X:0——64K只读空间用来装入Microsoft DOS信息,64K——4M装入DOS的兼容代码,4M——2GB的私有空间供进程使用,2GB——3GB的共享空间装入各种DLL代码,3GB——4GB为共享的系统内核代码空间,其中共享的2GB——4GB的空间是99%的“内存无效页错误”、“General Protect Error(GPE)”及蓝屏的罪魁祸首。),可执行代码,数据,对象句柄,环境变量,优先权以及设置最大化最小化的功能。每一个进程都从一个主线程开始执行,但可以在它所拥有的线程中创建额外的线程。一个进程的所有线程共享进程的虚拟地址空间和系统资源,一个线程的资源包括线程的机器寄存器设置,内核堆栈,线程环境变量和进程虚拟地址中的用户堆栈。
简单的说一个程序就是一个进程,而一个程序中的多个任务则被称为线程。
eg:
word是一个进程,而其中的一个文档就是一个线程!
进程只占据 4GB 地址空间来存放数据与代码!但它并不执行!
执行的任务由线程完成!
一个进程里包含一个主线程和由主线程生成的一些其它线程!
我觉得就像一根电线!
进程是外皮,线程是铜丝!
进程是一段程序,而多个线程组成程序。
进程通常被定义为一个正在运行的程序的实例,它由两个部分组成:
* 一个组成部分是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方。
* 另一个组成部分是地址空间,它包含所有可执行模块或DLL模块的代码和数据。它还包含动态内存分配的空间。如线程堆栈和堆栈分配空间。
进程是不活泼的。若要使进程完成某项操作,它必须拥有一个在它的环境中运行的线程,该线程负责执行包含在进程的地址空间中的代码。实际上,单个进程可能包含若干个线程,所有这些线程都“同时”执行进程地址空间中的代码。为此,每个线程都有它自己的一组CPU寄存器和它自己的堆栈。每个进程至少拥有一个线程,来执行进程的地址空间中的代码。如果没有线程来执行进程的地址空间中的代码,那么进程就没有存在的理由了,系统就将自动撤消该进程和它的地址空间。
若要使所有这些线程都能运行,操作系统就要为每个线程安排一定的CPU时间。它通过以一种循环方式为线程提供时间片(称为量程),从而造成一种假象,仿佛所有线程都是同时运行的一样。
当创建一个进程时,系统会自动创建它的第一个线程,称为主线程。然后,该线程可以创建其他的线程,而这些线程又能创建更多的线程。
以上from 《Windows 核心编程》
简单说明:
使用过下载工具么?比如“网络蚂蚁”。
开启蚂蚁即开始一个进程,假设同时下载3个文件,则每个下载动作就是一个
线程。
不知道恰不恰当
根据我的理解
进程就是一个单独程序打开了单独的一段地址空间进行单独的工作
而线程是一个程序用N段地址空间进行进行同一种操作,线程主要用在要求高效率进行的软件上,比如暴力破解,和下载软件上
上面是我的理解,至于定义是什么,你自己找吧!
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:
线程的划分尺度小于进程,使得多线程程序的并发性搞。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
进程(Process)是最初定义在Unix等多用户、多任务操作系统环境下用于表示应用程序在内存环境中基本执行单元的概念。以Unix操作系统为例,进程是Unix操作系统环境中的基本成分、是系统资源分配的基本单位。Unix操作系统中完成的几乎所有用户管理和资源分配等工作都是通过操作系统对应用程序进程的控制来实现的。
一个进程里面可以有多个线程,也就是多线程
进程是一次资源的分配
线程是一次处理机的分配
进程好比家庭,是社会细胞。线程好比家庭成员,注意,家庭成员可以共享筷子,碗,电视,沙发......等家庭资源。但是家庭之间一般不共享这些,因为她门使用自己的。
进程是程序分配内存的单位,
线程,又叫轻型线程,是一种比进程更小的执行单元
进程包含线程。
进程是操作系统资源分配的单位,而线程是操作系统执行的单位。
线城市为了提高操作系统的并发性而引入的,而且线程的创建,销毁及调度的开销一般都远小于进程。
一个进程可以包含多个共享该进程的资源的线程,同一进程内的线程间的通信是很容易实现的。
关于进程和线程的详细讨论可以在任何一本大学的操作系统的教材上找到。
我觉得线程和进程的主要区别还是在于
进程要拥有资源,而线程没有资源,它只是使用进程中的资源
进程是操作系统资源分配的单位
线程是操作系统执行的单位!
future_path(任我行):
在线程系统中进程也是一个线程。可以将进程理解为一个程序的第一个线程。
这句话说得有问题!!!!
只能说,在多线程系统里, 进程里至少包含一个线程!!!
如果一个进程有n个线程,那么这n个线程共享操作系统为这个进程分配的资源,如:内存空间。 但这n个线程可以并行执行。
/-----------------------------------------------------------------/
heiqisi(绝爱生鱼片):
关于使用进程还是用线程,那要看你的任务的具体情况。
如果你的任务需要独立分配大量资源,而且与现有环境不需要交换太多数据,你可以产生一个独立的进程。进程的管理、操作比线程方便多了。不需要去关心太多同步与共享的问题。
如果你的任务比较轻量级,同时却需要产生大量的任务(需要很多线程or进程),这时用线程比较好,因为产生一个线程的开销比进程要小得多!!
进程是程序的一次执行,线程可以理解为进程中的执行的一段程序片段。在一个多任务环境中下面的概念可以帮助我们理解两者间的差别:
进程间是独立的,这表现在内存空间,上下文环境;线程运行在进程空间内。
一般来讲(不使用特殊技术)进程是无法突破进程边界存取其他进程内的存储空间;而线程由于处于进程空间内,所以同一进程所产生的线程共享同一内存空间。
同一进程中的两段代码不能够同时执行,除非引入线程。
线程是属于进程的,当进程退出时该进程所产生的线程都会被强制退出并清除。
线程占用的资源要少于进程所占用的资源。
进程和线程都可以有优先级。
在线程系统中进程也是一个线程。可以将进程理解为一个程序的第一个线程。
现代的操作系统都可以有多个进程,而每一个进程都可以有多个线程;
同一进程中的线程之间共享同一块存储空间,所以都可以访问同一个全程变量等,而进程之间要
通讯需要使用共享内存等手段。
对操作系统来说,进程的开销大,而线程则小得多。
具体还有一些其他区别,你可以再看一下资料。
进程仅仅只是存在,它什么也不做,起作用的是线程。一个进程最少有一个线程。
在NT中(其他的操作系统与此类似):
进程是装入内存并且准备这姓的程序,他又代码、数据和该进程中的线程可用的其他资源组成。每个进程占有所有用户内存2GB(但让仅仅从进程自己的角度看时这样的,另外还要出去系统占用的2GB空间)。
而线程是进程的可执行部分,每个进程至少有一个线程,就是主线程了。多线程通过CPU时间片的划分机制分别被CPU装入运行。
同一个进程可以有多个线程,这多个线程共享进程的存储空间,当然每个线程也有之际的存储空间,称为线程局部存储(TLS:Thread Local Storage).通过API可以访问的,TlsAlloc, TlsGetValue, TlsSetValue, TlsFree.关于这方面的详细信息,如果你需要,可以交流。
进程是一个具有独立功能的程序,他是关于某个数据集合的一次可以并发执行的运行活动。进程作为构成系统的基本细胞,不仅是系统内部独立运行的实体,而且是独立竞争资源的实体。
线程也被称为轻权进程,同一进程的线程共享全局变量和内存,使得线程之间共享数据很容易也很方便,但会带来某些共享数据的互斥问题。
许对程序为了提高效率也都是用了线程来编写。
父子进程的派生是非常昂贵的,而且父子进程的通讯需要ipc或者其他方法来实现,比较麻烦。而线程的创建就花费少得多,并且同一进程内的线程共享全局存储区,所以通讯方便。
线程的缺点也是由它的优点造成的,主要是同步,异步和互斥的问题,值得在使用的时候小心设计。
“系统内核一定要是最高优先级的”这个对,但是有些中断的优先级要比系统内核高,比如掉电中断。线程是最近几年才有的概念,在操作系统里现在还是进程的调度比较多,而且中断是可以进行进程调度的。线程不能说是进程的一部分,虽然大多数时候,线程是比进程小的单位,但是有的进程比线程小。同一个进程可以有很多线程,同时一个线程也可以对应几个不同的进程。进程的切换不完全依赖于中断,有一定的进程调度算法,这个算法和不同的操走系统有关,实时的操作系统和分时的就有不同的进程调度算法。中断优先级有程序控制的,也有硬件控制的。
进程是一个包含cpu指令操作、虚存地址、内存区域等含义的概念。
线程是进程的一部分,他只是包括cpu指令操作一个概念,它和同一进程下别的线程公用同样的虚存地址、内存区域。
中断只是切换线程的一种方法,它不可能调整进程这个复杂的概念。
那么对进程的切换就不能是:
进程1 中断 进程2
而应该是:
进程1 中断 系统内核(自动退出) 进程2
所以要求系统内核一定要是最高优先级的,然后其余优先级全部由系统控制。
我上面的说法正确吗?希望大家给我指出我的错误。谢谢。
进程是程序的一次执行,线程可以理解为进程中的执行的一段程序片段。在一个多任务环境中下面的概念可以帮助我们理解两者间的差别:
进程间是独立的,这表现在内存空间,上下文环境;线程运行在进程空间内。
一般来讲(不使用特殊技术)进程是无法突破进程边界存取其他进程内的存储空间;而线程由于处于进程空间内,所以同一进程所产生的线程共享同一内存空间。
同一进程中的两段代码不能够同时执行,除非引入线程。
线程是属于进程的,当进程退出时该进程所产生的线程都会被强制退出并清除。
线程占用的资源要少于进程所占用的资源。
进程和线程都可以有优先级。
在线程系统中进程也是一个线程。可以将进程理解为一个程序的第一个线程。
进程是操作系统资源分配的单位
线程是操作系统执行的单位!
future_path(任我行):
在线程系统中进程也是一个线程。可以将进程理解为一个程序的第一个线程。
这句话说得有问题!!!!
只能说,在多线程系统里, 进程里至少包含一个线程!!!
如果一个进程有n个线程,那么这n个线程共享操作系统为这个进程分配的资源,如:内存空间。 但这n个线程可以并行执行。
/-----------------------------------------------------------------/
heiqisi(绝爱生鱼片):
关于使用进程还是用线程,那要看你的任务的具体情况。
如果你的任务需要独立分配大量资源,而且与现有环境不需要交换太多数据,你可以产生一个独立的进程。进程的管理、操作比线程方便多了。不需要去关心太多同步与共享的问题。
如果你的任务比较轻量级,同时却需要产生大量的任务(需要很多线程or进程),这时用线程比较好,因为产生一个线程的开销比进程要小得多!!
我觉得线程和进程的主要区别还是在于
进程要拥有资源,而线程没有资源,它只是使用进程中的资源
进程是操作系统资源分配的单位,线程是操作系统执行的单位。"非常好。
进程和线程没有很大可比性。只是大陆业界把它们翻译成都带"程"字罢了。个人认为,台湾翻译的就较好一些。
早期一些的操作系统的资源分配单位和执行单位是一起的,现在只不过分开了罢了。
另外,WIN32平台,线程也有一点自己的资源,那就是heap区,每个线程,都可以有自己的独立的heap区。
进程是操作系统资源分配的单位,而线程是操作系统执行的单位。
线城市为了提高操作系统的并发性而引入的,而且线程的创建,销毁及调度的开销一般都远小于进程。
一个进程可以包含多个共享该进程的资源的线程,同一进程内的线程间的通信是很容易实现的。
关于进程和线程的详细讨论可以在任何一本大学的操作系统的教材上找到。
异步编程和线程的区别?
你可以理解异步为由系统自己控制的线程。
To fa2002:
帮助上说,采用异步代替多线程编写WebService的一个目的是限制WebService所起的线程数目,也就是减少对资源的占用。
如按你说的观点,两种做法的本质是一样的,那异步怎么能减少对资源的占用?
fa2002(叮当) 说得没错,关键是“可以理解”:)
异步编程肯定需要多线程,只不过简单的应用多线程不一定能取得很好的效果。比如说:
1) 当系统负荷已经很高的时候(请求数量大),简单得为每个请求创建新的线程不但不能提高系统性能,反而导致更多的系统资源被浪费在了线程切换上面,得不偿失。
2) 对于相对简单的操作,线程的创建和销毁本身就变成了不可忽略的损耗,所以要尽量重复利用已有的线程。
.NET系统提供的多线程机制ThreadPool就是帮助你简化这些线程控制细节的,而几乎所有的.NET异步编程都是通过ThreadPool实现的。